《UNIX内核结构》由会员分享,可在线阅读,更多相关《UNIX内核结构(122页珍藏版)》请在金锄头文库上搜索。
1、第九章 UNIX内核结构,第一部分 UNIX进程子系统 9.1 UNIX概述 9.2 UNIX进程控制子系统 9.3 UNIX进程调度 9.4 UNIX进程通信,9.1.1 UNIX的特征核心部分设计简单且功能全面支持多用户多任务文件系统可装卸有良好的开放性及可移植性具有强大的命令解释功能具有完善的安全机制具有网络特性,9.1 UNIX概述,9.1.2 UNIX系统结构,UNIX简略结构,UNIX核心框图,硬件:可以是便携机、个人机、工作站、大中小型机等内核:包括中断、存储、进程、I/O、文件等管理程序Shell:具有多种功能的系统程序实用程序:完成大部分UNIX高级命令的功能,UNIX层次结
2、构说明,9.2 UNIX进程控制子系统,8.2.1 UNIX中进程创建机制8.2.2 UNIX中的进程描述8.2.3 UNIX进程状态及其转换8.2.4 进程映象,1、进程创建层次结构,引导,核心创建0#,0#创建1#,终端1,终端2,终端n,。,。,9.2.1 UNIX中进程创建机制, 0#进程由内核程序创建,初始化时创建1#进程负责进程调度与对换 1#进程是所有用户进程的祖先进程,2、UNIX中的两个特殊进程,9.2.2 UNIX中的进程描述,UNIX采用段页式存储管理,段称为区。有程序区、数据区、栈区等。每个区又可分页。 UNIX把PCB分为四部分: proc结构(进程基本控制块) Us
3、er结构(进程扩充控制块) 系统区表:各区的页表位置 本进程区表pprt(Per Process Region Table):指向系统区表,proc结构(进程基本控制块),进程状态 进程用户标识 进程标识 进程存储大小 进程调度参数 软中断信号项 执行时间及资源使用 User结构起始址 进程区表指针 被挂起事件描述,user结构(进程扩充控制块),指向proc的指针 系统调用参数 与用户标识有关项 与文件结构有关项 输入输出项 打开文件描述符 中断及软中断参数 错误信息 文件权限屏蔽项 交换数据项,user,Text data stack,进程表,进程I proc,PPRT,系统区表,页表,内
4、存,数据结构关联图,九种状态 1)初始态 2)内存就绪态 3)外存就绪态 4)核心态下的执行态 5)用户态下的执行态,6)内存中的睡眠 7)外存睡眠 8)被剥夺 9)僵死态,9.2.3 UNIX进程状态及其转换,见图13-4,1、进程可在用户态及核心态下运行,核心态,用户态,中断,重置PSW,进程状态间转换的几条规定,2、对就绪进程的两种处理方法 内存就绪进程参与竞争,外存就绪应先换入内存。 由0#进程管理。,3、有些状态只能做单向转换 内存睡眠的进程可调出到外存睡眠,而外存睡眠的进程不能调入到内存睡眠,外存睡眠的进程在被唤醒时只能进入外存就绪态,等待下一次的调度时再进入内存,转换是单向的。,
5、9.2.4 进程映象,UNIX进程映象由三部分组成: 用户级上下文:包括用户正文段、用户数据段和用户栈寄存器级上下文:程序寄存器(PC)、处理机状态寄存器(PSW)、栈指针、通用寄存器系统级上下文: 静态部分(PCB和资源表格) 动态部分:核心栈(核心过程的栈结构,不同进程在调用相同核心过程时有不同核心栈),8.3.1 进程调度程序主要责任对参与竞争CPU且已具备执行条件的进程进行分析和裁决对选中的进程做CPU控制权转交管理进程运行中各种状态的转换完成进程在系统内外存之间的对换,9.3 UNIX进程调度,UNIX中有两种调度时机: 1)进程自动放弃CPU 进程由核心态转为用户态时说明: 具体调
6、度由0#进程中的swtch程序完成。 第一种调度时机是可预见的。,9.3.2 调度时机,采用:动态优先级多级反馈循环调度法(Round Robin With Multiple Feedback),9.3.3 调度算法,将就绪队列分为N级,每个就绪队列分配给不同的时间片,队列级别越高,时间片越长,级别越小,时间片越短; 系统从第一级调度,当第一级为空时,系统转向第二个队列,.当运行进程用完一个时间片,放弃CPU时,进入下一级队列; 等待进程被唤醒时,进入原来的就绪队列; 当进程第一次就绪时,进入第一级队列,复习:多队列反馈调度算法,算法简要描述,1)给进程分配时间片 2)时间片结束时计算进程优先
7、级 3) 用优先数做比较选出高优先级进程 4)调度高优先级进程开始运行 5)被抢夺了cpu的进程反馈到相应的优先级队列中,Unix sys V采用动态优先数调度策略,并且规定优先数越大,其优先级越低,9.3.4 优先级计算,Ppri= Pcpu/2+PUSER+Pnice+NZERO其中: 。PUSER,NZERO是优先数基值;。Pcpu是每个进程最近一次使用 CPU的时间;。Pnice是用户设置的进程优先数偏移值。,普通用户只可增大Pnice,计算公式,对于新创建的进程由于Pcpu/2=0,所以其优先数会较小。因此会比较快的得到调度。对于原有进程a) 当被调度时:随着进程执行,其Pcpu的值
8、不断增加,因而可能会被其它进程抢先;b) 当不被调度时:由于公式中Pcpu被2所除,因此每当计算优先数时,Pcpu/2项会衰减。因此当其优先数小于当前进程和其它进程时,又会重新抢占CPU。,公式分析,进程调度的实现实质上是完成进程之间上下文(映象)的切换。分三步完成: 第一步:检查是否做且系统允许做上下文切换,若条件满足,则保存: 进程中各段内容(数据,正文,栈) 有关寄存器中内容 相关的栈指针 否则返回有关信息,不作调度。,9.3.5 进程调度的过程,第二步:0号进程选取就绪队列中一个优先级最高的进程,使之占有CPU;若没有满足条件的进程存在,0号进程循环。等待直到条件满足为止。第三步:被选
9、中的进程变为当前进程。系统从它的核心栈或user结构中恢复该进程的有关寄存器内容和栈指针,新进程开始执行。,9.4 UNIX进程通信,UNIX进程通信有三种方式: 信号(signals)通信 管道(pipes)通信 IPC(Inter Process Communication)通信:消息机制、共享内存机制、信号量(semaphore),9.4.1 信号,概念: 信号是一个整数,范围从1-19,用于通知进程发生了某异常事件。 一个进程可以向另一个进程发送一个信号。 每个进程的PCB中都有一个信号域(19位),某进程向本进程发送一个信号时,信号域的对应位就会被置位。 19类信号好图13-10,进
10、程从核态返回目态时要检测信号位,若某位被置位则中断正在执行的程序,转向与该信号对应的处理程序。完成后返回断点执行。 信号机制是对中断机制的模拟,故在早期又称软中断。,信号机制与中断机制的比较,相同点: 都采用异步通信方式 当检测到信号或中断时,暂停当前程序的执行,转去执行相应处理程序 处理完后回到断点 信号和中断都可进行屏蔽,不同点: 中断有优先级,信号没有 信号处理在目态,中断处理在管态 中断响应是及时的,信号响应通常都有较大的延迟。,信号的发送,发送进程把信号送到指定进程的信号域的某一位上。 进程可用kill向一个或一组进程发送一个信号。 int kill(pid,sig);其中:pid为
11、正数时,信号发送给进程pid pid 为0 时信号发送给与发送进程同组的所有进程。sig为要发送的信号,预置对信号的处理方式,可用系统调用signal(sig,func)来预置对信号的处理方式。 func=1时,进程对sig信号不予理睬。 func=0时,进程在收到 sig信号后应终止自己 func 非0/1时,func是信号处理程序的指针,对信号的处理,进程从核态返回目态时,要检查是否已收到信号。而进程在核态时并不检查信号位。只有当它返回目态后才处理信号。 如果收到的信号是一个已决定忽略的信号(func=1),进程不做任何处理便立即返回。 若func=0,本进程要终止。对有些信号,进程在自我
12、终止前,核心要将该进程的内存映像定入core文件,这可方便程序员调试程序。 func 非0/1时,执行用户设置的处理程序。,9.4.2 消息,消息是一个格式化的可变长的信息单元。消息机制允许一个进程给其它任意进程发送一条消息。,消息机制的数据结构,1、 消息首部 消息分为首部及数据区。消息首部中记录有消息的类型、大小、指向消息数据区的指针、消息队列的链指针。,2、 消息队列头表 其每一表项作为一个消息队列的头结点。 它包括如下内容: 指向消息队列的队首及队尾的指针 队列中消息的数目、 队列中消息数据的总字节数等。 如图13-12,消息队列的建立,系统调用 msgget()可用来建立消息队列 i
13、nt msgget(key,msgflag)key: 用户指定的消息队列的名字 msgflag:建立标志,如ipc_CREAT表示若无以key命名的消息队列,则建立,否则返回该消息队列的msgid返回值为消息队列的描述符msgid,消息的发送,系统调用 msgsnd()可用来发送消息。 msgsnd(msgid,msgp,msgsz,msgflg)msgid表示消息队列标识,即消息要发送到的消息队列。 msgp指向要发送的消息 msgsz要发送的消息的大小 msgflg规定当无内存空间存储消息时,进程是等待还是立即返回。,消息的接收,系统调用msgrev()用于从指定的消息队列接收指定类型的消
14、息。 msgrev(msgid,msgp,msgsz,msgtpy,msgflg);msgid 消息队列标识,即从该消息队列接收消息。 msgp接收到的消息存放到该位置 msgsz接收的消息的大小 msgtpy 消息类型 msgflg当无指定消息时,进程是等待还是立即返回。,9.4.3 共享存储区,是UNIX中通信速度最高的一种通信机制。 该机制可使多个进程共享主存中的某一区域。同时要注意,该机制并未提供同步互斥机制。用户要自己处理进程间的同步互斥,才能正确通信。,共享存储区的建立,int shmget(key,size,shmflg);key:共享存储区的名字。 size:大小 shmflg
15、:标志 返回值为共享存储区的描述符shmid,共享存储区的连接,进程在建立了一共享存储区后,还要用shmat()将其连接到进程的虚地址空间上,此后共享存储区成为进程虚地址空间的一部分,进程可存取该空间。 Shmat(shmid,shmaddr,shmflg);Shmid:共享存储区描述符 Shmaddr:进程虚地址 Shmflg:读写标志,共享存储区的断开,进程不需要共享存储区时,用系统调用shmdt()断开连接int shmdt(shmaddr);shmaddr:要断开连接的虚地址,第二部分 UNIX文件子系统,9.5 UNIX缓冲池管理 9.6 UNIX文件系统的总体结构 9.7 UNIX
16、文件系统的索引结构 9.8 UNIX文件的访问过程 9.9 管道文件的实现,9.5 UNIX缓冲池管理,9.5.1 缓冲控制块buf 在UNIX缓冲池中包含若干大小相等的缓冲区,每个缓冲区的大小均等于磁盘块的大小。系统为每个缓冲区设置一个缓冲控制块buf,用来登记相应缓冲区的使用和管理等方面的信息。 系统通过对buf的管理来达到管理缓冲区的目的。,Buf主要包括以下信息,b_addr:缓冲区内存地址 b_dev: 缓冲区对应的设备信息:高字节表示设备类号,低字节表示同类设备的编号 b_blkno:缓冲区对应的物理块号 b_forw, b_back和av_forw,av_back:链指针,用于连接两个双向队列。 b_flags:标志信息,反映缓冲区的使用情况。,9.5.2 自由buf队列,系统把空闲缓冲区对应的buf组成空闲buf队列,也称为自由buf队列。 这个队列是双向循环链表结构。,