进程调度与死锁
发布日期:2021-09-12 06:44:51
浏览次数:1
分类:技术文章
本文共 2301 字,大约阅读时间需要 7 分钟。
1.进程调度的功能
记录系统中所有进程的状态、优先数和资源的需求情况 确定调度算法。决定将CPU分配给哪个进程及多长时间 分配处理机给进程2.进程调度方式
非抢占式 :直到进程完成或因为某时间而不能运行时,才将CPU分配给其他进程 。通常用在批处理系统中。主要优点是简单、系统开销小 抢占式 :当一个进程正在执行,系统可以基于某种策略剥夺CPU给其他进程。剥夺的原则有:优先权原则、短进程优先原则和时间原则。主要用于分时系统和实时系统,以便及时响应各进程请求3.引进进程调度的时机
正在执行的进程正确完成/由于错误终止运行(陷阱和中断) 执行的进程提出I/O请求,等待其完成 分时系统中,进程时间片用完 按照优先级调度时,有更高的优先级进程变为就绪时(抢占方式) 发生阻塞(执行的进程执行了wait、阻塞原语和唤醒原语时)4.进程调度算法的评价准则
1)面向系统的调度性能准则 吞吐量 处理及利用率 各个设备的均衡利用 2)面向用户的调度性能准则 周转时间 响应时间 截止时间 公平性 优先级 3)调度算法本身的调度性能准则 易于实现 执行开销比多级反馈队列算法(多列轮转法)
设置多个就绪队列,分别赋予不同的优先级,队列1的优先级最高,其他逐渐降低,每队列分配不同的时间片,规定优先级越低时间片越长 (1)新进程就绪后,先投入队列1的末尾,按FCFS算法调度(先进先出调度算法,按进程进入就绪队列的先后次序,分派cpu,当前进程占用cpu,知道执行完或阻塞,才出让cpu(非抢占方式),在进程唤醒后(如i/o操作完成),并不立即恢复执行,通常等到当前进程出让cpu),(2)若一个时间片未能执行完,则降低投入到队列2的末尾,(3)以此类推,降低到最后的队列,则按时间片轮转算法(通过时间片轮转,提高进程并发性和响应时间特性,从而提高资源利用率。将就绪进程按FCFS原则,排成一个队列,每次调度时cpu分派给队首进程,执行一个时间片,时间片结束时,暂停当前进程的执行,将其送到队尾,并通过cpu现场切换执行当前队首进程。进程可以未使用完一个时间片,就让出cpu,比如阻塞)直到调度完成。(4)进程由于等待事件而放弃cpu后,进入等待队列,一旦等待的事件发生,回到原来的就绪队列。 仅当较高优先级的队列为空,才调度较低优先级的队列中进程执行。如果进程执行时有新进程进入较高优先级的队列,则抢先执行新进程,被抢先的进程被投入到原队列末尾 为适应一个进程在不同的时间段的运行特点,I/O完成时,提高优先级;时间片用完时,降低优先级CPU调度过程
保存现场:顺序保存,最后一步保存PSW(程序状态) 选择要运行的程序 如果没有就绪进程,系统会安排一个闲逛进程(idle),没有其他进程时,该进程一直运行,在执行过程中可接受中断 恢复现场:最后一步恢复选中进程的PSW闲逛进程——idle进程
idle 进程,也就是0号进程,不参与schedule机制,当系统中没有任何进程可以调度(就绪队列为空),cpu会进入该进程。多cpu系统中每个cpu一个idle。
void cpu_idle (void) { … while (1) { void (*idle)(void) = pm_idle; if (!idle) idle = default_idle; while (!current->need_resched) idle(); schedule(); … }内核初始化后,所有core都会进入该函数。pm_idle
为电源管理idle函数不讨论。
`default_idle`。#define safe_halt() __asm__ __volatile__("sti; hlt": : :"memory")
进入default_idle
后,会执行hlt, 也就是硬件停机,处于该状态时cpu不能执行任何指令,只有通过中断请求才能唤醒。
need_resched
就会进入schedule
又开始正常进程调度。否则继续idle。 系统空闲进程,一般优先级最低,系统没事干的时候就执行它。实际上在某些系统会在idle中处理一些内存回收之类的事情。其存在的原因是为了让调度器有事情做,要不然所有的进程全挂起了调度器会很郁闷的。
产生死锁的原因:
1)竞争资源引起死锁 永久性资源:可以给多个进程多次使用(可再用资源)——剥夺兴资源(CPU,内存),非剥夺性资源(磁带机、打印机) 临时性资源:只可使用一次的资源(可消耗性资源);如信号量,中断信号,同步信号 2)进程推进顺序不当 对资源采取“申请——分配——使用——释放”模式,由于推进不当两进程都要申请对方的资源 进程争夺资源有可能产生死锁,但不一定就会死锁,其取决于进程推进的速度和对资源的请求的顺序。死锁是一种与时间有关的错误产生死锁的必要条件:
1)互斥条件:一个资源每次只能给一个进程使用 2)不可剥夺条件:资源申请者不能强行的从资源占有者中夺取资源,资源只能由占有者资源释放 3)请求和保持条件:在申请新的资源的同时保持对原有资源的占有 4)循环等待条件:存在一个进程—等待资源环形链死锁的预防
预防死锁的方法是破坏死锁的四个必要条件之一死锁的避免
允许进程动态的申请资源,系统在进行资源分配之前,先计算资源分配的安全性。若此次分配不会导致系统从安全状态向不安全状态转换,便可将资源分配给进程;否则不分配资源,进程必须阻塞等待。从而避免发生死锁 避免死锁的实质是使系统不进入不安全状态转载地址:https://blog.csdn.net/weixin_36888577/article/details/79944997 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年04月18日 12时57分52秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
C++面经总结之《Effective C++》(二)
2019-04-27
这是什么“虎狼之词”啊!!!程序员的健康问题,看一线老中医怎么说!!!
2019-04-27
打开我的收藏夹 -- Python数据分析杂谈
2019-04-27
linux shell — 6.初识 EXT2 文件系统
2019-04-27
python - 【用户、商品】【购买、浏览】数据处理
2019-04-27
python - sql + pandas 与 sqlite 结合
2019-04-27
python - 使用sql 分析(06 - 15)国内各省GDP
2019-04-27
python - 抓取汇率数据分析美元和欧元对RMB的变化曲线
2019-04-27
python 数据科学 - 【回归分析】 ☞ 线性回归(2)
2019-04-27
设计模式——工厂模式
2019-04-27
Unity中实现有限状态机FSM
2019-04-27
Unity中实现反弹
2019-04-27
U3D游戏开发框架(九)——事件序列
2019-04-27
Unity中解决“SetDestination“ can only be called on an active agent that has been placed on a NavMesh
2019-04-27
Unity中的刚体
2019-04-27
Unity中的坐标转换
2019-04-27
Unity中为什么不能对transform.position.x直接赋值?
2019-04-27
使用对象池优化性能
2019-04-27
Lua(一)——Lua介绍
2019-04-27
Lua(二)——环境安装
2019-04-27