进程管理逻辑图
- 将多个程序拷贝到进程中,占用内存,如图扇形区域,当酷狗进程需要资源的时候,会通过I/O子系统取用资源的过程中,会放弃对cpu的占用,cpu就会处理别的进程,因此提高了cpu的利用率(I/O低速,cpu高速)
- qq想要知道键盘输入的结果,他就会拜托I/O子系统去取键盘输入的结果,这个时候会放弃CPU的占用,CPU会重新分配给其他应用程序。当I/O取到键盘输入的数值,会把结果返回给QQ
- 死锁中对于资源的抢占不仅仅是cpu,也有键盘、鼠标、U盘等I/O资源
- I/O低速 CPU高速
- 当QQ需要使用I/O获取数据的时候,会由先前的获得CPU状态变成等待CPU状态,这个过程是因为I/O阻塞从而主动放弃CPU。然后进入排队队列,状态为I/O中,阻塞。
- 因为不同的进程对资源的要求以及获取速度的不同,有可能获得了CPU但是状态还是阻塞中,所以会短暂的获取CPU然后立刻放弃CPU,进入排队队列。这会造成CPU的资源浪费。
- PCB存储的就是多进程状态图的状态信息
- 排队,形成一个循环队列;只有就绪状态的进程才可以获取cpu,处于阻塞状态的进程无法获取cpu
- 阻塞状态的成员获得cpu之后,因为I/O状态没有转备好数据,立刻放弃cpu。这个过程是低效的,应该按照进程的属性排成两个队列
- 队列分成两种,就绪队列(I/O完)和阻塞队列(I/O),提高了CPU的利用率
进程的由来
- 1,如果将一个程序所依赖的所有功能弄到一个进程的话,如图所示,如果网络功能进行网络资源的访问,涉及到I/O会释放对CPU的占用,因此其余的功能,比如渲染、物理引擎计算等等也会失去CPU的占用,软件会卡死;
- 2,如果为软件的不同功能都分配一个进程,每个进程实现不同的功能,多个进程会导致时空开销大,而且存储状态信息的工具PCB有限,因此引入了线程的概念。
- 3,两个功能进程之间切换。时空开销具体体现在上下文切换,上下文切换,是指上面涉及到的就绪、阻塞、运行状态的转换,如果切换过于频繁,在挑选PCB和修改PCB的信息,时间效率会降低;cpu执行qq程序,后切换到LOL程序,在回到qq程序,这个过程会涉及到状态信息的保存,利用栈保存当前信息,因为栈需要开辟空间,因此会带来空间开销。
- 3,线程,将功能转化为线程。解决了进程上述提到的问题。进程是线程的容器,进程和线程同时存在。
- 4,进程和进程之间并发,线程和线程之间并发(同一个进程不同线程;不同进程的不同线程)
- 新事物的出现,在解决旧的矛盾的同时也会引入新的矛盾
进程和程序的区别
- 1,程序是静态的,进程是动态的。程序就是代码,但是进程会涉及到状态的转换,就绪、阻塞和运行之间的切换,这个过程是动态的
- 2,进程是程序的一次执行过程。
- 3,程序和进程不是一一对应的,即以下两点
- 一个程序对应多个进程-->多开 word程序打开不同的文档
- 一个进程对应多个程序-->UI界面进程:QQ 360 LOL
进程的特征
- 1,并行
- 2,异步
- 3,动态性:状态的转换;存储在PCB
- 4,结构性:(描述,组织) 进程 = 程序+PCB;程序:指令段(程序段)和数据段
- 5,独立性:资源分配,给每一个进程分配的空间都是隔离的
进程的结构
编译
- 编译过程中,将.c文件转化为.o文件,将内部代码转化为程序段和数据段,具体转化如下:
- a+b -> 3+2;其中a是变量名字,在编译的时候,所有的数据会汇聚在一起,所有的指令也会汇聚在一起。将数据存储到数据段,指令存储到程序段(指令段)。
链接
- 将.o文件中的所有数据段放在一起,所有的程序段放在一起。然后形成exe运行程序
- 程序运行的时候,将程序代码从磁盘拷贝到内存中, 也就是将数据段和程序段从磁盘复制到内存中,并且创建一个pcb模板,记录到内存中
PCB
- 运行软件,将程序从磁盘拷贝到内存(将其指令段和程序段拷贝到内存上)上运行的同时会创建一个PCB(档案),PCB
- PCB是进程存在的唯一标识
- PCB存储的内容:
- 进程标识符:唯一性,进程的数字标识,数字代表程序
- 进程的当前状态:新建、就绪、堵塞、运行、结束
- 进程的优先级:VIP,用于后面的程序调度
- 代码的入口地址:程序由磁盘拷贝到内存中,入口的地址是指拷贝到内存中的起始地址,指向内存
- 代码的外存地址:标识本段代码是从磁盘哪个区域拷贝过来的,指向磁盘
- 进入内存的时间:从磁盘拷贝到内存的完成的时间
- 代码段指针:指向代码段
- 数据段指针:指向数据段
- 堆栈指针:CPU在不同进程之间切换,用于保存现场信息
进程的状态与控制
- 就绪:使用PCB里面的PID代表进程,使当前状态为ready,标识就绪;使用pcb进行排队
- PCB :process control block,通过调整PCB内部参数的数值,控制不同的进程
- 进程状态转换图-目的:便于OS监控和调度
- *进程程序运行 需要同时具备 PCB + 内存 + CPU
- 每种状态拥有了哪些资源?
- 什么时候需要状态装换?
- 状态装换需要做什么事情?(进程的控制)
- 1,分配(申请) PCB + 内存 + CPU
- 2,回收 PCB + 内存 + CPU
- 3,修改PCB 中进程的当前状态
- 例子
- 点击QQ,CPU将代码复制到内存,并且开辟QQ_PCB,并修改当前状态为ready,由新建状态变成了就绪状态;通过pcb内部代码运行的入口地址,找到QQ程序的入口地址,cpu分配,由就绪状态变成了运行状态,改状态信息为run。cpu运行一段时间就会由一个程序跳转到另外一个程序,假设QQ占有的cpu时间到了,就会释放cpu,cpu会到360进程,因此qq从运行状态变成了就绪状态。
- QQ发消息,因为发消息需要网卡,发消息的时候会释放CPU,由由运行状态变成阻塞block状态,当得到I/o请求,将阻塞状态变成就绪状态
- 关闭qq程序或者异常退出,会使得qq进程终止,归还 内存、删除pcb,交还CPU,注意顺序问题
进程之间通信 IPC(Inter process communication)
os实现进程之间通信
- 1,为什么要通信?安全性和交互性,不同进程之间创建之后,都会在内存上分配一段内存,彼此内存空间不可见(内存隔离),这个目的是为了提高安全性。但是如何在保证安全性的前提下实现进程之间交互,就需要进程通信
- 2,通信的例子?粘贴复制,实现word和txt之间内容拷贝;天影天堂下载电影,自动启动迅雷下载,通信的内容就是电影的链接;网站登录,第三方登录选择QQ登录
- 1,共享内存 2,消息传递 3,管道通信
- 最后一个是管道通信,因为os可以实现和不同进程之间的通信,因此不同进程可以通过连接通信管道,实现进程之间的通信
- 半双工是指每次双方只有一个人讲话,不可以同时说话
三级调度
- 中级调度,比如使命召唤,整个游戏有100G,但是内存只有8G,游戏运行的时候,会根据游戏场景变化和人物的变化,动态切换,即将磁盘数据拷贝到内存中执行,对于执行完的数据,要不丢弃,要不复制到磁盘。解决内部不够问题,以及提高了内存的利用率。
-
高级调度,第一次将数据从磁盘拷贝到内存
- 低级调度,程序已经到达内存,cpu一个一个来执行,抢夺cpu
进程调度算法
FCFS算法 + 调度过程 first come first service
- 算法思想:先来先服务,一次运行一个程序,只有前面的程序结束之后,才会运行下一个程序
- 调度方式:不可剥夺,非抢占(抢占cpu)。非抢占,主动放弃;抢占,是被迫放弃。按照磁盘拷贝到内存的顺序,PCB形成一个队列,按照这个队列依次执行程序。只有前面的程序释放,后面的程序才有机会得到cpu来执行。
- 调度时机:一个进程结束
- 特点 : 利长不利短,利于需要占据cpu长的程序,不利于占用cpu短的程序
- 利CPU忙,不利I/O忙;因为排队,CPU不停歇,非常忙碌;如果io频繁,会增加大量的I/O时间
- 不利分时、实时系统;分时:cpu在不同的进程之间切换;实时,立刻调动cpu到指定的进程执行。FCFS算法不满足分时和实时系统以上的条件
- 典型案例:打印机 银行窗口
时间片轮转算法 + 调度过程
- 算法思想:分时间轮流获取CPU(按照队列的顺序),循环队列,适用于分时操作系统,每个进程运行指定的时间片长度然后释放cpu
- 调度方式:可剥夺,抢占的方式
- 调度时机:时间片用完(抢占);程序结束(主动,非剥夺)
- 程序的运行时间如何得到的? 利用cpu的频率,得到一个周期的时间 (1/n = T),然后利用计时器(计数器)不断计数,从而得到一个时间,也就是每个进程占用执行多长时间,10ms。
- 特点:1,时间片大小很讲究,不能太大,也不能太小
- 2,时间片太大,退化为FCFS
- 3,时间片太小,时空开销很大,
- 4,适用于分时系统
SJF算法 短作业优先
- 算法思想:优先选择短作业,运行时间由程序员提供
- 调度方式:非剥夺 非抢占
- 调度时机:程序结束的时候;阻塞时I/O请求
- 特点:
- 1,利短不利长(长饥饿)
- 2,不可以保证紧迫作业及时运行,(用户、程序员可能提供虚假的运行时间)
- 3,平均等待时间、平均周转时间最少
- 4,吞吐量很大
优先级调度算法 + 调度过程
- 算法思想:优先级级别高的优先执行,PCB里面会存一个信息,表明优先级信息
- 调度方式:抢占式,可剥夺式;非抢占式,非剥夺式
- 调度时机:程序结束的时候;阻塞时(I/O请求);更高优先级进程进入队列的时候
- 特点
- 1,满足紧迫作业的要求
- 2,特别适用于实时系统中
- 3,动态优先级 静态优先级
- *优先级翻转问题
高响应比优先算法
- 算法思想:优先选择响应比高的进程作业
- 调度方式:无 主要用在调度作业中,从磁盘拷贝到内存
- 调度时机 无
- 特点:
- 1,是FCFS(利长不利短)和SJF(利短不利长)的结合体,利用响应比来结合两者,综合利用彼此之间的优势
- 2,克服了饥饿兼顾了长作业,有使得短作业先运行
- 相关概念
- 提交时间:程序从磁盘拷贝到内存,构建完成PCB
- 等待时间:当程序拷贝到内存之后,如果有其他程序正在占用CPU,那么就需要等待,
- 响应比rp = (等待时间 +运行服务时间)/ 运行服务时间
- 占用CPU时间少的进程可以有限执行
- 等待时间一定,服务时间增大,响应比越小,进程运行越靠后执行
- 等待时间一定,服务时间减少,响应比越大,进程运行越靠前执行
- 等待很长时间的进程也会有机会运行
- 服务时间一定,等待时间越大,响应比越大,进程靠前执行
- 服务时间一定,等待时间越小,响应比越小,进程靠后执行
多级反馈队列调度算法
- 算法思想:FCFS + 优先级 + 时间片轮转 (结合体 )
- 调度方式 综合
- 调度时机 综合
- 特点
- 1,短作业优先
- 2,周转时间短
- 3,长作业也会得到处理
例子
- 假设QQ、360和LOL一次来处理,分成5个级别,只有一次CPU,在第一级CPU每次执行10分钟,当QQ转型完成之后,会在第二级排队等待,cpu会执行360 10分钟,360运行完10分钟会在第二级等待,cpu执行LOL。如果第一级没有等待程序,cpu会到第二级一次执行,第二级的时间片会比第一级的时间片长,执行方式和上面一致,直到有程序执行完退出。
甘特图
- 生产计划进度图
- 描述多个进程之间的进度关系
调度准则介绍
1,cpu利用率 ,尽可能忙碌 FCFS
- 11到13阶段 QQ和LOL都没有占用CPU,属于cpu空闲
- 空闲率 = (13 - 11)/ 30
- 使用率 = 1 - 空闲率
2,吞吐量
- 一个程序开始到结束算一个,计算单位时间内完成程序的数量。
- SJF算法:尽可能使执行时间最短的优先执行,因此吞吐量最大
3,周转时间
- 结束时间到提交时间的时间差就是周转时间
- 平均周转时间 = 所有进程的周转时间 / 进程的数量
- 带权周转时间 = 周转时间 / 服务时间(运行时间) 永远大于1
- 平均带权周转时间 = 所有进程的带权周转时间 / 进程的数量
4,等待时间
- 开始时间减去提交时间
5,服务时间(运行时间)
- 结束时间减去开始时间
调度准则之评价调度算法
同步互斥逻辑图
并发性 异步性 独立性
- 并发性:多个进程同时执行
- 异步性:cpu执行每个进程的代码行数,处理逻辑不同,不具有预测性
- 独立性:进程之间不通信
临界资源和临界区
- 临界资源:一次只能被一个进程所使用的资源
- 软件层面:共享变量
- 硬件层面:打印机 网卡 键盘
- 和平精英:两个人抢同一把枪,如何判定这把枪属于哪个人?这个枪属于临界资源,需要在前面添加信号量(交通灯),信号量开始和结束的段落是临界区,信号量使得cpu在获取临界资源前进行检查,是否可以占有
- 竞争和互斥相关
- 同步和合作相关,体现在代码执行的运行次序方面
互斥的硬件实现方法
互斥的软件实现方法
单标志法:
- 令牌环网(轮流传递的思想),生死系于别人;对于一个变量进行操作,使用这个变量代表说话人的身份
双标志法
- 每个人有自己的标志
- 但是双方可能同时检查对方的标志,有漏洞,双方同时修改,导致bug,不会同时出现为true的情形,但是会出现同时为false的情形
- 对临界资源,竞争双方先看对方的标志位,如果对方没有对临界资源的抢占,就自己对临界资源进行抢占,并且更新标志位
- 比如A和B抢夺资源,A的标志位为flag,B的标志位为flag;flag为true表示占有资源,flag为false,表示不占有资源。A在对临界资源的抢夺之前,会看B的标志位,如果为true,表明B占有资源,A就不可以抢占资源,如果为false,则抢占资源,并修改标志位,将自己的标志位修改为true
双标志后检查法
- 基于双标志先检查法的优化,因为双方太谦让而导致的bug
- 交换了两行代码的先后顺序
- 先申明自己要抢资源,但是会导致无限等待和饥饿问题
peterson算法
- 真正实现互斥
- 引入一个变量
信号量的由来
- 信号量使cpu在进入临界区之前停下来
- 统一API,p和v操作;p是等待,v是释放的意思
信号量的工作原理
伪代码
信号量实现同步
- 初始的时候,将信号量设为0,当P0进程执行的时候,P(S),本质上是wait(s),s.value-1小于0,进入等待
- cpu执行P1进程,V(s)本质上是signal(s),唤醒P0进程,实现了P1进程优先在P0进程之前执行,因此使用信号量实现了进程之间的同步操作
信号量实现互斥
- cpu先执行P0,后执行P1,不会产生互斥现象
- cpu先执行P1,后执行P0,不会产生互斥现象
- cpu先执行P0,期间执行P1,能达到互斥
- cpu先执行P1,期间执行P0,能达到互斥
同步互斥小口诀
- 画图理解题目
- 判断题目类型
- 分析进程数目 填写进程模板
- 补充基本代码(伪代码)
- 补充PV代码
- 检查调整代码
注意事项
- 代码是一步一步写出来的,代码是反复调整写出来的
- 60%是生产者和消费者模型
- 30%是读者和写者的模型