调度---------操作系统

来源:互联网 发布:2016年鞍山中考大数据 编辑:程序博客网 时间:2024/05/22 12:53

调度是指在多道程序设计系统中,也就是说有多个进程处于就绪态而(或线程)同时竞争cpu(只有一个)时,必须选择一个进程运行。怎么选择?用调度算法去选。

一、基本概念
1.1进程切换的代价: 用户态转到内核态 保存当前进程状态。内存映像保存,运行调度算法选择新进程,将新进程的内存映射重装入MMU,最后新进程开始运行。注意:进程切换使内存高速缓存失效,强迫内存动态装入两次(进入内核一次,离开内核一次。这里我不太明白。)
这一切都说明并不是单位时间内进程切换越多越好,反而很差。

1.2进程行为: 几乎所有进程都是I/O请求与计算交替执行,什么是I/O操作:当一个进程由于等待外部设备工作完而阻塞。

计算密集型:一进程花费大多时间在计算上
I/O密集型:一进城在等待I/O上花费大多时间
随着cpu的速度在不停变快,现在进程更多是I/O密集型,那么,调度程序要尽可能的让I/O密集型进程运行,以便让I/O请求发出让磁盘始终忙碌。

1.3何时调度:

  • 父进程创建子进程时,两进程都处于就绪态,需要选择运行哪一个
  • 一个进程退出时,挑选一个。若没有,则运行系统提供的空闲进程
  • 一进程zuse在I/O操作和信号量上或因其他原因阻塞
  • I/O中断发生时,做出决策,I/O设备发出中断完成工作,是让阻塞等待盖I/O的进程执行还是其他,调度算法决定

调度算法分类:硬件始终以某一频率发生周期性中断,每个时钟中断或者每k个时钟中断做出调度决策,可把调度算法分为抢占式与非抢占式。
非抢占式:挑选一个进程,直到运行至被阻塞,或者其自动释放cpu。即使运行了很长很长时间,也不会被强迫挂起,在时钟中断发生时也不调度。
抢占式:挑选一个进程运行某个固定时段的最大值。若时间段结束,还在运行,他被挂起,挑选一个进程运行。进行抢占式算法,必须在时间段末端发生时钟中断,以便把cpu让给调度程序。抢占式依赖好的时钟中断。

1.4调度算法分类:
不同系统需要不同的调度算法,根据系统需要去选择。

  • 批处理
  • 交互式
  • 实时

批处理系统,处理长时间的处理作业,没有交互用户会不耐烦的等待。所以选择非抢占式或者长周期的抢占式。
交互式系统:避免一个进程霸占cpu,抢占式必须的。
实时系统:实时系统只运行推进现有应用的程序。交互式什么都运行。这样看抢占不抢占就看具体情况了

1.5调度算法的目标:
所有系统:公平(cpu时间均衡),策略强制执行(调度算法一定要按代码要求实现),平衡(系统每一部分都在忙碌)96-
批处理系统:吞吐量(每小时最大作业数),周转时间(从提交到终止的时间,就是用户要等待的时间,越小越好)cpu利用率(保持cpu始终忙碌)
交互式:最小响应时间(服务好),均衡性(对于一种操作,用户有自己心中的期望时间,最好满足)
实时:满足截止时间,可预测性(多媒体的实时系统,进程调度必须高度可预测和实时调度,不然用户的体验会很差)

二、批处理系统中的调度

2.1先来先服务:非抢占式。队列,阻塞作业进程到就绪态加入到队列尾,新作业也在作业尾。缺点很明显,大量I/O密集型与一个计算密集型同时运行,计算密集型运行1秒,接着去读取磁盘。然后所有的I/O密集型开始读磁盘。当计算密集型获得cpu,,在运行1s,紧跟着是所以I/O密集型。这样子,每个I/O密集型都要等待很长时间。若是抢占式的则不用等待那么长时间。

2.2最短作业优先 适用于运行时间已知的。非抢占的。我自己之前不太在意抢占不抢占,一直认为什么都是抢占的,导致一次考试题目做错了。学习应用要记清楚知识点。不要含糊。

最短剩余时间: 这个听名字就知道是抢占式的了。 这块要注意抢占与非抢占。这个关系着算法怎么写的问题。运行时间已知,每一次新作业进来,比较要运行多产后个时间结束,运行时间短的那个执行。这里是短作业执行更好。 这里有一个问题,一个进程越运行它的运行时间就越短,最后的结果是一个作业执行完成后才调度。这个只是在有新作业进入时才抢占。这个抢占式感觉奇怪,所以我想这个一般与另一种抢占式算法结合使用。不然一个进程执行了,就结束不了,除非新的短的进程到来,或者他自己执行完了。

三、 交互式系统

3.1轮转调度 :抢占。每个进程分配一个时间段(时间片)。时间片用完就进行进程切换。用完前阻塞或者结束,cpu立即切换。
进程切换(上下文切换)需要时间的,假设1ms,时间片4ms。4ms中有1ms要上下文切换。cpu浪费率20%。为了提高cpu利用率,我们设置时间片长时间一点,比如100ms,这样浪费率为1%,但是多进程请求cpu,时间片长了就有不好的用户交互。
还有一点比较有趣,时间片长于cpu突发时间(cpu突发-I/O操作-cpu突发-I/O操作-……),那么在时间片耗尽前进程会堵塞在I/O操作,引起进程切换,抢占的消失改善了性能。进程切换只发生在逻辑需要时,I/O阻塞。而一般抢占时切换后,是在cpu突发段中断,而之后运行可能很短的时间就有阻塞了(I/O操作),这样又切换上下文,浪费时间。
所以,时间片设置长短很重要。一般是20ms~50ms(书上给的建议,我感觉要根据处理的所有进程来断定时时间片长度)

3.2优先级调度
轮转有一个前提,所有进程同等重要。这样显然不符合现实,每个进程有一个优先级,高优先级先运行。
为了防止高优先级无休无止地运行,调度程序可以在每个时钟中断降低当前进程的优先级。如果这个动作导致优先级降低,那就上下文切换。还有一种是给每个进程赋予一个时间片,用完了就切换到次高进程(与我之前想的差不多)
优先级可以有系统动态确定,,例如I/O密集型应该先运行。
运行时低优先级进程可能会产生饥饿,要有一个合理地调整优先级的动态策略,使高的不能一直运行,低的无法运行(饥饿)

3.3多级队列
提出的前提:cpu密集型进程设置长的时间片会更高效(减少交换次数),长时间片的进程又影响响应时间。由此我们引出了多级队列的概念来解决。

多级队列是指每个队列有一个优先级,调度程序会根据队列的优先级来运行存在队列中的进程,若当前优先级队列为空,则运行次优先级队列。到这里,与优先级调度是没有区别的。而长时间片的优势以及进程的优先级的改变还没有实现。
为每一个队列设置一些固定的时间片,刚开始是少的,到后来越来越多。当一个进程在当前队列里用完了队列分配的时间片,则移到次优先级队列去执行(这里改变了进程的优先级)。而新进程的到来总会先被添加到最高优先级的队列里去。
注意:到这里我有一个疑问,如果一个进程把所有优先级队列转个遍都还没运行完,难道要到最高级优先队列里在运行一遍?我在百度百科里看到这么一句话:
各个队列的时间片是一样的吗?不一样,这就是该算法设计的精妙之处。各个队列的时间片是随着优先级的增加而减少的,也就是说,优先级越高的队列中它的时间片就越短。同时,为了便于那些超大作业的完成,最后一个队列QN(优先级最低的队列)的时间片一般很大(不需要考虑这个问题)
意思是:最后一个时间片会分配很大很大,所有进程都会在这里或之前结束,无需担心。

3.4最短进程优先
类比短作业优先(或者推广短作业优先),交互式进程的执行模式:等待命令,执行命令的循环。如果把执行命令看作是一个“作业”,那么,运行最短“作业”会有最快的响应时间。
那么关键就是执行命令时间最短的那一个进程了。我们可以用老化技术:用当前测量时间和先前估计时间加权得到下一次估计时间。下一次估计执行时间=a*当前测量值+(1-a)*上一次估计的这一次的运行时间。

3.5保证调度
这个算法保证每一个进程都占有相同的cpu时间。
计算一进程运行时间T1(使用cpu),然后再算他应获得的cpu时间,从他创建开始到现在的时间(这中间cpu一直在工作)除以进程数N,得到银火的cpu时间T0,用T1/T0得到一个时间比,小于1表示运行时间太短,等于以表示刚好,大于一表示超时了。大于等于1的都要转向运行比率更低的进程,知道该进程的比率超过他最接近的竞争者才可以。

这里的问题:首先每个进程占用cpu时间好算,应运行时间也好算,但是每过固定时间都要重新计算,这个会很慢,进程数一朵=多,单计算都要浪费时间。况且这种太“公平”的总感觉不实用,但也是一种解决问题的办法。

3.6彩票调度
每个进程持有一些数量的彩票,调度算法随机抽取一张,是谁的就让谁运行。这里看到,彩票数目多的运行几率大。
进程之间有协作关系的画也会进行彩票借出。比如一个进程由于另外一个进程堵塞。那么把这个进程的彩票借给另外一个进程,让另外一个进程更快运行,让他不堵塞。最后归还就行了。
这个原理是这样,具体实现的话不好说。不过我们对进程以多大概率运行提供了一种思路。

3.6公平分享调度
这里关注的不是单单一个进程了。每一些进程都属于一个用户。我们要对用户公平,然后在对用户自己的进程公平。比如说。每个用户有相同的cpu时间,让用户下的进程使用这些给用户分配的进程时间。
这里吧公平的定义扩展了。关键还是看怎么定义公平。

四、实时系统中的调度

实时可以分为软实时与硬实时。
实时性是通过把程序划分为一组进程实现的,每个进程很短,且行为是可预测与提前掌握的。
可调度实时系统:有m个事件,时间i以周期pi发生,cpu处理一个事件ci。
则当ci/pi(i=1….m)的累加和<=1是实时系统才是可调度的(这里原理不是太清楚)

五、调度策略与机制
当一进程有多个子进程并在其控制下完成,主进程可以知道哪一个子进程要先运行,但调度算法不知道。
解决办事法是将调度策略与调度机制分离开。将调度算法参数化,而参数有用户输入。

六、线程调度

用户级线程:内核只选取进程A,A中的线程调度选取线程。缺乏时钟中断运行时间过长的线程
内核级线程:内核选取,不考虑属于那一个进程。

用户级线程只是少量指令切换。而内核级是要完整的上下文切换。进程A的线程切换到进程二的线程是很慢的,不如切换到进程A的另一个线程。而内核是知道这样的情况,会更倾向于选择进程A的与进程二线程同等重要的线程来运行。用户级线程可以专门定制调度算法。

0 0