• 操作系统内并发执行的进程可能是独立进程和协作进程。
为什么会有进程间协作?
→信息共享infornationsharing
→提高运算速度computationspeedup子任务并行执行(需要计算机有多个处理单元)
→模块化modularity需要按照模块化的方法构造系统
→方便convenience单个用户可能同时执行多个任务
进程间通信机制(informationcommunicationIPC)
(1)共享内存速度快 只在建立共享内存区时使用系统调用
(2)消息传递交换较少量的数据 易于实现使用系统调用实现
详细介绍:
(1)共享内存
通常,一块共享内存区域驻留在生成共享内存段进程的地址空间。其他希望使用这个共享内存段的进程必须将此放在他们的地址空间上。
而通常操作系统试图组织一个进程访问另一个进程的内存,共享内存需要两个进程或更多的进程取消这一限制,他们通过在共享内存区域读或写来交换信息。
数据的形式或位置取决与进程而不是操作系统,进程还必须保证它们不能在同一时间写数据。
例:生产者消费者问题
使用缓冲机制来被生产者填充并被消费者使用(有限缓冲&无限缓冲)
#defineBUFFER_SIZE 10
//共享缓冲通过循环数组和逻辑指针实现
typedefstruct{
...
}item;
itembuffer[BUFFER_SIZE];
intin = 0; //指向缓冲中下一个空位
intout = 0; //指向缓冲中第一个满位 当BUFFER_SIZE== out 时,缓冲为满
生产者进程代码 消费者进程代码
item nextProduced; itemnextConsumed;
while(true) while(true)
{ {
//生产一个item while(in = out )
while((in+1)%BUFFER_SIZE==out) ;//donothing
;//donothing nextConsumed=buffer[out]
buffer[in]=nextProduced; out=(out+1)%BUFFER_SIZE
in=(in+1)%BUFFER_SIZE //消费这个item
} }
(2)消息传递
在分布式环境中很有用
消息传递工具至少提供两种操作:发送消息接受消息
例:进程P和Q通信
P&Q之间必须要有通信线路(communicationlink)(邮箱或端口)
逻辑实现线路和send()/revice()操作的方法:
•直接或间接通信
→直接通信
需要通信的每个进程必须明确地命名通信接受者或发送者(对称寻址)
send(P,message);
reveice(Q,message);
具有如下属性:在需要通信的每对线路之间自动建立线路。进程仅需要知道相互通信的标志符。
具有如下属性 一个线路只与两个进程相关
具有如下属性 每对进程之间只有一个线路
只要发送者命名接受者,接受者不许要命名发送者(非对称寻址)
send(P,message);
reveice(id,message);//变量id设置成与其通信的进程名称
直接通信的缺点:硬编码技术,限制了进程定义的模块化。
→间接通信
通过邮箱或端口来发送或接收消息。
邮箱可以抽象成一个对象,进程可以向其中存放消息,可以从中删除消息。每个邮箱都有一个唯一的标志符。
send(A,message);//发送一个消息到邮箱A
receive(A,message);//接受来自邮箱A的消息
具有如下属性:只有两个进程共享一个邮箱时,才能建立通信线路。
具有如下属性:一个线路可能和两个或更多进程相关联。
具有如下属性:两个通信进程之间可能有多个不同线路,每个线路对应一个邮箱。
进程和操作系统都可以拥有邮箱:
1.邮箱为进程所有(邮箱是进程地址空间的一部分):使用者(只能向邮箱发消息)或拥有者(只能接受消息)。当拥有邮箱的进程终止,那么邮箱消失。
2.邮箱为操作系统所有------>操作系统需要提供相应的机制允许进程创建、删除邮箱和通过邮箱接受、发送东西。
•同步或异步通信
→阻塞send
发送进程阻塞,直到消息被接收进程或邮箱接收。
→非阻塞send
发送进程发送消息并再次进行操作。
→阻塞receive
接受者堵塞,直到有消息可用。
→非阻塞receive
接受者接到一个有效消息或空消息。
•自动或显示缓冲
无论通信是直接的还是间接的,通信进程所交换的消息都驻留在临时队列中。
队列实现的三种方法:
1、零容量 必须阻塞发送,直到接收者收到消息
2、有限容量
3、无限容量
实例介绍:
一、POSIX共享内存:
1.进程使用系统调用shmget()创建共享内存段。该调用返回一个共享内存段整数标识值。
2.想访问共享内存段的进程采用系统调用shmat()将其加入地址空间。该调用返回一个指向附属的共享区域的指针。
3.一个进程不需要访问该共享区域时,用系统调用shmdt()分离出该内存段。
4.使用系统调用shmctl()从系统中删除共享内存段。
二、Mach消息传递(邮箱)
Mach的绝大多数通信(绝大多数系统调用和所有任务间信息)是通过消息实现的,消息通过邮箱来发送和接受。
1.每个任务在创建时建立了两个邮箱(内核邮箱和通报邮箱)。内核使用内核邮箱与任务进行通信,使用通报邮箱发送时间发生通知。系统调用port_allocate()创建新邮箱并为其消息队列分配空间。
2.开始时,邮箱的消息队列为空,随着消息向邮箱发送,消息被复制到消息队列中,所有消息有同样的优先级。Mach保证同一发送者的消息是FIFO顺序排队,不能保证绝对排序。
3.当向一个邮箱发送消息时,如果邮箱已满,发送线程有4种选择。
4.接受操作有两个地方可以接受消息。
消息系统的主要问题是双重复制,但虚拟内存管理技术解决了这个问题(将发送者的地址空间映射到接受者的地址空间)
三、WindowXP(端口)
WindowXP的消息传递工具称为本地过程调用(LPC)工具。使用了端口对象来建立和维护两进程之间的链接。
连接端口:为所有进程可见,允许应用程序建立通信频道。
通信工作:1.客户机打开系统的连接端口对象的句柄
通信工作:2.客户机发送连接请求
通信工作:3.服务器创建两个私有通信端口,并返回其中之一的句柄给客户机
通信工作:4.客户机和服务器使用相应的端口句柄已发送消息或回调,并等待回答。