1、第十章UNIX系统内核结构 第十章UNIX系统内核结构 10.1UNIX系统概述系统概述10.2进程的描述和控制进程的描述和控制10.3进程的同步与通信进程的同步与通信10.4存储器管理存储器管理10.5设备管理设备管理 10.6文件管理文件管理 1谢谢观赏2019-5-18第十章UNIX系统内核结构 10.1UNIX系统概述系统概述 10.1.110.1.1UNIXUNIX系统的发展史系统的发展史1 1UNIXUNIX系统的发展系统的发展UNIX系统是美国电报电话公司(AT&T)Bell实验室的Ennis Ritchie和Ken Thompson合作设计和实现的。他们在设计时,充分地吸取了以
2、往OS(其中包括著名的CTSS和MULTICS系统)设计和实践中的各种成功经验和教训。在DEC公司的小型机PDP7上实现并于1971年正式移植到PDP11计算机上。2谢谢观赏2019-5-18第十章UNIX系统内核结构 最初的UNIX版本是用汇编语言编写的。不久,Thompson用一种较高级的B语言重写了该系统。1973年Ritchie又用C语言对UNIX进行了重写,形成了最早的正式文件UNIX V5 版本。1976年正式公开发表了UNIX V6版本,还开始向美国各大学及研究机构颁发了使用UNIX的许可证,并提供了源代码,以鼓励他们对UNIX加以改进,因而又推动了UNIX 的迅速发展。3谢谢观
3、赏2019-5-18第十章UNIX系统内核结构 1978年发表了UNIX V7版本,它是在PDP 11/70上运行的,后来移植到DEC公司的VAX系列计算机上。1982至1983年期间,又先后宣布了UNIX System 和UNIX System;1984年推出了UNIX System 2.0;1987年发布了UNIX System 3.0版本,分别称为UNIX SVR 2和UNIX SVR 3;1989年宣布了UNIX SVR 4;1992年又发表了UNIX SVR 4.2版本。4谢谢观赏2019-5-18第十章UNIX系统内核结构 2 2两大集团对峙两大集团对峙在UNIX系统的发展史上必须
4、说明的是,由于UNIX的开放性、发展概念和商业利益等因素,使UNIX呈现出“百家争鸣”的盛况,后又进一步形成了两大阵营对峙的局面。此即,由IBM和DEC等公司于1988年5月结成了开放软件基金会OSF集团,以及由AT&T、SUN和NCR等公司于同年12月结成了UI集团。他们分别推出了自己的UNIX系统产品。其中,UI推出的是“SVR 4”,而OSF推出的是“OSF/I”。虽然两者都是UNIX,但它们在系统构架、命令操作以及管理方式上,都有所不同。两者在市场上展开了激烈的竞争。5谢谢观赏2019-5-18第十章UNIX系统内核结构 应当看到,虽然两种UNIX系统并存,但在他们之间并不相互兼容,这
5、对用户非常不利。因而,这无疑会影响到UNIX对用户的吸引力,加之,随着Microsoft公司的迅速崛起,并以惊人的速度由传统的PC机市场向工作站和网络市场扩张,迫使UI和OSF两大集团不得不相互让步、携手言和,从而共同制定了应用程序接口API(Application Program Interface)标准技术规范,并联合开发共同开放软件环境COSE(Common Open Software Enviroment)。6谢谢观赏2019-5-18第十章UNIX系统内核结构 由于UNIX这一名字已被X/Open用作注册商标,因而其他公司所开发的UNIX产品不能再用UNIX这一名字,致使不同的UNI
6、X系统在不同的公司,甚至是在不同的机器上,都各用自己的名字,如IBM RS/6000上的“AIX”(System)操作系统、Sun公司的“Sun OS”(4.3 BSD或SVR 4)和“Solarix”操作系统、HP公司的“HPUX”(System)以及SCO公司的“SCO UNIX”(SVR 3.2)操作系统等。7谢谢观赏2019-5-18第十章UNIX系统内核结构 3 3网络操作系统网络操作系统UNIXUNIXUNIX凭借其“开放性”、“先进性”以及先入为主的优势,使20世纪70年代成为UNIX时代。70年代同时也是网络的萌芽时代,相应地,1976年人们便开发了一个UNIX网络应用程序。该
7、程序随着UNIX V7版本一并发行。1980年9月Bell实验室等又为美国国防部在Berkeley的UNIX上开发了TCP/IP协议系统,于1983年8月对外发行,该协议得以很快发表和普及,从而成为后来的Internet上最重要的网络协议。到80年代中期,他们已在UNIX System 上开发出多种基于TCP/IP的网络软件,并将它们构成一个TCP/IP协议软件包。8谢谢观赏2019-5-18第十章UNIX系统内核结构 20世纪80年代是LAN快速发展的10年。1984年,Novell公司推出了以LAN为环境的Netware V1.0,继之它经过了不断的改进并增强了其功能,相应的版本由V1.0
8、经过V2.X到V3.X。仅经历短短的3年,到1987年时,其销量已占居全球第一位,并由于此后它长期保持优势而使之成为网络工业界的标准。9谢谢观赏2019-5-18第十章UNIX系统内核结构 进入90年代后,企业网络和Internet得到极其迅速的发展和广泛应用,致使计算机网络已经无所不在,也形成了巨大的网络软件市场。此时,一些主要的UNIX系统开发商也加强了在网络方面更深入的研究,于是也不断地推出用于企业网络的UNIX网络OS版本,如SCO公司的Unixware NOS和Sun公司的Solaris NOS等。10谢谢观赏2019-5-18第十章UNIX系统内核结构 10.1.210.1.2UN
9、IXUNIX系统的特征系统的特征1 1开放性开放性UNIX系统最本质的特征是开放性。所谓开放性,是指系统遵循国际标准规范;凡遵循国际标准所开发的硬件和软件,均能彼此兼容,并可方便地实现互连。开放性已成为20世纪90年代计算机技术的核心问题,也是一个新推出的系统或软件能否被广泛应用的重要因素。人们普遍认为:UNIX是目前开放性最好的OS,是目前惟一能稳定运行在从微型机到大、中型等各种机器上的OS,而且还能方便地将已配置了UNIX OS的机器互连成计算机网络。11谢谢观赏2019-5-18第十章UNIX系统内核结构 2 2多用户、多任务环境多用户、多任务环境UNIX系统是一个多用户、多任务OS,它
10、既可以同时支持数十个乃至数百个用户通过各自的联机终端同时使用一台计算机,而且还允许每个用户同时执行多个任务。例如,在进行字符图形处理时,用户可建立多个任务,分别用于处理字符的输入、图形的制作和编辑等任务。12谢谢观赏2019-5-18第十章UNIX系统内核结构 3 3功能强大且高效功能强大且高效UNIX系统提供了精选的、丰富的系统功能,使用户可方便、快速地完成许多其它OS所难于实现的功能。UNIX已成为世界上功能最强大的操作系统之一,而且它在许多功能的实现上还有其独到之处,并且是高效的。例如,UNIX的目录结构、磁盘空间的管理方式、I/O重定向和管道功能等。其中,不少功能及其实现技术已被其它O
11、S所借鉴。13谢谢观赏2019-5-18第十章UNIX系统内核结构 4 4丰富的网络功能丰富的网络功能UNIX系统还提供了十分丰富的网络功能。作为Internet网络技术基础的TCP/IP协议,便是在UNIX系统上开发出来的,并已成为UNIX系统不可分割的部分。UNIX系统还提供了许多最常用的网络通信协议软件,其中包括网络文件系统NFS软件、客户/服务器协议软件Lan Manager Client/Server及IPX/SPX软件等。通过这些产品可以实现在各UNIX 系统之间,UNIX与Novell的Netware,以及MS-Windows NT、IBM LAN Server等网络之间的互连和
12、互操作。14谢谢观赏2019-5-18第十章UNIX系统内核结构 5 5支持多处理器功能支持多处理器功能与Windows NT及Netware等OS相比较,UNIX是最早提供支持多处理器功能的OS,它所能支持的多处理器数目也一直处于领先水平。例如,1996年推出的NT 4.0只能支持14个处理器,而Windows 2000最多也只支持16个处理器,然而UNIX系统在20世纪90年代中期便已能支持3264个处理器,而且拥有数百个乃至数千个处理器的超级并行机也普遍支持UNIX。15谢谢观赏2019-5-18第十章UNIX系统内核结构 10.1.310.1.3UNIXUNIX系统的内核结构系统的内核
13、结构可以把整个UNIX系统分成四个层次。其最低层是硬件,作为整个系统的基础。次低层是OS核心,包括前面所介绍的进程管理、存储器管理、设备管理和文件管理四大资源管理功能。上面第二层是OS与用户的接口Shell以及编译程序等。最高层是应用程序。作为OS的核心,它应具有两方面的接口:一方面是核心与硬件的接口,它通常是由一组驱动程序和一些基本的例程所组成的;另一方面就是核心与Shell的接口,它由两组系统调用及命令解释程序等所组成。核心本身又可分成两大部分:一部分是进程控制子系统;另一部分则是文件子系统。两组系统调用分别与这两大子系统交互。图10-1示出了UNIX核心的框图。16谢谢观赏2019-5-
14、18第十章UNIX系统内核结构 图10-1UNIX核心的框图 字符设备块设备设备驱动程序硬件控制高速缓存文件子系统系统调用接口进程间通信调度存储管理进程控制子系统核心级硬件级硬件核心级用户级库函数用户程序捕俘17谢谢观赏2019-5-18第十章UNIX系统内核结构 1 1进程控制子系统进程控制子系统进程控制子系统负责对四大资源中的两大资源处理机和存储器进行管理。进程控制子系统的功能可分成以下几个方面:(1)进程控制。在UNIX系统中提供了一系列用于对进程进行控制的系统调用,例如,应用程序可利用系统调用fork创建一个新进程;用系统调用exit结束一个进程的执行。(2)进程通信。在UNIX系统中
15、提供了许多进程间通信的手段,例如,用于实现进程之间通信的消息机制,用于在同一用户的各进程之间通信的“信号”通信工具以及性能优良的信号量机制等。18谢谢观赏2019-5-18第十章UNIX系统内核结构(3)存储器管理。该功能用于为进程分配物理存储空间。为了提高内存利用率且方便用户,可采用段页式存储管理方式;可利用请求调页法实现虚拟存储器功能,以便从逻辑上扩充内存。此外,还实现了外存与内存间的对换功能。(4)进程调度。在UNIX系统中所采用的进程调度算法,是动态优先数轮转调度算法。系统按优先数最小者优先的策略,为选中的某一进程分配一个CPU时间片。当进程运行完一个时间片后,内核便把它送回就绪队列的
16、末尾。19谢谢观赏2019-5-18第十章UNIX系统内核结构 2 2文件子系统文件子系统文件子系统用于有效地管理系统中的所有设备和文件。其功能可分成以下三个方面:(1)文件管理。该功能用于为文件分配存储空间、管理空闲磁盘块、控制对文件的存取以及为用户检索数据。用户可通过一组系统调用来实现对文件的各种操作。(2)高速缓冲机制。为使核心与外设之间的数据流在速率上相匹配,设置了多个缓冲区,每个缓冲区的大小与一个盘块的大小相当。这些缓冲区被分别链入各种链表中,如空闲缓冲区链表等。20谢谢观赏2019-5-18第十章UNIX系统内核结构(3)设备驱动程序。UNIX系统把设备分成块设备(如磁盘、磁带等)
17、和字符设备(如打印机)两类。相应地,也把驱动程序分成两类,文件子系统将在缓冲机制的支持下,与块设备的驱动程序之间交互作用。21谢谢观赏2019-5-18第十章UNIX系统内核结构 10.2进程的描述和控制进程的描述和控制 10.2.110.2.1进程控制块进程控制块在UNIX系统中,把进程控制块(PCB)分为四部分:(1)进程表项,其中包括最常用的核心数据。(2)U区,用于存放用户进程表项的一些扩充数据。(3)系统区表,存放各个区在物理存储器中的地址信息等。(4)进程区表,用于存放各区的起始虚地址及指向系统区表中对应区表项的指针。22谢谢观赏2019-5-18第十章UNIX系统内核结构 1 1
18、进程表项进程表项(Process Table Entry)Process Table Entry)用于描述和控制一个进程的信息通常都很多,其中有些是经常要被访问的,如进程标识符、进程状态等。为了提高对这些信息访问的效率,系统设计者将这些信息放在进程表项中,又称之为Proc表或Proc结构,使之常驻内存。在每个进程表项中,含有下述一些具体信息:(1)进程标识符(PID),也称内部标识符,为方便用户使用,这里惟一地标识一个进程的某个整数。(2)用户标识符(UID),标识拥有该进程的用户。23谢谢观赏2019-5-18第十章UNIX系统内核结构(3)进程状态,表示该进程的当前状态。(4)事件描述符,
19、记录使进程进入睡眠状态的事件。(5)进程和U区在内存或外存的地址,核心可利用这些信息做上、下文切换。(6)软中断信息,记录其它进程发来的软中断信号。(7)计时域,给出进程的执行时间和对资源的利用情况。(8)进程的大小,这是核心在为进程分配存储空间时的依据,包括正文段长度和栈段长度等。24谢谢观赏2019-5-18第十章UNIX系统内核结构(9)偏置值nice,供计算该进程的优先数时使用,可由用户设置。(10)P_Link指针,这是指向就绪队列中下一个PCB的指针。(11)指向U区进程正文、数据及栈在内存区域的指针。25谢谢观赏2019-5-18第十章UNIX系统内核结构 2 2U U区区(U
20、Area)U Area)为了存放用于描述和控制进程的另一部分信息,系统为每一个进程设置了一个私用的U区,又称之为User结构,这部分数据并非常驻内存,其中含有下述信息:(1)进程表项指针,指向当前(正在执行)进程的进程表项。(2)真正用户标识符u-ruid(real user ID),这是由超级用户分配给用户的标识符,以后,每次用户在登录进入系统时,均须输入此标识符。26谢谢观赏2019-5-18第十章UNIX系统内核结构(3)有效用户标识符u-euid(effective user ID),在一般情况下,它与ruid相同,但在其他用户允许的情况下,可用系统调用setuid将它改变为其他用户标
21、识符,以获得对该用户的文件进行操作的权力。(4)用户文件描述符表,其中记录了该进程已打开的所有文件。(5)当前目录和当前根,用于给出进程的文件系统环境。(6)计时器,记录该进程及其后代在用户态和核心态运行的时间。27谢谢观赏2019-5-18第十章UNIX系统内核结构(7)内部I/O参数,给出要传输的数据量、源(或目标)数据的地址、文件的输入/输出偏移量。(8)限制字段,指对进程的大小及其能“写”的文件大小进行限制。(9)差错字段,记录系统调用执行期间所发生的错误。(10)返回值,指出系统调用的执行结果。(11)信号处理数组,用于指示在接收到每一种信号时的处理方式。28谢谢观赏2019-5-1
22、8第十章UNIX系统内核结构 3 3系统区表系统区表(System Region Table)System Region Table)系统把一个进程的虚地址空间划分为若干个连续的区域:正文区、数据区、栈区等。这些区是可被共享和保护的独立实体。多个进程可共享一个区,例如,多个进程共享一个正文区,即几个进程将执行同一个(子)程序。同样,多个进程也可共享一个数据区。为了对区进行管理,在核心中设置了一个系统区表(简称区表),在各表项中记录了以下有关描述活动区的信息:29谢谢观赏2019-5-18第十章UNIX系统内核结构(1)区的类型和大小。(2)区的状态。一个区有这样几种状态:锁住、在请求中、在装入
23、过程、有效(区已装入内存)。(3)区在物理存储器中的位置。(4)引用计数,即共享该区的进程数。(5)指向文件索引结点的指针。30谢谢观赏2019-5-18第十章UNIX系统内核结构 4 4进程区表进程区表(Process Region Table)Process Region Table)为了记录进程的每个区在进程中的虚地址,并通过它找到该区在物理存储器中的实地址,系统为每个进程配置了一张进程区表。表中的每一项记录一个区的起始虚地址及指向系统区表中对应的区表项的指针。这样,核心可通过查找进程区表和系统区表,将区的逻辑地址变换为物理地址。可见,进程区表和系统区表用于对区地址进行映像(射)。这里用
24、两张区表实现地址映射,是为了便于实现对区的共享。31谢谢观赏2019-5-18第十章UNIX系统内核结构 图10-2示出A和B两个进程的进程区表和系统区表。在A进程区表中的正文区、数据区和栈区中的指针,分别指向相应于a、b、c区的系统区表项。由于A和B进程共享正文区,故它们都指向同一个正文区a。一个进程的数据结构是由上述的进程表项、U区、进程区表与系统区表项所组成的,它们之间的关系如图10-3所示。32谢谢观赏2019-5-18第十章UNIX系统内核结构 图10-2进程区表项、系统区表项和区的关系 正文数据栈正文数据栈abcdeabcde系统区表A进程区表B进程区表33谢谢观赏2019-5-1
25、8第十章UNIX系统内核结构 图10-3进程的数据结构 U区进程表abcabc进程区表系统区表34谢谢观赏2019-5-18第十章UNIX系统内核结构 10.2.210.2.2进程状态与进程映像进程状态与进程映像1 1进程状态进程状态在UNIX内核中,为进程设置了如图10-4所示的9种状态。35谢谢观赏2019-5-18第十章UNIX系统内核结构 图10-4进程的状态转换 62379845唤醒换出换出换入内存中睡眠睡眠且换出睡眠调度核心态执行1抢占被抢占内存中就绪内存足内存不足创建fork用户态执行返回到用户态系统调用中断中断中断返回返回僵死唤醒就绪且换出36谢谢观赏2019-5-18第十章U
26、NIX系统内核结构(1)执行状态。这表示进程已获得处理机而正在执行。UNIX系统把执行状态又进一步分为两种:一种是用户态执行,表示进程正处于用户状态中执行;另一种是核心态执行,表示一个应用进程执行系统调用后,或I/O中断、时钟中断后,进程便处于核心态执行。这两种状态的主要差别在于:处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所占有的处理机是可被抢占的;而处于核心态执行中的进程,则能访问所有的内存空间和对象,且所占用的处理机是不允许被抢占的。37谢谢观赏2019-5-18第十章UNIX系统内核结构(2)就绪状态。这是指进程处于一种只需再获得处理机便可执行的状态。由于UNIX内核提供
27、了对换功能,因而又可把就绪状态分为“内存中就绪”和“就绪且换出”两种状态。当调度程序调度到“内存中就绪”状态的进程时,该进程便可立即执行;而调度到“就绪且换出”状态的进程时,则须先将该进程映像全部调入内存后,再使其执行。38谢谢观赏2019-5-18第十章UNIX系统内核结构(3)睡眠状态。使一个进程由执行状态转换为睡眠状态的原因有许多,如因进程请求使用某系统资源而未能得到满足时;又如进程使用了系统调用wait()后,便主动暂停自己的执行,以等待某事件的出现等。在UNIX中把睡眠原因分为64种,相应地,最多也可设置64个睡眠队列。同样,由于对换功能的原因又可将睡眠状态分为“内存睡眠”状态和“睡
28、眠且换出”状态。当内存紧张时,在内存中睡眠的进程可被内核换出到外存上,相应地,此时进程的状态便由“内存睡眠”状态转换为“睡眠且换出”状态。39谢谢观赏2019-5-18第十章UNIX系统内核结构(4)“创建”与“僵死”状态。创建状态是指利用fork系统调用来创建子进程时,被创建的新进程所处的状态;僵死状态是在进程执行了exit系统调用后所处的状态,此时该进程实际上已不存在,但还留下一些信息供父进程搜集。(5)“被抢占”状态,也称为“被剥夺状态”。当正在核心态执行的进程要从核心态返回到用户态执行时,如果此时已有一优先级更高的进程在等待处理机,则此时内核可以抢占(剥夺)已分配给正在执行进程的处理机
29、,去调度该优先级更高的进程执行。这时,被抢占了处理机的进程便转换为“被抢占”状态。处于“被抢占”状态的进程与处于“内存中就绪”状态的进程是等效的,它们都被排列在同一就绪队列中等待再次被调度。40谢谢观赏2019-5-18第十章UNIX系统内核结构 2 2进程映像进程映像1)用户级上下文用户级上下文的主要成分是用户程序。它在系统中可分为正文区和数据区两部分。正文区是只读的,它主要包括一些程序指令。进程在执行时,可利用用户栈区来保存过程调用时的传送参数和返回值。共享存储区是一个能与其它进程共享的数据区。存储区中的数据可由有权共享该存储区的进程所共享。41谢谢观赏2019-5-18第十章UNIX系统
30、内核结构 2)寄存器上下文寄存器上下文主要是由CPU中的一些寄存器的内容所组成的。主要的寄存器有下述几种。(1)程序寄存器。在其中存放的是CPU要执行的下一条指令的虚地址。(2)处理机状态寄存器(PSR)。其中包括运行方式(用户态或核心态)、处理机当前的运行级以及记录处理机与该进程有关的硬件状态信息,如产生进位和溢出等。(3)栈指针。该指针指向栈的下一个自由项或栈中最后使用的项(因机器而异)。(4)通用寄存器。该寄存器用于存放进程在运行过程中所产生的数据,通用寄存器的数目也因机器而异。42谢谢观赏2019-5-18第十章UNIX系统内核结构 3)系统级上下文系统级上下文包括OS为管理该进程所用
31、的信息,可分为静态和动态两部分:(1)静态部分。在进程的整个生命期中,系统级上下文的静态部分只有一个,其大小保持不变,又可再进一步把它分成三部分:进程表项、U区及进程区表项、系统区表项和页表。(2)动态部分。在整个进程的生命期中,系统级上下文动态部分的大小是可变的,它包括:核心栈,这是进程在核心态时使用的栈;若干层寄存器上下文,其中,每一层都保存了前一层的上下文。43谢谢观赏2019-5-18第十章UNIX系统内核结构 10.2.310.2.3进程控制进程控制1 1forkfork系统调用系统调用在UNIX的内核中设置了一个0进程,它是惟一一个在系统引导时被创建的进程。在系统初启时,由0进程再
32、创建1进程,以后0进程变为对换进程,1进程成为系统中的始祖进程。UNIX利用fork为每个终端创建一个子进程为用户服务,如等待用户登录、执行shell命令解释程序等。每个终端进程又可利用fork来创建自己的子进程,如此下去可以形成一棵进程树。因此说,系统中除0进程外的所有进程都是用fork创建的。44谢谢观赏2019-5-18第十章UNIX系统内核结构 fork系统调用如果执行成功,便可创建一个子进程,子进程继承父进程的许多特性,并具有与父进程完全相同的用户级上下文。核心需为fork完成下列操作:(1)为新进程分配一个进程表项和进程标识符。进入fork后,核心检查系统是否有足够的资源以创建一个
33、新进程。若资源不足,fork调用必失败;否则,核心为新进程分配一个进程表项和惟一的进程标识符。(2)检查同时运行的进程数目。对于普通用户,是否能为之建立进程要受事先设定的、系统允许同时存在的进程数目的限制,超过此限制值时,fork系统调用失败。45谢谢观赏2019-5-18第十章UNIX系统内核结构(3)拷贝进程表项中的数据。将父进程表项中的数据拷贝到子进程的进程表项中,并置进程的状态为“创建”状态。(4)子进程继承父进程的所有文件。对父进程的当前目录和所有已打开文件的文件表项中的引用计数f.count做加1操作,表示这些文件又增加了一个访问者,详见10.6节。46谢谢观赏2019-5-18第
34、十章UNIX系统内核结构(5)为子进程创建进程上下文。首先,由核心为子进程创建进程上下文的静态部分,并将其父进程上下文的静态部分拷贝到子进程的上下文中。然后,再为子进程创建进程上下文的动态部分。至此,进程的创建即告结束,再置子进程的状态为“内存中就绪”。最后,返回该子进程的标识符。(6)子进程执行。当子进程被调度执行时,将U区的计时字段初始化后返回0。47谢谢观赏2019-5-18第十章UNIX系统内核结构 2 2execexec系统调用系统调用在UNIX系统中,当利用fork系统调用创建一个新进程时,只是将父进程的用户级上下文拷贝到新建的子进程中。而UNIX系统又提供了一组系统调用exec,
35、用于将一个可执行的二进制文件覆盖在新进程的用户级上下文的存储空间上,以更新新进程的用户级上下文。UNIX所提供的这一组exec系统调用,它们的基本功能相同,只是它们须各自以不同的方式提供参数,且参数各异。一种方式是直接给出指向参数的指针,另一种方式则是给出指向参数表的指针。48谢谢观赏2019-5-18第十章UNIX系统内核结构 图10-5exec 的参数组织方式trappatharg varg 2parg 1parg 0p0文件名字符串参数字符串49谢谢观赏2019-5-18第十章UNIX系统内核结构(1)对可执行文件进行检查。先调用检索目录的过程namei,以沿着目录树去获得指名可执行文件
36、的索引结点。由于在索引结点中存放了相应文件的全部属性,因而可以从中得知该文件是否是可执行的,用户是否拥有执行的许可(权)。若可执行,便再将新的exec 参数拷贝到一个临时缓冲区,以腾出参数占用的空间,然后将这些空间释放。(2)回收内存空间。对原来与进程连接的各个区,逐个断开其连接,并收回它们所占用的内存空间。50谢谢观赏2019-5-18第十章UNIX系统内核结构(3)分配存储空间。根据可执行文件头中的信息(包括文件中的所有正文段和数据段的大小、进程执行时的起始地址等),为每个段分配新区,并将它们连接到进程上。若有足够的内存空间,可将这些新区装入内存。(4)参数拷贝。将exec参数由临时缓冲区
37、拷贝到新的用户栈区,并设置用户态寄存器上下文,如用户栈指针、程序计数器等。51谢谢观赏2019-5-18第十章UNIX系统内核结构 3 3exitexit系统调用系统调用为了及时回收进程所占用的资源,对于一般的用户进程,在其任务完成后应尽快撤消该进程。UNIX内核利用exit来实现进程的自我终止。通常,父进程在创建子进程时,应在子进程的末尾安排一条exit,使子进程能自我终止。内核需为exit完成以下操作:(1)关闭软中断。由于进程即将终止而不再处理任何软中断信号,故应将软中断处理函数关闭。如果终止的进程是与某一终端相联系的进程组组长,则还须向本组中的各进程发送“挂起”软中断信号,并将它们交给
38、进程1处理。52谢谢观赏2019-5-18第十章UNIX系统内核结构(2)回收资源。关闭所有已打开的文件,释放进程所有的区及相应的内存,释放当前目录及修改根目录的索引结点。(3)写记账信息。将进程在运行过程中所产生的记账数据(其中含有进程运行时的各种统计数据)记录到一个全局记账文件中。(4)置进程为“僵死”状态。在做完上述处理后,便可将进程置为“僵死”状态,执行exit系统调用的子进程还应向父进程发送“子进程死”的软中断信号,最后由内核进行上下文切换,调度另一进程执行。53谢谢观赏2019-5-18第十章UNIX系统内核结构 4 4waitwait系统调用系统调用wait系统调用用于将调用进程
39、挂起,直至其子进程因暂停或终止而发来软中断信号为止。如果在wait调用前已有子进程暂停或终止,则调用进程做适当处理后便返回。核心对wait调用做以下处理:核心查找调用进程是否还有子进程,若无,便返回出错码;如果找到一个处于“僵死”状态的子进程,便将子进程的执行时间加到其父进程的执行时间上,并释放该子进程的进程表项;如果未找到处于“僵死”状态的子进程,则调用进程便在可被中断的优先级上睡眠,等待其子进程发来软中断信号时被唤醒。54谢谢观赏2019-5-18第十章UNIX系统内核结构 10.2.410.2.4进程调度与切换进程调度与切换1 1引起进程调度的原因引起进程调度的原因首先,由于UNIX系统
40、是分时系统,因而其时钟中断处理程序须每隔一定时间便对要求进程调度程序进行调度的标志runrun予以置位,以引起调度程序重新调度。其次,当进程执行了wait、exit及sleep等系统调用后要放弃处理机时,也会引起调度程序重新进行调度。此外,当进程执行完系统调用功能而从核心态返回到用户态时,如果系统中又出现了更高优先级的进程在等待处理机时,内核应抢占当前进程的处理机,这也会引起调度。55谢谢观赏2019-5-18第十章UNIX系统内核结构 2 2调度算法调度算法采用动态优先数轮转调度算法进行进程调度。调度程序在进行调度时,首先从处于“内存就绪”或“被抢占”状态的进程中选择一个其优先数最小(优先级
41、最高)的进程。若此时系统中(同时)有多个进程都具有相同的最高优先级,则内核将选择其中处于就绪状态或被抢占状态最久的进程,将它从其所在队列中移出,并进行进程上下文的切换,恢复其运行。56谢谢观赏2019-5-18第十章UNIX系统内核结构 3 3进程优先级的分类进程优先级的分类UNIX系统把进程的优先级分成两类,第一类是核心优先级,又可进一步把它分为可中断和不可中断两种。当一个软中断信号到达时,若有进程正在可中断优先级上睡眠,该进程将立即被唤醒;若有进程处于不可中断优先级上,则该进程继续睡眠。诸如“对换”、“等待磁盘I/O”、“等待缓冲区”等几个优先级,都属于不可中断优先级;而“等待输入”、“等
42、待终端输出”、“等待子进程退出”几个优先级,都是可中断优先级。另一类是用户优先级,它又被分成n+1级,其中第0级为最高优先级,第n级的优先级最低。57谢谢观赏2019-5-18第十章UNIX系统内核结构 4 4进程优先数的计算进程优先数的计算在进程调度算法中,非常重要的部分是如何计算进程的优先数。在系统中,进程优先数的计算公式可表示如下:基本用优先数的时间最近使用优先数2CPU其中,基本用户优先数即proc结构中的偏移值nice,可由用户将它设置成040中的任一个数。一旦设定后,用户仅能使其值增加,特权用户才有权减小nice的值。而最近使用CPU的时间,则是指当前占有处理机的进程本次使用CPU
43、的时间。内核每隔16.667 ms便对该时间做加1操作,这样,占有CPU的进程其优先数将会随着它占有CPU时间的增加而加大,相应地,其优先级便随之降低。58谢谢观赏2019-5-18第十章UNIX系统内核结构 5 5进程切换进程切换在OS中,凡要进行中断处理和执行系统调用时,都将涉及到进程上下文的保存和恢复问题,此时系统所保存或恢复的上下文都是属于同一个进程的。而在进程调度之后,内核所应执行的是进程上下文的切换,即内核是把当前进程的上下文保存起来,而所恢复的则是进程调度程序所选中的进程的上下文,以使该进程能恢复执行。59谢谢观赏2019-5-18第十章UNIX系统内核结构 10.3进程的同步与
44、通信进程的同步与通信 10.3.110.3.1sleepsleep与与wakeupwakeup同步机制同步机制1 1sleepsleep过程过程进入sleep过程后,核心首先保存进入睡眠时的处理机运行级,再提高处理机的运行优先级来屏蔽所有的中断,接着将该进程置为“睡眠”状态,将睡眠地址(对应着某个睡眠事件)保存在进程表项中,并将该进程放入睡眠队列中。如果进程的睡眠是不可中断的,做了进程上下文的切换后,进程便可安稳地睡眠。当进程被唤醒并被调度执行时,将恢复处理机的运行级为进入睡眠时的值,此时允许中断处理机。60谢谢观赏2019-5-18第十章UNIX系统内核结构 如果进程的睡眠可被中断,但该进程
45、并未收到软中断信号,则在做了进程上下文的切换后也进入睡眠状态。当它被唤醒并被调度执行时,应再次检查是否有待处理的软中断信号;若仍无,则恢复处理机的运行级为进入睡眠时的值,最后返回0。如果在进入睡眠前检测到有软中断信号,那么进程是否还要进入睡眠状态将取决于该进程的优先级。如果它是不可中断的优先级,进程仍进入睡眠,直至被wakeup唤醒;否则,即若进程的优先级为可中断的,则进程便不再进入睡眠,而是响应软中断。61谢谢观赏2019-5-18第十章UNIX系统内核结构 2 2wakeupwakeup过程过程该过程的主要功能是唤醒在指定事件队列上睡眠的所有进程,并将它们放入可被调度的进程队列中。如果进程
46、尚未被装入内存,应唤醒对换进程;如果被唤醒进程的优先级高于当前进程的优先级,则应重置调度标志。最后,在恢复处理机的运行级后返回。62谢谢观赏2019-5-18第十章UNIX系统内核结构 10.3.210.3.2信号机制信号机制1 1信号机制的基本概念信号机制的基本概念信号机制主要是作为在同一用户的诸进程之间通信的简单工具。信号本身是一个119中的某个整数,用来代表某一种事先约定好的简单消息。每个进程在执行时,都要通过信号机制来检查是否有信号到达。若有信号到达,表示某进程已发生了某种异常事件,便立即中断正在执行的进程,转向由该信号(某整数)所指示的处理程序,去完成对所发生的事件(事先约定)的处理
47、。处理完毕,再返回到此前的断点处继续执行。可见,信号机制是对硬中断的一种模拟,故在早期的UNIX版本中又称其为软中断。63谢谢观赏2019-5-18第十章UNIX系统内核结构 信号机制与中断机制之间的相似之处表现为:信号和中断都同样采用异步通信方式,在检测出有信号或有中断请求时,两者都是暂停正在执行的程序而转去执行相应的处理程序,处理完后都再返回到原来的断点;再有就是两者对信号或中断都可加以屏蔽。信号与中断两机制之间的差异是:中断有优先级,而信号机制则没有,即所有的信号都是平等的;再者是信号处理程序是在用户态下运行的,而中断处理程序则是在核心态下运行;还有,中断响应是及时的,而对信号的响应通常
48、都有较长的时间延迟。64谢谢观赏2019-5-18第十章UNIX系统内核结构 2 2信号机制的功能信号机制的功能1)发送信号这是指由发送进程把信号送至指定目标进程的proc结构中信号域的某一位上。如果目标进程正在一个可被中断的优先级上睡眠,核心便将目标进程唤醒,发送过程就此结束。一个进程可能在其信号域中有多个位被置位,代表已有多种类型的信号到达,但对于一类信号,进程却只能记住其中的某一个。进程可利用系统调用kill向另一进程或一组进程发送一个信号。65谢谢观赏2019-5-18第十章UNIX系统内核结构 2)设置对信号的处理方式在UNIX系统中,可利用系统调用signal(sig,func)来
49、预置对信号的处理方式。其中,参数sig为信号名,func用于预置处理方式,可分成三种情况:(1)func=1时,进程对sig类信号不予理睬,亦即屏蔽了该信号。(2)func=0,即为缺省值时,进程在收到sig信号后应自我终止。(3)func为非0、非1类整数时,就把func的值作为指向某信号处理程序的指针。66谢谢观赏2019-5-18第十章UNIX系统内核结构 3)对信号的处理当一个进程要进入或退出一个低优先级睡眠状态时,或一个进程即将从核心态返回到用户态时,核心都要检查该进程是否已收到信号。当进程处于核心态时,即使收到信号也不予理睬;仅当进程返回到用户态时,才处理信号。对信号的处理分三种情
50、况进行:当func=1时,进程不做任何处理便返回;当func=0时,进程自我终止;当其值为非0、非1的整数时,系统从核心态转为用户态后,便转向相应信号的处理程序(因为该程序是用户程序,故应运行在用户态),处理完后,再返回到用户程序的断点。67谢谢观赏2019-5-18第十章UNIX系统内核结构 10.3.310.3.3管道机制管道机制1 1管道的类型管道的类型1)无名管道(Unnamed Pipes)在早期的UNIX版本中,只提供了无名管道。这是一个临时文件,是利用系统调用pipe()建立起来的无名文件(指无路径名)。只用该系统调用所返回的文件描述符来标识该文件,因而,只有调用pipe的进程及