1.进程的定义——fork创建进程
(1)程序的概念
(2)进程的概念
进程实体:
进程和程序的区别和联系:
区别:
1)进程是动态的;程序是静态的。
(2)进程有独立性,能并发执行;程序不能并发执行。
(3)二者无一一对应关系。
(4)进程异步运行,会相互制约;程序不具备此特征。 但是,进程与程序又有密切的联系: 进程不能脱离具体程序而虚设,
程序规定了相应进程所要完成的动作。
(5)组成不同。进程包含PCB、程序段、数据段。程序包含数据和指令代码。
(6)程序是一个包含了所有指令和数据的静态实体。本身除占用磁盘的存储空间外,并不占用系统如CPU、内存等运行资源。
(7)进程由程序段、数据段和PCB构成,会占用系统如CPU、内存等运行资源。
(8)一个程序可以启动多个进程来共同完成。
联系:
进程不能脱离具体程序而虚设, 程序规定了相应进程所要完成的动作。
PCB通常包含的内容:
4.进程的组织
(1)链接方式
(2)索引方式
1.思维导图总览
2.进程的状态
(2)创建态和结束态
3.进程状态之间的转换
进程一共有如下5种状态,那么他们之间如何实现切换呢?
咱们从一个进程的从无到有看起,来了解进程5种状态之间的转换
创建态
,完成一系列的分配资源工作。就绪态
,说明可以有机会被处理机调度。运行态
。来一张形象生动的图片感受一下5种状态之间的切换
1.什么是进程控制?
最基本的三个状态:
三个状态的关系是什么?
没头没尾的?好!给你头和尾!
就绪态与阻塞态太绝对,一个是 缺CPU、一个是缺某种资源,为什么让我已经有的资源白白运行着,等待缺少的东西!!!OK,给你个挂起态,当我缺东西的时候,我先把我身上的资源给出去,我一身轻,资源还不白白浪费。
挂起就绪
:提交的进程可能会很久获得CPU和资源,但是作为就绪态,也会占用很多资源,但是由于是就绪态,不是在运行,所以现在不给他分配资源(没有CPU)也是对资源的一种节约。挂起阻塞
:阻塞状态是由于运行时,我缺少了某种资源,被迫转化为阻塞态,但是阻塞态除了缺少的资源,其他的资源还是在占用,太浪费了。出现挂起阻塞,可以通过唤醒回到阻塞态。2.原语实现对进程的控制
(1)操作系统的运行机制和体系结构
(2)操作系统内核在计算机系统中的层次结构
(3)操作系统体系结构类比
(4)操作系统用户态和核心态的转换
3.回忆进程的组织
进程在操作系统中的组织使各个进程能够有序的进行切换和运行
这里说明一下调度和切换的区别:
调度
是指决定资源分配给哪个进程的行为,是一种决策行为
切换
是指实际分配的行为,是执行行为
一般来说现有资源调度,后有进程切换
5.进程控制原语的相同点
学习技巧:进程控制会导致进程状态的转换。无论哪个原语,要做的无非三类事情:
更新PCB中的信息(如修改进程状态标志、将运行环境保存到PCB、从PCB恢复运行环境)
a.所有的进程控制原语一定都会修改进程状态标志
b.剥夺当前运行进程的CPU使用权必然需要保存其运行环境
c.某进程开始运行前必然要恢复期运行环境
将PCB插入 合适的队列
分配/回收资源
接下来我们就具体学习一下关于进程控制的五种原语,进程的创建、终止、唤醒、阻塞、切换
;
6.进程控制的五种原语
(1)进程的创建原语
- 根据被终止进程的标识符,从PCB集合中找出该进程的PCB,从中取出该进程的状态;
- 若将被终止的进程正处于执行状态,则终止该进程的执行,并将处理机资源分配给其他进程;
- 若该进程还有子孙进程,还应将其所有子孙进程予以终止,以防它们成为不可控的进程;
- 将被终止进程所拥有的全部资源,或者归还给其父进程,或者归还给系统;
(3)进程的唤醒和阻塞原语
进程的阻塞和唤醒原语是成对存在
的,必须成对使用
。
阻塞原语
是由被阻塞进程自我调用实现的
唤醒原语
是由一个被唤醒进程合作或被其他相关的进程调用实现的
进程的阻塞
- 先用进程标识符找到要被阻塞的进程;
- 若该进程处于运行状态,先立即停止执行,将其状态转为阻塞态;
- 将本进程插入到阻塞队列,如果系统中设置了因不同事件而阻塞的多个阻塞队列,则插入具有相同事件的阻塞(等待) 队列;
- 转调度程序进行重新调度,将处理机分配给另一就绪进程。
进程的唤醒
- 把被阻塞的进程从等待该事件的阻塞队列中移出;
- 将其PCB中的现行状态由阻塞改为就绪:
- 然后再将该PCB插入到就绪队列中。
- 保存被中断进程的处理机上下文信息;
- 更新被中断进程的PCB信息,如进程状态;
- 把被中断进程的PCB加入相关队列;
- 选择一个新进程并更新其PCB信息,如进程状态;
- 更新被选中进程的存储管理信息;
- 恢复被选中进程的处理机上下文信息。
什么是进程通信?
图中我们可以知道什么是进程通信,以及进程通信的低级和高级方式;
我们还可以知道为什么要引入进程通信方式,以及它的意义
1.共享存储
共享一块大家都可以访问的空间,一次只能有一个进程进行读或写操作
3.消息传递
发送信息的进程将消息头写好,接受信息进程根据消息头读取信息或寻找信封是哪一个
- 系统在创建一个进程时,必须为它分配其所必需的、除处理机以外的所有资源,如内存空间、I/O 设备,以及建立相应的PCB,开销大;
- 系统在撤消进程时,又必须先回收其所占有的资源,然后再撤消PCB,开销大;
- 对进程进行切换时,由于要保留当前进程的CPUJ环境和恢复新选中进程的CPU环境,因而 须花费不少的处理机时间;
- 不同进程之间,资源独立分配,不共享地址空间,不便于协作。
为了方便于理解,我打开了我的任务管理器,可以看出chrome一个进程,下面有很多分支,可以把这些分支当做线程看待,PID即进程和线程都有的标识符。
5.线程的实现方式
前面我们了解了引入线程的好处和引入线程的变化,以及线程的属性,那么线程如何实现呢?
线程的实现分为两类:用户级线程(User-Level Thread,UTL)
和内核级线程(Kernel-Level Thread, KTL)
。内核级线程又称内核支持的线程。
什么是内核!简单粗暴!内核就是访问硬件的软件程序!如果word可以访问硬件(bushi),你可以管word叫内核(狗头)。
QQ是内核吗?不是!为什么?因为他不能访问硬件,那QQ为什么可以开摄像头这硬件。因为QQ要去舔内核,内核同意了,QQ才能得到摄像头的使用权限。 如下图:
所以什么是内核态!当一个进程陷入内核代码中执行时,我们就称进程处于内核态。(进入内核态:系统调用、异常、外围设备的中断)
通过运行时系统来管理线程,运行时系统实际上是一套库函数,存在于用户空间内;
内核管理的还是进程,感觉不到线程的存在;
线程切换不需要内核管理。
优点:线程切换速度快,调度算法可根据应用程序需要而定制,可运行在任何操作系统上。
缺点:内核只能将CPU以进程为单位分配,同一进程中的两个线程就无法分配到不同的CPU。
进程被阻塞,则进程内的所有线程都会被阻塞。
内核管理所有线程,并向用户提供APl接口来创建线程;
内核即维护进程相关数据结构还维护线程相关数据结构;
线程切换由内核来支持;
调度以线程为单位
优点:
1)在多处理器系统中,内核能够同时调度同一进程中多个线程并行执行;
2)进程中的一个线程被阻塞了,内核可以调度该进程中的其它线程占有处理器运行, 也可以运行其它进程中的线程;
3)内核本身也可以采用多线程技术,可以提高系统的执行速度和效率。
缺点:
对于用户的线程切换而言,其模式切换的开销较大,在同一个进程中,从一个线程切换 到另个线程时,需要从用户态转到内核态进行,
这是因为用户进程的线程在用户态运 行,而线程调度和管理是在内核实现的,系统开销较大
6.多线程模型
前面我们提到了线程的实现方式,有用户级和内核级。那么这两种模式的交叉组合就会产生几种不一样的组织结构,即不一样的模型。
(1)多对一模型
0.思维导图
1.调度的基本概念
2.调度的三个层次
(1)高级调度( 作业调度)
(2)中级调度(内存调度)
(3)OS内核程序临界区与普通临界区的进程调度情况
2.进程调度的方式
所谓进程调度方式,是指当某个进程正在处理机上执行时,若有某个更为重要或紧迫的进程需要处理,即有优先权更高的进程进入就绪队列,此时应如何分配处理机。
3.进程的切换和过程
3.周转时间
4.等待时间
作业:包含程序、数据和一份作业说明书,系统根据该说明书来对程序的运行进行控制。
作业控制块(JCB):它是作业在系统中存在的标志,其中保存了系统对作业进行管理和调度所需的全部信息。
0.思维导图
1.先来先服务—FCFS
First come first sever
2.短作业优先—SJF
Shortest Job First
3.高响应比优先—HRRN
Highest Response Ratio Next
举个例子
0.思维导图
操作系统的一个重要功能是什么?
就是让程序并发执行。
1.进程同步
2.进程互斥
为了禁止两个进程同时进入临界区,需遵循以下准则
软件实现方法的思想:
在进入区设置并检查一些标志 来标明是否有进程在临界区中,若已有进程在临界区,则在进入区通过循环检查进行等待,进程离开临界区后则在退出区修改标志。入区通过循环检查进行等待,进程离开临界区后则在退出区修改标志。
2.双标志先检查法
两个是可以同时进入临界区,违反了互斥!!!!
所以不能先检查
后上锁
。
2.TestAndSet指令
3.Swap指令
1.为什么引入信号量机制?
为了更好的解决进程互斥与同步的问题
(1)举一个生动形象的例子了解记录型信号量
一张图咱们回忆一下进程的状态
1.信号量机制实现进程互斥
2.信号量机制实现进程同步
想象一下四则运算的顺序,加减乘除;
要想理解这一部分知识,必须知道P、V操作的内部实现原理
3.信号量机制实现前驱关系
(生产者-消费者问题、多生产者-多消费者问题、吸烟者问题、读者-写者问题、哲学家进餐问题)
0.前言
同步时,前V后P。
1.生产者-消费者问题
(1)问题描述
(2)问题分析
(4)实现互斥的P操作一定要在实现同步的P操作之后
③ 为什么有mutex和没有mutex一样呢?
原因在于:本题中的缓冲区大小为1,在任何时刻,apple、 orange、 plate
三个同步信号量中最多只有一个是1。因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利地进入临界区…
(4)知识总结与重要考点
总结
:在生产者_消费者问题中,如果缓冲区大小为1,那么有可能不需要设置互斥信号量就可以实现互斥访问缓冲区的功能。当然,这不是绝对的,要具体问题具体分析。
建议
:在考试中如果来不及仔细分析,可以加上互斥信号量,保证各进程一定会互斥地访问缓冲区。但需要注意的是,·实现互斥的P操作一定要在实现同步的P操作之后·,否则可能引起·“死锁”·。
3.读者-写者问题
(1)问题描述
(3)实现方法
① 给count加mutex互斥访问
这里说一下为什么要加mutex。
比如:当count=0时,第一个读者进程执行到p(rw),rw=0,假设此时时间片到了,切换到第二个读者进程,第二个进程发现count=0,则执行p(rw),但是此时rw=0,于是第二个进程被堵在p(rw)这里,同理,后面的可能会有多个进程堵在p(rw),只有当第一个进程再次获得时间片,执行count++,让count不为0,然后其他进程就可以直接绕过if直接进行count++来访问文件,但是第三个读者进程和后面的几个可能堵在p(rw)的多个读者进程则必须得等count–为0后才可以再次和写进程竞争来访问文件,对count的访问没有做到一气呵成,会导致本来一些进程一直堵在p(rw)。
② 加一个w实现“读写公平法”
在上面的算法中,读进程是优先的,即当存在读进程时,写操作将被延迟,且只要有
一个读进程活跃,随后而来的读进程都将被允许访问文件。这样的方式会导致写进程可能长时间等待,且存在写进程“饿死”的情况。
若希望写进程优先,即当有读进程正在读共享文件时,有写进程请求访问,这时应禁止后续读进程的请求,等到已在共享文件的读进程执行完毕,立即让写进程执行,只有在无写进程执行的情况下才允许读进程再次运行。为此,增加一个信号量并在上面程序的writer()和
reader()函数中各增加一对PV操作,就可以得到写进程优先的解决程序。
(3)如何实现
4.java中类似于管程的机制
0.思维导图
2.死锁、饥饿、死循环的区别
3.死锁产生的四个必要条件
③ 避免系统进入不安全状态------银行家算法
举个例子,可以消除所有边,即无死锁发生
举个例子,不可消除所有边,即产生死锁
② 死锁的解除