您的位置:首页 > 其它

操作系统基础

2017-05-13 11:05 169 查看
博主 q q 656358805,欢迎线上交流。

由于特殊原因,我们今天就来扯点操作系统。

一、操作系统的特征:

1、并发性:

先说一下什么是并发,并发是两个或多个事件在同一时间间隔发生。对于单核的操作系统来说呢,并发是必然的,因为一个cpu在同一时间只能计算某一个程序的某个运算,而不能同时算几个程序中的代码内容,所以我们说的多道程序并发其实是个宏观上的概念,由于cpu切换的速度很快,所以宏观上似乎实现了多程序运行的效果。操作系统会一次运行多个程序,当其中一个程序获得cpu时,其他程序则为挂起状态等待接受cpu,因此微观上,单核操作系统不可能实现同一时间计算多个程序。

与并发相似的一个性质——并行,它是多核操作系统实实在在的多程序运行,有好多个cpu自然可以在同一时间运行cpu个数的程序。我们说的程序是一个静态实体,他们本不能并发执行,因此为了使他们并发执行,系统为每一个程序建立进程,又称为任务,进程是系统中能独立运行并且作为资源分配的基本单位,是一个活动的实体。

并发性可以使有限的物理资源进行多用户共享以提高效率,避免操作系统中部件相互等待,改进系统吞吐率,但是在cpu切换的时候难免会发生问题,例如:谁会是下一个接受cpu的程序?如何保证程序之间不相互受影响?这是值得思考的问题。

2、共享性:

这个性质和并发性都是最基本的并且相互依存、促进的性质,系统的资源有很多(硬件、信息..),而进程访问资源却有以下两种方式:在说方式之前先说明一下什么事临界资源: 临界资源是同一时间只允许一个进程访问的资源,如打印机。

方式一:互斥访问:资源可供多程序访问,但是同一时间只能有一个程序访问,当一个程序释放该资源后其他进程才可以使用。

方式二:同时访问:多个进程可以在同一时间访问同一个资源,如磁盘。

3、异步性(随机性,不确定性):

多道进程运行的次序不一定,换句话说就是cpu切换后,将由哪一个进程来接受是不一定的,但是导致异步性的基本原因是进程执行时的各种中断不定,因此我们必须保证每个进程在相同操作系统运行下运行的结果永远相同。

4、虚拟性:

是一种巧妙地管理技术,它可以将多个实体逻辑上看作一个实体,一个实体逻辑上看成多个实体,例如:一个cpu分成逻辑上多个cpu实现并发;一个窗口逻辑上分成多个窗口实现多窗口;一个信道分成逻辑多个信道传数据;多个存储设备看成逻辑上一个存储器来储存,因此物理设备为1,逻辑上虚拟n个,则速度必然小于1/n。

二、unix的内核功能。(利用unix这个分时操作系统来更好地理解操作系统的原理,unix系统可以看成三级,user,shell,core,user包括shell,实用程序,函数库,core里面是硬件)

1、文件子系统。

涉及到空闲文件存储空间的管理,给文件分配存储空间,回收文件释放的空间,存取文件,搜索文件,提供调用服务。

2、进程控制子系统。

进程创建、调度,进程间通讯、同步控制。

3、设备管理子系统。

完成进程和外设(文件)之间的数据交换功能。

4、存储管理子系统。

管理内存空闲空间,对交换区空间管理,对虚拟空间管理。由于内存对于计算机来说十分宝贵,所以操作系统只把某程序的一小段放入内存执行,其它部分放入外存,利用交换和请求调页等管理策略来使一个程序快速在内存中运行。

三、多道程序设计以及其利弊。

以前的单道程序运行是cpu一次只执行一个进程,直到把这个进程执行完再执行下一个进程,也就是顺序执行。但是这不免会有一种情况,就是可能一个进程利用不了系统的所有资源,这样的话当进程执行的时候会有资源空闲的情况,系统资源的利用率会很低,而为了提高资源利用率便出现了多道程序设计,将多个程序放入一个主存中执行,允许他们共享资源,并发执行程序。但是这样做会带来互斥与同步的问题,管理资源的共享也会更加复杂。

程序的两种执行方式:

1、顺序执行:

内部顺序性:代码或指令只会由上而下顺序执行

外部顺序性:一次执行一个任务,任务的次序已规定

特点: 封闭性:一个程序占用所有资源,不受外界影响; 可再现性:只要程序初始化数据相同,可得相同的结果。

2、并发执行:

满足内部顺序性,但是外部是并发的,并发的定义之前已经讲过了。

不利因素:

共享资源的相互制约;失去封闭性和可再现性,程序运行的速度也会影响程序的结果,因此操作系统必须保证:无论程序以那种交叉执行的顺序最后都要得到相同的结果。

对于以上众多不利因素,我们定义了进程来作为解决此类问题的基础。(但不是只有进程)

四、进程。

进程是程序、数据、PCB。

进程包含程序,程序中一定会有代码,可能会有数据,但是进程一定是出于正在执行。PCB是控制进程的数据结构,记录了进程有关的资料。

进程的分类:

用户进程:运行用户程序,服务用户。

系统进程:运行系统程序,完成操作系统的某些功能。 例如:window运行初始化后的一些管理进程。

进程的属性:

动态性:不断地执行

并发性:在同一主存中同时运行

独立性:有自己的内部计数器和状态

异步性:有自己的执行推进速度

交往性:可能会和其他进程相互制约

进程的状态转换:

初始态:进程新创建后

终止态:进程执行结束

执行态:占用cpu执行中

等待态:未占用cpu等待处理,等待态可以依据中断原因的不同来分为几个状态:  阻塞态:进程由于自身的阻塞而进入等待态  ;就绪态:一个进程等待cpu的时间已经很长了,操作系统为了公平将cpu传给这个进程,这是由于操作系统的原因,而出于就绪态的进程万事俱备只缺cpu了。

除此之外再说一个状态——挂起。 

挂起:当系统资源不能满足这个进程的执行要求时,os将这个进程转移到磁盘中,不让他参与进程调度,以减少系统负荷的过程。

挂起原因:

1、阻塞后挂起。

2、进程太多,资源不足,挂起不重要进程。

3、用户主动请求挂起某个进程。

4、父进程要求挂起子进程。

5、os出错或要检查系统资源时必要挂起一些进程。

进一步介绍进程前需要了解一下作业:

作业:计算机做一次运算,计算机所做的关于该计算的全部工作。

一个作业一般需要多个进程组成。

PCB:

作用:PCB随进程创建时创建,随进程结束时消亡,它可以是进程并发,没有PCB的进程不会并发。

信息: 进程标识符:进程名; 进程当前状态: 进程的程序和数据地址:联系其PCB和程序;资源清单:列出该进程拥有的资源 ;进程优先级; cpu现场保护区:用于该进程重展由cpu时恢复上次的现场 ;进程同步和通讯:存指针 ;PCB连接字 ;其他信息

进程上下文:进程的实体以及支持进程运行的环境。

进程的切换会导致上下文的切换,进程a切b,存a上下文,恢复b上下文。

进程的控制:依赖进程管理和原语操作。

进程管理功能基本上都放入内核中,因为该功能需要调用的频率很高,在内核中便于执行,而原语是一段程序,用来改变进程状态,原语操作时注意阻塞和就绪队列的使用。

1、创建原语fork()。

用来创建子进程,步骤如下:

(1)扫描PCB表找出空表,获得标识号。

(2)分配空间,存放数据和程序。

(3)初始化PCB的信息。

(4)新进程插入PCB就绪队列。

2、撤销(删除)原语。

步骤:

(1)检索被撤销的PCB,并读出其状态。

(2)如果该进程在执行,则立刻终止,设置重调度,以便转换cpu。

(3)如果被撤销进程还有子孙则一并撤销。

(4)收回资源,归还父进程和系统,注销资源清单。

(5)释放被撤销的PCB。

(6)如果可以重调度,则转重调度。

3、阻塞原语。

用来将执行状态改为阻塞,预阻塞进程自身调用。

(1)停止该进程的执行。

(2)保存当前进程cpu现场。

(3)设置阻塞状态。

(4)把调用者PCB插入相应事件的等待队列中。

(5)转入调度程序,加入新执行的进程。

4、唤醒原语。

阻塞变就绪,但是只能是别的进程唤醒某个阻塞进程。

步骤:

(1)找出需唤醒的进程标识。

(2)移除阻塞队列。

(3)设置就绪态。

(4)加入就绪队列,

(5)判断优先级,进入调度程序。

五、处理机调度原理。

调度就是对实体的资源分配,实体可以是进程或是系统级线程。

处理机四级调度:用户为了完成某个作业,需要作业调度,作业通过创建多个进程完成,需要进程调度,提高主存利用率需要交换调度,支持线程的os需要线程调度。

1、作业调度(长程调度):

从输入中选择一个作业,放入内存分配资源,建立相应进程,使其具有竞争cpu的资格。

2、交换调度(中程调度):

将外存中具有执行条件的就绪进程放入内存,或者将内存中阻塞或就绪的进程放入外存。

3、进程调度(短程调度):

从就绪队列中选一个活跃就绪态的进程占用cpu并完成上下文切换。

4、系统级线程切换:同一个进程下的线程切换不需上下文切换,而不同进程下则不然。

      用户级线程切换:都在同一个进程下切换,而且不需os内核参与。

调度目标:通过对处理及的合理分配,达到使系统高效健康地运行,并使用户满意。

1、提高系统资源的利用率:尽量不让资源空闲。

2、提高系统吞吐量,降低平均周转时间: 吞吐量指单位时间系统完成作业的个数 ;周转时间是从作业提交到完成的时间。

3、降低平均响应时间:响应时间从提交请求到系统第一次相应的时间。

4、提供相对公平机制:各个作业都有机会完成。

5、其他子目标:依据优先级完成作业,可预测参数等。

调度方式:当优先级高的进程进入就绪队列时需要进行的处理,一般分为抢先方式和非抢先方式。

1、非抢先方式:一个进程处理时直到其完成或阻塞之前都不可被抢先,就算有优先级高的进程也不可以。其优点是系统开销小,简单;缺点是可能会延误优先级高的进程。

2、抢先方式:规则有如下: 时间片原则:时间片用光后被抢先,重调度; 优先级原则:高的优先; 短作业规则:短作业比长作业先做; 其优点可以保证并发性和响应时间;缺点是更复杂,系统开销大,频繁切换会使上下文切换时间过长,时间开销大。

调度时机:只有程序进入系统内核才可以调用调度程序,而进入系统内核的方式是中断。

调度算法:

1、先来先服务:依据作业申请cpu的次序。 优点是简单,公平,没有饥饿;缺点是不利于短作业,使短作业周转时间变长,从而使平均周转时间变长。

2、最短周期优先:使整个队列中的作业平均周转时间最短,优点:短作业有利;缺点:作业的执行时间可能不会预先知道,或许会出现虚假,长作业可能由于短作业的不断加入而一直得不到cpu从而产生饥饿, 由此延伸出一种剩余时间优先算法,加入的新进程的执行时间与当前执行的进程时间比较,时间短的先执行,然后再执行完时间长的。 

以上两种方法没考虑优先级问题,因此有紧急任务时不好处理。 

3、最高优先级优先:依照所赋予的优先级来执行,若优先级相同则结合上述两种方法。

如何确定优先级:

(1)静态优先级:对于作业可以依据费用,定量计算费用,多则优先;对于进程,系统进程优先,资源利用少的优先,时间快的优先。优点:简单,开销少,不公平,用于实时调度要求不高的系统。

(2)动态优先级:开始先依据某原则赋一个优先级,执行时动态改变此优先级,一个进程被分配资源时,其优先级提高避免浪费资源;执行时的进程优先级随时间增长而减小,就绪态的相反。优点灵活,公平,资源利用率高,防止cpu垄断;缺点:复杂,系统开销大。

4、时间片轮转法:

以作业申请的顺序依次执行某个时间片长的时间。

(1)固定时间片轮转:时间片固定为几十毫秒到几百毫秒。

(2)可变时间片轮转:时间片不同。

优点:公平,响应及时;动态的复杂,开销大,但是灵活 ;缺点:该方法对偏重io进程处理不公平。

5、多级反馈队列:

综合动态时间片轮转和最高优先级调度。

(1)设置多个队列,每个队列优先级不同。

(2)每个队列时间片不同,时间片与队列优先级成反比。

(3)新进程放入第一个队列队尾,每个队列依据先来先服务规则。

(4)进程没在一个时间片内执行完则放入下一个队列的队尾,若已经是最后一个队列,则依据时间片轮转。

(5)仅当第一个队列为空,才在第二个队列里执行,仅当优先级高的队列全空才执行更低的队列。

(6)当有更高优先级新进程加入时,先执行新进程,当前进程回到该队列队尾。

优点:短周期一般先在优先级高的队列中处理,切换开销小,不太复杂。

缺点:优先级高的队列一直不为空则优先级低的队列出现饥饿。

实时调度:对时间的约束的调度,依据截止时间和优先级或在满足硬实时的前提下尽可能多地满足软实时。

硬实时:必须在一定时间完成

软实时:大多数情况下完成

下面具体讲一下原语操作函数:

1、fork()创建一个子进程,无输入,输出对于父进程为子进程的标识号,对于子进程是0。

流程:

(1)检查是否有足够的资源创建进程。

(2)有的话就分配一个proc数组项和唯一的标识号。

(3)检查是否创建的子进程太多。

(4)不是的话设置创建态。

(5)将父进程的proc复制到子进程。

(6)父进程的引用目录加一,根目录修改。

(7)父进程的引用文件数加一。

(8)子进程上下文保存如父进程fork专区,父进程上下文保存如子进程中

(9)判断父进程执行子进程就改为就绪,否则初始化user计时字段。

2、exec()执行一个文件,使子进程拥有不同于父进程的正文和数据,所执行的文件会覆盖原进程的上下文。

输入:文件名,参数,环境变量表。

(1)判断是否该文件可以执行以及执行的权限。

(2)确定文件格式,地址空间参数存入缓冲区。

(3)中断老区并回收。

(4)分配新区的正文和数据,连接进程,可能的话新进程装入内存。

3、sleep()使某个进程以指定优先数在队列中休眠和wakeup()唤醒队列中所有的休眠态进程。

sleep()输入: 睡眠地址,优先级 输出:处理软中断时信号返回,其他为0

wakeup()输入:休眠地址 输出:无

4、exit()进程自己调用成为僵死态,直到其资源回收完毕(除proc)后消亡。

5、wait()等待子进程终止。输入:含有退出状态的变量的地址。输出:子进程标志号,子进程退出码。

(1)是否有子进程。

(2)有的话是否有僵死的子进程。

(3)有的话选一个僵死的子进程。

(4)将该子进程cpu时间加到父进程上。

(5)释放该子进程proc。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: