做网站用哪种编程语言,短网址生成器 python,营销工具,深圳定制衣柜价格ui 操作系统#xff08;二#xff09;进程管理一、进程程序和进程进程控制块#xff08;PCB#xff09;进程的组成进程的特征进程的状态与转换进程状态的转换进程的组织链接方式索引方式进程的控制进程的创建进程的终止进程阻塞进程唤醒进程切换进程通信共享存储消息传递管…ui
操作系统二进程管理一、进程程序和进程进程控制块PCB进程的组成进程的特征进程的状态与转换进程状态的转换进程的组织链接方式索引方式进程的控制进程的创建进程的终止进程阻塞进程唤醒进程切换进程通信共享存储消息传递管道通信二、线程什么是线程线程的属性线程的实现用户级线程内核级线程多线程模型处理机调度高级调度低级调度中级调度调度算法先来先服务FCFS短作业优先高响应比优先时间片轮转优先级调度算法多级反馈队列调度算法三、进程同步和互斥四、死锁死锁产生的必要条件预防死锁静态策略破坏互斥条件破坏不剥夺条件破坏请求和保持条件破坏循环等待条件动态策略安全序列银行家算法死锁的检测和解除死锁的检测死锁的解除一、进程
程序和进程
程序是静态的编译好的二进制文件存储在磁盘中.exe程序
进程是动态的是程序的一次执行过程
进程控制块PCB
进程id。系统中每个进程有唯一的id在C语言中用pid_t类型表示其实就是一个非负整数。进程的状态有就绪、运行、挂起、停止等状态。进程切换时需要保存和恢复的一些CPU寄存器。描述虚拟地址空间的信息。描述控制终端的信息。当前工作目录Current Working Directory。umask掩码。文件描述符表包含很多指向file结构体的指针。和信号相关的信息。用户id和组id。会话Session和进程组。进程可以使用的资源上限Resource Limit。
进程的组成
PCB
进程描述信息进程控制和管理信息资源分配清单处理机相关信息
程序段程序的代码(指令序列) 数据段运行过程中产生的各种数据 (如:程序中定义的变量)
进程的特征
动态性进程是程序的一次执行过程是动态地产生、变化和消亡的并发性内存中有多个进程实体各进程可并发执行独立性进程是能独立运行、独立获得资源、独立接受调度的基本单位异步性各进程按各自独立的、不可预知的速度向前推进,操作系统要提供进程同步机制来解决异步问题结构性每个进程都会配置一个PCB。 结构上看进程由程序段、数据段、PCB组成
进程的状态与转换
进程基本的状态有5种。分别为运行状态、就绪状态、阻塞状态、创建状态、终止状态。
创建态进程正在被创建时它的状态是“创建态”在这个阶段操作系统会为进程分配资源、初始化PCB。
就绪态当进程创建完成后便进入“就绪态”处于就绪态的进程已经具备运行条件但由于没有空闲CPU就暂时不能运行。
运行态如果一个进程此时在CPU上运行那么这个进程处于“运行态”。CPU会执行该进程对应的程序执行指令序列
阻塞态在进程运行的过程中可能会请求等待某个事件的发生如等待某种系统资源的分配或者等待其他进程的响应。在这个事件发生之前进程无法继续往下执行此时操作系统会 让这个进程下CPU并让它进入“阻塞态”当CPU空闲时又会选择另一个“就绪态”进程上CPU运行
终止态一个进程可以执行 exit 系统调用请求操作系统终止该进程。此时该进程会进入“终止态”操作系统会让该进程下CPU并回收内存空间等资源最后还要回收该进程的PCB。当终止进程的工作完成之后这个进程就彻底消失了
进程状态的转换 就绪态-运行态进程被调度 运行态- 就绪态:时间片到或CPU被其他高优先级的进程抢占 运行态- 阻塞态:等待系统资源分配或等待某事件发生(主动行为) 阻塞态-就绪态资源分配到位等待的事件发生(被动行为) 创建态- 就绪态系统完成创建进程相关的工作 运行态-终止态进程运行结束或运行过程中遇到不可修复的错误
进程的组织
链接方式 索引方式 进程的控制
进程的创建
步骤
申请空白PCB为新进程分配所需资源初始化PCB将PCB插入就绪队列
引起进程创建的事件 用户登录分时系统中用户登录成功系统会建立为其建立-个新的进程 作业调度多道批处理系统中有新的作业放入内存时会为其建立-个新的进程 提供服务用户向操作系统提出某些请求时会新建一个进程处理该请求 应用请求由用户进程主动请求创建一个子进程
进程的终止
步骤
从PCB集合中找到终止进程的PCB若进程正在运行立即剥夺CPU将CPU分配给其他进程终止其所有子进程进程间的关系是树形结构将该进程拥有的所有资源归还给父进程或操作系统删除PCB
引起进程终止的事件
正常结束进程自己请求终止(exit 系统调用)异常结束整数除以0、非法使用特权指令然后被操作系统强行杀掉外界干预CtrlAltdelete用户选择杀掉进程
进程阻塞
步骤
找到要阻塞的进程对应的PCB保护进程运行现场将PCB状态信息设置为“阻塞态暂时停止进程运行将PCB插入相应事件的等待队列
引起进程阻塞的事件
需要等待系统分配某种资源需要等待相互合作的其他进程完成工作
进程唤醒
在事件等待队列中找到PCB将PCB从等待队列移除设置进程为就绪态将PCB插入就绪队列等待被调度
引起进程唤醒的事件
等待的事件发生
进程切换
步骤
将运行环境信息进程上下文存入PCBPCB移入相应队列选择另一个进程执行并更新其PCB根据PCB恢复新进程所需的运行环境
引起进程切换的事件
当前进程时间片到有更高优先级的进程到达当前进程主动阻塞当前进程终止 进程通信
共享存储
在linux中使用共享内存的方式来实现共享内存。要让各个进程互斥的进行可以采用加锁或者pv操作。
消息传递
进程间的数据交换以格式化的消息Message为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。 步骤
1进程p发送消息2通过消息队列写入数据通常需要从进程拷贝到内核进程X的pcb消息队列中。3进程X从内核拷贝到进程4然后再从进程中X拷贝到输出文件
管道通信 管道只能采用半双工通信某一时间段内只能实现单向的传输。如果要实现双向同时通信则需要设置两个管道。各进程要互斥地访问管道由操作系统实现当管道写满时写进程将阻塞直到读进程将管道中的数据取走即可唤醒写进程。当管道读空时读进程将阻塞直到写进程往管道中写入数据即可唤醒读进程。管道中的数据一旦被读出就彻底消失。因此当多个进程读同一个管道时可能会错乱。对此通常有两种解决方案①一个管道允许多个写进程一个读进程②允 许有多个写进程多个读进程但系统会让各个读进程轮流从管道中读数据。
二、线程
什么是线程
线程可以理解为“轻量级进程”。线程是一个基本的CPU执行单元也是程序执行流的最小单位。引入线程之后不仅是进程之间可以并发进程内的各线程之间也可以并发从而进一步提升了系统的并发度使得一个进程内也可以并发处理各种任务如QQ视频、文字聊天、传文件引入线程后进程只作为除CPU之外的系统资源的分配单元如打印机、内存地址空间等都是分配给进程的。线程则作为处理机的分配单元。
线程的属性
线程是处理机调度的单位多CPU计算机中各个线程可占用不同的CPU每个线程都有一个线程ID、线程控制块(TCB)线程也有就绪、阻塞、运行三种基本状态线程几乎不拥有系统资源同一进程的不同线程间共享进程的资源由于共享内存地址空间同-进程中的线程间通信甚至无需系统干预同一进程中的线程切换不会引起进程切换不同进程中的线程切换会引起进程切换切换同进程内的线程系统开销很小切换进程系统开销较大
线程的实现
用户级线程 从代码的角度看线程其实就是一段代码逻辑。上述三段代码逻辑上可以看作三个“线程”。 while 循环就是一个最弱智的“线程库”线程库完成了对线程的管理工作如调度。
用户级线程由应用程序通过线程库实现所有的线程管理工作都由应用程序负责包 括线程切换用户级线程中线程切换可以在用户态下即可完成无需操作系统干预。在用户看来是有多个线程。但是在操作系统内核看来并意识不到线程的存在。“用户级线程”就是“从用户视角看能看到的线程”
优缺点 优点用户级线程的切换在用户空间即可完成不需要切换到核心态线程管理的系统 开销小效率高 缺点当一个用户级线程被阻塞后整个进程都会被阻塞并发度不高。多个线程不可 在多核处理机上并行运行。
内核级线程 内核级线程的管理工作由操作系统内核完成。线程调度、切换等工作都由内核负责因此内核级线程的切换必然需要在核心态下才 能完成。操作系统会为每个内核级线程建立相应的TCBThread Control Block线程控制块 通过TCB对线程进行管理。“内核级线程”就是“从操作系统内核视角看能看到的线程”
优缺点 优点当一个线程被阻塞后别的线程还可以继续执行并发能力强。多线程可在多核 处理机上并行执行。 缺点一个用户进程会占用多个内核级线程线程切换由操作系统内核完成需要切换到 核心态因此线程管理的成本高开销大。
多线程模型 一对一模型一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同 数量的内核级线程。 优点当一个线程被阻塞后别的线程还可以继续执行并发能力强。多线程可在多核 处理机上并行执行。 缺点一个用户进程会占用多个内核级线程线程切换由操作系统内核完成需要切换到 核心态因此线程管理的成本高开销大 多对一模型多个用户级线程映射到一个内核级线程。且一个进程只被分配一个内核级 线程。 优点用户级线程的切换在用户空间即可完成不需要切换到核心态线程管理的系统 开销小效率高 缺点当一个用户级线程被阻塞后整个进程都会被阻塞并发度不高。多个线程不可 在多核处理机上并行运行 多对多模型n 用户及线程映射到 m 个内核级线程n m。每个用户进程对应 m 个内核级线程。克服了多对一模型并发度不高的缺点一个阻塞全体阻塞又克服了一对一模型中一个用户进程占用太多内核级线程开销太大的缺点
处理机调度
高级调度
高级调度作业调度。按一定的原则从外存的作业后备队列中挑选一个作业调入内存并创建进程。每个作业只调入一次调出一次。作业调入时会建立PCB调出时才撤销PCB。
低级调度 低级调度进程调度/处理机调度按照某种策略从就绪队列中选取一个进程将处理机分配给它。
中级调度
内存不够时可将某些进程的数据调出外存。等内存空闲或者进程需要运行时再重新调入内存。暂时调到外存等待的进程状态为挂起状态。被挂起的进程PCB会被组织成挂起队列 中级调度内存调度—按照某种策略决定将哪个处于挂起状态的进程重新调入内存。一个进程可能会被多次调出、调入内存因此中级调度发生的频率要比高级调度更高。 三种调度的联系、对比
调度算法
先来先服务FCFS 短作业优先 高响应比优先 时间片轮转 优先级调度算法 多级反馈队列调度算法 三、进程同步和互斥
进程的同步并发性带来了异步性有时需要通过进程同步解决这种异步问题。有的进程之间需要相互配合地完成工作各进程的工作推进需要遵循一定的先后顺序。
进程互斥对临界资源的访问需要互斥的进行。即同一时间段内只能允许一个进程访问该资源
临界资源分为四个部分
进入区检查是否可进入临界区 若可进入需要上锁”临界区访问临界资源的那段代码退出区负责解锁剩余区其余代码部分
需要遵循的原则
空闲让进临界区空闲时 应允许一个进程访问忙则等待临界区正在被访问时其他试图访问的进程需要等待有限等待要在有限时间内进入临界区保证不会饥饿让权等待进不了临界区的进程要释放处理机防止忙等
四、死锁
死锁各进程互相等待对方手里的资源导致各进程都阻塞无法向前推进的现象 饥饿由于长期得不到想要的资源某进程无法向前推进的现象。 死循环某进程执行过程中一直跳不出某个循环的现象。
死锁产生的必要条件
互斥条件只有对必须互斥使用的资源的争抢才会导致死锁不剥夺条件进程所获得的资源在未使用完之前不能由其他进程强行夺走只能主动释放。请求和保持条件进程已经保持了至少一个资源但又提出了新的资源请求而该资源又被其他进程占有此时请求进程被阻塞但又对自己已有的资源保持不放。循环等待条件存在一种进程资源的循环等待链链中的每一个进程已获得的资源同时被下一个进程所请求。
预防死锁
静态策略
破坏互斥条件
互斥条件只有对必须互斥使用的资源的争抢才会导致死锁。
如果把只能互斥使用的资源改造为允许共享使用则系统不会进入死锁状态。比如: SPOOLing技术。操作系统可以采用 SPOOLing 技术把独占设备在逻辑上改造成共享设备。比如用SPOOLing技术将打印机改造为共享设备 破坏不剥夺条件
不剥夺条件进程所获得的资源在未使用完之前不能由其他进程强行夺走只能主动释放。
方案一当某个进程请求新的资源得不到满足时它必须立即释放保持的所有资源待以后需要时再重新申请。也就是说即使某些资源尚未使用完也需要主动释放从而破坏了不可剥夺条件。方案二当某个进程需要的资源被其他进程所占有的时候可以由操作系统协助将想要的资源强行剥夺。这种方式一般需要考虑各进程的优先级比如剥夺调度方式就是将处理机资源强行剥夺给优先级更高的进程使用
破坏请求和保持条件
请求和保持条件进程已经保持了至少一个资源但又提出了新的资源请求而该资源又被其他进程占有此时请求进程被阻塞但又对自己已有的资源保持不放。
可以采用静态分配方法即进程在运行前一次申请完它所需要的全部资源在它的资源未满足前不让它投入运行。一旦投入运行后这些资源就一直归它所有该进程就不会再请求别的任何资源了。
破坏循环等待条件
循环等待条件存在一种进程资源的循环等待链链中的每一个进程已获得的资源同时被下一个进程所请求。 可采用顺序资源分配法。首先给系统中的资源编号规定每个进程必须按编号递增的顺序请求资源 同类资源即编号相同的资源一次申请完。
原理分析一个进程只有已占有小编号的资源时才有资格申请更大编号的资源。按此规则已持有大编号资源的进程不可能逆向地回来申请小编号的资源从而就不会产生循环等待的现象。
动态策略
安全序列
所谓安全序列就是指如果系统按照这种序列分配资源则每个进程都能顺利完成。只要能找出一个安全序列系统就是安全状态。当然安全序列可能有多个。
如果分配了资源之后系统中找不出任何一个安全序列系统就进入了不安全状态。这就意味着之后可能所有进程都无法顺利的执行下去。当然如果有进程提前归还了一些资源那系统也有可能重新回到安全状态不过我们在分配资源之前总是要考虑到最坏的情况。
如果系统处于安全状态就一定不会发生死锁。如果系统进入不安全状态就可能发生死锁处于不安全状态未必就是发生了死锁但发生死锁时一定是在不安全状态因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态以此决定是否答应资源分配请求。这也是“银行家算法”的核心思想
银行家算法
死锁的检测和解除
死锁的检测
为了能对系统是否已发生了死锁进行检测必须
用某种数据结构来保存资源的请求和分配信息提供一种算法利用上述信息来检测系统是否已进入死锁状态 死锁的解除
解除死锁的主要方法有
资源剥夺法。挂起暂时放到外存上某些死锁进程并抢占它的资源将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿。撤销进程法或称终止进程法。强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源。这种方式的优点是实现简单但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间已经接近结束了一旦被终止可谓功亏一篑以后还得从头再来。进程回退法。让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息设置还原点。