操作系统第二章 进程管理
写在前面:本文参考王道论坛的 操作系统考研复习指导单科书
文章目录
- 第二章 进程管理
- 进程同步
- 读者写者问题
- 哲学家就餐问题
- 练习题
- 哲学家就餐:加碗(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是水缸内剩余空间能容纳的水的桶数
三个合作进程(同步:前驱图)
分析:
各个进程的任务:
- P1进程从输入设备输入数据a;然后计算
x = a + b
; 使用打印机打印x,y,z; - P2进程从输入设备输入数据b;然后计算
y = a * b
; - P3进程从输入设备输入数据c;然后计算
z = y + c - a
;
进程同步:
注意:进程同步前V后P
的使用,亦即在前的进程执行完后V(某信号量);
,而在后的进程执行前P(某信号量);
下面是三个进程的执行顺序,故而需要两个同步信号量。
此题有前驱图的感觉。前驱图使用信号量进行同步,所以就不需要再使用另外的互斥信号量mutex
了。
死锁
死锁v.s.
饥饿 v.s.
死循环
- 死锁:各进程相互等待对方手里的资源,导致各进程都阻塞
- 饥饿:某进程长时间得不到某种资源,无法向前推进。比如短进程优先(SPF)算法中,长进程可能一直无法运行,“饥饿”
- 死循环:某进程执行过程中一直跳不出某个循环的现象
死锁和饥饿是操作系统要解决的问题,死循环是应用程序员要解决的问题。
死锁预防
死锁避免(银行家算法)
死锁检测与解除
系统为进程分配资源时不采取任何措施,而在具体分配过程中提供死锁检测和解除的手段。
资源分配图:是一个有向图,用于表示某时刻系统资源与进程之间的关系。
圆圈代表进程,方框代表一类资源,方框内圆圈个数代表该类资源的个数。
死锁的知识结构
操作系统第二章 进程管理相关推荐
- (王道408考研操作系统)第二章进程管理-第三节10:经典同步问题之哲学家进餐问题
本文接: (王道408考研操作系统)第二章进程管理-第三节6:经典同步问题之生产者与消费者问题 ((王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题 (王道408 ...
- (王道408考研操作系统)第二章进程管理-第三节8:经典同步问题之吸烟者问题
本文接: (王道408考研操作系统)第二章进程管理-第三节6:经典同步问题之生产者与消费者问题 ((王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题 文章目录 一 ...
- (王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题
注意:生产者与消费者问题Linux系统编程专栏有案例讲解 Linux系统编程39:多线程之基于阻塞队列生产者与消费者模型 Linux系统编程40:多线程之基于环形队列的生产者与消费者模型 本文接:(王 ...
- 笔记篇:操作系统第二章 进程管理
笔记篇:操作系统第二章 进程管理 目录 笔记篇:操作系统第二章 进程管理 2.1 进程的基本概念 2.1.1 程序的顺序执行及其特征 2.1.2 前驱图 2.1.3 程序的并发执行及其特征 2.1.4 ...
- 操作系统 第二章 进程管理
2.1 进程与线程 第一节零碎知识比较多,关键在于进程状态的切换.进程线程的关系. 第一章中提到过的多道程序环境,由于程序的特点,不能让程序并发,所以引入了进程的概念,让进程来并发,从而实现了多道程序 ...
- 3 操作系统第二章 进程管理 进程定义、特征、组织、状态与转换
文章目录 1 进程的定义和特征 2 进程的组织 3 进程的状态与转换 3.1 进程的状态 3.2 进程状态转换 1 进程的定义和特征 引入进程的原因 为了使程序能够并发执行,并且可以对并发执行的程序加 ...
- (王道408考研操作系统)第二章进程管理-第一节4:进程通信(配合Linux)
文章目录 一:什么是进程通信 二:如何实现进程间通信及其分类 三:通信方式1-共享存储(共享内存) (1)课本基础内容 (2)补充-Linux中的进程通信 四:通信方式2-管道 (1)管道是什么 (2 ...
- (王道408考研操作系统)第二章进程管理-第一节3:进程控制(配合Linux讲解)
文章目录 一:如何实现进程控制 二:进程控制原语 (1)进程创建 A:概述 B:补充-Linux中的创建进程操作 ①:fork() ②:fork()相关问题 (2)进程终止 A:概述 B:补充-僵尸进 ...
- 7 操作系统第二章 进程管理 进程同步与互斥
文章目录 1 进程同步与互斥 1.1 进程同步 1.2 进程互斥 1.3 进程同步机制遵循的原则 1.3 进程同步.互斥小结 2 进程互斥实现方法 2.1 互斥的软件实现方法 2.1.1 单标志法 2 ...
最新文章
- Basic Level 1008. 数组元素循环右移问题 (20)
- 某小公司项目环境部署演变之路
- debin linux 指令手册,debianGNULinux系统应用手册.pdf
- 取消一个请求(Cancel)
- mysql集群fuzhi_MySQL集群 和MySQL主从复制的不同
- Sentinel流控规则_预热_分布式系统集群限流_线程数隔离_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0036
- js return 闭包为null_那么如何让你的 JS 写得更漂亮?
- poj 1657 Distance on Chessboard
- 《Python游戏编程入门》第二章编程挑战
- iOS开发,第三方应用微信授权登录,获取微信unionid
- yjj某数后缀生成(1-15,js逆向)
- Linux基础入门(详细版)
- 建筑智能化资质办理条件
- SDNU 1014.书的页码问题
- npm install --save 、--save-dev 、-D、-S的区别详细解说
- 中国的芯片产业距崛起还有多远?
- 戴尔 DELL 游戏笔记本电脑 - Windows 10 关闭或开启功能键 (Fn key)
- c语言打印顺时针循环方阵,顺时针打印矩阵(C语言代码)
- 试证明:已知二叉树的前序序列和中序序列,可以唯一确定该二叉树
- 软银云商|总部参观考察