一、操作系统的定义和分类
1.操作系统的基础知识
计算机系统中的软件极为丰富,通常分为应用软件和系统软件两大类。应用软件是指计算机用户利用计算机的软件、硬件资源为某一专门的应用目的而开发的软件。例如,科学计算、工程设计、数据处理、事务处理和过程控制等方面的程序,以及文字处理软件、表格处理软件、辅助设计软件(CAD)和实时处理软件等。系统软件是计算机系统的一部分,由它支持应用软件的运行。常用的系统软件有操作系统、语言处理程序、链接程序、诊断程序和数据库管理系统等。操作系统是计算机系统中必不可少的核心系统软件,其他软件是建立在操作系统的基础上,并在操作系统的统一管理和支持下运行,是用户与计算机之间的接口。
2.操作系统的概念
操作系统是控制和管理计算机系统内各种硬件和软件资源,合理有效地组织计算机系统工作流程,控制程序的执行,为用户提供一个良好的工作环境和友好的接口。
3.操作系统的分类
操作系统的基本类型可以分为三大类:批处理操作系统、分时操作系统和实时操作系统。随着计算机体系结构的发展,又出现了许多类型的操作系统,比如嵌入式操作系统、个人操作系统、网络操作系统和分布式操作系统。
二、操作系统的特征与功能
操作系统的4个特征是并发性、共享性、虚拟性和不确定性。从资源管理的观点来看,操作系统的功能可分为处理机管理、文件管理、存储管理、设备管理和作业管理 5大部分。操作系统的5大部分通过相互配合、协调工作,以实现对计算机系统中资源的管理,控制任务的运行。
(1)处理机管理:主要任务是对处理机进行分配,并对其进行有效的控制和管理。在多道程序环境下,处理机的分配以线程为基本单位,因此对处理机的管理可归结为对线程的管理。
(2)存储管理:主要任务是为程序的运行提供良好的环境,方便用户使用存储器,提高存储器的利用率,以及从逻辑上来扩充内存。所以存储管理应具有内存分配、内存包含、地址映射和内存扩充等功能。
(3)设备管理:主要任务是完成用户提出的 I/O请求,为用户分配 I/O设备,提高 CPU和I/O设备的利用率,提高 I/O速度以及方便用户使用I/O设备。为实现上述任务,设备管理应具有缓冲管理、设备分配和设备处理,以及虚拟设备等功能。通常采用通道、控制器和设备三级控制方法管理这些设备。
(4)文件管理:主要任务是对用户文件和系统文件进行管理,以方便用户使用,并保证文件的安全性。为此文件管理应具有文件存储空间的管理、目录管理、文件的读写管理以及文件的共享与保护等功能。
(5)用户接口:为了方便用户使用操作系统,操作系统向用户提供命令接口和系统调用接口,在较晚出现的操作系统中又向用户提供了图形接口。
三、UNIX操作系统
UNIX是一种多用户、多任务的分时操作系统。它利用最内层硬件提供的基本服务,向外层提供全部应用程序所需的服务。
1.UNIX文件系统
UNIX文件系统的目录结构是树型的,根目录记为“/”,非叶节点为目录文件,叶节点可以是目录文件,也可以是文件或特殊文件。目录是一个包含目录项的文件,在逻辑上,可以认为每个目录项都包含一个文件名,同时还包含说明该文件属性的信息。
UNIX文件系统的结构如图3-1所示。
![]() |
图 3-1 UNIX文件系统的布局 |
2.UNIX设备管理
在UNIX系统中,文件等于系统中可用的任何资源。UNIX的设计者们遵循一条这样的原则: UNIX系统中可以使用的任何计算机资源都用一种统一的方法表示。他们选择用“文件”这个概念作为一切资源的抽象表示方法。
UNIX设备管理的主要特点如下:
块设备与字符设备具有相似的层次结构。这是指对它们的控制方法和所采用的数据结构、层次结构几乎相同。
将设备作为一个特殊文件,并赋予一个文件名。这样,对设备的使用类似于对文件的存取,具有统一的接口。
采用完善的缓冲区管理技术。引入“预先读”、“异步写”和“延迟写”方式,进一步提高系统效率。
3.shell程序 shell既是一种命令语言,又是一种程序设计语言。在UNIX中,任何一个存放一条或多条命令
的文件称为shell程序或shell过程。 shell变量可分为三种类型:用户定义变量、系统定义变量和shell定义变量。其中,用户定义变量必须以字母或下划线开始,可以包含字母、下划线和数字的字符序列。
用户定义的shell变量能用赋值语句置初值或重置值。例如ux=UNIX。
处理软件(用于输入、存储、修改、检索各种信息,例如工资管理软件、人事管理软件、仓库管理软件、计划管理软件等)、辅助设计软件(用于高效地绘制、修改工程图纸,进行设计中的常规计算,帮助人寻求好设计方案。)、实时控制软件(用于随时搜集生产装置、飞行器等的运行状态信息,以此为依据按预定的方案实施自动或半自动控制,安全、准确地完成任务。)。
系统软件主要负责数据是如何输入、输出的以及对硬件的管理等,主要有:
(1)操作系统:DOS、Windows、UNIX等。
(2)数据库管理系统:有组织地、动态地存储大量数据,使人们能方便、高效地使用这些数据。现在比较流行的数据库有FoxPro、DB-2、Access、SQL-Server等。
(3)编译软件:源程序与机器代码的转换,完成这种翻译的软件称为高级语言编译软件,通常把它们归入系统软件。目前常用的高级语言有VB、C++、Java等,它们各有特点,分别适用于编写某一类型的程序,它们都有各自的编译软件。
应用软件是为最终用户服务的,因此①应为最终用户,而②是工作在其他系统软件和操作系统基础上,应该为应用软件开发者,而③是工作在操作系统和计算机硬件上,应为系统软件开发者。
进程管理(1)
一、基本概念
(1)前趋图
前趋图是一个有向无循环图,图由节点和节点间的有向边组成,节点代表各程序段的操作,而节点间的有向边表示两程序段操作之间存在的前趋关系(“ → ”)。两程序段Pi和Pj的前趋关系表示成Pi → Pj,其中Pi是Pj的前趋,Pj是Pi的后继,其含义是Pi执行完毕才能由Pj执行。
(2)进程的定义及基本特征
进程是资源分配和独立运行的基本单位,也是核心调度的最小单位。与程序的重要区别之一是:进程是有状态的,而程序没有,程序是静态的。
进程的基本特征有:动态性、并发性、独立性、异步性、结构特征。
(3)进程的组成
①进程控制块(PCB):是进程存在的唯一标志。
②程序:描述了进程需要完成的功能。
③数据:包括程序执行时所需要的数据及工作区。
(4)进程的状态及状态间转换
进程一般有三种基本状态:运行、就绪和阻塞。实际上对于一个实际的系统,进程的状态及其转换将更加复杂,如图3-2所示。
![]() |
二、进程的控制
进程控制就是对系统中所有进程从创建到消亡的全过程实施有效的控制。为此,操作系统设置了一套控制机构,该机构的主要功能包括创建一个新进程,撤销一个已经运行完的进程,改变进程的状态,实现进程间的通信。
进程控制是由操作系统内核(Kernel)中的原语实现的。内核是计算机系统硬件的首次延伸,是基于硬件的第一层软件扩充,它为系统对进程进行控制和管理提供了良好的环境。
原语(Primitive)是指由若干条机器指令组成的,用于完成特定功能的程序段。
原语的特点是在执行时不能被分割,即原子操作,要么都做,要么都不做。内核中所包含的原语主要有进程控制原语、进程通信原语、资源管理原语以及其他方面的原语。属于进程控制方面的原语有进程创建原语、进程撤销原语、进程挂起原语、进程激活原语、进程阻塞原语以及进程唤醒原语等。
三、进程间通信
1.同步与互斥
同步是合作进程间的直接制约问题,互斥是申请临界资源进程间的间接制约问题。
(1)进程间的同步
一个进程相对于另一个进程的运行速度是不确定的,也就是说进程是在异步环境下运行的。每个进程都以各自独立的、不可预知的速度向前推进。但相互合作的进程需要在某些确定点上协调它们的工作,当一个进程到达了这些点后,除非另一进程已经完成了某些操作,否则就不得不停下来等待这些操作结束。
(2)进程间的互斥
在多道程序系统中,各进程可以共享各类资资,但有些资源一次只能供一个进程使用,称为临界资源(Critical Resource,CR),例如打印机、公共变量和表格等。同步是进程间的直接制约问题,互斥是进程间的间接制约问题。
(3)临界区管理的原则
有空即进。无进程处于临界区时,允许进程进入临界区.并且只能在临界区运行有限的时间。
无空则等。临界区中有进程时,其他欲进入临界区的进程必须等待,以保证远程互斥地访问临界资源。
有限等待。对要求访问临界资源的进程,应保证进程能在有限时间进入临界区,以免陷人“饥饿”状态。
让权等待。当进程不能进入自己的临界区时,应立即释放处理机。
2.信号量机制
信号量机制是一种解决的进程同步与互斥的工具。主要有整型信号量、记录型信号量、信号量集机制。最常用的信号量是整型变量。
信号量可分为两类:一类是公用信号量,实现进程间的互斥,初值等于l或资源的数目。另一类是私用信号量,实现进程间的同步,初值等于0或某个正整数。信号量S的物理意义是:当 S≥0时,表示某资源的可用数,当S<0时,其绝对值表示阻塞队列中等待该资源的进程数。
3.PV操作
PV操作是实现进程同步与互斥的常用方法,PV操作是低级通信原语,在执行期间不可分割。其中,P操作表示申请一个资源、V操作表示释放一个资源。
P操作定义:S:=S-1,若S≥0,则执行P操作的进程继续执行;否则,若S<0,则置该进程为阻塞状态(因为无可用资源),并将其插入阻塞队列。
V操作定义:S:=S+1,若S>0,则执行V操作的进程继续执行;否则,若S≤0,则从阻塞状态唤醒一个进程,并将其插入就绪队列,执行V操作的进程继续执行。
4.利用
PV操作实现进程的互斥令信号量mutex的初值为1,当进程进入临界区时执行P操作,退出临界区时执行V操作。
5.利用
PV操作实现进程的同步
用一个信号量与消息联系起来。当信号量的值为“0”时表示希望的消息未产生,当信号量的值为非“0“时表示希望的消息已经存在。假定用信号量S表示某条消息,进程可以通过调用P操作测试消息是否到达,调用 V操作通知消息已准备好。最典型的问题是单缓冲区的生产者和消费者的同步问题。
四、管程
管程(Monitor)是一种并发性的构造,它包括用于分配一个共享资源或一组共享资源的数据和过程。为了完成分配资源的功能,进程必须调用特定的管程入口。管程采用资源集中管理的方法,将系统中的资源用某种数据结构抽象地表示出来。由于临界区是访问共享资源的代码段,因而建立一个管程来管理进程提出的访问请求。采用这种方式对共享资源的管理就可以借助数据结构及其上实施操作的若干过程来进行;对共享资源的申请和释放可以通过管程在数据结构上的操作来实现。
五、进程调度
1.三级调度
在某些操作系统中,一个作业从提交到完成需要经历高、中、低三级调度。
2.调度算法
先来先服务:按进程进入就绪队列的先后次序选择可以占用处理器的进程。
优先级调度:对每个进程确定一个优先数,进程调度总是让具有最高优先数的进程先使用处理器。如果进程具有相同的优先数,则对这些有相同优先数的进程再按先来先服务的次序分配处理器。
时间片轮转:把规定进程一次使用处理器的最长时间称为“时间片”。让就绪进程按就绪的先后次序排成队列,每次总是选择就绪队列中的第一个进程占用处理器,但规定只能使用一个“时间片”。如果一个“时间片”用完,进程工作尚未结束,则它也必须让出处理器给其他进程使用,自己被重新排到就绪队列的末尾,等待再次运行。时间片轮转调度算法经常用在分时操作系统中。
多级反馈调度:由系统设置多个就绪队列,每个就绪队列中的进程按时间片轮转法占用处理器。
3.进程优先级确定
(1)对I/O型进程,让其进入最高优先级队列,以及时响应需要I/O交互的进程。
(2)对计算型进程,每次都执行完时间片后进入更低级队列。
(3)对I/O次数不多,而主要是 CPU处理的进程,在 I/O完成后,放回优先I/O请求时离开的队列,以免每次都回到最高优先级队列后再逐次下降。
(4)为适应一个进程在不同时间段的运行特点,I/O完成时,提高优先级;时间片用完时,降
低优先级。
六、死锁
1.死锁的概念
若系统中存在一组进程,它们中的每个进程都占用了某种资源,而又都在等待其中另一个进程所占用的资源,这种等待永远不能结束,则说明系统出现了死锁。
2.四个必要条件
只要下面四个条件中有一个不具备,系统就不会出现死锁。
(1)互斥条件:某个资源在一段时间内只能由一个进程占有,不能同时被两个或两个以上的进程占有。
(2)不可抢占条件:进程所获得的资源在未使用完毕之前,资源申请者不能强行地从资源占有者手中夺取资源,而只能由该资源的占有者进程自行释放。
(3)占有且申请条件:进程至少已经占有一个资源,但又申请新的资源;由于该资源已被另外进程占有,此时该进程阻塞;但是,它在等待新资源之时,仍继续占用已占有的资源。
(4)循环等待条件:存在一组进程等待序列{P1,P2,…,Pn},其中P1等待P2所占有的某一资源,P2等待P3所占有的某一资源,……,而Pn等待P1所占有的某一资源,形成一个进程循环等待环。
3.死锁的预防
打破互斥条件。
打破不可抢占条件。
打破占有且申请条件。
4.死锁的避免
(1)安全序列
所谓系统是安全的,是指系统中的所有进程能够按照某一种次序分配资源,并且依次地运行完毕,这种进程序列{P1,P2,…,Pn}就是安全序列。如果存在这样一个安全序列,则系统是安全的;如果系统不存在这样一个安全序列,则系统是不安全的。不安全状态并不一定会发生死锁的危险,但它隐含将发生死锁。只要系统能保持安全状态就可以避免死锁的发生。
(2)银行家算法
银行家算法是一个著名的避免死锁的算法。在安全状态下系统接到一个进程的资源请求后,就先判断这个资源请求是否超过了自己所要申请的总的资源数目,判断完毕后再继续进行下一个判断,即判断是否小于系统现有的可以分配的资源数目。如果这两个判断都通过,则系统把资源分配给该进程,系统检查现在的系统是否处于安全状态,如果安全则正式把资源分配给进程,以完成此次分配,否则刚才的试分配作废。
5.死锁的检测与恢复
(1)死锁的检测
当进程进行资源请求时检查并发进程组是否构成资源的请求和占用环路,如果不存在环路,则系统不存在死锁;如果存在环路,则系统中可能存在死锁,也可能不存在死锁。
(2)死锁的恢复
有两种方法,一是重新启动系统,二是撤消进程或剥夺资源。
七、线程
1.基本概念
线程是比进程更小的能独立运行的基本单位,它是处理器分配的最小单位。进程是资源分配的基本单位,而线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。
线程也有就绪、阻塞和执行三种基本状态。
2.进程与线程
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程与线程的区别:
线程的划分尺度小于进程,使得多线程程序的并发性高。进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而大大提高了程序的执行效率。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看作多个独立的应用,来实现进程的调度和管理以及资源分配。
进程是重量级的任务,需要分配它们自己独立的地址空间。进程间的通信和相互转换需要很多的开销。而线程是轻量级的任务,它们共享相同的地址空间并且分享同一个进程。线程间的通信和转换开销要小很多。多线程程序比多进程程序需要更少的管理费用。