一、进程通信的类型
1、共享存储器系统(操作存储区方式,共享某些数据结构或共享存储区)
a、基于共享数据结构的通信方式(低级,适合传递少量数据)
进程公用某些数据结构,借以实现诸进程间的信息交换
b、基于共享存储区的通信方式(高级)
进程可通过对共享存储区中数据的读或写来实现通信
2、消息传递系统(发–收方式)
进程间的数据交换,以格式化的消息为单位(例如:计算机网络中的消息称为报文)
3、管道通信(中间文件方式)
连接一读进程和一写进程以实现通信的一个共享文件。写进程以字符流形式将大量的数据送入管道;而接收管道输出的读进程则从管道中接收(读)数据。
4、Client-Server system
a、套接字(Socket)
一个套接字就是一个通信标识类型的数据结构,包含了通信目的的地址,端口号,传输层协议、进程所在的网络地址,以及针对C\S程序提供的不同系统调用(API函数)等。系统中所有的连接都持有唯一的一对套接字及端口连接。
b、远程过程调用(远程方法调用)
RPC的基本通信模型是基于Client/Server进程间相互通信模型的一种同步通信形式;它对Client提供了远程服务的过程抽象,其底层消息传递操作对Client是透明的。
二、消息传递通信的实现方法
1、直接通信方式(利用OS所提供的发送命令(原语),直接把消息发送给目标进程)
原语:Send(Receiver, message);Receive(Sender, message);
例:
Producer:
repeat
…
produce an item in nextp;
…
send(consumer, nextp);
until false;
Consumer:
repeat
receive(producer, nextc);
…
consume the item in nextc;
until false;
2、间接通信方式
基于共享数据结构的实体用来暂存发送给目标进程的消息;接收进程则从该实体中,取出对方发送给自己的消息。
原语:Send(mailbox, message);Receive(mailbox, message);
三、消息传递系统的实现方法
单机和网络环境下的高级进程通信广泛采用“消息传递”方式,需要考虑的问题:
1、通信链路的建立
2、消息格式
3、同步方式
四、消息缓冲队列通信机制
广泛应用于本地进程通信。
1、不需管理链路
2、定义简单数据结构(亦即消息格式)
3、实现发送和接收的操作原语
数据结构:
type message buffer = record
sender; 发送者进程标识符
size; 消息长度
text; 消息正文
next; 指向下一消息缓冲区的指针
end
发送原语:
procedure send(receiver, a)
begin
getbuf(a.size, i); 根据a.size申请缓冲区
i.sender :=a.sender; 将发送区a中的信息复制到 i
i.size :=a.size;
i.text :=a.text;
i.next :=0;
getid(PCB set, receiver, j); 获取接收进程内部标识符
wait(j.mutex);
insert(j.mq, i); 将消息缓冲区插入目标消息队列
signal(j.mutex);
signal(j.sm);
end
接收原语:
procedure receive(b)
begin
j:=internal name; j为接收进程内部标识符
wait(j.sm);
wait(j.mutex);
remove(j.mq, i); 将消息队列中的第i个消息移出
signal(j.mutex);
b.sender :=i.sender;
b.size :=i.size; 将消息缓冲区i中的信息
b.text :=i.text; 复制到接收区b
end
五、线程与进程的比较
1、调度:线程作为CPU调度的基本单位,而进程只作为其它资源分配单位。
2、并发性:进程之间可以并发,实质上是不同进程中的两个线程并发。一个进程的多个线程之间亦可并发。
3、拥有资源:进程间资源相互独立;同一进程的各线程间共享。某进程内的线程在其它进程不可见
4、系统开销:线程上下文切换在同进程环境下上下文切换要快得多。因为同进程内线程间共享内存地址和打开的文件资源;
六、线程的管理
1)互斥锁
2)条件变量
3)信号量
适用于逐渐复杂的情况