处理及制度与死锁的学习报告

1.处理机调度的基本概念:

  在多道程序环境下,内存中存在的进程数目往往大于处理机的数目,因此,需要通过处理机的调度,动态地将 CPU 按照某种算法分配给处于就绪状态的一个进程。

  书上 P85 页有这样的一段描述:

  在多道程序系统中,调度的实质是一种资源分配,处理机调度是对处理机资源进行分配。处理机调度算法是指根据处理机分配策略所规定的处理机分配算法。在多道批处理系统中,一个作业从提交到获得处理及执行,直至作业运行完毕,可能需要经历多级处理机调度。

  一个作业从提交开始,往往要经历三级调度:高级调度、中级调度、低级调度。

  上面依次写的调度顺序与书中写的(高级、低级、中极)稍有不符,是因为我更偏向于这样的既定顺序。中级调度实际上也可以称为交换调度,它的作用是:在内存和外存对换区之间按照给定的策略选择进程交换,也为了解决内存紧张问题,提高内存的利用率和系统吞吐量。书中的编排顺序让我觉得中级调度是后来才引入的制度,我也没有百度到,再根据下图的信息我就暂时这样认为吧。

  以上对于调度有了简单的理解,那么引起进程调度的因素有哪些呢?

以下内容均摘自《计算机操作系统》学习指导与题解 P71 :

1)正在执行的进程正常终止或异常终止。

2)正在执行的进程因某种原因而阻塞。具体包括:

  ● 提出 I/O 请求后被阻塞;

  ● 在调用 wait 操作时因资源不足而阻塞;

  ● 因其他原因执行 block 原语(理解为进程阻塞命令)而阻塞等。

3)在引入时间片的系统中,时间片用完。

4)在抢占调度方式中,就绪队列中某进程的优先权变得比当前正在执行的进程高,或者有优先权更高的进程进入就绪队列。

2.CPU 调度(进程调度)的直观想法:

  调度其实可以说得很简单,就是在就绪队列中有一堆进程,我们究竟应该选择谁来执行的问题。我们可以举一些生活中一些实际需要调度的地方,比如银行中:

  1)考虑第一种调度策略:谁先进入,就先调度谁。

  这样做的好处是简单有效,谁排在第一个就先调度谁,很简单也很公平,但是随之而来的一个问题:如果一个只是想简单询问业务的人应该怎么办呢?这个人只是想问一个问题,让他排队或许会显得有些不公平,也有些不如意,所以基于这一点思考又有第二种策略。

  2)任务短的可以适当优先。

  这个策略呢就是短任务,也就是简单询问业务的人可以适当的优先,但是呢,你怎么知道这个人会询问多长的时间呢,如果这个人询问的时间越来越长怎么办?所以又要适当的降低他的优先级,伴随的另一个问题是:如果客户占用的时间长是因为银行需要用户填写一张很长的表,又该怎么办呢?因为客户是一个短任务,而且询问时间很短,但是银行又要求用户填写很长的表,那降低他的优先级又显得他很吃亏,这样也不太合适。

  实际银行所用的调度系统呢,肯定比我这里所讨论和臆想的要复杂得多,这里只是对调度本身进行了简单的讨论,那么总结关于 CPU 调度的话题,是没有穷尽的,我们只需要关心,面对一个实际的操作系统中的各项进程,我们应该怎样调度,用怎样的算法相对合适,相对的合理。

3.如何设计调度算法:

  上面对调度这个问题进行了简单的讨论,在这里想对算法这个问题也进行一个简单的讨论:

  1)什么样的调度算法算是一个好的算法:

  对比银行的调度系统,为什么说它好呢,是因为客户感到满意,那么衡量调度算法的好坏就在于是否让我们操作系统中的各项进程满意。怎样才能让进程满意呢?进程就是一段程序执行,而这段程序是由上层用户交给系统的,那么怎样让上层用户满意呢,那就是一个字:。时间复杂度是衡量一个程序的执行一个很重要的指标,所以最核心的问题还是时间。这里所说的时间有:①周转时间:即从任务进入到任务结束所用的时间;②响应时间:从操作发生到响应,例如点击一次鼠标;③吞吐量(系统内耗时间):完成的任务量。所以要让进程满意,就要让这些个时间变短。

  这里只是提及一下,不做深入了解,看到一个关于系统内耗时间减小的有趣描述:比如你进了银行做了出纳,你总不能不干活一顿唠嗑,对吧。

  2)怎样做到合理:

  操作系统中做 CPU 调度最关键的是需要折中还有综合。

  在操作系统中有很多各种类型的任务,它们的关注点不同,譬如前台任务和后台任务:前台任务关注响应时间,而后台任务关注周转时间。这很容易理解,我把前台任务简单的理解为正在播放的 PPT,把后台任务简单的理解为一个计算器,那么正在播放的 PPT 最重要的就是响应的速度,你不能点一下播放要等很久才切换到下一张,这样首先给用户的体验就非常差,而后台执行的计算器不用在乎这个,只关心整个程序计算的时间,即周转时间。

  还有就是各种类型的任务的目标不同,这就会导致调度的时候可能会出现一些矛盾。

  这些的不同就需要操作系统在调度过程中进行折中和综合,这让操作系统调度变得复杂。

4.一些调度算法的简单了解:

  1)先来先服务算法(FCFS):First Come First Served

选择最先进入就绪队列的进程投入执行。

  2)短作业优先(SJF):Shortest Job First

选择就绪队列中估计运行时间最短的进程投入执行。

  3)优先级调度算法(PSA)

系统根据进程的紧迫程度赋予每个进程的一个优先权,并选择就绪队列中优先权最高的进程投入执行。

一个故事:1973年关闭的 MIT 的 IBM 7094 时,发现有一个进程在 1967 年提交但一直未执行。

  4)高响应比优先调度算法(HRRN):

该算法实际上是一种动态优先权调度算法,它以相应比作为作业或进程的动态优先权。

相应比 = 响应时间/要求服务时间 = (等待时间 + 要求服务需时间)/ 要求服务时间

  5)时间片轮转发(RR):

时间片是指一个较小的时间间隔,通常为 10 ms ~ 100 ms。在简单的轮转算法中,系统将所有的就绪队列中的进程按 FIFO 规则排成一个队列,将 CPU 分配给队首进程,且规定它最多只能连续执行一个时间片,若时间片用完时进程仍未完成,也必须将其插入就绪队列末尾,并把 CPU 交给下一个进程。

  6)多级队列调度算法

将系统中不同类型或者性质的就绪进程固定分配到不同的就绪队列中,每个就绪队列可采用自己的调度算法;而在队列之间,通常采用固定优先权的抢占调度方式。

  7)多级反馈队列调度算法(FB):这里不作论述。

5.一个实际的 schedule 函数:

  上面论述了在 CPU 调度中一个比较重要的主题就是折中和综合。这里对一个实际的调度函数 schedule 进行一个简单的研究:

 1 void Schedule(void)    //在kernel/sched.c中
 2 {
 3     while(1){
 4         c = -1;    next = 0;    i = NR_TASKS;
 5         p = &task[NR_TASKS];
 6         while(--i){ if((*p->state == TASK_RUNNING && (*p)->counter>c)
 7             c = (*p)->counter , next = i;    }
 8         if(c) break;    //找到了最大的counter
 9         for(p=&LAST_TASK;p>&FIRST_TASK;--p)
10             (*p)->counter = ((*p)->counter>>1)
11                                         + (*p)->priority;}
12         switch_to(next);}

第4行作初始化,没什么讲的。

第5行,将 p 设置成 PCB 块的末尾。

第6行,讲 p 序列从后往前移,判断,如果进程的状态为 TASK_RUNNING 就绪状态且 p 的时间片不为0,那么就把 c 设置为当前的时间片大小,通过这样的 while 循环就找到了最大的 counter 时间片,这据说是典型的优先级算法。

第9行,for 循环遍历了所有的进程让所有进程的 counter 都变为了 counter 的初值加上它本身折半的数值,让 I/O 的优先级上来。

这里就只能简单的分析一下了,由此简单的了解就能体会到操作系统的复杂性。

6.死锁的基本概念:

  书上 P65 有死锁的形成有详细描述:

  如下图所示的系统,有一台打印机 R1 和一台读卡机 R2,供进程 P1 和 P2 共享。假定 P1 已占用打印机 R1,P2 已占用读卡机 R2。此时,若 P2 继续要求打印机,P1 要求读卡机,则 P1 和 P2 之间便会形成僵局,它们都在等待着对方释放出自己所需要的资源,但同时又不可能释放出自己已占用的资源,从而进入死锁状态。

  死锁:一个进程集合中的每一个进程都在等待只能由该集合中的其他进程才能引发的事件,那么该组进程进入死锁状态(Deadlock)。

  产生死锁的原因:

  1)竞争资源。当系统中供多个进程共享的资源不足,而这些资源又属于不可抢占资源时,将引起进程对资源的竞争而产生死锁。

  2)进程推进顺序非法。进程在运行过程中具有异步性特征,如果它们之间的推进顺序不当,也同样会导致进程产生死锁。

  产生死锁的必要条件:

  1)互斥条件。进程所竞争的资源必须被互斥使用。

  2)请求与保持条件。当前已拥有资源的进程,仍能申请新的资源,而且,当该进程因新的资源被其他进程占用而阻塞时,它对自己已活的的资源仍保持不放。

  3)不剥夺条件。进程已获得的资源,只能在使用完时自行释放,而不能被抢占。

  4)环路等待条件。存在一个至少包含两个进程的循环等待链,链中的每个进程都正在等待下一个进程所占有的资源。

时间: 2024-10-05 17:35:38

处理及制度与死锁的学习报告的相关文章

Linux内核分析第一次学习报告

Linux内核分析第一次学习报告 学生 黎静 学习内容 1.存储程序计算机工作模型 冯诺依曼体系结构:核心思想为存储程序计算机. CPU抽象为for循环,总是执行下一条指令,内存保存指令和数据,CPU来解释和执行这些指令. API:应用程序编程接口(程序员与计算机的接口界面) ABI:二进制接口,指令编码(程序员与CPU的接口界面) 2.X86汇编 1.寄存器 (1)通用寄存器 (2)段寄存器: (3)标志寄存器 2.计算机的汇编指令 (1)movl指令: 寄存器寻址,寄存器模式,以%开头的寄存

分布式事务处理学习报告

1.什么是事务? 事务通俗说就是一个事情分为多个步骤完成: 比如: 2.事务的ACID四大属性: 原子性(Atomicity):意为:即一事务的操作要么全部执行,要么全部不执行.当事务非正常终止时,其中间结果将被取消. 一致性(Consistence):指的是保证数据在变化中只存在一个完整状态.比如修改一个人的信息(姓名,性别,年龄),在更新过程中发生错误,则所做的修改要么全没了,要么全保留. 隔离性(Isolation):一个未完成事务不能在提交前就把其中间结果提供给其它事务使用. 持久性(D

Cocos2dx学习报告2

记录二:创建项目,其名曰DFJ(仿照微信打飞机) 上一个记录我们说到开发环境的配置以及怎样去建立自己的项目.现在我们就通过之前说所的方法来建立一个项目.这里我就不再截图了. 建立了自己的项目之后,我们就可以开始动工编写自己的代码了.这里我不对已有的HelloWorldScene的文件做修改.我们自己建立自己的场景来开始我们自己的游戏之旅. 首先在这里说明一下,由于后面多是代码编写的工作,所以后面的记录多数会用代码的形式展示给大家,需要记录的地方我会通过注释来向大家说明. ----------本次

我的假期学习报告2

我的假期学习报告2 复习进度报告 高等数学 已完成所有公式的默写工作,正在做题以增加熟练度. 概率论与数理统计 已完成第3章的复习工作. 操作系统 已完成第一.二.三章的PPT复习. 病情报告 已无大碍,没有任何后遗症:气温回暖,相信穿厚实点可以不会重蹈覆辙. 实践报告 已经在预约单位实践一星期,单位对我的工作表示积极肯定. 感想 我只能飞回北京了,多亏了这奇怪的抢票系统! 原文地址:https://www.cnblogs.com/battlefieldheros/p/8414733.html

苏黄的假期学习报告3

苏黄的假期学习报告3 复习进度 所有需要复习科目都已经过了一遍,但是时间所剩不多,因为本来寒假就短,我还因为病情住院.不爽! 春节安排 如果学校放假时间往后延一两个星期,我就可以和家人.同学在家乡过完一个完整的春节--从大年三十到元宵节.可惜学校就是想让我们这群年轻人体验一把春运抢不着返程票的滋味,真TMD的生气!我前几天就帮家里人收拾屋子,明天去买只活鸡宰了来祭祀.年三十肯定和家里人过,看不看春晚另外讲:初一就按小学.初中.高中.家这个路线去"行大运":初二回老家.之后就在吃汤圆.粽

【学习报告】【离散数学】第一章 什么是证明

第一章 什么是证明 本学习报告用书是由电子工业出版社出版的<计算机科学中的数学 信息与只能时代的必修课>一书,会在我本身的理解上对原书内容加以修改,可能会与原书内容有出入:若有问题欢迎在下面评论指正探讨.:) 本章内容: 1.什么是命题,以及命题的相关种类 2.谓词跟命题的关系 3.了解公理化方法 4.逻辑推理以及四种方法 5.一些证明的建议 1.什么是命题,以及命题的相关种类 定义:命题是一个或真或假的语句(表述). 举个例子:(真命题)2 + 3 = 5:(假命题)1 + 1 = 3: 由

学习软件工程学习报告以及心得体会

学习了一个学期的软件工程,到现在基本上已经结课了.我谈谈这个学期我学到的和懂得的东西. 总体来说,我最大的收获是我们的实际能力得到了提高,我们有个人项目,结对项目以及团队项目.我们的互动做了很多,所以动手能力更强了.无论是在上个世纪还是在现在,软件开发所涉及的工作基本上都没有变化,它们都起始于一个实际需要或某个灵感然后就是分析,设计,编码,调试,维护.这些任务以某种方式动态地结合起来就构成了软件开发的整个过程,这就是所谓的"软件开发周期". 但对于这些工作具体怎样做,什么时候做,每

高通sensor库和Linker的死锁问题分析报告

[问题描述] 调试NativeHeap泄露时,我们会用到Android Native Heap调试框架. 在push libc_malloc_debug_leak.so后重启zygote(adb shell stop + adb shell start),会发现系统一直起不来. 用debuggerd打印system_server的调用栈,可以发现system server的大部分线程都在malloc函数里卡死: pid: 4918, tid: 4929, name: Binder_1 >>&g

20145307第十周JAVA学习报告

教材学习内容总结 Java的网络编程 1.计算机网络概述 (1)路由器和交换机组成了核心的计算机网络,计算机只是这个网络上的节点以及控制等,通过光纤.网线等连接将设备连接起来,从而形成了一张巨大的计算机网络. (2)网络最主要的优势在于共享:共享设备和数据,现在共享设备最常见的是打印机. (3)IP地址:为了能够方便的识别网络上的每个设备,网络中的每个设备的唯一的数字标识.现在命名IP地址的规定是IPv4协议,该协议规定每个IP地址由4个0-255之间的数字组成,例如10.0.120.34.IP