操作系统(2.6)--进程通信
Posted 码银
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统(2.6)--进程通信相关的知识,希望对你有一定的参考价值。
进程通信是指进程之间的信息交换。
在进程之间要传送大量数据时,应当利用OS提供的高级通信工具,该工具最主要的特点是:
- (1)使用方便。OS隐藏了实现进程通信的具体细节,向用户提供了一组用于实现高级通信的命令(原语),用户可方便地直接利用它实现进程之间的通信。
- (2)高效地传送大量数据。用户可直接利用高级通信命令(原语)高效地传送大量的数据。
一、进程通信的流程
高级通信机制可归纳为四大类:共享存储器系统、管道通信系统、消息传递系统以及客户机-服务器系统。
1.共享存储器系统
(1) 基于共享数据结构的通信方式。在这种通信方式中,要求诸进程公用某些数据结构,借以实现诸进程间的信息交换。如在生产者一消费者问题中,就是用有界缓冲区这种数据结构来实现通信的。这种通信方式是低效的,只适于传递相对少量的数据,属于低级通信。
(2) 基于共享存储区的通信方式。为了传输大量数据,在存储器中划出了一块共享存储区,诸进程可通过对共享存储区中数据的读或写来实现通信。这种通信方式属于高级通信。
进程利用共享内存储区进行通信时的步骤:
- 向操作系统申请共享存储区
- 挂接共享存储区到进程的存储空间
- 进程互斥读写存储区
- 通信结束后归还存储区
2.管道通信
“管道”,是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件, 又名pipe文件。
为了协调双方的通信,管道机制必须提供以下三方面的协调能力:
- 互斥,
- 同步,
- 确定对方是否存在,只有确定了对方已存在时,才能进行通信。
消息传递系统 消息传递系统是当前应用最为广泛的一种进程间的通信机制。在该机制中,进程间的数据交换是以格式化的消息为单位的。
基于消息传递系统的通信方式属于高级通信方式,因其实现方式的不同,可进一步分成两类:
- (1)直接通信方式,是指发送进程利用OS所提供的发送原语,直接把消息发送给目标进程;
- (2)间接通信方式,是指发送和接收进程,都通过共享中间实体(称为邮箱)的方式进行消息的发送和接收,宗成进程间的通信。
3.客户机-服务器系统
1)套接字(Socket)
基于文件型、基于网络型
socket:一个套接字就是一个通信标识类型的数据结构,它包含了通信目的地地址,通信使用的端口号,通信网络的传输协议,进程所在的网络地址,以及针对客户或服务器程序提供不同系统调用等,是进程通信和网络通信的基本构件。
Socket的功能由系统调用体现主要有:创建socket()、指定本地地址bind()、建立socket连接connect()、愿意接收连接listen ()和接收连接accept()、发送数据send()、sendto() 、sendmsg()、write()、writev ()和接收数据read()、readv() 、recvfrom()、recvmsg()
2)远程过程调用和远程方法调用
存根:远程过程的一个不同版本,被存于库中
本地客户端:每个能够独立运行的远程过程都拥有一个客户存根。
服务器端:在每个远程进程所在的服务器端,其所对应的实际可执行进程也存在一个服务器存根与之对应。
实际上,远程过程调用的主要步骤是:
- (1)本地过程调用者以一般方式调用远程过程在本地关联的客户存根,传递相应的参数,然后将控制权转移给客户存根;
- (2)客户存根执行,完成包括过程名和调用参数等信息的消息建立,将控制权转移给本地客户进程:
- (3)本地客户进程完成与服务器的消息传递,将消息发送到远程服务器进程;
- (4)远程服务器进程接收消息后转入执行,并根据其中的远程过程名找到对应的服务器存根,将消息转给该存根:
- (5)该服务器存根接到消息后,:由阻塞状态转入执行状态,拆开消息从中取出过程调用的参数,然后以一般方式调用服务器上关联的过程;
- (6)在服务器端的远程过程运行完毕后,将结果返回给与之关联的服务器存根;
- (7)该服务器存根获得控制权运行,将结果打包为消息,并将控制权转移给远程服务器进程;
- (8)远程服务器进程将消息发送回客户端;
- (9)本地客户进程接收到消息后,根据其中的过程名将消息存入关联的客户存根,再将控制权转移给客户存根:
- (10)客户存根从消息中取出结果,返回给本地调用者进程,并完成控制权的转移。这样,本地调用者再次获得控制权,并且得到了所需的数据,得以继续运行。
进程通信
进程通信
知识总览
什么 进程通信?
顾名思义,进程通信就是指进程之间的信息交换。
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。
为了保证安全,一个进程不能直接访问另一个进程的地址空间。
但是进程之间的信息交换又是必须实现的。为了保证进程间的安全通信,操作系统提供了一些方法。
进程通信——共享存储
两个进程对共享空间的访问必须是互斥的(互斥访问通过操作系统提供的工具实现)。
操作系统只负责提供共享空间和同步互斥工具(如P、V操作)
基于数据结构的共享:比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式。
基于存储区的共享:在内存中画一块共享存储区,数据的形式、存放位置都由进程控制。而不是操作系统。相比之下,这种共享方式速度更快,是一种高级通信方式。
进程通信——管道通信
“管道”是指连接读写进程的一个共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的缓冲区
- 管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向通信,则需要设置两个管道。
- 各进程要互斥地访问管道。
- 数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞。
- 如果没写满,就不允许读。如果没读空,就不允许写。
- 数据一旦被读写,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况。
进程通信——信息传递
进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。
知识回顾与重要考点
以上是关于操作系统(2.6)--进程通信的主要内容,如果未能解决你的问题,请参考以下文章