1 / 85

第十章 UNIX 系统内核结构

第十章 UNIX 系统内核结构. 参考 《 UNIX 操作系统设计 》 Maurice J.Bach. 主要内容 UNIX 系统的特点 ; 进程 , 存储 , 文件 , 设备管理的相关数据结构及算法 重点 UNIX 系统的进程管理 ( 数据结构 , 算法 ) 文件管理超级块 , 索引结点 , 空闲块管理. 第十章 UNIX 系统内核结构. 10.1 UNIX 系统概述. 1. UNIX 系统的特征 1) 开放性 2) 多用户、多任务环境 3) 功能强大,实现高效 4) 提供了丰富的网络功能 5) 支持多处理器功能.

preston
Télécharger la présentation

第十章 UNIX 系统内核结构

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第十章 UNIX系统内核结构 参考《 UNIX操作系统设计》 Maurice J.Bach

  2. 主要内容 • UNIX系统的特点; • 进程,存储,文件,设备管理的相关数据结构及算法 • 重点 • UNIX系统的进程管理(数据结构,算法) • 文件管理超级块,索引结点,空闲块管理

  3. 第十章UNIX系统内核结构

  4. 10.1 UNIX系统概述 1. UNIX系统的特征 1) 开放性 2) 多用户、多任务环境 3) 功能强大,实现高效 4) 提供了丰富的网络功能 5) 支持多处理器功能

  5. UNIX系统结构 用户程序 Shell edit 编译程序 kernel 硬件 实用程序 UNIX简略结构

  6. UNIX层次结构说明 • 硬件:可以是便携机、个人机、工作站、大中小型机等 • 内核:包括中断、存储、进程、I/O、文件等管理程序 • Shell:具有多种功能的系统程序 • 实用程序:完成大部分UNIX高级命令的功能

  7. 2. UNIX系统的内核结构 图 10-1 UNIX核心的框图

  8. 1) 进程控制子系统 (1) 进程同步 (2) 进程通信 (3) 存储器管理 (4) 进程调度

  9. 2) 文件子系统 (1) 文件管理 (2) 高速缓冲机制 (3) 设备驱动程序

  10. 10.2 进程的描述和控制 2.1 进程描述 在UNIX系统Ⅴ中, 把进程控制块分为四部分: (1) 进程表项 (2) U区  (3) 本进程区表  (4) 系统区表

  11. 1. 进程表项(Process Table Entry) (1) 进程标识符(PID)。 (2) 用户标识符(UID)。 (3) 进程状态。 (4) 事件描述符。 (5) 进程和U区在内存或外存的地址。 (6) 软中断信息。 (7) 计时域。 (8) 进程的大小。 (9) 偏置值nice。 (10) P-Link指针。 (11) 指向U区进程正文、 数据及栈在内存区域的指针。

  12. 2. U区(U Area) (1) 指向进程表项的指针。 (2) 真正用户标识符u-ruid(real user ID)。 (3) 有效用户标识符u-euid(effective user ID)。 (4) 用户文件描述符表。 (5) 当前目录和当前根。 (6) 计时器。 (7) 内部I/O参数。 (8) 限制字段。 (9) 差错字段。 (10) 返回值。 (11) 信号处理数组。

  13. 3. 系统区表(System Region Table) 又称区表,每个表目代表一个在系统中的区 (1) 区的类型和大小 (2) 区的状态 (3) 区在物理存储器中的位置 (4) 引用计数 (5) 指向文件索引结点的指针

  14. 4. 本进程区表(Per Process Region Table) 图 10-2 进程区表项、系统区表项和区的关系

  15. 进程的数据结构

  16. 数据结构关联图 user Text data stack 进程I proc 内存 系统区表 进程表 PPRT 页表

  17. 2.2 进程状态与进程映像 1.进程状态

  18. 九种状态 1)初始态 2)内存就绪态 3)外存就绪态 4)核心态下的执行态 5)用户态下的执行态 6)内存中的睡眠 7)外存睡眠 8)被剥夺 9)僵死态 见图10-4

  19. 进程状态间转换的几条规定 中断 用户态 核心态 重置PSW 1、进程可在用户态及核心态下运行

  20. 2、对就绪进程的两种处理方法 内存就绪进程参与竞争,外存就绪应先换入内存。 由0#进程管理。

  21. 3、有些状态只能做单向转换 内存睡眠的进程可调出到外存睡眠,而外存睡眠的进程不能调入到内存睡眠,外存睡眠的进程在被唤醒时只能进入外存就绪态,等待下一次的调度时再进入内存,转换是单向的。

  22. 2. 进程映像 • UNIX进程映象由三部分组成: • 用户级上下文:包括用户正文段、用户数据段和用户栈 • 寄存器级上下文:程序寄存器(PC)、处理机状态寄存器(PSW)、栈指针、通用寄存器 • 系统级上下文: • 静态部分(PCB和资源表格) • 动态部分:核心栈(核心过程的栈结构,不同进程在调用相同核心过程时有不同核心栈)

  23. 2.3 进程控制 进程创建层次结构 引导 核心创建0# 0#创建1# 终端1 终端2 终端n . . . . . .

  24. UNIX中的两个特殊进程 • 0#进程 • 由内核程序创建,初始化时创建1#进程 • 负责进程调度与对换 • 1#进程 • 是所有用户进程的祖先进程

  25. 1. sched:PID=0  UNIX核心创建的第一个进程  系统启动时创建其他系统进程  负责进程在swap和memory之间的切换(进程调度) 2. init:PID=1  初始化boot和login进程  所有用户进程的“祖先”(ancestor)  所有非sched创建的系统进程的“祖先”(ancestor) 3. vhand:PID=2  将memory中较少使用的页移入swap 区。 4. dbflush:PID=3  在一定的时间间隔将“buffer cache”中的内容刷新至硬盘。 5. kmdaemon:PID=4  管理保留内存池,以备服务进程中断时取用 6. htepi_daemon:PID=5  处理“ht filesystem driver ” 的异步日志文件的修改

  26. 1. 进程创建 fork系统调用 (1) 为新进程分配一个进程表项和进 程标识符。 (2) 检查同时运行的进程数目。 (3) 拷贝进程表项中的数据。 (4) 子进程继承父进程的所有文件。 (5) 为子进程创建进程上下文。 (6) 子进程执行。

  27. (1) 为新进程分配一个进程表项和进 程标识符。 (2) 检查同时运行的进程数目。 (3) 拷贝进程表项中的数据。 (4) 子进程继承父进程的所有文件。 (5) 为子进程创建进程上下文。 (6) 子进程执行。 • main() • { • pid_t pid; • pid=fork(); • if(pid==0) • exec(program); • else if(pid>0) • wait(); • }

  28. 2. exec系列系统调用 把新的程序装入调用进程的内存空间,使调用进程被覆盖,从新引入进程的入口开始执行。 即:新进程取代了老进程。(进程标识符与调用进程相同,只是执行的代码不同。) 两种参数传递: int execv(path,argv) char *path,*argv[] int execl(path,arg0[,arg1,...,argn], 0) char * path,*arg0,*arg1,.......,*argn

  29. 3. exit系统调用 通常,父进程在创建子进程时,应在进程的末尾安排一条exit,使子进程能自我终止。内核须为exit完成以下操作: • (1) 关闭软中断 • (2) 回收资源 • (3) 写记账信息 • (4) 置进程为“僵死”状态

  30. 4. wait系统调用 wait系统调用用于将调用进程挂起, 直至其子进程因暂停或终止而发来软中断信号为止。 核心对wait调用做以下处理: 查找调用进程是否还有子进程, 若无,便返回出错码; 若找到一个处于“僵死”状态的子进程,便将子进程的执行时间加到其父进程的执行时间上, 并释放该子进程的进程表项; 如果未找到处于“僵死”状态的子进程,则调用进程便在可被中断的优先级上睡眠,等待其子进程发来软中断信号时被唤醒。

  31. 练习1 main() { int i; while((i=fork()==-1); if (i) { printf(“It’s parent process.\n”); wait(); printf(“My child process,Id number%d exited.\n”,i); exit(); } else printf(“It is child process”); printf(“It is parent or child process); } • 设子进程的ID是33写出运行时的各种可能输出

  32. 能产生的输出有三种: 1、 It’s parent process It is child process It is parent or child process My child process,Id number 33 exited

  33. 2、 It is child process It is parent or child process It’s parent process My child process,Id number 33 exited 3、 It is child process It’s parent process It is parent or child process My child process,Id number 33 exited

  34. 练习2 UN IX 运行下列程序,最多可产生多少个进程?画出进程家族树。设开始执行的进程为A进程 mian() /*A*/ { fork(); fork(); fork(); }

  35. mian() /*B*/ { fork(); fork(); fork(); } mian() /*A*/ { fork(); fork(); fork(); }

  36. A C E B D G F H

  37. #include <stdio.h> main() { char command[32]; char *prompt=“>”; while (printf(“%s”,prompt),gets(command)!=NULL){ if (fork()==0) execl(command,command,(char *) 0); else wait(); } } 练习3 输出提示符,读入命令,当命令不空时,创建一子进程去执行该命令,父进程等待子进程完成操作后,再次输出提示符,等待读入命令。

  38. 2。4 UNIX进程调度 • 进程调度程序主要责任 • 对参与竞争CPU且已具备执行条件的进程进行分析和裁决 • 对选中的进程做CPU控制权转交 • 管理进程运行中各种状态的转换 • 完成进程在系统内外存之间的对换

  39. 调度时机 • UNIX中有两种调度时机: • 1)进程自动放弃CPU • 进程由核心态转为用户态时 • 说明: • 具体调度由0#进程中的swtch程序完成。 • 第一种调度时机是可预见的。

  40. 调度算法 • 采用:动态优先级多级反馈循环调度法(Round Robin With Multiple Feedback)

  41. 复习:多队列反馈调度算法 • 将就绪队列分为N级,每个就绪队列分配给不同的时间片,队列级别越高,时间片越长,级别越小,时间片越短; • 系统从第一级调度,当第一级为空时,系统转向第二个队列,.....当运行进程用完一个时间片,放弃CPU时,进入下一级队列; • 等待进程被唤醒时,进入原来的就绪队列; • 当进程第一次就绪时,进入第一级队列

  42. 算法简要描述 • 1)给进程分配时间片 • 2)时间片结束时计算进程优先级 • 3) 用优先数做比较选出高优先级进程 • 4)调度高优先级进程开始运行 • 5)被抢夺了cpu的进程反馈到相应的优先级队列中

  43. 进程优先级的分类  UNIX系统把进程的优先级分成两类: • 核心优先级:分可中断和不可中断两种。 当一个软中断信号到达时,若有进程正在可中断优先级上睡眠,该进程将立即被唤醒; 若有进程处于不可中断优先级上,则该进程继续睡眠。 • 用户优先级,它又被分成n+1级, 其中第0级为最高优先级,第n级的优先级最低。

  44. 优先级计算 Unix sys V采用动态优先数调度策略,并且规定 优先数越大,其优先级越低

  45. 计算公式 Ppri= Pcpu/2+基本用户优先数(PUSER+Pnice+NZERO) 其中: 。Pcpu—是每个进程最近一次使用 CPU的时间; 。Pnice—是用户设置的进程优先数偏移值。由用户将它设置成0~40中的任一个数。一旦设定后,用户仅能使其值增加,特权用户才有权减小nice的值。 PUSER,NZERO—是优先数基值;

  46. 公式分析 • 对于新创建的进程 • 由于Pcpu/2=0,所以其优先数会较小。因此会比较快的得到调度。 • 对于原有进程 • a) 当被调度时:随着进程执行,其Pcpu的值不断增加,因而可能会被其它进程抢先; • b) 当不被调度时:由于公式中Pcpu被2所除,因此每当计算优先数时,Pcpu/2项会衰减。因此当其优先数小于当前进程和其它进程时,又会重新抢占CPU。

  47. 进程调度的过程 进程调度的实现实质上是完成进程之间上下文(映象)的切换。 分三步完成: 第一步:检查是否做且系统允许做上下文切换,若条件满足,则保存: · 进程中各段内容(数据,正文,栈) · 有关寄存器中内容 · 相关的栈指针 否则返回有关信息,不作调度。

  48. 第二步:0号进程选取就绪队列中一个优先级最高的进程,使之占有CPU;若没有满足条件的进程存在,0号进程循环等待直到条件满足为止。第二步:0号进程选取就绪队列中一个优先级最高的进程,使之占有CPU;若没有满足条件的进程存在,0号进程循环等待直到条件满足为止。 第三步:被选中的进程变为当前进程。系统从它的核心栈或user结构中恢复该进程的有关寄存器内容和栈指针,新进程开始执行。

  49. 10.3 进程的同步与通信 1 sleep与wakeup同步机制 2、管道 3、信号机制(软中断) 4、UNIX V 进程间通信软件包IPC 消息 共享内存机制 信号量机制

  50. 3.1 sleep与wakeup同步机制 a.保存进入睡眠时的处理机运行级 b再提高处理机的运行优先级,来屏蔽所有的中断,c将该进程置为“睡眠”状态,将睡眠地址保存在进程表项中,并将该进程放入睡眠队列中。 如果进程的睡眠是不可中断的,做了进程上下文的切换后,进程便可安稳地睡眠。 当进程被唤醒并被调度执行时,将恢复处理机的运行级为进入睡眠时的值, 此时允许中断处理机。 1. sleep过程

More Related