进程间通信
定义:
进程通信,是指进程之间的信息交换,其所交换的信息量少者是一个状态或数值,多者则是成千上万个字节。
前面所讲的信号量机制作为同步工具是卓有成效的,但作为通信工具则不够理想,因为其效率低,对用户不够透明。属于低级通信工具。
下面介绍高级通信工具,用户可以直接利用操作系统所提供的一组通信命令高效的传达大量数据。
进程通信的类型:
高级通信机制分为三大类:共享存储器系统、消息传递系统、管道通信系统。
1 共享存储器系统
相互通信的进程公用某些数据结构,借以实现诸进程之间的信息交换。据此又可分为两种类型:
(1)基于共享数据结构的通信方式
这种方式低效,只适用于传递相对少量的数据。
(2)基于共享存储区的通信方式
在存储器中划分共享存储区供进程使用。
2 消息传递系统
是当前应用最广泛的一种进程通信机制,该进制中,进程间的数据交换以格式化的消息(Message)为单位,在计算机网络中成为报文。程序员直接用操作系统提供的一组通信命令(原语),隐藏了通信细节,简化了复杂性。
3 管道通信
管道指指用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件。该方法首创于UNIX系统。为了协调双方通信,管道机制必须提供以下三个方面
的协调能力:
(1)互斥(2)同步(3)确定对方是否存在才可以进行通信
消息传递通信的实现方法
1 直接通信方式
直接调用原语命令:
Send(Receiver,message);
Receive(Sender,messgae);
另外接受进程可以与多个发送进程通信,因此又可以表示为Receive(id,message);//id表示原进程ID
2 间接通信方式
以一个中间实体暂存消息,该实体成为信箱(mailbox),只允许核实的目标用户随时读取。
发送和接受原语:
Send(mailbox,message);//将消息发送到指定信箱
Receive(mailbox,message);//从指定信箱接受一个消息
信箱又可分为三类:
私用信箱:在进程内,随进程的结束而消失
公用信箱:由操作系统提供,所有核准进程都可以存取
共享信箱:由某进程创建,供其他指定进程共享使用
消息队缓冲队列通信机制
1 消息缓冲队列通信机制中的数据结构
(1)消息缓冲区
该数据结构可以被描述如下:
type message buffer = record
sender;//发送进程标识符
size;//消息长度
text;//消息正文
next;//指向下一个消息缓冲的指针
end
(2)PCB中有关通信的数据项
type processcontrol block = record
...
mq;//消息队列首指针
mutex;//消息队列互斥信号量
sm;//消息队列资源信号量
...
end
2 发送原语
procedure send(receiver,a)//发送区a
begin
getbuf(a.size,i);//根据发送区的大小申请一块缓冲区i
i.sender := a.sender;//将信息复制到缓冲区
i.size := a.size;
i.text := a.text;
i.next := 0;
getid(PCB set,receiver.j);//获得接受进程的内部标识j.然后将i挂在j.mq上
wait(j.mutex);
insert(j,mq,i);
signal(j.mutex);
signal(j.sm);
end
3 接受原语
procedure receive(b)
begin
j:=internal name; //j为接受进程内部标识符
wait(j.sm);
wait(j,mutex);
remove(j.mq,i);//将消息队列中的第一个消息移除
signal(j.mutex);
b.sender := i.sender;//从缓冲区i中将数据复制到接收区b
b.size := i.size;
b.text := i.text;
end
线程
线程引入的目的:
减少程序在并发时所付出的时空开销。
线程与进程的比较:
(1)调度:
进程作为资源拥有的基本单位,线程作为调度和分派的基本单位。
(2)并发性:
进程之间可以并发执行,一个进程中的多个线程也可以并发执行。
(3)拥有资源:
线程自己不拥有资源(除了一点必不可少的资源),但他可以访问其隶属进程的资源。
(4)系统开销:
进程切换开销远大于线程切换
线程的属性:
(1)轻型实体(2)独立调度和分配的基本单位(3)可并发执行(4)共享进程资源
线程的状态:
(1)状态参数
寄存器状态、堆栈、线程运行状态、优先级、线程专有存储器、信号屏蔽
(2)线程运行状态
执行、就绪、阻塞
线程间的同步和通信
1 互斥锁(mutex)
两个命令函数lock、unlock以及一个减少线程阻塞的函数Trylock
2 条件变量
用于线程的长期等待,直到所等待的资源成为可用资源
信号量资源分为私有信号量(同一进程中的不同线程)和公有信号量(不同进程或者不同进程之间的不同线程)
线程的实现方式
(1)内核支持线程
无论是用户进程的线程还是系统进程中的线程,他们的创建、撤销、切换等都是依靠内核,在内核空间实现。
(2)用户级线程
User Level Threads仅存在用户空间。对于线程的创建、撤销、切换无须系统完成与支持。与操作系统无关。