在学习操作系统时总结了笔记,并分享出来,特别是蓝色和红色字体。有问题请及时联系博主:Alliswell_WP,转载请注明出处。
参考书:《操作系统》谌卫军等,清华大学出版社,2012年5月
参考视频:清航全套计算机专业课视频
目录
第二章 进程管理
1.进程(Process)
2.线程(Thread)
3.进程间通信
4.经典的IPC问题
5.进程调度
第三章 死锁
第二章 进程管理(进程三种状态的转换?如何共享数据?低级通信?高级通信?互斥(引入的原因及如何解决)?PV原语、经典的三大IPC问题及解决方案、进程调度的优先级、死锁)
1.进程(Process)
为什么使用进程?Why processes?
为了提高计算机系统中各种资源的利用率,现代操作系统广泛采用多道程序技术(multi-programming),使多个程序同时在系统中存在并运行。
X86 CPU 寄存器
![](https://i-blog.csdnimg.cn/blog_migrate/2089488b4af6c021ce0243e7fcd8ea75.png)
程序1 程序2
![](https://i-blog.csdnimg.cn/blog_migrate/29daebb8cbad2d74114c1656458d85a7.png)
问题:硬件只有一份,如何使这两个程序同时运行?
为此,操作系统设计者提出了进程的概念。
什么是进程?A process = a program in execution
一个进程应该包括:
-程序的代码;
-程序的数据;
-CPU寄存器的值,如PC,用来指示下一条将运行的指令、通用寄存器等;
-堆、栈;
-一组系统资源(如地址空间、打开的文件)
总之,进程包含了正在运行的一个程序的所有状态信息。
扩展:栈的作用是什么?保存临时数据、函数调用时来分配栈针来存放形参和局部变量
进程和程序的区别?
程序是静态的,进程是动态的。
进程的特性
-动态性:程序的运行状态在变,PC、寄存器、堆和栈等;
-独立性:是一个独立的实体,是计算机系统资源的使用单位。每一个进程在一个“虚拟计算机”上运行,每个进程都有“自己”的PC和内部状态,运行时独立于其他的进程(虚拟PC和物理PC);
如何实现逻辑PC?
在内存开辟一段空间,实现不同进程物理PC和逻辑PC轮流切换。
引起进程创建的三个主要事件?
-系统初始化时;
-在一个正在运行的进程当中,执行了创建进程的系统调用;
-用户请求创建一个新进程。
进程的三个基本状态
-运行状态(Running):进程占有CPU,并在CPU上运行。处于此状态的进程数目小于等于CPU的数目。
-就绪状态(Ready):进程已经具备运行条件,但由于CPU忙暂时不能运行,只要分得CPU即可运行;
(万事俱备只欠东风,只欠CPU)
-阻塞状态(Blocked/Waited):指进程因等待某种事件的发生而暂时不能运行的状态(如I/O操作或进程同步),此时,即使CPU空闲,该进程也不能运行。
类比:修自行车……(运行——正在修;就绪——正在修别人的车,等空闲修;阻塞——坏零件,买回来才能修)
进程的状态及其转换
![](https://i-blog.csdnimg.cn/blog_migrate/b62a94c5b33774b5341d57112ffe13dc.png)
引起进程状态转换的具体原因如下:
运行态→等待态:等待使用资源;如等待外设传输;等待人工干预。
等待态→就绪态:资源得到满足;如外设传输结束;人工干预完成。
运行态→就绪态:运行时间片到;出现有更高优先权进程。
就绪态—→运行态:CPU 空闲时选择一个就绪进程。
问题:1)进程正常运行(未阻塞)时处于什么状态?运行态或就绪态
2)此页正在讲的PPT处于什么状态?阻塞态
3)是否有其他的状态转换?没有,这三种只有四种情况。
程序 = 数据结构 + 算法
描述进程的数据结构:进程控制块(Process Control Block,PCB)。
系统为每个进程都维护了一个PCB,用来保存与进程有关的各种状态信息。
PCB中的主要内容
![](https://i-blog.csdnimg.cn/blog_migrate/51abbf3772b506618a60d336a346254d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0f0b45b6a1d206aa5a126a0f6518b56b.png)
系统用PCB来描述进程的基本情况以及运行变化的过程,PCB是进程存在的唯一标志。
进程的创建:为该进程生成一个PCB;
进程的终止:回收它的PCB;
进程的组织管理:通过对PCB的组织管理来实现;
状态队列
-由操作系统来维护一组队列,用来表示系统当中所有进程的当前状态;
-不同的状态分别用不同的队列来表示(运行队列、就绪队列、各种类型的阻塞队列);
-每个进程的PCB都根据它的状态加入到相应的队列当中,当一个进程的状态发生变化时,它的PCB从一个状态队列中脱离出来,加入到另外一个队列。
![](https://i-blog.csdnimg.cn/blog_migrate/6cd933cc810c995034e9bfd0ec112552.png)
如何实现队列?链表
2.线程(Thread)
为什么要引入线程?
【案例】编写一个MP3播放软件。核心功能模块有三个:1)从MP3音频文件当中读取数据;2)对数据进行解压缩;3)把解压缩后的音频数据播放出来。
单进程的实现方法
1 main()
2 {
3 while(TRUE)
4 {
5 Read();//I/O
6 Decompress();//CPU
7 Play();//I/O
8 }
9 }
10 Read(){……}//读数据
11 Decompress(){……}//解压缩
12 Play(){……}//播放
问题:1)播放出来的声音能否连贯?2)各个函数之间不是并发执行,影响资源的使用效率;
多进程的实现方法
![](https://i-blog.csdnimg.cn/blog_migrate/6054ada9985797d68041fb5e8558bb31.png)
问题:进程之间如何通信,共享数据?
怎么来解决这些问题?
需要提出一种新的实体,满足一下特性:1)实体之间可以并发地执行;2)实体之间共享相同的地址空间;
这种实体就是:线程