操作系统 - 详解进程之间的通信方式

一、管道

    管道类似于一种特殊的文件(并不是),它存在于内存中,进程可以对它进行读写,它提供流控制,保证进程的正确读写,即管道为空时读进程会阻塞,管道为满时写进程会阻塞,以此实现进程之间的通信。

  管道有三种:1.普通管道(无名管道、也常直接称管道) 2.流管道 3.命名管道(FIFO)

  • 普通管道    

               它是半双工的,即只能单向传输

             它是有进程关系限制的,只能在父子进程之间使用

  • 流管道

             相对于普通管道而言,它不止是单向传输,可以双向传输。

  •     命名管道(FIFO):

             相对于普通管道而言,它没有进程关系限制,可以在无关进程之间进行数据交换。

二、消息队列

        类似于用链表的结构存储消息。

                     

        它相比于管道,不止只能传输字节流,也没有缓冲区大小的限制

        它独立于进程存在,进程终止时,消息队列及其内容并不会被删除。

        它实现了消息的随机读取。

三、套接字(socket)

        与其它通信机制不同是,套接字可用于不同机器间的进程通信,即可用于网络之间的进程通信。

           


四、信号量

        信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。它是一个计数器,用来控制多个进程对共享资源的访问,常作为一种锁机制,实现进程间的同步和互斥。(JUC的Semaphore的设计思想来源吧)


五、共享内存

        即多个进程共享某块内存,共享内存是通信方式中最快的一种。

        操作系统建立一块共享内存,并将其映射到参与通信的每个进程的地址空间上,进程就可以直接对这块共享内存进行读写。

                

  那么,共享内存这种方式为什么是最快的呢?

        这是因为共享内存的整个通信过程对消息的复制只有两次。

                1.从数据来源复制到共享内存 

                2.从共享内存复制到数据目的地

          而管道、消息队列等方式对消息的复制需要四次,因为有缓冲区的存在,读写都要经过缓冲区。

    


没有更多推荐了,返回首页