《操作系统第四版》(刘振鹏 王煜)(四)进程同步与通信

操作系统(四)

四、进程同步与通信

4.1 进程间的相互作用

4.1.1进程间的联系
  • 进程间的联系
    • 资源共享关系
    • 相互合作关系
  • 临界资源
    • 一种供多个进程互斥访问的资源 同一时刻只允许一个进程访问的资源叫临界资源
  • 临界区 每个进程中访问临界资源的那段代码称为临界区(critical section)
  • 同步机制应遵循的准则
    • 空闲让进
    • 忙则等待
    • 有限等待
    • 让权等待
  • 解决进程互斥问题:
    4.1.2 软件方法:
    完全使用软件的方法 解决此问题有一定难度并且有很大的局限性。
    4.1.3 硬件方法:
    • 利用Test-and-Set指令实现互斥
    • 利用Swap指令实现进程互斥
    4.1.4 信号量机制
    • 对信号量的操作:信号量机制是一种非常有效的进程同步工具

      • 1.记录型信号量机制
        • 记录型数据结构描述

        •    typedef struct {
                int value;  //代表资源数
           	 list of process *L;  //进程链表L,用于链接所有等待该信号量代表资源的进程
            }  semaphore;
          

          在这里插入图片描述

        • 对信号量的操作:
          信号量除初始化外,仅能通过两个标准的原子操作wait(s)和signal(s)来访问。这两个操作很长时间以来被称为P、V操作。

        • 信号量的物理含义:

          • S.value>0时 S.value表示可使用的资源数或表示可使用资源的进程数;
          • S.value=0时 S.value表示无资源可供使用或表示不允许进程得到该资源;
          • S.value<0时 S.value表示等待使用资源的进程个数或表示等待该资源的进程个数。
        • wait原语:申请一个资源,得到就继续,得不到就阻塞

            void  wait (static  semaphore  s)
            {
             s.value - -;
             if (s.value<0)   block(s.L);
            } 
          
        • singal原语: 释放一个资源,有进程等待则唤醒一个

           void signal ( static  semaphore  s)
           	{
               s.value++;
              if (s.value <= 0)  wackup(s.L);
             } 
          
        • 利用信号量实现进程互斥的过程描述
          为使多个进程互斥地访问某个临界资源,只需为该资源设置一个信号量,并设其初始值为1。此信号量可称为“互斥信号量”。
          在这里插入图片描述
          进程1,进程2 同时执行,并不存在顺序关系。

    • 2.信号量集机制

      • AND型信号量集机制
        .引入:
        假定现有两个进程P和Q,它们都要求同时访问共享数据A和B。共享数据都应作为临界资源,为此,可为这两个数据分别设置用于互斥的信号量Amutex和Bmutex,并令它们的初值为1(表示可以被访问)。这时容易产生死锁的情况。
        对若干个临界资源的分配采取原子操作方式,要么全部分配到进程,要么一个也不分配,这称为AND同步,可以通过信号量集机制实现(Swait,Ssignal)
        • Swait操作:

             Swait(S1, S2, … , Sn)
             {  
                 if (S1≥1&&…&&Sn≥1)
             	for (i=1;  i<=n;  i++)     Si -- ;
             	 else  {
             		阻塞该进程,并将其插入到 等待资源Si的阻塞队列中;
             		 将程序计数器PC重新指向Swait 操作的第一条语句。
             			     }
               }
          
        • Ssignal操作:

          Ssignal (S1, S2, … , Sn)
          {
               for (i=1; i<=n; i++)
                {
                      Si++;
                      将所有等待Si资源的进程唤醒;
                 }
          }
          
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值