进程与线程
进程 PROCESS
进程是具有一定独立功能的程序在一个数据集合上的一次动态执行过程,而程序只是静态的代码(指令集合)
一个进程包含的内容:程序所有的状态信息
- 程序的代码
- 程序处理的数据
- 程序计数器中的值,指示下一条将要执行的指令
- 一组通用寄存器的当前值,堆、栈
- 一组系统资源
进程与程序联系
- 程序是产生进程的基础
- 程序的每次运行构成不同进程(处理数据不同可能导致结果不同)
- 进程是程序功能的体现
- 通过多次执行,一个程序可对应多个进程,通过调用关系,一个进程可包括多个程序
进程与程序区别:
- 进程是动态的,程序是静态的
- 程序是有序代码的集合
- 进程是程序的执行
- 进程有核心态(如读写操作需要在内核中执行)/用户态
- 进程是暂时的,程序是永久的。
- 进程包含程序、数据、进程控制状态
类比:
CPU == 厨师 ,数据 == 原料,程序 == 食谱,进程 == 做蛋糕
进程特点:
动态性:动态创建与结束
并发性:一段时间内有多个进程被执行(针对单个CPU而言,多CPU才是并行)
独立性:多个进程之间的工作并不会相互影响,独立获取资源,独立接受调度的基本单位。(引入线程后,线程会变成独立接受调度的基本单位)
制约性:不会把资源一直分配给某一进程
异步性:各个进程按照各自独立的、不可预知的速度向前推进,并发让执行结果不确定,需要进程同步机制
进程ID PID:唯一的、不重复的
用于区分不同进程
进程控制块 PCB:进程存在的唯一标志
PCB包含信息:
- 进程表示信息,如本进程标识PID,本进程产生者标识,用户标识UID
- 处理机状态信息保护区。保存进程运行现场信息,如用户可见寄存器,控制和状态寄存器,栈指针。
- 进程控制信息,调度和状态信息,进程间通信信息,储存管理信息,进程所有资源,有关数据结构连接信息。
PCB组织方式
- 链表,方便修改
- 数组,便于查找
上下文切换
指停止当前运行的进程,并且调度其他进程
需要储存寄存器、CPU状态
进程状态 State
进程的生命周期管理
进程创建、进程运行、进程等待、进程唤醒、进程结束
进程状态变化模型
运行状态、就绪状态、等待状态
处理机资源代表CPU资源,如果有多个cpu则可以同时运行多个线程
进程控制原语,需要完成的操作
- 更新PCB中的信息
- 将PCB插入合适的队列
- 分配/回收资源
进程挂起模型
挂起:进程不占用内存空间
进程通信
各个进程拥有的内存地址空间相互独立,进程通信的原理是申请和使用共享内存区,进程对于共享内存区访问是互斥的,不可同步进行。
或者通过消息传递的方式通信
或者通过管道(先进先出的共享内存区)
线程 THREAD
比进程更小的独立运行基本单位,一个基本的CPU执行单元,也是执行流的最小单位
特点:并发,共享相同的地址空间(页表相同)
定义:进程当中的一条执行流程
进程 | 线程 | |
最小单位 | 资源分配 | CPU调度 |
占有资源 | 磁盘、网络 | 寄存器、栈 |
切换花销 | 大 | 小 |
崩溃 | 不影响其他进程 | 影响整个进程的其他线程 |
线程的实现
用户线程
操作系统只看到进程,看不到的线程,线程由用户级的线程库函数来完成线程管理
如一个while循环中加入if分支,让线程实现交替运行
优点:
不用CPU切换到内核态,开销会变小。
缺点:
如果一个线程发起系统调用而阻塞,则整个进程在等待。
一个线程开始运行后,除非主动交出CPU使用权,否则其他线程无法运行,
并行程度不高,多个线程也不能在多核处理机上并行运行
内核线程
内核管理起来的线程
线程的创建、中止、切换都是通过系统调用/内核函数方式进行,开销大
轻量级进程
内核支持用户线程,每个量级进程由一个单独的内核线程来支持
调度制度
挂起和阻塞区别:
挂起态是将进程映像调到外存去了,而阻塞态下进程映像还在内存中。
进程调度的时机
进程调度的方式
- 非剥夺调度方式:又称非抢占方式。即,只允许进程主动放弃处理机。在运行过程中即便有更紧迫 的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。适合早期的批处理系统
- 剥夺调度方式:又称抢占方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进 程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。适合实时和分时操作系统
调度算法评价指标
- CPU利用率:CPU “忙碌”的时间占总时间的比例。
- 系统吞吐量:单位时间内完成作业的数量
- 周转时间:是指从作业被提交给系统开始,到作业完成为止的这段时间间隔。(作业在外存后备队列上等待作业调度(高级调度)的时间、进程在就绪队列上等 待进程调度(低级调度)的时间、进程在CPU上执行的时间、进程等待I/O操作完成的时间。后三项 在一个作业的整个处理过程中,可能发生多次。)
- 等待时间:指进程/作业处于等待处理机状态时间之和,进程等待时间指指进程建立后等待被服务的时间之和,等待I/O的时间不被计入,
- 响应时间:指从用户提交请求到首次产生响应所用的时间。
调度算法
算法名称 | 规则 | 可抢占? | 优点 | 缺点 | 导致饥饿? | 补充 |
FCFS | 等待最久的先相应(顺序排队) | 非抢占式 | 公平;实现简单 | 对短作业不利,不考虑运行时间 | 不会 | |
SJF/S PF | 执行时间最短的先相应 | 默认为非抢占式, 也有SJF的抢占式 版本最短剩余时间 优先算法(SRTN) | “最短的”平均等待 /周转时间; | 对长作业不利,可 能导致饥饿;难以 做到真正的短作业 优先 | 会 | |
HRRN | 把等待时间和执行时间同时考虑 | 非抢占式 | 综合考虑的等待时间和运行时间 | 不会 | ||
时间片轮转 | 每个任务只能执行一个时间片,随后强制跳转 | 抢占式 | 公平,适用 于分时系统,进程及时得到相应 | 频繁切换有开销, 不区分优先级 | 不会 | |
优先级调度 | 时选择优先级最高的作业/进程 | 有抢占式的,也有非抢占式的。 | 灵活调整各种进程被服务的时间 | 可能导致饥饿 | 会 | |
多级反馈队列 |
1. 设置多级就绪队列,各级队列优先级从高到低,时间片从小到大 2. 新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时 间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。 如果此时已经是在最下级的队列,则重新放回该队列队尾 3. 只有第 k 级队列为空时,才会为 k+1 级队头的进程分配时间片 |
抢占式 | 平衡优秀 | 可能导致饥饿 | 会 |
进程互斥与同步
由于并发进程的异步性,指令的推进顺序不可预知。如果需要实现相对固定的推进顺序,就需要用到进程同步机制。
同步:直接制约关系,协调进程某些位置上的工作次序而产生的制约关系。
互斥:互斥共享的对立面不是同步而是同时共享,进程互斥指当一个进程访问某临界资源 时,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源之后, 另一个进程才能去访问临界资源。
临界区是进程中访问临界资源的代码段。
进入区和退出区是负责实现互斥的代码段。
软件实现互斥
单标志的问题是没锁,双标志的问题是无法检查的同时就上锁。
皮特森的特点是,大家要用就说,同时表示谦让,最后谦让的一方被迫要谦让。
硬件互斥
信号量
用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互 斥、进程同步。
信号量其实就是一个变量 ,可以用一个信号量 来表示系统中某种资源的数量。
原语是一种特殊的程序段,其执行只能一气呵成,不可被中断。
这对原语是wait(S) 原语和 signal(S) 原语或写为 P(S)、V(S)
整形信号量会导致忙等,即进不了临界区的进程会一直占用处理机资源。
记录型信号量,只要有进程需要使用资源,就把信号量减1,如果此时信号量小于0则执行block进入阻塞态,同时被插入等待队列。如果一个进程执行完此时信号量小于0,则会唤醒等待队列中的一个进程。
死锁 DEADLOCK
死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象。(阻塞态或就绪态)
饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。比如:在短进程优先(SPF)算法 中,若有源源不断的短进程到来,则长进程将一直得不到处理机,从而发生长进程“饥饿”。(阻塞态或就绪态)
死循环:某进程执行过程中一直跳不出某个循环的现象。有时是因为程序逻辑 bug 导致的,有时是 程序员故意设计的。(运行态)
发生死锁的情况:
- 对系统资源的竞争。各进程对不可剥夺的资源(如打印机)的竞争可能引起死锁,对可剥夺的资 源(CPU)的竞争是不会引起死锁的。
- 进程推进顺序非法。请求和释放资源的顺序不当,也同样会导致死锁。例如,并发执行的进程P1、 P2 分别申请并占有了资源 R1、R2,之后进程P1又紧接着申请资源R2,而进程P2又申请资源R1, 两者会因为申请的资源被对方占有而阻塞,从而发生死锁。
- 信号量的使用不当也会造成死锁。如生产者-消费者问题中,如果实现互斥的P操作在实现同步的 P操作之前,就有可能导致死锁。(可以把互斥信号量、同步信号量也看做是一种抽象的系统资源)
死锁的处理策略:
预防:
破坏其中一个或几个条件。
破坏互斥条件:把互斥资源改成共享资源,如加入一个进程管理打印机资源,给其他进程提供打印队列服务。
破坏不剥夺条件:请求的资源得不到满足时,需要立即释放保持的资源,或优先级高的资源可以剥夺优先级低的资源。
破坏请求和保持条件:可以采用静态分配的方法,进程在运行前一次申请完它所需要的全部资源
破坏循环等待条件:采用顺序资源分配法,占有小编号的资源的申请大编号资源
避免:
安全性算法步骤: 检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列, 并把该进程持有的资源全部回收。 不断重复上述过程,看最终是否能让所有进程都加入安全序列。
检测和解除:
posted on 2022-04-06 15:31 MIXTAPE_208 阅读(32) 评论(0) 编辑 收藏 举报