计算机操作系统笔记(6)--进程管理之进程通信

进程通信:指进程之间的信息交换
1)低级通信:进程间仅交换一些状态和少量数据。如:进程之间的互斥和同步。
信号量机制作为通信工具的缺点:a.效率低;b.通信对用户不透明。

2)高级通信:进程间可交换大量数据。
用户可直接利用操作系统提供的一组通信命令,高效地传送大量数据的一种通信方式。
操作系统隐藏了进程通信的细节对用户透明减少了通信程序编制上的复杂性

以下指的是高级通信

一 进程通信的类型

高级通信机制可归结为三大类:

1 共享存储器系统

相互通信的进程间共享某些数据结构或共享存储区,通过这些空间进行通信。
1)基于共享数据结构的通信方式
进程公用某些数据结构,借以实现诸进程间的信息交换。
实现:公用数据结构的设置及对进程间同步的处理,都是程序员的职责。操作系统–提供共享存储器。
特点:低效。只适合传递相对少量的数据。

2)基于共享存储区的通信方式
在存储器中划出一块共享存储区,诸进程可通过对共享存储区中数据的读或写来实现通信。

2 消息传递系统

进程间的数据交换,以格式化的消息为单位。
程序员直接利用系统提供的一组通信命令(原语)进行通信。
例如:计算机网络中的网络报文

3 管道通信系统(Unix专用)

管道:指用于连接一个读进程和一个写进程以实现他们之间通信的一个打开共享文件,又名pipe文件。

写进程(发送进程)->==========->读进程(接收进程)

管道机制提供的协调能力:互斥同步确定对方是否存在

二 消息传递的实现方式

进程间通信时,源进程可以直接或间接地将消息传送给目标进程,由此可将进程分为直接通信间接通信

1 直接通信方式

发送进程利用OS提供的发送命令,直接把消息发送给目标进程。发送进程和接收进程都以显式方式提供对方的标识符。

通信原语
Send(Receiver, message);发送一个消息给接收进程
Receive(Sender, message);接收Sender发来的消息

利用直接通信原语解决生产者–消费者问题
当生产者产出一个产品(消息)后,便用Send原语将消息发送给消费者进程;而消费者进程则利用Receive原语来得到一个消息。若消息尚未产生出来,消费者必须等待,直至生产者进程将消息发送过来。

Producer://生产者
    repeat
        ...
        produce an item in nextp;//生产一个产品放入nextp中
        ...
        send(consumer, nextp);//将nextp发送给consumer
    until false;

Consumer://消费者
    repeat
        receive(producer, nextc);//接收producer发送的消息放入nextc中
        ...
        consume the item in nextc;//消费nextc中的产品
    until false;
2 间接通信方式

信箱用来暂存发送进程发送给目标进程的消息,接收进程则从信箱中取出发送给自己的消息。

消息在信箱中可安全保存,只允许标准的目标用户随时读取利用信箱通信方式,既可实时通信,又可非实时通信

信箱可由操作系统创建,也可由用户进程创建,创建者是信箱的拥有者。

信箱分类:
私用信箱:用户进程可创建自己的私用信箱。
公用信箱:由操作系统创建的信箱,并把访问权限分配给操作系统核准认可的进程。
共享信箱:由某个进程创建,将访问权限分配给其他进程。

三 消息传递系统实现中的若干问题

1 通信链路

分类:
1)根据通信链路的建立方式
显式连接:先用“建立连接”命令(原语)建立一条通信链路;通信;用显式方式拆除链路。–用于计算机网络。
隐式连接:发送进程无须明确提出建立链路的要求,直接利用系统提供的发送命令(原语),系统会自动地为之建立一条链路。–用单机系统。

2)根据通信链路的连接方式
点–点连接通信链路
多点连接通信链路

3)根据通信方式的不同
单向通信链路
双向链路

4)根据通信链路容量的不同
无容量通信链路
有容量通信链路

2 消息的格式

单机系统环境:环境相同,消息格式简单。
计算机网络环境:环境不同,消息的传输距离很远,消息格式比较复杂。

消息格式
消息头:消息在传输时所需的控制信息
消息正文:发送进程实际上所发送的数据

3 进程同步方式

在进程之间进行通信时,辅以进程同步机制,使诸进程间能协调通信。

发送进程或接收进程在完成消息的发送或接收后,都存在两种可能性:进程或者继续发送(接收)或者阻塞
1)发送进程阻塞,接收进程阻塞。紧密同步,发送进程和接收进程之间无缓冲区,中间不暂存。
2)发送进程不阻塞,接收进程阻塞。比如一个发送进程,多个接收进程。
3)发送进程和接收进程均不阻塞。比如有N个缓冲区。

四 消息缓冲队列通信机制

发送进程利用Send原语,将消息直接发送给接收进程;接收进程利用Receive原语接收消息。用于本地进程间通信。

1 消息缓冲队列通信机制中的数据结构

消息缓冲队列通信方式中,主要利用的数据结构是消息缓冲区

1)消息缓冲区

type message buffer = record
    sender;//发送者进程标识符
    size;//消息长度
    text;//消息正文
    next;//指向下一个消息缓冲区的指针
end

2)PBC中有关通信的数据项
应该在进程的PCB中增加消息队列队首指针,用于对消息队列进程操作,以及用于实现同步的互斥信号量mutex和信号量sm

type processcontrol block = record
    ...
    mq;//消息队列队首指针
    nutex;//消息队列互斥信号量
    sm;//消息队列资源信号量,用于记录队列中的消息数量
    ...
end
2 发送原语
//将发送区a的内容发给receiver
procedure send(receiver, a)//a为发送的内容
    begin
        getbuf(a.size, i);//根据a.size申请缓冲区i

        //将发送
        i.sender := a.sender;
        i.size := a.size;
        i.text := a.text;
        i.next := 0;

        //取接收进程内部标识符放于j中
        getid(PCB set, receiver.j);

        //将消息缓冲区插入消息队列
        wait(j.mutex);
        insert(j.mq, i);
        signal(j.mutex);
        signal(j.sm);
    end
3 接收原语
//从进程自己的消息接收队列中取消息i放入消息接收区b中
procedure receice(b)
    begin
        j := internal name;//j为接收进程内部标识符

        wait(j.sm);//先申请资源信号量
        wait(j.mutex);//再申请互斥信号量
        remove(j.mq, i);//将消息队列中的第一个消息移出
        signal(j.mutex);

        //将消息缓冲区i中的信息复制到接收区b中
        b.sender := i.sender;
        b.size := i.size;
        b.text := i.text;
    end
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值