开发成长之路(21)-- 不可不知的操作系统知识

Posted 看,未来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开发成长之路(21)-- 不可不知的操作系统知识相关的知识,希望对你有一定的参考价值。


知识框图


操作系统的硬件环境

计算机系统由硬件(子)系统和软件(子)系统组成。

计算机系统的层次结构

最下面是硬件系统;最上面是使用计算机的人,即各种各样的用户;人与硬件系统之间是软件系统。系统软件是最靠近硬件的一层,其次是支撑软件和应用软件。

操作系统是紧挨着硬件的第一层软件,是对硬件功能的首次扩充,其他软件则是建立在操作系统之上的。通过操作系统对硬件功能进行扩充,并在操作系统的统一管理和支持下运行其他各种软件。
操作系统实际上是一个计算机系统中硬、软件资源的总指挥部。决定了计算机硬件性能的发挥和系统的安全性和可靠性。

操作系统是计算机系统中的系统软件,是能有效地组织和管理计算机系统中的硬件和软件资源,合理地组织计算机工作流程,控制程序的执行,并向用户提供各种服务功能,使得用户能够方便地使用计算机,使整个计算机系统能高效运行的一组程序模块的集合。


操作系统主要作用

1、管理系统中的各种资源 ,包括硬件资源和软件资源
2、为用户提供良好的界面

多道程序设计的基本概念

把一个以上的作业(程序)存放在主存中,并且同时处于运行状态,共享处理机时间和外部设备等其他资源的方法。

优点:提高了CPU的利用率
     提高了内存和I/O设备的利用率
	 增加系统吞吐量 

-优点:资源利用率高、系统吞吐量大
-缺点:平均周转时间长、无交互能力

分时系统

人-机交互、共享主机、便于用户上机

-作业直接进入内存
-规定每个程序只运行一个时间片的时间

- 多路性 
- 独立性
- 及时性
- 交互性    

实时系统

实时控制、实时信息处理

实时任务的类型

-按任务执行时是否呈现周期性来划分:周期性实时任务、非周期性实时任务
-根据对截止时间的要求来划分 :强实时任务 、弱实时任务

实时系统与分时系统的比较

-多路性
-独立性
-及时性
-交互性
-可靠性

中央处理机

一般的处理机由运算器、控制器、一系列的寄存器以及高速缓存构成。

寄存器为处理机本身提供了一定的存储能力,它们的速度比主存储器快得多,但是因为造价很高,存储容量一般都很小。
处理器一般包括两类寄存器:用户可见寄存器、控制和状态寄存器(如PC、IR、PSW)。

指令的基本执行过程

特权指令:在指令系统中那些只能由操作系统使用的指令

非特权指令:允许一般的用户使用的指令


处理机的状态

管态(特权态、特态、系统态):指操作系统管理程序运行的状态。可以执行全部指令,使用所有资源,具有改变处理机状态的能力

目态(指用户程序运行时的状态。只能执行非特权指令:有些系统分为核心状态、管理状态和用户程序状态普通态、普态、用户态)

存储器的层次结构

为了简化对存储器的分配和管理,在不少计算机系统中把存储器分成块。在为用户分配主存空间时,以块为最小单位。

常用的存储保护机构:界地址寄存器(界限寄存器)、存储键。

缓冲技术与中断技术

缓冲技术—般有3种用途:

1.用在处理机与内存之间的
2.用在处理机和其他外部设备之间
3.用在设备与设备之间的通信上的    

目的:为了解决部件之间速度不匹配的问题


-所谓中断是指CPU对系统中或系统外发生的异步事件的响应;

- 引起中断的那些事件称为中断事件或中断源;
- 中断源向处理器发出的请求信号称为中断请求;
- 把处理中断事件的那段程序称为中断处理程序
- 中断的作用:能充分发挥处理器的使用效率 、提高系统的实时能力
  • 典型的中断:程序中断、时钟中断、I/O中断、硬件失效中断

-依据中断的功能:可屏蔽中断(I/O中断)、不可屏蔽中断(机器内部故障、掉电中断)、程序错误中断(溢出、除法错等中断)、软件中断(Trap指令或中断指令INT)
-依据被激发的手段:强迫性中断、自愿性中断
-依据中断事件发生和处理是否是异步 :异步中断(中断)、同步中断(异常)
-依据中断源的类型 :硬件中断、软件中断


-中断优先级:高优先级屏蔽低优先级
-同一中断级中有多个中断请求时,可采用固定的优先数和轮转法来处理

中断处理

时钟

	-在多道程序运行的环境中,它可以为系统发现一个陷入死循环(编程错误)的作业,从而防止机时的浪费 
    -在分时系统中,用间隔时钟来实现作业间按时间片轮转 
    -在实时系统中,按要求的时间间隔输出正确的时间信号给一个实时的控制设备
    -定时唤醒那些要求延迟执行的各个外部事件
    -记录用户使用各种设备的时间和记录某外部事件发生的时间间隔 
    -记录用户和系统所需要的绝对时间,即年、月、日

进程

前驱图

前趋图(Procedence Graph)是一个有向无循环图(DAG)。图中的每个结点可用于表示一条语句、一个程序段或进程;结点间的有向边则表示在两结点之间存在的偏序或前趋关系“→”,
→={(Pi,Pj)| Pi必须在Pj开始前完成 }。


程序一旦开始运行,其执行结果不受外界因素的影响。

程序执行的结果与它的执行速度、时间无关。

程序执行时的环境和初始条件相同,当程序多次重复执行时,都将获得相同的结果。

程序执行的相互制约将导致并发程序具有“执行—暂停执行—执行”这种间断性的活动规律。

因多个程序共享系统中的资源,所以某程序在执行时必然会受到其他程序的影响。

由于失去了封闭性,也将导致失去其可再现性。

系统中的硬件资源和软件资源不再被单个用户或程序独占,而为多个用户或作业共同使用。

程序和计算是两个不同的概念,在程序并发执行中一个共享程序可对应多个“计算”,程序与“计算”已不再一一对应。

在采用多道程序设计的计算机系统中,允许多个程序同时进入一个计算机系统的内存储器并运行,这种让多个程序同时进入计算机计算的方法称为多道程序设计。

提高处理器的效率,从而提高整个系统的效率。


为什么要进程

为了使程序在多道程序环境下能够并发执行,并对并发执行的程序加以控制和描述,引入进程的概念。
程序段、数据段及进程控制块三部分构成了一个进程的实体。

进程是具有独立功能的可并发执行的程序在一个数据集合上的运行过程,是系统进行资源分配和调度的独立单位。或者说,“进程”是进程实体的运行过程。

(1)进程是程序的一次执行,是一个动态的概念,程序是完成某个特定功能的指令的有序序列,是一个静态的概念
(2)一个进程可以执行一个或几个程序,同一程序也可能由多个进程同时执行
(3)进程是系统进行资源分配和调度的一个独立单位,程序则不是
(4)程序可以作为一种软件资源长期保存,而进程是程序的一次执行过程,它是临时的,有生命期的
进程是具有结构的

联系:进程是程序的运行

进程的特征

动态性:进程的基本特性。进程是进程实体的执行过程;
并发性:进程的主要特征。多个进程实体同存于内存中,能在一段时间内同时运行;
独立性:进程实体是一个能独立运行的基本单位,同时也是系统中独立获得资源和独立调度的基本单位。
异步性:进程按各自独立的、不可预知的速度向前推进;或者说,进程按异步方式运行。
结构特征:从结构上看,进程实体是由程序段、数据段及进程控制块三部分组成,有人把这三部分统称为“进程映像”。

进程的三种基本状态

  • 就绪状态
    当进程已分配到除CPU以外的所有必要的资源后,只要能再获得处理机便可立即执行,这时的状态称为就绪状态

  • 执行状态
    指进程已获得处理机,其程序正在执行

  • 阻塞状态
    进程因发生某种事件(如I/O请求、申请缓冲空间等)而暂停执行时的状态,亦即进程的执行受到阻塞,故称这种状态为阻塞状态,有时也称为“等待”状态或“睡眠”状态。

- 就绪→执行状态
处于就绪状态的进程,当进程调度为之分配了处理机后
- 执行→阻塞状态
正在执行的进程因发生某种事件而无法执行
- 执行→就绪状态
正在执行的进程如因时间片用完或一个优先权高的进程到来而被暂停执行
- 阻塞→就绪状态
处于阻塞状态的进程,其等待的事件已经发生

思考:其他状态转换可以存在吗?
这个问题自己想想。、,碧如阻塞到执行的飞跃。

挂起状态的引入

  • 终端用户的需要
    当终端用户在自己的程序运行期间发现有可疑问题时,往往希望暂时使自己的进程静止下来。
  • 父进程的需要
    父进程常常希望考察和修改子进程或者当要协调各子进程间的活动
  • 操作系统的需要
    操作系统有时需要挂起某些进程,检查运行中资源的使用情况及进行记账,以便改善系统运行的性能。
  • 对换的需要
    为了缓解内存紧张的情况,即将内存中处于阻塞状态的进程换至辅存上,使进程又处于一种有别于阻塞状态的新状态。
  • 负荷调节的需要

在引入挂起状态后,又将增加从挂起状态(又称静止状态)到非挂起状态(又称活动状态)的转换
- 活动就绪→静止就绪
- 活动阻塞→静止阻塞
- 静止就绪→活动就绪
- 静止阻塞→活动阻塞

进程控制块(PCB)

-进程控制块记录进程信息
-操作系统是根据进程控制块PCB来对并发执行的进程进行控制和管理的 
-PCB是进程存在的唯一标志

-进程标识符信息
进程标识符用于唯一地标识一个进程,通常有外部标识符和内部标识符
①外部标识符。由创建者提供,通常由字母、数字所组成,往往是由用户(进程)在访问该进程时使用。
②内部标识符。这是为了方便系统使用而设置的。在所有操作系统中都为每一个进程赋予一个惟一的整数作为内部标识符,它通常就是一个进程的序号。

-处理机状态信息
处理机状态信息主要是由处理机各种寄存器中的内容所组成 :通用寄存器、指令计数器、程序状态字PSW、用户栈指针。

-进程调度信息
存放了一些与进程调度和进程对换有关的信息:进程状态、进程优先级、进程调度所需的其他信息、事件。

进程控制的主要任务是创建和撤消进程以及实现进程的状态转换,进程控制一般由操作系统的内核来实现。操作系统内核通常是运行在系统态的。

通常,将一些与硬件紧密相关的模块诸如中断处理程序、各种常用设备的驱动程序以及运行频率较高的模块都安排在紧靠硬件的软件层次中并使它们常驻内存,以便提高操作系统的运行效率,并对它们加以特殊的保护,把这一部分称为操作系统的内核

操作系统内核的功能

中断处理:中断处理功能在操作系统中,既是内核的最基本功能,也是整个操作系统赖以活动的基础,即操作系统的重要活动最终都将依赖于中断。
进程管理:进程创建、撤消、进程状态的转换 、进程调度等。
资源管理中的基本操作:包括对时钟、I/O设备和文件系统进行控制和管理的基本操作。 

所谓原子操作是指:一个操作中的所有动作,要么全做,要么全不做。换言之,原子操作是一个不可分割的操作。
内核在执行上述操作时,往往是通过执行各种原语操作来实现的。

进程便通过调用阻塞原语block()把自己阻塞
-立即停止当前进程的执行
-把进程控制块中的现行状态由“执行”改为“阻塞”,并把它插入到阻塞队列


调用唤醒原语wakeup( )将等待该事件的进程唤醒
-把被阻塞进程从等待该事件的阻塞队列中移出
-将其PCB中的现行状态由“阻塞”改为“就绪”
-然后再将该进程插入到就绪队列中


当出现了引起进程挂起的事件时,系统就利用挂起原语suspend( )将指定进程或处于阻塞状态的进程挂起
-检查被挂起进程的状态,若正处于活动就绪状态,便将其改为静止就绪;对于活动阻塞状态的进程,则将其改为静止阻塞
-进程保存于外存对换区
-如被挂起的进程正在执行,则转调度程序重新调度


当发生激活进程的事件时系统将利用激活原语active( )将指定进程激活

-将进程从外存调入内存,检查该进程的现行状态:若是静止就绪,便将其改为活动就绪;若为静止阻塞,便将其改为活动阻塞
-假如采用的是抢占调度策略 ,检查是否要进行重新调度

进程的调度

一个程序从提交开始直到完成,往往要经历三级调度:
高级调度又称为作业调度,它决定将哪些在外存上处于后备状态的作业(程序加数据)调入主机内存,准备执行。
低级调度又称为进程调度。它决定就绪队列中哪个进程将获得处理机,并实际执行将处理机分配给该进程的操作。
在有的系统中,可能增加一中级调度,主要作用是在内存和外存对换区之间进行进程对换,以解决内存紧张问题 。


进程调度就是系统按照某种算法把CPU动态地分配给某一就绪进程。进程调度工作是通过进程调度程序来完成的。
进程调度程序的主要功能:
-选择进程占有CPU
-进行进程上下文的切换

调度方式

非剥夺方式

分派程序一旦把处理机分配给某进程后便让它一直运行下去,直到进程完成或发生某事件(如提出I/O请求)而阻塞时才把处理机分配给另一进程
-优点:简单,系统开销小,
-缺点:貌似公正,可能导致系统性能的恶化

剥夺方式

该方式规定,当一个进程正在运行时,系统可以基于某种原则,剥夺已分配给它的处理机,将之分配给其它进程
剥夺原则:优先权原则、短进程优先原则、时间片原则

进程调度算法

先进先出(FIFO)
	-算法:把处理机分配给最先进入就绪队列的进程 
    -优点:易于实现
    -缺点:表面上公平,服务质量不佳 、对短进程不利
最短处理机运行期优先调度算法

-算法:从就绪队列中选出“下一个CPU执行期”最短的进程,为之分配处理机使之执行
-优点:可获得较好的调度性能
-缺点: 进程的CPU执行期难以准确得到、对长进程不利

最高响应比优先调度算法
   -算法:响应比=(等待时间+要求的服务时间)/要求的服务时间 ,每次选取响应比最高的进程调度        
   -优点:所以对短进程有利,并且考虑了等待时间
   -缺点:计算响应比有一定的系统开销
优先级调度算法

-算法:将CPU分配给就绪队列中优先级最高的进程
-静态优先级
在进程创建时确立,确定后运行期间保持不变。确立依据有:进程的类型、进程对资源的需求、用户申请的优先级
优点:简单
缺点:不能动态反映进程特点,系统调度性能差

动态优先级
进程在开始创建时,根据某种原则确定一个优先级后,随着进程执行时间的变化,其优先级不断地进行动态调整 
确定依据:根据进程占有的CPU时间的长短来决定,占有时间越长优先级越低;根据进程等待CPU的时间来决定,时间越长优先级越高
时间片轮转调度算法

算法:通常用在分时系统,它轮流地调度系统中所有就绪进程,使就绪进程依次获得一个时间片的运行时间

  • 时间片长短确定遵循原则
    既要保证系统各个用户进程及时地得到响应,又不要由于时间片太短而增加调度的开销,降低系统的效率
前后台调度算法

-算法:该方法用在批处理和分时相结合的系统中。将分时用户作业放在前台,把批处理作业放在后台。系统对前台作业按照时间片轮转法进行调度,仅当前台无作业时,才把处理机分配给后台作业的进程。后台进程通常按先来先服务方式运行
-优点:使分时用户进程得到及时响应,又提高了系统资源的利用率

多级反馈队列轮转算法

-系统设置多个不同优先级的就绪队列,每次调度总是先调度优先级高的队列,仅当该队列空时,才调度次高优先级队列。
-通常刚创建的进程和因请求I/O未用完时间片的进程排在最高优先级队列,在这个队列中运行2-3个时间片未完成的进程排列下一个较低优先级队列。
-不论什么时候,只要较高优先级队列有进程进入,立即转进程调度,及时调度较高优先级队列进程。
-优点:能较好地满足各类作业的用户要求,既能使分时用户作业得到满意的响应,又能使批处理用户的作业获得较合理的周转时间

进程依次执行时可能发生的三种情况

   -进程未用完一个时间片便结束,这时系统应提前进行调度
   -进程在执行过程中提出I/O请求而阻塞,系统应将它放入相应的阻塞队列并引起调度 
   -进程用完一个时间片后尚未完成。系统应将它重新放到就绪队列的末尾,等待下次执行 

进程调度的时机和过程

进程调度的时机
   -正在执行的进程运行完毕 
   -正在执行的进程调用阻塞原语将自己阻塞起来进入等待状态 
   -在采用抢占式优先级调度时,有优先级高于正在运行进程的进程进入就绪队列 
   -在分时系统中时间片已经用完 
   -CPU方式是可剥夺时,就绪队列中的某个进程 优先级变得高于当前运行进程的优先级 
进程调度的过程

-进程调度所依赖的数据结构通常是调度队列,由于调度的原因不同,在单处理器系统中设置了多种等待队列
-只有就绪队列中的进程能够获得处理器而最终运行,其他队列中的进程从队列中出来后,必须进入就绪队列才能分配处理器
-队列数据结构的建立结构与调度算法密切相关
-进程调度算法只是决定哪一个进程将获得处理机,而将处理机分配给该进程的具体操作是由分派程序完成的


进程间通信

同步机制应遵循的准则

 	- 空闲让进
    - 忙则等待
    - 有限等待
    - 让权等待

读者-写者问题

只要求读的进程称为“reader进程”,其他进程称为“writer进程”。
允许多个reader进程同时读一个共享对象,但决不允许一个writer进程和其他reader进程或writer进程同时访问共享对象
所谓读者-写者问题(The Reader-Writer Problem)是只保证一个writer进程必须与其他进程互斥地访问共享对象的同步问题

哲学家进餐问题

有五个哲学家,他们的生活方式是交替地进行思考和进餐。哲学家们共用一张圆桌,分别坐在周围的五张椅子上。在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。进餐毕,放下筷子继续思考。

解决办法:

①至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释放出他所使用过的两支筷子,从而可使更多的哲学家进餐。
②仅当哲学家的左、右两支筷子均可用时才允许他拿起筷子进餐。
③规定奇数号哲学家先拿他左边的筷子,然后再去拿他右边的筷子;而偶数号哲学家则相反。

管程

为了解决信号量大量的同步操作分散,不利于管理;而且还会因同步操作的使用不当而导致系统死锁,所以引入一种新的同步工具——管程

一个管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中的数据.

由定义可知,管程由三部分组成
-局部于管程的共享变量说明
-对该数据结构进行操作的一组过程
-对局部于管程的数据设置初值的语句

死锁

在多道程序系统中,若对资源的管理、分配和使用不当,也会产生一种危险,即在一定条件下会导致系统发生一种随机性错误——死锁。

竞争资源

多个进程所共享的资源不足,引起它们对资源的竞争而产生死锁
-竞争可剥夺和非剥夺性资源
-竞争非剥夺性资源

进程推进顺序不当引起死锁

进程运行过程中,请求和释放资源的顺序不当,而导致进程死锁
-进程推进顺序合法
-进程推进顺序非法

产生死锁的四个必要条件

  • 互斥条件
    进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占有

  • 请求和保持条件
    当进程因请求资源而阻塞时,对已获得的资源保持不放

  • 不剥夺条件
    进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放

  • 环路等待条件
    在发生死锁时必然存在一个进程—资源的环形链

解决死锁的基本办法

  • 预防死锁
    通过设置某些限制条件,以破坏产生死锁的四个必要条件中的一个或几个,来防止发生死锁。

  • 避免死锁
    在资源的动态分配过程中,使用某种方法去防止系统进入不安全状态,从而避免了死锁的发生。

  • 检测死锁
    检测死锁方法允许系统运行过程中发生死锁。但通过系统所设置的检测机构,可以及时检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中消除所发生的死锁

  • 解除死锁
    解除死锁是与检测死锁相配套的一种设施,用于将进程从死锁状态下解脱出来

预防死锁

系统要求所有进程一次性地申请其所需的全部资源,若系统有足够的资源分配给一进程时,便一次把所有其所需的资源分配给该进程,摒弃“请求”条件;在分配时只要有一种资源要求不能满足,则已有的其它资源也全部不分配给该进程,摒弃“保持”条件(静态资源分配法).

摒弃“不剥夺”条件

一个已保持了某些资源的进程,若新的资源要求不能立即得到满足,它必须释放已保持的所有资源

摒弃“环路等待”条件

将所有的资源按类型进行线性排队,并赋予不同的序号 ,所有进程对资源的请求,必须严格按资源序号递增的次序提出.

避免死锁

安全与不安全状态

所谓安全状态,是指系统能按某种进程顺序如(P1,P2,…,Pn)(称<P1,P2,…,Pn>序列为安全序列)来为每个进程分配其所需资源,直至最大需求,使每个进程都可顺利完成

不安全状态

若系统不存在这样一个安全序列,则称系统处于不安全状态

由安全状态向不安全状态的转换

如果不按照安全顺序分配资源,则系统可能由安全状态进入不安 全状态 ,可能发生死锁

银行家算法

银行家算法中的数据结构
可利用资源向量Available

是一个具有m个元素的数组,其中每一个元素代表一类 可利用的资源数目 ,如果Available[j]=k,表示系统中现有Rj类资源有k个

最大需求矩阵Max
是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程,对m类资源的最大需求,如果Max(i,j)=k,表示进程i需要Rj类资源的最大数目为k 
分配矩阵Allocation
一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一个进程的资源数,如果Allocation(i,j)=k,表示进程i当前已分得Rj类资源的数目为k 
需求矩阵Need
    是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数,如果Need[i,j]=k,表示进程i还需要Rj类资源k个,方能完成其任务

Need(i,j)=Max(i,j)-Allocation(i,j)

示例







检测死锁

为了检测死锁,系统必须①保存有关资源的请求和分配信息,②提供一种算法,利用这些信息来检测系统是否已进入死锁状态

资源分配图

资源分配图是由一组结点N和 一组边E所组成的一对偶G =(N,E)
结点分为两种结点:进程结点和资源结点;边表示进程和资源的请求分配关系

死锁的解除

-剥夺资源
-撤销进程


略多,分两三篇吧。

以上是关于开发成长之路(21)-- 不可不知的操作系统知识的主要内容,如果未能解决你的问题,请参考以下文章

开发成长之路(22)-- 不可不知的操作系统知识

开发成长之路(22)-- 不可不知的操作系统知识

你不可不知的事 | 单点登录成长史

2018——记录自己的成长之路

移动开发者的成长之路?

架构师成长之路:谈应用系统架构设计