操作系统 -- 处理器管理


  在前面 操作系统绪论中有介绍到操作系统的几大部分:处理机管理 存储管理 设备管理 文件管理 用户接口。这篇文章主要是对处理器管理这一部分进行详细说明。

进程的由来

  从联机批处理 -> 脱机批处理 -> 多道批处理 -> 多道程序设计技术,很大的原因是cpu和其他硬件资源速度不匹配(cpu太快,其他硬件速度都跟不上),操作系统设计人员为了缓解cpu和硬盘等硬件速度上的差距、提高cpu的利用率而不断改进操作系统的结果。充分体现了物尽其用这个原则。
  程序就是一个指令序列。在未出现多道程序设计之前,只支持单道程序,操作系统只是一个一个按顺序执行程序,所以计算机中的所有资源都被当前运行的程序所享有,包括内存。当时内存仅仅被划分为程序段和数据段,程序段用于存放程序代码,数据段则用于存放程序的数据。因为只有一个程序,所以很容易就可以找到相应的程序段和数据段。
  多道程序设计技术的出现,支持同一时间内多个程序并发(当一道程序因I/O请求而暂停运行时,CPU便立即转去运行另一道程序。)。这样内存中就需要存放各个运行程序的相关信息。这样就产生一个问题,操作系统如何才能找到个程序的存放位置?
  所以为了方便操作系统管理和完成多个程序并发执行,引入了进程和进程实体的概念。操作系统为每一个运行的程序配置了一个数据结构,进程控制块(PCB)用来描述进程的各种信息,例如代码的存放位置,数据存放位置等。并不是直接存放程序段和数据段的内容,程序段、数据段的内容存放在内存其他地方,但是由于PCB的存中,很容易获取到这些信息。
  PCB、程序段、数据段三个部分构成了进程实体,也称进程印象。一般情况下,我们把进程实体简称为进程,例如所谓的创建进程,实质上是创建进程实体的PCB;而撤销进程,实质上是撤销进程实体中的PCB。

进程的定义

  进程的定义并没有一个统一的说法,自己比较认同的就是:
  进程是具有独立功能的程序在一个数据集合上一次动态执行的过程。

注意

  严格来说,进程实体和进程并不一样,进程实体是静态的,进程则是动态的。Linux内核通常把进程也叫任务。

该如何去理解进程和进程实体

  PCB、程序段、数据段三个部分构成了进程实体。程序本身和进程实体只相差了一个PCB,二者均是静态的,即是存储起来的状态,而进程所描述的,是进程实体运行的过程,或者说是程序运行的过程,即强调的是程序的运行,动态的过程。

PCB记录的信息

  从上述可以知道,pcb是一个很重要的结构,里面一般存放什么信息呢?

  • 进程描述信息
  • 进程标识符PID:当进程被创建时,操作系统会为该进程分配一个唯一的、不重复的ID,用于区分不同的进程,就像是身份证号
  • 用户标识符UID
  • 进程控制和管理信息
  • 进程当前状态
  • 进程优先级
  • 资源分配清单
  • 处理机相关信息

处理器管理概述

  处理器管理是操作系统的重要组成部分,它负责管理,调度和分派计算机系统的重要资源————处理器,并控制程序的执行。
  操作系统的基本任务是对“进程”实施管理,操作系统必须有效有效控制进程的执行,给进程分配资源,准许进程之间交换信息保护每个进程在运行期间免受其他进程干扰控制进程的互斥、同步和通信
  早期的计算机系统是基于单个处理器的顺序处理机器。程序员编写串行执行的代码,让其在处理器上串行执行,每一条指令的执行也是串行的(取指令,取操作数,执行操作,存出结果)。单核的处理器管理也很容易理解,cpu调度策略也很多(FCFS、优先级调度、SJF调度、RR调度、多级反馈调度)
  但是为了提高cpu硬件的性能,逐步发展出了流水线系统(解决了指令并行的问题)和多核CPU。由于多核处理器有多个核心,那么在多核处理器工作时就存在任务分配、调度、仲裁以及负载均衡等诸多问题。这时候的操作系统的处理器管理要是想利用上多核cpu的优势,必须优化系统任务调度算法,一般多核上任务调度算法有全局队列调度和局部队列调度。前者是指操作系统维护一个全局的任务等待队列,后者是指操作系统为每个CPU内核维护一个局部的任务等待队列。

硬件知识:
按照计算机在一个执行阶段能执行的指令或能处理的最大可能数可将计算机分为四类:

  1.单指令流单数据流(SISD);

  2.单指令流多数据流(SIMD);

  3.多指令流单数据流(MISD);

  4.多指令流多数据流(MIMD)。

  MIMD系统划分为:共享内存的紧密耦合MIMD系统;内存分布的松散耦合MIMD系统。

  根据处理器分配策略,紧密耦合MIMD系统可以分为主从式系统MSP;对称式系统SMP。
MSP
  操作系统对不同的计算机结构有不同的支持,我们接触的个人计算机大多是SMP(最大的特点就是共享所有资源)

处理器管理实例 – Linux2.6内核上的实现

  下面提到的Linux如果不是特别指明都是代指Linux2.6.32内核。

Linux调度器的简史

从Linux2.4之前的内核调度器 -> Linux2.4调度器 -> Linux2.6的O(1)调度器 -> Linux新一代调度器CFS

Linux2.4调度器

在这里插入图片描述
过程:2.4的调度算法,将所有的就绪进程组织成一条可运行队列,不管是单核环境还是smp环境,cpu都只从这条可运行队列中循环遍历直到挑选到下一个要运行的进程。如果所有的进程的时间片都用完,就重新计算所有进程的时间片。
2.4调度的不足:
1)一个明显的缺点就是时间复杂度为O(n),每次都要遍历队列,效率低!。虽然说O(n)的复杂度看起来不是很糟糕,而且系统能容纳进程数量也不一定会很大,但复杂度为O(n)还是很难忍受的。
2)由于在smp环境下多个cpu还是使用同一条运行队列,所以进程在多个cpu间切换会使cpu的缓存效率降低,降低系统的性能。
3)多个cpu共享一条运行队列,使得每个cpu在对队列操作的时候需要对运行队列进行加锁,这时如果其他空闲cpu要访问运行队列,则只能等待了。由2、3两点可以看出2.4的调度算法对smp环境的伸缩性不高!不能很好地支持smp环境。
4)不支持内核抢占,内核不能及时响应实时任务,无法满足实时系统的要求(即使linux不是一个硬实时,但同样无法满足软实时性的要求)。
5)进程的剩余时间是除了nice值外对动态优先级影响最大的因素,并且系统将休眠次数多的进程的剩余时间叠加起来,从而得出更大的动态优先级。这体现了 系统更倾向优先执行I/O型进程。内核就是通过这种方式来提高交互进程的优先级,使其优先执行。但休眠多的进程就代表是交互型的进程吗?并不是的,这只能 说明它是I/O型进程。I/O型进程需要进行I/O交互,如读写磁盘时进程会经常处于休眠的状态。如果把这种进程当成是交互进程,反而会影响其他真正的交 互进程。
6)简单的负载平衡。那个cpu空闲就把就绪的进程调度到这个cpu上去执行。或者某个cpu的进程的优先级比某个进程低,就调度到那个cpu上去执行。这样简单的负载平衡缺点不言而喻。进程迁移比较频繁,而且出现2、3的情况。这样的负载平衡弊大于利!

Linux的O(1)调度器

在这里插入图片描述
过程:每个cpu维护一个自己的运行队列,每个运行队列有分别维护自己的active队列与expried队列。当进程的时间片用完后就会被放入expired 队列中。当active队列中所有进程的时间片都用完,进程执行完毕后,交换active队列和expried。这样expried队列就成为了 active队列。这样做只需要指针的交换而已。当调度程序要找出下一个要运行的进程时,只需要根据上面提过的位图宏来找出优先级最高的且有就绪进程的队 列。这样的数据组织下,2.6的调度程序的时间复杂度由原来2.4的O(n)提高到O(1)。而其对smp环境具有较好的伸缩性。

Linux的cfs调度器

在这里插入图片描述
过程:与之前的Linux调度器不同,CFS没有将任务维护在链表式的运行队列中,它抛弃了active/expire数组,而是对每个CPU维护一个以时间为顺序的红黑树。

Linux的CFS调度器详细。

  Linux进程调度一些设计思想:
  把进程抽象成进程描述符task_struct:包含进程所必需的数据,如状态信息、调度信息、优先级信息、内存页信息等。
  把需要调度的东西抽象成调度实体sched_entity:调度实体可以是进程、进程组、用户等。这里包含负载权重值、对应红黑树结点、虚拟运行时vruntime等。
  把调度策略(算法)抽象成调度类sched_class:包含一组通用的调度操作接口,将接口和实现分离。你可以根据这组接口实现不同的调度算法,使得一个Linux调度程序可以有多个不同的调度策略。
  把调度的组织抽象成可运行队列rq:包含自旋锁、进程数量、用于公平调度的CFS信息结构、当前正在运行的进程描述符等。实际的进程队列用红黑树来维护(通过CFS信息结构来访问)。
  把CFS调度的运行队列信息抽象成cfs_rq:包含红黑树的根结点、正在运行的进程指针、用于负载平衡的叶子队列等。
  
  
  
  
  
  
  

参考

  https://www.cnblogs.com/814467783sweet/p/9634631.html
  https://www.cnblogs.com/zhoug2020/p/3967328.html
  https://blog.csdn.net/zhoudaxia/article/details/7375668
  https://www.docin.com/p-1396901563.html
  《Linux设计与实现》

发布了87 篇原创文章 · 获赞 28 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/shuzishij/article/details/99164647