批处理结束某个进程_进程调度

0381b0ab6e6daa46cc3b5a7112247f7a.png

当计算机系统是多道程序设计系统时,常常会出现多个进程或线程竞争CPU的情况。如果有大于处理器数的进程(线程)处于就绪态时,就必须要选择下一个要执行的进程(线程)。在操作系统,用于选择接下来要执行的进程的程序称之为调度程序(Scheduler),调度程序相应的算法称之为调度算法(Schedule Algorithm)。虽然进程调度和线程调度有些许不同,但是许多适用于进程调度的处理方法大多也适用于线程的调度。

  • 进程的行为

几乎所有的进程的I/O请求和计算都是交替发生的,典型的,CPU不间断的执行一段时间,当CPU发现需要执行I/O操作,发出系统调用来完成I/O请求,当/O请求执行完成后CPU继续计算,直到进程需要执行其他的I/O操作或者执行完成。某些进程花费大量的时间在计算上(使用CPU),这类型进程称之为CPU密集型进程(compute-bound),典型的CPU密集型进程具有较长时间的CPU集中使用和较小频度的I/O操作。相反,某些进程花费大量时间用于处理I/O请求,这类进程称之为I/O密集型进程(I/O-bound),典型的I/O密集型进程具有较短的CPU集中使用和频度较大的I/O操作。随着CPU的速度的不断提升,进程更加偏向于I/O密集型,因为因此如果需要运行/O密集型进程,那么应当劲量让/O密集型进程得到执行,以便发出磁盘请求并保持磁盘忙碌。因为I/O操作远远慢于CPU的速度,对于/O密集型进程的调度就更加重要了。

  • 何时调度

有关调度的一个关键问题是在何时进行调度?考虑如下的情形:

  1. 在进程创建子进程后,需要决定调用子进程还是父进程,因为子进程和父进程都处于就绪态,因此可以任意决定选择那个进程执行。
  2. 当一个进程执行结束退出时,调度程序(Scheduler)需要从就绪队列中选择一个进程执行,如果就绪队列没有就绪进程,那么应该调用操作系统提供的空闲进程。
  3. 当一个进程因为I/O、信号量或其他原因陷入阻塞时,调度程序需要从就绪队列中选择一个进程执行。
  4. 在一个I/O中断发生时,必须做出调度决策,如果终中断来自I/O设备,而设备完成中断工作后,被阻塞的进程此时处于就绪状态,那么此时是继续执行正在执行的进程还是调度完成中断的进程将由调度程序决定。或者让刚刚中断发生的的进程执行,或者让某个其他进程执行。

根据如何处理时钟中断,可以把调度算法分为两类。非抢占式调度算法是挑选一个进程让其执行,直到该进程阻塞(I/O请求或其它原因)或者主动释放CPU,即使该进程执行了若干小时也不会强制挂起。这样做的结果是在时钟中断发生时不会进行调度,在处理完时钟中断后,如果没有优先级更高的进程,该进程会继续执行。抢占式调度算法是挑选一个进程,让进程执行一个给定的最大运行时间(时间片),如果在给定的最大执行时间后进程仍然在执行,那么会强制挂起该进程,调度程序选择另一个进程执行。

  • 调度算法分类

调度算法的分类主要是根据其执行的环境,不同的执行环境使用不同的调度算法。大致可以划分出三种环境:批处理、交互式、实时。

  • 调度算法的目标

前面我们知道,对于不同的环境使用不同的调度算法,因为在不同的环境所追求的性能指标也不尽相同,有些是所有环境都适合,有些则适合于特定的环境。

所有系统公平——保证每个进程由公平的CPU份额策略强制执行——保证指定的策略能够被执行平衡——保持系统所有的部分都是忙碌的
批处理系统吞吐量——每小时完成最大的作业数周转时间——任务从被提交到执行完成的最小时间CPU利用率——CPU的使用情况
交互式系统响应时间——快速响应时间均衡性——满足用户的请求
实时系统满足截止时间——避免丢失数据可预测性——在多媒体系统中避免品质降低

对于所有情形,公平性十分重要,进程应该得到公平的CPU的份额,在理论上能够达到公平。再者,尽量保证系统的各个部分都保持忙碌,保证CPU和I/O设备都在处理任务,这样比CPU空转或I/O设备空闲会更加高效。因此调度程序在把进程调入到内存时,保证内存中既有CPU密集型进程和I/O密集型进程是较好的想法。好于内存中先全部都是CPU密集型进程然后在全是I/O密集型进程。如果是后一种策略,在CPU密集型进程执行时会竞争CPU并且磁盘空闲,而后面执行I/O密集型进程时会竞争磁盘,而CPU却空转。因此保证内存中的进程既包含CPU密集型又包含I/O密集型能够让系统的性能好一些。

  • 批处理系统中的调度算法
  1. 先来先服务:在所有调度算法中,最简单的莫过于非抢占式的先来先服务调度算法(first-come first-served),使用该调度算法时,进程按照请求CPU的时间的先后来使用CPU。基本上会有一个就绪进程的队列,每个请求CPU的进程会被放入到就绪队列中,然后CPU从队列头部选择进程执行,新来的进程会被放入到队列尾部。当正在执行的进程陷入阻塞时,CPU会从就绪队列首部中选择一个进程执行,当被阻塞的进程变为就绪态时,它就行刚刚请求CPU的进程一样被放入到队列尾部。该算法的优点在于便于理解并且容易在程序中应用。 缺点是对长作业比较有利,而不利于短作业,因为短作业执行的时间很短,但却要等待很多长时间才能执行。当内存中的进程大部分为I/O密集型进程时,CPU在这些进程间交替时会导致很多进程竞争I/O资源而导致CPU处于空闲。
  2. 最短作业优先:每个进程都有使用CPU的时间,每次调度程序选择进程时选择使用CPU时间最短的进程执行,这种非抢占式调度算法称之为最短作业优先(shortest job first)。最短作业优先算法能够提升高系统的吞吐量,并且使得平均等待时间最小。有必要支持,只有在所有进程同时运行的情形,最短作业优先才是最有的。
  3. 最短剩余时间优先:最短作业优先算法的抢占式版本是最短剩余时间优先(shortest remaining time first)算法。调度程序总是挑选剩余运行时间最短的进程进行执行,因此每个进程的运行时间要可知。当有新进程请求CPU时,会比较正在执行的程序的剩余执行时间和新请求的进程的执行时间,如果新请求的进程的执行时间更短就会暂停正在执行的进程转而执行最新请求的进程。否则新请求的进程放入到就绪队列,CPU继续执行当前进程。对于最短作业优先算法和最短剩余时间算法最大的问题在于需要知道每个进程运行的时间,对于这点往往是很难做到的。
  • 交互式系统中的调度
  1. 轮转算法:一种最古老、最简单、最公平且使用最广泛的算法是轮转调度(round robin)。基本思想:为每个进程分配一个执行的时间段,成为时间片(quantum),允许进程在时间片内使用CPU,如果在时间片结束时进程依然在执行,那么调度程序暂停正在执行的进程并分配CPU给其他的进程。如果正在执行的进程在时间片结束前终止或阻塞,那么调度程序立即调度进程执行CPU而不是等到时间片结束再调度。该调度算法中有趣的是时间片长度的选择:从一个进程切换的另一个进程是需要时间进行事务管理的——保存前一个进程的寄存器,堆栈信息等信息并且装入新进程的堆栈信息、寄存器信息等,这种方式称之为进程切换(process switch)或者上下文切换(context switch)。如果时间片设置的过小,那么会有很多时间会用于进程的上下文切换的开销上,如果时间片设置的比较大,那么在请求量很大的场景(例如Web服务器),那么到来的请求要等很长的时间才有机会被调度。因此时间片过长或者过短都不合适,通常将时间片长度设置为20ms-50ms是比较合理的折中。
  2. 优先级调度:轮转算法做出了一个假设那就是默认所有的进程的优先级一样,但是现实的情况是有些进程的优先级高一些,有些不那么重要的进程的优先级可能相对低一些。因此在优先级调度算法中每个进程给予一个优先级,运行优先级最高的进程先执行。为了方式优先级高的进程一直运行,可以在时钟滴答降低进程的优先级使得优先级相对低的进程也有机会执行。另一种方法是为进程赋予一个运行执行的最大时间片(时间片长度可能因进程的优先级的不同而不同),当使用完时间片,优先级次高的进程也能被执行。优先级也可以由系统动态分配,例如有些I/O密集型进程大多数时间在等待I/O结束,当这类型的进程请求执行时应该劲量满足,以便启动下一次I/O请求。系统应该能适当的调整进程的优先级避免出现优先级较低的进程出现饥饿现象。
  3. 多级队列:多级队列(Multilevel Queue)调度算法是将就绪队列分成介个单独的队列,一般根据进程的特性如占用内存的大小,进程的优先级,进程类型等,每个队列都有自己的调度算法。
  4. 最短进程优先:对于交互式系统,用户可能比较在意的指标是响应时间,因此最短进程优先常常伴随着最短的响应时间,用户体验也越好。这里唯一的问题是如何从当前可执行的进程中找出最短的那一个进程? 一种方法是根据进程过去的行为进行推测,并执行运行时间最短的那个。假设终端上每个命令的执行时间为T0,现在假设测量到下一次运行时间为T1,那么使用加权和来改进预计时间,即aT0+(1-a)T1,通过选择a的值,可以决定尽快忘掉老的执行时机还是保留。当a = 1/2时,可得到如下的序列: T0,To/2 + T1/2,To/4 + T1/4 + T2/2 .........
  • 线程调度

当进程拥有多个线程时,就存在两个层次的并行:进程和线程,这两种调度存在本质的区别,并且还取决于线程是用户级线程还是内核级线程还是两者的混合。首先考虑用户级线程,操作系统不知道线程的存在,因此操作系统还是和以前一样调度进程,而线程调度程序在进程内部,进程内的调度程序决定如何调度线程。因为多个线程不存在时钟中断,因此使用时间片是可行的方案。当进程的运行时间介绍内核就会调度其他进程。也就是说当调度程序分配给进程一定的执行时间,进程内的多个线程如何使用这段执行时间内核不关心,内核关系的是分配给进程的执行时间(时间片长度)。对于内核级线程,内核选择一个特定的线程执行,它不用考虑该线程属于那个进程,对于被选择的进程赋予一个时间片,而且超过了时间片,就会强制挂起该线程。用户级线程和内核级线程之间的差别在于性能,用户级线程的线程切换需要更少的机器指令,甚至内核都不知道进行了线程切换,因为这是由进程内部的调度程序决定的,因此用户级线程可以使用转为应用程序定制的线程调度程序。另一方面,使用内核级线程时,一个线程被阻塞时不会出现像用户级线程那样挂起相应的进程的情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[RN] 可播放视频的播放器版本

可播放视频的播放器版本 "react": "16.6.3", "react-native": "0.57.8", "react-native-orientation": "^3.1.0", "react-native-vector-icons": "^4.3.0", "react-native-video":…

有限元python编程流行吗_Python进行有限元分析

本博客主要是来讲述采用Python语言,利用直接刚度法,来编写求解《有限元方法基础教程》(第五版) 的例题2.1。(也许有的人认为商业软件已经和普及了,没有 必要再自己进行编程了,但是龙猪在这里建议大家还是去了解一下有限元的原理&a…

java用中根后根序列构造二叉树,106. 从中序与后序遍历序列构造二叉树

题目描述根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。示例:例如,给出中序遍历 inorder [9,3,15,20,7]后序遍历 postorder [9,15,7,20,3]返回如下的二叉树:3/ \9 20/ \15 7思路1.思路与105. 从前序与中序…

Python_selenium之获取当前页面的href属性,id属性,图片信息和截全屏

一、 获取当前页面的全部信息 1. 图片信息包括图片名称、图片大小等信息 2. 只需将图片信息打印出来(image.text image.size image.tag_name) 二、 获取页面元素的href属性(id同理) 1. 获取当前页面所有的链接信息&#xff0…

动态游标for循环_数据结构系列循环链表

前面留的一个问题,后文更跟新回答单链表可以表示任意的线性关系,有些线性关系是循环的,既没有队尾元素。将单链表中的终端结点指针端由空指针改为指向头结点,这时的单链表形成国恒一个环,改为循环链表。插入与删除与单链表的原理甚…

php对数组进行合成的函数,php合并数组函数array_merge()

array_merge()函数在php中是对数组进行合并的,可以把多个数组合成一个数组,并且不改变原数组的值了,但今天我在使用array_merge合并数组时碰到几个小细节上的问题,下面我举例子给各位朋友看看1.array_merge()合并$array array(a&…

Day01,python爬虫基础

今日内容: 爬虫课程: 一爬虫基本原理 二requests请求库 一爬虫基本原理 1、什么是爬虫? 爬虫就是爬取数据。 2、什么是互联网? 由一堆网络设备,把一台台的计算机互联到一起称之为互联网。 3、互联网建立的目的 数据的传递与数据的共享。 4、什么是数据? 例如: 电…

sas sql 读取最后一行数据_SAS基础编程和数据处理

前几天讲了数据分析中SQL的基本使用方法以及具体案例分析思路,接下来会继续讲统计基础以及在SAS软件内的应用,在这之前,本文先进行SAS基础使用编程的基础介绍,后续会主要阐述SAS软件内的统计数学的应用,如分析或初步建…

python 列表索引位置,python – 在列表中查找值的第一个位置

一种方法是为项目创建单独的列表以查找索引并使用索引函数和使用列表理解(还要进行额外检查以确保项目在列表中,否则将发生ValueError):my_list [1,1,1]items [1,2]print ([my_list.index(item) if item in my_list else -1 for item in items])输出:[…

Linux 下配置多路径及SCSI扫描磁盘重新发现大小

Linux SCSI扫描磁盘重新发现大小: # for i in find /sys/class/scsi_host/host*; do echo 1 >> $i/issue_lip; echo "- - -" >> $i/scan; done 1、安装多路径软件包:device-mapper-1.02.67-2.el5device-mapper-event-1.02.67.2.el…

代码合并工具_分享几款比较常用的代码比较工具

俗话说:三句不离本行,对于程序员这个可爱的群体来说也是一样,即使面对无休无止的编程工作,程序员们依旧任劳任怨的埋头苦干,梦想着用自己码下的代码改变世界。工欲善其事,必先利其器,每一位程序员都有自己私…

oracle9i 恢复数据库,Oracle9i RMAN备份及恢复步骤(zt)

1、切换服务器归档模式,如果已经是归档模式可跳过此步:%sqlplus /nolog (启动sqlplus)SQL> conn / as sysdba (以DBA身份连接数据库)SQL> shutdown immediate; (立即关闭数据库)SQL> startup mount (启动实例并加载数据库,但不打开)…

python 计量经济 35岁 工作_Python在计量经济与统计学中的应用

Python for Econometrics and Statistics (Python在计量经济与统计学中的应用) 【点击链接进入主页】。这套笔记将重点介绍Python在计量经济学与统计分析中的应用。内容涵盖Python基本数据类型,Numpy科学运算,Pandas数据分析,统计分析&#x…

循环控制

循环控制 定义 Python 循环语句是通过一条或多条语句的执行结果(True 或者 False)来决定执行的代码块。 并在符合条件的情况下跳出该段循环。 类似于控制语句。 如下图所示。 WHILE 循环 while 判断条件: 语句 求1~100的和 n 0 sum 0 while…

rest风格的get加密字符串怎么接收_RESTful Api的设计与风格,你该学一下咯

REST的重要概念REST全称是Representational State Transfer,中文意思是表征性状态转移。RESTful是指具有REST表征的web架构风格,并非必须遵守的规则。REST分离了API的结构和逻辑,主要应用于客户端和服务器交互类的软件。基于这种风格设计的软…

oracle截取字符串替换,oracle字符串操作:拼接、替换、截取、查找

‘拼接‘||‘字符串‘ as Str from student;2、使用concat(param1,param2)函数实现:select concat(‘拼接‘,‘字符串‘) as Str from student;注:oracle的concat()方法只支持两个参数,如果拼接多个参数,可以嵌套concat()&#xf…

oracle函数 INSTR(C1,C2[,I[,J]])

【功能】在一个字符串中搜索指定的字符,返回发现指定的字符的位置; 【说明】多字节符(汉字、全角符等),按1个字符计算 【参数】 C1 被搜索的字符串 C2 希望搜索的字符串 I 搜索的开始位置,默认为1 J 第J次出现的位置,默认为1 【返回】数值 【示例】se…

mybatis3 oracle,Mybatis3中對oracle的批量插入

Mybatis批量插入的資料,很多都是mysql的,insert into ... values (),(),...醬紫。oracle中不支持這種語法,oracle中的批量插入是醬紫insert intoselcect... union all select ...。在這里http://my.oschina.net/u/232879/blog/118245有說明my…

python里 try里怎么用int函数_如何在不使用try / catch的情况下测试Python枚举中是否存在int值?...

测试价值变体1请注意,_member_names_具有一个名为in的成员(未记录...):print(Fruit._value2member_map_)# {4: , 5: , 6: }您可以对照此地图测试值是否在_member_names_中:5 in Fruit._value2member_map_ # True7 in Fruit._value2member_map…

U盘安装可能会遇见UEFI的问题,使用easyBCD安装即可。

参考链接 CSDN博客 Tips 关于 (hd0,0) 如果出现 File not find的问题那么使用,(hd0,1) 后面的数字变一下,主要根据是,windows 的磁盘管理中的C盘的系统盘的序列。 转载于:https://www.cnblogs.com/eat-too-much/p/11120772.html