zoukankan      html  css  js  c++  java
  • 操作系统(1)

    进程之间究竟有哪些通信方方式?如何通信?

    单向通讯(“|”,管道符),只能把第一一个命令的输出作为第二个命令的输入入,如果进程之间想要互相通信的话,那么需要创建两个管道。
    下面我们来创建一个命名管道。
    mkfifo     test
    接下来我们用一个进程向这个管道里里里面面写数据,然后有另外一个进程把里里里面面的数据读出来。
    echo "this is a pipe" > test            // 写数据
    这个时候管道的内容没有被读出的话,那么这个命令就会一一直停在这里里里,只有当另外一一个进程把 test 里里里
    面面的内容读出来的时候这条命令才会结束。接下来我们用用另外一一个进程来读取
    cat < test                                    // 读数据
    我们可以看到,test 里里里面面的数据被读取出来了了。上一一条命令也执行行行结束了了。
    从上面面的例例子子可以看出,管道的通知机制类似于缓存,就像一一个进程把数据放在某个缓存区域,然后等
    着另外一一个进程去拿,并且是管道是单向传输的。
    这种通信方方式有什什么缺点呢?显然,这种通信方方式效率低下,你看,a 进程给 b 进程传输数据,只能等
    待 b 进程取了了数据之后 a 进程才能返回。所以管道不不适合频繁通信的进程。

    消息队列列
    那我们能不不能把进程的数据放在某个内存之后就⻢马上让进程返回呢?无无需等待其他进程来取就返回呢?我们可以用用消息队列列的通信模式来解决这个问题,例例如 a 进程要给 b 进程发送消息,只需要把消息放在对应的消息队列里就行了,b 进程需要的时候再去对应的 消息队列里取出来。同理理,b 进程要个 a 进程发送消息也是一一样。

    缺点:如果 a 进程发送的数据占的内存比比较大大,并且两个进程之间的通信特别频繁的话,消息队列列模型就不不大大适合了了。因为 a 发送的数据很大大的话,意味发送消息(拷⻉贝)这个过程需要花很多时间来读内存。

    解决拷⻉所消耗的时间:共享内存
    这个可能有人人会问了了,每个进程不不是有自自己己的独立立内存吗?两个进程怎么就可以共享一一块内存了了?
    我们都知道,系统加载一一个进程的时候,分配给进程的内存并不不是实际物理理内存,而而是虚拟内存空间。那么我们可以让两个进程各自自拿出一一块虚拟地址空间来,然后映射到相同的物理理内存中,这样,两个进程虽然有着独立立的虚拟内存空间,但有一一部分却是映射到相同的物理理内存,这就完成了了内存共享机制了。

    信号量量
    共享内存最大大的问题是什什么?没错,就是多进程竞争内存的问题,就像类似于我们平时说的线程安全问题。如何解决这个问题?这个时候我们的信号量量就上场了了。
    信号量的本质就是一一个计数器,用来实现进程之间的互斥与同步。

    Socket
    上面面我们说的共享内存、管道、信号量量、消息队列列,他们都是多个进程在一一台主机之间的通信,那两个相隔几千里里里的进程能够进行通信吗?答是必须的,这个时候 Socket 这家伙就派上用场了,

  • 相关阅读:
    酷狗大数据平台架构是如何重构的
    分层架构,前后端分离有啥坏处?
    Redis快速入门及应用
    Kafka不只是个消息系统
    提高代码质量:如何编写函数
    jquery 回车事件
    程序员的薪资是如何确定出来的?
    HTTP 错误 500.21
    制作手机浏览器显示格式的HTML页面
    操作必须使用一个可更新的查询。
  • 原文地址:https://www.cnblogs.com/topass123/p/12639652.html
Copyright © 2011-2022 走看看