操作系统OS
一、进程的概念、组成、特征
1.概念
我们先引入程序的概念。
程序,是静态的,是存放在磁盘里的可执行文件,一系列的指令集合
进程,是动态的,是程序的一次执行过程
2.组成
当进程被创建时,操作系统会为该进程分配一个PID(process ID,进程ID)。
操作系统需要记录进程的PID、UID(进程所属用户ID)、给进程分配了那些资源、进程运行情况,这些信息都要被保存在一个数据结构PCB(Procss Control Block,进程控制块)里。
进程是一个独立的运行单元,也是操作系统进行资源分配和调度的基本单位。它由进程控制块、程序段、数据段组成。
3.特征
1)动态性。
进程是程序的一次执行,它有着创建、活动、暂停、终止等过程,具有一定的生命周期,是动态地产生、变化和消亡的。动态性是进程最基本的特征。
2)并发性。
指多个进程实体同存于内存中,能在一段时间内同时运行。引入进程的目的就是使进程能和其他进程并发执行。并发性是进程的重要特征,也是操作系统的重要特征。
3)独立性。
指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。凡未建立 PCB的程序,都不能作为一个独立的单位参与运行。
4)异步性。
由于进程的相互制约,使得进程按各自独立的、不可预知的速度向前推进。异
步性会导致执行结果的不可再现性,为此在操作系统中必须配置相应的进程同步机制。
通常不会直接考查进程有什么特性,所以读者对上面的4个特性不必记忆,只求理解。
二、进程的状态、转换、组织
1.进程的状态
进程在其生命周期内,由于系统中各进程之间的相互制约及系统的运行环境的变化,使得进程的状态也在不断地发生变化。通常进程有以下5种状态,前3种是进程的基本状态。
1)运行态(Running)。进程正在处理机上运行。在单处理机中,每个时刻只有一个进程处于运行态。
2)就绪态(Ready)。进程获得了除处理机外的一切所需资源,一旦得到处理机,便可立即运行。系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列。
3)阻塞态(Waiting/Blocked),又称等待态。进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或等待输入/输出完成。即使处理机空闲,该进程也不能运行。系统通常将处于阻塞态的进程也排成一个队列,甚至根据阻塞原因的不同,设置多个阻塞队列。
4)创建态(New)。进程正在被创建,尚未转到就绪态。创建进程需要多个步骤:首先申请一个空白PCB,并向 PCB中填写用于控制和管理进程的信息:然后为该进程分配运行时所必须的资源;最后把该进程转入就绪态并插入就绪队列。但是,如果进程所需的资源尚不能得到满足,如内存不足,则创建工作尚未完成,进程此时所处的状态称为创建态。
5)终止态(Terminated)。进程正从系统中消失,可能是进程正常结束或其他原因退出运行。进程需要结束运行时,系统首先将该进程置为终止态,然后进一步处理资源释放和回收等工作。
2.进程状态的转换
需要注意的是,
一个进程从运行态变成阻塞态是主动的行为,
而从阻塞态变成就绪态是被动的行为,需要其他相关进程的协助。
3.进程的组织
在一个系统中,通常存在着许多进程的PCB,有的处于就绪态,有的处于阻塞态,而且阻塞的原因各不相同。为了方便进程的调度和管理,需要将各进程的 PCB用适当的方法组织起来。目前,常用的组织方式有链接方式和索引方式两种。
链接方式将同一状态的 PCB链接成一个队列,不同状态对应不同的队列,也可把处于阻塞态的进程PCB,根据其阻塞原因的不同,排成多个阻塞队列。
索引方式将同一状态的进程组织在一个索引表中,索引表的表项指向相应的 PCB,不同状态对应不同的索引表,如就绪索引表和阻塞索引表等。
三、进程控制
进程控制的主要功能是对系统中所有进程实施有效的管理(实施状态转换)。
计算机进程的控制通常由原语完成。所谓原语,不是原神语,一般是指由若干条指令组成的程序段,用来实现某个特定功能,在执行过程中不可被中断。
四、进程通信
进程通信(Inter Process Communication,IPC)是指俩个进程之间产生数据交互。
1.共享存储
在通信的进程之间存在一块可直接访问的共享空间,通过对这片共享空间进行写/读操作实现进程之间的信息交换。在对共享空间进行写/读操作时,需要使用同步互斥工具(如P操作、V操作),对共享空间的写/读进行控制。共享存储又分为两种:低级方式的共享是基于数据结构的共享;高级方式的共享则是基于存储区的共享。操作系统只负责为通信进程提供可共享使用的存储空间和同步互斥工具,而数据交换则由用户自己安排读/写指令完成。注意,进程空间一般都是独立的,进程运行期间一般不能访问其他进程的空间,想让两个进程共享空间,必须通过特殊的系统调用实现,而进程内的线程是自然共享进程空间的。
简单理解就是,甲和乙中间有一个大布袋,甲和乙交换物品是通过大布袋进行的,甲把物品放在大布袋里,乙拿走。但乙不能直接到甲的手中拿东西,甲也不能直接到乙的手中拿东西。
2.消息传递
在消息传递系统中,进程间的数据交换以格式化的消息(Message)为单位。若通信的进程之间不存在可直接访问的共享空间,则必须利用操作系统提供的消息传递方法实现进程通信。进程通过系统提供的发送消息和接收消息两个原语进行数据交换。这种方式隐藏了通信实现细节,使通信过程对用户透明,简化了通信程序的设计,是当前应用最广泛的进程间通信机制。在微内核操作系统中,微内核与服务器之间的通信就采用了消息传递机制。由于该机制能很好地支持多处理机系统、分布式系统和计算机网络,因此也成为这些领域最主要的通信工具。
1)直接通信方式。发送进程直接把消息发送给接收进程,并将它挂在接收进程的消息缓冲队列上,接收进程从消息缓冲队列中取得消息
2)间接通信方式。发送进程把消息发送到某个中间实体,接收进程从中间实体取得消息。
这种中间实体一般称为信箱。该通信方式广泛应用于计算机网络中。
简单理解就是,甲要告诉乙某些事情,就要写信,然后通过邮差送给乙。直接通信就是邮差,把信直接送到乙的手上;间接通信就是乙家门口有一个邮箱,邮差把信放到邮箱里。
3.管道通信
管道通信允许两个进程按生产者-消费者方式进行通
信(,生产者向管道的一端写,消费者从管道的另一端读。数据在管道中是先进先出的。只要管道非空,读进程就能从管道中读出数据,若数据被读空,则读进程塞,直到写进程往管道中写入新的数据,再将读进程唤醒。只要管道不满,写进程就能往管道中写入数据,若管道写满,则写进程阻塞,直到读进程读出数据,再将写进程唤醒。为了协调双方的通信,管道机制必须提供三方面的协调能力:互斥、同步和确定对方的存在。
五、线程
1.概念
引入进程的目的是更好地使多道程序并发执行,提高资源利用率和系统吞吐量;而引入线程的目的则是减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能。
线程最直接的理解就是“轻量级进程”,它是一个基本的CPU执行单元,是程序执行流的最小单元,由线程ID、程序计数器、寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。引入线程后,进程的内涵发生了改变,进程只作为除CPU 外的系统资源的分配单元,而线程则作为处理机的分配单元。由于一个进程内部有多个线程,若线程的切换发生在同一个进程内部,则只需要很少的时空开销。
2.属性
3.实现方式和多线程模型
在用户级线程(ULT)中,有关线程管理(创建、撤销和切换等)的所有工作都由应用程序在用户空间中完成,内核意识不到线程的存在。应用程序可以通过使用线程库设计成多线程程序。通常,应用程序从单线程开始,在该线程中开始运行,在其运行的任何时刻,可以通过调用线程库中的派生例程创建一个在相同进程中运行的新线程。
在操作系统中,无论是系统进程还是用户进程,都是在操作系统内核的支持下运行的,与内核紧密相关。内核级线程(KLT)同样也是在内核的支持下运行的,线程管理的所有工作也是在内核空间内实现的。内核空间也为每个内核级线程设置一个线程控制块,内核根据该控制块感知某线程的存在,并对其加以控制。
4.线程的状态和转换
和进程类似。
5.线程的组织与切换
和进程类似。
系统也为每个线程配置一个线程控制块TCB,用于记录控制和管理线程的信息。
线程控制块通常包括:
①线程标识符:
②一组寄存器,包括程序计数器、状态寄存器和通用寄存
器;
③线程运行状态,用于描述线程正处于何种状态;
④优先级;
⑤线程专有存储区,线程切换时用于保存现场等;
⑥堆栈指针,用于过程调用时保存局部变量及返回地址等。
同一进程中的所有线程都完全共享进程的地址空间和全局变量。各个线程都可以访问进程地址空间的每个单元,所以一个线程可以读、写或甚至清除另一个线程的堆栈。
5.线程调度的时机、方式、切换和过程
调度:当有一堆任务要处理,由于资源有限,这些事情没法同时处理。这就需要确定某种规则来确定这些任务的顺序,这就是“调度”研究的问题。
(1)高级调度(作业调度)就是内存与辅存之间的调度。每个作业只调入一次、调出一次。多道批处理系统中大多配有作业调度,而其他系统中通常不需要配置作业调度。
(2)中级调度(内存调度)
引入中级调度的目的是提高内存利用率和系统吞吐量。为此,将那些暂时不能运行的进程调至外存等待,此时进程的状态称为挂起态。当它们已具备运行条件且内存又稍有空闲时,由中级调度来决定把外存上的那些已具备运行条件的就绪进程再重新调入内存,并修改其状态为就绪态,挂在就绪队列上等待。中级调度实际上是存储器管理中的对换功能。
(3)低级调度(进程调度)
按照某种算法从就绪队列中选取一个进程,将处理机分配给它。进程调度是最基本的一种调度,在各种操作系统中都必须配置这级调度。进程调度的频率很高,一般几十亳秒一次。
调度时机:
调度方式:
切换与过程:
保存原来运行进程各种数据,恢复新的进程各种数据
6.调度器和闲逛进程
调度器:
1)排队器。
将系统中的所有就绪进程按照一定的策略排成一个或多个队列,以便于调度程序选择。每当有一个进程转变为就绪态时,排队器便将它插入到相应的就绪队列中。
2)分派器。
依据调度程序所选的进程,将其从就绪队列中取出,将CPU分配给新进程。
3)上下文切换器。
在对处理机进行切换时,会发生两对上下文的切换操作:第一对,将当前进程的上下文保存到其PCB中,再装入分派程序的上下文,以便分派程序运行;第二对,移出分派程序的上下文,将新选进程的CPU 现场信息装入处理机的各个相应寄存器。
在上下文切换时,需要执行大量load 和 store指令,以保存寄存器的内容,因此会花费较多时间。现在已有硬件实现的方法来减少上下文切换时间。通常采用两组寄存器,其中一组供内核使用,一组供用户使用。这样,上下文切换时,只需改变指针,让其指向当前寄存器组即可。
闲逛进程:
在进程切换时,如果系统中没有就绪进程,就会调度闲逛进程(idle)运行,如果没有其他进程就绪,该进程就一直运行,并在执行过程中测试中断。闲逛进程的优先级最低,没有就绪进程时才会运行闲逛进程,只要有进程就绪,就会立即让出处理机。闲逛进程不需要CPU之外的资源,它不会被阻塞。
7.调度算法
评价标准:
调度算法:
1.先来先服务(FCFS)
2.短作业优先(SJF)
3.高响应比优先(HRRN)
这些可以望文生义一下……
4.时间片轮转(RR)
时间片轮转调度算法主要适用于分时系统。在这种算法中,系统将所有就绪进程按FCFS 策略排成一个就绪队列,调度程序总是选择就绪队列中的第一个进程执行,但仅能运行一个时间片,如50ms。在使用完一个时间片后,即使进程并未运行完成,它也必须释放出(被剥夺)处理机给下一个就绪进程,而被剥夺的进程返回到就绪队列的末尾重新排队,等候再次运行。
5.优先级
6.多级反馈队列
多级反馈队列调度算法是时间片轮转调度算法和优先级调度算法的综合与发展。通过动态调整进程优先级和时间片大小,多级反馈队列调度算法可以兼顾多方面的系统目标。
例如,为提高系统吞吐量和缩短平均周转时间而照顾短进程;
为获得较好的I/O设备利用率和缩短响应时间而照顾I/O型进程;
同时,也不必事先估计进程的执行时间。
六、同步和互斥
在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系。为了协调进程之间的相互制约关系,引入了进程同步的概念。下面举一个简单的例子来帮大家理解这个概念。例如,让系统计算1+2x3,假设系统产生两个进程:一个是加法进程,一个是乘法进程。
要让计算结果是正确的,一定要让加法进程发生在乘法进程之后,但实际上操作系统具有异步性,若不加以制约,加法进程发生在乘法进程之前是绝对有可能的,因此要制定一定的机制去约束加法进程,让它在乘法进程完成之后才发生,而这种机制就是本节要讨论的内容。
临界资源
虽然多个进程可以共享系统中的各种资源,但其中许多资源一次只能为一个进程所用,我们将一次仅允许一个进程使用的资源称为临界资源。许多物理设备都属于临界资源,如打印机等。
此外,还有许多变量、数据等都可以被若干进程共享,也属于临界资源。对临界资源的访问,必须互斥地进行,在每个进程中,访问临界资源的那段代码称为临界区。
同步
同步亦称直接制约关系,是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系源于它们之间的相互合作。
例如,输入进程A通过单缓冲向进程B 提供数据。当该缓冲区空时,进程B不能获得所需数据而阻塞,一旦进程A 将数据送入缓冲区,进程B就被唤醒。反之,当缓冲区满时,进程A被阻塞,仅当进程B取走缓冲数时,才唤醒进程A。
互斥
互斥也称间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一进程才允许去访问此临界资源。
例如,在仅有一台打印机的系统中,有两个进程A和进程B,若进程A需要打印时,系统已将打印机分配给进程B,则进程A必须阻塞。一旦进程B将打印机释放,系统便将进程A唤醒,并将其由阻塞态变为就绪态。
为禁止两个进程同时进入临界区,同步机制应遵循以下准则:
1)空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区。
2)忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待。
3)有限等待。对请求访问的进程,应保证能在有限时间内进入临界区。
4)让权等待。当进程不能进入临界区时,应立即释放处理器,防止进程忙等待。
七、信号量机制
1.整型信号量
用一个整数型的变量作为信号量,用来表示系统中某种资源的数量。
2.纪录型信号量
3.信号量机制实现进程同步
4.信号量机制实现进程互斥
5.信号量机制实现前驱关系
八、管程
在信号量机制中,每个要访问临界资源的进程都必须自备同步的PV 操作,大量分散的同步操作给系统管理带来了麻烦,且容易因同步操作不当而导致系统死锁。于是,便产生了一种新的进程同步工具一管程。管程的特性保证了进程互斥,无须程序员自己实现互斥,从而降低了死锁发生的可能性。同时管程提供了条件变量,可以让程序员灵活地实现进程同步。
九、死锁
在多道程序系统中,由于多个进程的并发执行,改善了系统资源的利用率并提高了系统的处理能力。然而,多个进程的并发执行也带来了新的问题一死锁。所谓死锁,是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
在一条河上有一座桥,桥面很窄,只能容纳一辆汽车通行。
若有两辆汽车分别从桥的左右两端驶上该桥,则会出现下述冲突情况:此时,左边的汽车占有桥面左边的一段,要想过桥还需等待右边的汽车让出桥面右边的一段右边的汽车占有桥面右边的一段,要想过桥还需等待左边的汽车让出桥面左边的一段。此时,若左右两边的汽车都只能向前行驶,则两辆汽车都无法过桥。