写在前面:本文参考王道论坛的 操作系统考研复习指导单科书

文章目录

  • 第二章 进程管理
    • 进程同步
      • 读者写者问题
      • 哲学家就餐问题
    • 练习题
      • 哲学家就餐:加碗(2019真题)
      • 既是生产者又是消费者
      • 和尚取水(生产者-消费者问题)
      • 三个合作进程(同步:前驱图)
    • 死锁
      • 死锁预防
      • 死锁避免(银行家算法)
      • 死锁检测与解除

第二章 进程管理

进程同步

信号量用于实现进程间的同步和互斥访问。

读者写者问题

模型:读写之间互斥,写写之间互斥;读读不互斥。

关键特征:互斥访问的计数器count。

1)关系分析

写者和任何人都是互斥的,读者和读者不存在互斥关系

2)思路整理

共有两个进程,读者reader()和写者writer().

  • 写者:因为和任何进程互斥,只要P、V操作即可。
  • 读者:互斥信号量rw实现读写互斥;为了实现读者间同时访问,创建变量count,用于统计正在读共享文件的读者数量。只有第一个读者可以P(rw);只有最后一个读者可以V(rw); 使用互斥信号量mutex用于不同读者进程互斥的访问count变量.
  • 写优先
    • 设置互斥信号量w用于控制写优先。读进程和写进程在进入后首先P(w),表示在无写进程的时候进入,实现写进程优先。

使用信号量实现进程的互斥和同步:

#include<stdio.h>/* typedef struct{int value;struct process *L;
}semaphore;*/
#define semaphore intsemaphore rw = 1; // 读者和写者互斥访问
int count = 0; // 统计正在读共享文件的读者数量
semaphore mutex = 1; // 多个读进程互斥的访问count变量
semaphore w = 1; // 用于实现写优先void writer(){while (1){P(w); // 在无写请求的时候进入P(rw); //互斥访问共享文件// writingR(rw);V(w); //恢复对共享文件的访问}}void reader_write_first(){while(1){P(w); // 在没有写请求的时候进入P(mutex);if(count == 0)P(rw);count ++;V(mutex);V(w); // 恢复对共享文件的访问// readingP(mutex);count --;if(count == 0)V(rw);V(mutex);}
}

哲学家就餐问题

哲学家问题的一种解法

思路一:至多允许n-1个哲学家同时就餐


semaphore Max = n - 1;  // 最多允许n -1 个人同时吃饭
semaphore chopsticks[n];for(int i = 0; i < n; i ++)chopsticks[i] = 1;Pi(){P(Max);P(chopsticks[i]); // 拿左手边的筷子P(chopsticks[(i+1)%n]); // 拿右手边的筷子//eatingV(Max);V(chopsticks[i]);V(chopsticks[(i+1)%n]);// thinking
}

练习题

哲学家就餐:加碗(2019真题)

思路:使用互斥信号量来控制哲学家拿筷子。取互斥信号量bowl取筷子(n)和碗(m)两者的最小值。why?

  • m < n时,碗的数量少,此时P(bowl)V(bowl)可以起到限制作用。此时,碗的数量m相当于普通的哲学家问题解法里面的Max,即Max = m;

  • n ≥ m时,碗多,此时P(bowl)V(bowl)不起作用。问题退化为普通的哲学家就餐问题,此时Max = n - 1;

综上,取semaphore bowl = min(m, n- 1);

信号量伪代码:

#include<stdio.h>/* typedef struct{int value;struct process *L;
}semaphore;*/
#define semaphore int
#define n 3
#define m 5semaphore chopsticks[n];
semaphore bowl = min(n - 1,m);void Pi(){for(int i = 0; i < n; i ++)chopsticks[i] = 1; // 互斥信号量全部初始化为1P(bowl);P(chopsticks[i]);P(chopsticks[(i+1)%n]);// eatingV(chopsticks[i]);V(chopsticks[(i+1)%n]);V(bowl);// thinking
}

既是生产者又是消费者

解答

#include<stdio.h>/* typedef struct{int value;struct process *L;
}semaphore;*/
#define semaphore int
semaphore mutex = 1;// 互斥访问缓冲区
semaphore full = 0; // 缓冲区产品的数量
semaphore empty  = 1; // 缓冲区空格的数量//P是生产者
void P(){while(1){P(empty);P(mutex);// produce oneV(mutex);V(full);}
}// Q是消费者
void Q(){while(1){P(full);P(mutex);// consume oneQ(mutex);Q(empty);}
}//R 既是生产者又是消费者
void R(){// 执行producer的职能if(empty == 1){P(empty);P(mutex);// produce one;V(mutex);V(full);}//执行consumer的职能if(full == 1){P(full);P(mutex);// consume oneV(mutex);V(empty);}
}

和尚取水(生产者-消费者问题)

信号量代码

#include<stdio.h>/* typedef struct{int value;struct process *L;
}semaphore;*/
#define semaphore intsemaphore well = 1; //用于互斥访问水井
semaphore vat = 1; // 用于互斥访问水缸
semaphore empty = 10; // 表示水缸内还可以容纳的水的桶数
semaphore full = 0; // 表示水缸中水的桶数
semaphore pail = 3; // 表示有多少个水桶可以用void old_monk(){P(full); // 老和尚取水后,水缸中水的数量--P(pail);P(vat);// 从水缸(vat)中取一桶水V(vat);V(empty); // 取完水后,水缸剩余空间++// 喝水V(pail); }
/*
注意P操作的先后顺序:先确认水缸还有空余位置,再去拿桶,再打水。*/void little_monk(){P(empty); // 水缸中剩余空间-- P(pail);P(well);// 从水井(well)中打一桶水V(well);P(vat);// 倒入水缸(vat)V(vat);V(full); // 水缸中水量++v(pail);
}

本题批注:

连续多个P操作连在一起的时候,检查可能会发生死锁。本题如果先P(pail),再P(empty);就会发生死锁。pail是水桶,empty是水缸内剩余空间能容纳的水的桶数

三个合作进程(同步:前驱图)

分析:

各个进程的任务:

  1. P1进程从输入设备输入数据a;然后计算 x = a + b; 使用打印机打印x,y,z;
  2. P2进程从输入设备输入数据b;然后计算y = a * b;
  3. P3进程从输入设备输入数据c;然后计算z = y + c - a;

进程同步:

注意:进程同步前V后P的使用,亦即在前的进程执行完后V(某信号量);,而在后的进程执行前P(某信号量);

下面是三个进程的执行顺序,故而需要两个同步信号量。

此题有前驱图的感觉。前驱图使用信号量进行同步,所以就不需要再使用另外的互斥信号量mutex了。

死锁

死锁v.s. 饥饿 v.s. 死循环

  • 死锁:各进程相互等待对方手里的资源,导致各进程都阻塞
  • 饥饿:某进程长时间得不到某种资源,无法向前推进。比如短进程优先(SPF)算法中,长进程可能一直无法运行,“饥饿”
  • 死循环:某进程执行过程中一直跳不出某个循环的现象

死锁和饥饿是操作系统要解决的问题,死循环是应用程序员要解决的问题。

死锁预防

死锁避免(银行家算法)

死锁检测与解除

系统为进程分配资源时不采取任何措施,而在具体分配过程中提供死锁检测和解除的手段。

资源分配图:是一个有向图,用于表示某时刻系统资源与进程之间的关系。

圆圈代表进程,方框代表一类资源,方框内圆圈个数代表该类资源的个数。

死锁的知识结构

操作系统第二章 进程管理相关推荐

  1. (王道408考研操作系统)第二章进程管理-第三节10:经典同步问题之哲学家进餐问题

    本文接: (王道408考研操作系统)第二章进程管理-第三节6:经典同步问题之生产者与消费者问题 ((王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题 (王道408 ...

  2. (王道408考研操作系统)第二章进程管理-第三节8:经典同步问题之吸烟者问题

    本文接: (王道408考研操作系统)第二章进程管理-第三节6:经典同步问题之生产者与消费者问题 ((王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题 文章目录 一 ...

  3. (王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题

    注意:生产者与消费者问题Linux系统编程专栏有案例讲解 Linux系统编程39:多线程之基于阻塞队列生产者与消费者模型 Linux系统编程40:多线程之基于环形队列的生产者与消费者模型 本文接:(王 ...

  4. 笔记篇:操作系统第二章 进程管理

    笔记篇:操作系统第二章 进程管理 目录 笔记篇:操作系统第二章 进程管理 2.1 进程的基本概念 2.1.1 程序的顺序执行及其特征 2.1.2 前驱图 2.1.3 程序的并发执行及其特征 2.1.4 ...

  5. 操作系统 第二章 进程管理

    2.1 进程与线程 第一节零碎知识比较多,关键在于进程状态的切换.进程线程的关系. 第一章中提到过的多道程序环境,由于程序的特点,不能让程序并发,所以引入了进程的概念,让进程来并发,从而实现了多道程序 ...

  6. 3 操作系统第二章 进程管理 进程定义、特征、组织、状态与转换

    文章目录 1 进程的定义和特征 2 进程的组织 3 进程的状态与转换 3.1 进程的状态 3.2 进程状态转换 1 进程的定义和特征 引入进程的原因 为了使程序能够并发执行,并且可以对并发执行的程序加 ...

  7. (王道408考研操作系统)第二章进程管理-第一节4:进程通信(配合Linux)

    文章目录 一:什么是进程通信 二:如何实现进程间通信及其分类 三:通信方式1-共享存储(共享内存) (1)课本基础内容 (2)补充-Linux中的进程通信 四:通信方式2-管道 (1)管道是什么 (2 ...

  8. (王道408考研操作系统)第二章进程管理-第一节3:进程控制(配合Linux讲解)

    文章目录 一:如何实现进程控制 二:进程控制原语 (1)进程创建 A:概述 B:补充-Linux中的创建进程操作 ①:fork() ②:fork()相关问题 (2)进程终止 A:概述 B:补充-僵尸进 ...

  9. 7 操作系统第二章 进程管理 进程同步与互斥

    文章目录 1 进程同步与互斥 1.1 进程同步 1.2 进程互斥 1.3 进程同步机制遵循的原则 1.3 进程同步.互斥小结 2 进程互斥实现方法 2.1 互斥的软件实现方法 2.1.1 单标志法 2 ...

最新文章

  1. Basic Level 1008. 数组元素循环右移问题 (20)
  2. 某小公司项目环境部署演变之路
  3. debin linux 指令手册,debianGNULinux系统应用手册.pdf
  4. 取消一个请求(Cancel)
  5. mysql集群fuzhi_MySQL集群 和MySQL主从复制的不同
  6. Sentinel流控规则_预热_分布式系统集群限流_线程数隔离_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0036
  7. js return 闭包为null_那么如何让你的 JS 写得更漂亮?
  8. poj 1657 Distance on Chessboard
  9. 《Python游戏编程入门》第二章编程挑战
  10. iOS开发,第三方应用微信授权登录,获取微信unionid
  11. yjj某数后缀生成(1-15,js逆向)
  12. Linux基础入门(详细版)
  13. 建筑智能化资质办理条件
  14. SDNU 1014.书的页码问题
  15. npm install --save 、--save-dev 、-D、-S的区别详细解说
  16. 中国的芯片产业距崛起还有多远?
  17. 戴尔 DELL 游戏笔记本电脑 - Windows 10 关闭或开启功能键 (Fn key)
  18. c语言打印顺时针循环方阵,顺时针打印矩阵(C语言代码)
  19. 试证明:已知二叉树的前序序列和中序序列,可以唯一确定该二叉树
  20. 软银云商|总部参观考察

热门文章

  1. CISP/CISA 每日一题 11
  2. Perl新接触的小命令
  3. mySql 注入攻击
  4. ACM学习历程—HDU2476 String painter(动态规划)
  5. 统一建模语言UML轻松入门系列
  6. 转.net内存回收与Dispose﹐Close﹐Finalize方法
  7. webview检测html事件,在JavaFX WebView中检测HTML textarea onkeyup事件
  8. 【Python】3D Axis
  9. 【数理知识】co-inner-outer factorizations
  10. 【控制】根轨迹分析及绘制