操作系统原理

操作系统其实并没有一个标准的定义。

它主要是一个控制程序,控制程序执行过程,执行用户程序;

也是一个资源管理器。管理计算机的资源,主要包括文件管理、内存管理以及内存管理。

下面是一个脑图:

操作系统内核的特征就是并发、共享、虚拟、异步。

并发就是操作系统要管理同时运行的多个进程。

共享就是多个进程同时访问同一个资源,这是宏观上的。但微观上是互斥的,即同一时刻只有一个进程访问存储单元。

虚拟就是通过交替运行,使得用户感知操作系统只为他提供服务。

异步就是程序不是一气呵成的,而是走走停停的。操作系统可保证同样的输入,提供的输出一定是相同的。

之前看深入理解计算机系统的时候学过一篇Linux进程的文章。那应该是2017年的事了: Linux进程学习 。本文学习一下CPU的调度。

我们知道系统是时分复用的系统,CPU会在多个进线程之间实现上下文切换来完成不同进程的执行。那当我们要从就绪队列中选择进程时是通过什么原则呢?这时候就需要CPU完成调度的。

那什么时候完成调度呢?

主要还是要看是抢占式系统还是非抢占式系统。

非抢占式系统:当前进程会主动放弃CPU;

抢占式系统:

中断请求时,会将当前进程转成就绪状态。那通常情况下,如果时时间片轮转,就会在时间片用完了,会被抢占。或者有一个进程从等待变就绪了,且其更急迫需要执行,就会抢占当前进程。

CPU的调度最重要的目标是能够提供最大的吞吐量以及CPU的利用率。

所以如何实现最优的调度是很重要的。

目前存在的几种CPU调度算法:

  • 先来先服务算法;
  • 短进程优先算法;
  • 最高响应比优先算法;
  • 时间片轮转算法;
  • 多级反馈队列算法;
  • 公平共享调度算法;

先来先服务算法FCFS:

在就绪队列中,先进入的进程会先被执行。看下面的队列:

上面的队列,P1执行时间24,P2执行时间3,到达时间24,P3执行时间3,到达时间24.

上面队列的平均周转时间(24+27+30)/3。

看上面的例子,P1是一个执行时间很长的进程,在这种算法下,他会是先执行的,这就导致整个队列的平均周转时间可能比较长,这取决于长进程排在哪里,也就是周平均等待时间波动比较大。

另外一个问题是IO资源和CPU资源的利用率比较低。假如现在有一个CPU密集型任务的长进程正在执行,此时IO资源是空闲的,但是呢这种算法下,IO资源也并没有利用上,即使后面有IO密集型任务,也是只能干等着。这是一种非抢占式的算法。

短进程优先算法:

他是对FCFS的一种改进,它会优先执行短进程的,就绪队列会按照时间来排序。从而缩短了平均周转时间。

但怎么选择是一个问题,每个进程预计执行时间是多少呢?它要么希望用户告知,要么会通过某种算法预估执行时间。

上面是一个最优排序的算法,可以保证平均等待时间最短。

此外,短进程优先有一种算法改进,即加入当前有个进程执行,这时如果又到来一个进程,它执行时间要比正在执行进程剩余时间还短,那么它可以进行抢占。

那它有一个缺点,就是就绪队列不断地进入进程,由于它会把短的排在前面,可能不断地有短进程进入,就导致长进程永远得不到执行,导致长进程饥饿。这是一个问题。

最高响应比优先算法:

基于上面说的饥饿的问题,又有一种改进算法叫最高相应比优先算法。

相应比计算公式 rate = (w+s)/s, w表示等待时间,s表示预估执行时间。等待时间越长,rate越来越大,这样就可以避免长进程长时间等待出现饥饿的问题。该算法不允许抢占。

时间片轮转算法:

时间片是分批处理资源的基本执行单元。时间片轮转是为每个进程分配相同时间片,然后通过时钟中断,完成进程切换。

时间片轮转算法最重要的是时间片大小的设置。

设置太大,可能就变成先进先服务了。设置太小,可能会引起频繁的进程上下文切换。基于经验,一般都是设置成进程切换的1%.

多级反馈队列算法

把就绪队列分成多个独立的子队列,每个队列可以有不同的优先级,时间片的大小根据队列的优先级设置不同值。比如CPU密集型的可以放在低优先级,IO密集型的可以放在高优先级队列。进程可以放到不同的队列中,比如某个进程在一个队列的时间片内没有执行完,会把该进程放到低优先级队列中。

公平共享调度算法FSS

该算法会控制用户对资源的访问,可能让更重要的用户访问资源。

多处理机调度

目前计算机都是多处理器,因此都是多CPU组成的多处理器系统。在多处理器系统中,通常都是每个处理器有自己的调度程序,然后在访问共享资源时会进行同步。目前存在的算法:

1、静态资源算法

一个进程从开始到结束都在一个固定处理器,每个处理器有自己的就绪队列。这种算法开销小,但可能导致调度不均衡。

2、动态进程分配

每个进程在运行时可分配到各个处理器上,所有CPU共享一个就绪队列。这种做法开销是比较大的,因为它每次都要选择到哪个处理器上,但它却可以实现负载均衡。

--------EOF---------
微信分享/微信扫码阅读