操作系统--进程(3)
进程通讯
一.进程对白:管道,套接字
进程对白就是一个进程发出某种数据信息,另一方接收数据信息,而这些数据信息通过一片共享的存储空间进行传递
管道:一个进程向存储空间的一端写入信息,另一个进程存储空间的另一端读取信息,这个就是管道,管道所占的空间既可以是内存也可以是磁盘
例如在Linux下,我们通过shell命令输入两个命令,中间通过符号“|”来创建两个命令之间的管道:sort < file1 | grep zou
对file1的内容进行排序,完成后结果将作为grep的输入,在结果里找出所有包含zou的文本行,也就是说,数据从sort流向了grep
套接字:套接字(socket)的功能非常强大,可以支持不同层面,不同应用,跨网络的通讯,使用套接字进行通讯需要双方均创建一个套接字,其中一方作为服务器方,另一方作为客户方,服务器方必须首先创建一个服务区套接字,然后在该套接字上进行监听,等待远方的连接请求,客户方也要创建一个套接字,然后向服务器方发送连接请求,服务器套接字在受到连接请求之后,将在服务器方机器上新建一个客户套接字,与远方的客户方套接字形成点到点的通信通道,之后,客户方和服务器方就可以直接通过类似于send和recv的命令在这个创建的套接字管道上进行交流了
例如,创建一个服务器方的socket:
SocketWatch = new Socket(AddressFamily,InterNetwork,SocketType.Stream,ProtocolType.Tcp);
创建socket
socketWatch.Bind(newIPEndPoint(IPAddress.Parse(txtIPAddress.Text),int.Parse(txtPort.Text)));
绑定ip与端口
socketWatch.Listen(10);
设置监听队列的长度,开启监听连接
不足之处:a.必须首先在通讯的进程间建立连接(管道或套接字),这需要消耗系统资源
b.通信是资源的,而管道和套接字需要强制双方进行通信
c.由于建立连接需要消耗时间,一旦建立就应该尽可能多的通信,如果通信信息量很少,则是“杀鸡用牛刀”
二.进程电报与旗语:信号与信号量
信号:信号就是一个内核对象或者一个内核数据结构,发送方将该数据结构的内容填好,并指明该信号的目标进程后,发出特定的软件中断(相当于发电报的操作),操作系统接收到特定的中断请求后,知道是有进程要发送信号,于是到特定的内核数据结构里查找信号接收方,并进行通知,接到通知的进程则对信号进行相应处理
信号量:在计算机中,信号量实际就是一个简单整数,一个进程在信号量变为0或者1的情况下推进,并将信号变为1或者0来防止别的进程同时推进,当该进程完成任务后,则将信号再改为0或者1,从而允许其他进程执行,我们可以看出,信号量已经不止是一种通信机制,更是一种同步机制
三.进程拥抱:共享内存
要共享大量数据
共享内存:进程的拥抱就是共享内存,两个进程共同拥有同一片内存,对于这片内存中的任何内容,二者均可以访问,要使用共享内存进行通信,进程A首先需要创建一片内存空间作为通信用,而其他进程B则将片内存映射到自己的(虚拟)地址空间,这样,进程A读写自己的地址空间中对应共享内存的区域时,就是在和B进行通信
不足之处:a.使用共享内存机制通信的两个进程必须在同一台物理机上
b.安全性脆弱,假如一个进程有病毒,会很容易传给另外一个进程
四.信件发送:消息队列
消息队列是一列具有头和尾的消息排列,新来的消息放在队列尾部,而读取消息则是从队列头部开始
这样看来,它和管道十分类似,一头读,一头写,但是,它看起来很像管道,但又不是管道
a.消息队列无固定的读写进程,任何进程都可以读写:而管道需要指定谁读和谁写
b.消息队列可以同时支持多个进程,多个进程可以读写消息队列,即所谓的多对多,而管道是点对点
c.消息队列只在内存中实现,而管道还可以在磁盘上实现
作者:周旭龙
出处:http://edisonchou.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
http://www.cnblogs.com/edisonchou/p/5022508.html