2.6 进程通信

1. 进程通信是指进程之间的信息交换。

2. 进程通信低级的原因:(1)效率低(2)通信对用户不透明

3. 高级通信机制四大类:

共享存储器系统(共享数据结构和共享存储区)

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

消息传递系统:直接通信方式、间接通信方式

客户机-服务器系统:套接字、远程过程调用、远程方法调用

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

通信原语:

Send(Receiver, message);    Receive(Sender, message);   

利用直接通信原语解决生产者——消费者问

1. 间接通信方式 —— 通过信箱通信

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

Send(mailbox, message);  将一个消息发送到指定信箱

Receive(mailbox, message);  从指定信箱中接收一个消息

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

通信链路

分类:

(1)根据通信链路的建立方式:

显示连接:先用 “建立连接”命令(原语) 建立一条通信链路; 通信; 用显式方式拆除链路。——用于计算机网络

隐式连接:发送进程无须明确提出建立链路的要求,直接利用系统提供的发送命令(原语),系统会自动地为之建立一条链路。——用于单机系统

7.消息缓冲队列通信机制

发送进程利用Send原语,将消息直接发送给接收进程;接收进程利用Receive原语接收消息。

(1)消息缓冲区

type message buffer =record

                                           sender;   发送者进程标识符

                                           size;        消息长度

                                           text;       消息正文

                                           next;   指向下一个消息缓冲区的指针

                                       end

(2)PCB中有关通信的数据项

增加用于对消息队列进行操作和实现同步的信号量,并将它们置入进程的PCB中。

type processcontrol block =record

                                  …

                                  mq;         消息队列队首指针

                                  mutex;    消息队列互斥信号量

                                  sm;          消息队列资源信号量

                                  …

                                  end

2. 发送原语

procedure send(receiver, a)   //将发送区a的内容发给receiver

    begin

        getbuf(a.size, i);              //根据a.size申请缓冲区i

        

        i.sender :=a.sender;        //将发送区a中的信息复制

        i.size :=a.size;                  //到消息缓冲区i中   

        i.text :=a.text;

        i.next :=0;

 

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

 

        wait(j.mutex);                  //将消息缓冲区插入消息队列

        insert(j.mq, i);                       

        signal(j.mutex);

        signal(j.sm);

    end

3. 接收原语    

procedure receive(b)    //从进程自己的消息接收队列中取

    begin                                             //消息i放入消息接收区b中

 

        j:=internal name; //j为接收进程内部标识符

 

        wait(j.sm);            //将消息队列中的第一个消息移出

        wait(j.mutex);

        remove(j.mq, i);

        signal(j.mutex);

       

        b.sender :=i.sender;    //将消息缓冲区i中的信息

        b.size :=i.size;              //复制到接收区b

        b.text :=i.text;

End

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值