《UNIX内核分析》课件.ppt_第1页
《UNIX内核分析》课件.ppt_第2页
《UNIX内核分析》课件.ppt_第3页
《UNIX内核分析》课件.ppt_第4页
《UNIX内核分析》课件.ppt_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

UNIX 内核分析,参考教材: UNIX操作系统教程 尤晋元 西安电子科技大学出版社,前 序,UNIX系统1969年诞生,以其特有的简洁性和开放性获得赞同与青睐,已经被移植到数十种硬件平台上。 UNIX是通用的,交互式的分时系统。 UNIX系统已远远超出一个OS软件所起的作用,它在方方面面潜移默化地影响着人们对软件的设计和开发,其蕴含的设计思想至今仍然是十分值得借鉴的。,UNIX系统特点,已有技术的精选、提炼和发展,简洁实用,短小精悍,功能强大 具有分层、可装卸的文件卷系统 任何一个程序可不加改变地在前台/后台异步运行 将文件、目录和设备均统一看作文件 提供I/O缓冲技术 提供功能完备、使用灵活的命令语言 丰富的核外系统程序 采用高级语言编写,可移植性好,UNIX系统结构,UNIX核心源程序结构,以UNIX V6为例,其内核源程序约一万行,按编译方式大致分3类44个文件: .c文件:28个文件,190个可单独编译的子程序 .h文件:全局变量,14个文件 .s文件:汇编程序文件,约1000条,2个文件33个子程序,进程描述 程序状态字和通用寄存器,PDP-11程序状态字组成,进程分Kernel/User 2种运行状态,区别 进程处于不同地址空间:核心态/用户态空间 可否执行特权指令 使用不同的栈顶指针寄存器r6,进程描述 程序状态字和通用寄存器,通用寄存器 PDP-11/40有9个通用寄存器,长度16位,编号r0-r7 r0-r1:I/O参数传递 r2-r4:存放过程执行时的局部变量 r5:环境指针 r6:堆栈指针,kernel/user态各1个 r7:PC,进程描述 进程与映像(Process & Image),进程是映像的执行 映像是计算机的执行环境,一个映像包括 存储映像 通用寄存器的值 打开文件的状态 当前目录 其他信息,进程描述 进程的存储影响,进程映像中最为关键的部分是存储映像。 存储映像由5部分组成: 进程控制块PCB 共享正文段 数据段 共享内存段 工作区,进程控制块PCB,Unix为了节省PCB所占主存,PCB分为2部分 常驻内存部分:Proc结构。包含进程调度必须的信息; 非常驻内存部分: User结构。包含进程运行时才要用到的更多其他信息,它随用户程序和数据部分换进/换出主存。 User区的字段只能由正在运行的进程存取。即只有占用CPU的进程才能访问属于当前进程的私有User区。 整个系统有一个进程表,称为Proc数组。Unix系统最多有50个进程; 每个进程有专用的User区,但核心根据进程页表,通过地址映射机构,可访问当前进程的User区。(好像系统中仅有一个User区),共享正文段,是指可由多个进程共享的区域,包括 纯代码形式的程序 参数 一个进程的正文段也可以不存在,数据段,指进程执行时用到的数据,包括 外部变量 静态局部变量 常数 如果进程执行的程序为非共享的,也可以构成数据段的一部分,可被用户态进程读、写、执行,工作区,进程的用户栈和核心栈分别为进程用户态和核心态下运行的工作区 用于函数调用时的常数传递,现场保留,返回地址保存,局部变量存储等,进程映像在存储器中的分布,PDP-11/40最多配置248K内存,进程映像分为常驻/非常驻内存部分 常驻部分:Proc,共享正文段的控制信息块 非常驻部分:数据段,共享正文段,工作区。 Unix将除了共享正文段以外的其他部分作为一个整体处理,(结构见下页) 无论在主存还是在盘交换区,该部分占用连续存储区 作为整体入/出主存 Unix设置text数组(共40个元素)管理所有可共享正文段,表目内容主要有:共享正文段外存地址,段长度,共享该段的进程数等,非常驻部分的分布结构,ppda区只有核心态进程可以访问,进程的数据结构 进程的基本控制块/Proc结构,Struct proc (主要部分) int p-pid; /*唯一标识一个进程的整数:0 215-1 int p-ppid; /*父进程标识数 char p-uid; /*用户标识符UID,由高级用户分配 char p-stat; /*进程当前状态 char p-flag; /*表示进程映像是否在主存/盘交换区 char p-pri; /*-100+127。值越小,优先权越高 char p-time; /*调度驻留时间:进程映像最近一次入/出主存后的时间 char p-cpu /*CPU使用情况 char p-nice; /*偏置值:计算进程优先权时使用,可由用户设置 char p-sig; /*进程接收的信号类型数:0 19,0 13系统定义 int p-addr; /*ppda区的起址(单位是字符块数):内存64B/块,外存512B/块 int p-size; /*除共享正文段外,可交换映像长度 int p-wchan; /*睡眠原因:原因消失,则唤醒 int p-textp; /*指向text结构的指针 procNproc ; /* Nproc是系统可容纳的最大进程数/50,进程的数据结构 进程的扩充控制块/User结构(1),每个进程User结构的虚拟起始地址都是u=14000。操作系统通过编译、链接给u变量赋值,其地址空间对应核心空间第7页,其物理地址可以映射到主存中各进程的user结构。 User结构含有当进程换出内存候不需要访问的所有数据,进程的数据结构 进程的扩充控制块/User结构(2),Struct user (主要部分) int u-rsav2; /*调度进程的正常保留区:r5,r6 int u-qsav2; /*中止系统调用的越级返回保留区 int u-ssav2; /*fork时恢复子进程运行的保留区 char u-segflg; /*I/O标志,0/1/2分别为:用户数据/系统/用户指令空间 char u-error; /*出错返回码 char u-uid; /*有效用户标识号 char u-gid; /*有效用户组标识号 char u-ruid /*实际用户标识号 char u-rgid; /*实际用户组标识号 int u-procp; /*指向本进程的proc结构指针 char *u-base; /*I/O基址,文件传输中表示主存地址,R/W-目标/信息源指针 char *u-count; /* I/O字节数 char *u-offset2; /*文件传输中表示文件内相对位移量(字节) char *u-cdir; /*当前目录项i节点指针 char u-dbufDIRSIZE; /*保留当前用到的文件路径名 char *u-dirp; /*当前目录文件名指针,进程的数据结构 进程的扩充控制块/User结构(3),Struct int u-ino /* i结点号 /*该结构保存一个文件目录项 char u-nameDIRSIZE; /*该文件路径名分量 u-dent; int *u-pdir; /*父目录项i结点指针 char u-uisa16; /*存放本进程用户空间地址寄存器内容 char u-uisd16; /*存放本进程用户空间说明寄存器内容 char u-ofileNOFILE; /*用户打开文件表,共15个表目 char u-arg5; /*用户传入的自变量 char u-tsize /*本进程正文段块数 char u-dsize; /*本进程数据段块数 int u-ssize; /*本进程堆栈段块数 char u-signalNSIG; /*软中断处理程序入口表,20个表目 char u-utime; /*进程用户态下运行时间 char u-stime; /*进程核心态下运行时间 char u-cutime; /*已中止子进程用户态下运行时间总和 char u-cstime; /*已中止子进程核心态下运行时间总和 char u-intflag; /*系统调用是否执行完成标志 u;,进程的数据结构 共享正文段/text结构,Struct text int x-daddr; /*共享正文段在盘交换区的起始地址 int x-caddr; /*共享正文段在内存中的起始块号(*64=起始地址) int x-size; /*共享正文段长度 char x-count /*共享该正文段的进程数 char x-ccount; /*共享该正文段,且映像在内存的进程数 int *x-iptr; /*指向正文段所在文件的inode指针 textNTEXT; 一般NTEXT=40 如果有某正文段的共享进程映像在内存中,则该共享正文段一定在内存中,进程映像的基本结构图,进程的状态,进程在其生命周期的不同时刻有不同状态;同一时刻不同进程有不同状态 Unix系统中,进城的完整状态有9种。 (转换图见下一页) 创建状态 内存就绪 就绪且换出:新创建/原就绪进程,因内存紧张而换出 核心态执行 用户态执行 内存中睡眠:执行I/O操作进程,等待 睡眠且换出:内存紧张时,睡眠进程首先被换出 被剥夺状态:进程被调度程序剥夺了处理机后的状态 僵死状态:类似于中止状态,进程状态转换图,进程状态转换说明,进程执行系统调用、I/O终端、时钟中断后,进入核心态运行。2种不同状态运行的主要差别: 进程访问的内存空间的对象受到限制。 核心态运行时,不允许被剥夺;而用户态运行可以被剥夺(核心态运行完成,欲返回用户态时可被剥夺);核心态运行时,可被高优先级核心态进程中断。 就绪与被剥夺(preempted)状态是等效的,他们在同一队列等待再次调度 处于运行状态的进程包括:正在处理机上执行和就绪队列进程,进程上下文,进程上下文由三部分组成: 用户级上下文:正文,数据,堆栈,共享内存段 寄存器上下文: PC,PS,SP,r0, 系统级上下文:Proc,User,核心栈 上下文切换时,要保证内部数据的完整性和一致性。所以切换有严格的条件: 当进程是自己进入睡眠时 系统调用/中断完成返回用户态而被剥夺 以exit退出时 Q:进程从用户态到核心态切换时,是否为上下文切换?,进程管理 Unix进程的各种调度状态(1),Unix V6中进程的调度状态有6种,由p-stat描述。 1 SSLEEP:高优先权睡眠状态 2 SWAIT: 低优先权睡眠状态 3 SRUN: 运行/可运行状态 4 SIDL: 创建子进程的中间状态 5 SZOMB:进程终止时的中间状态 6 SSTOP: 暂停/正被跟踪状态,进程管理 Unix进程的各种调度状态(2),进程标志p-flag定义为: #define SLOAD 01 映像在内存 #define SSYS 02 系统进程,应常驻内存 #define SLOCK 04 进程不能换出 #define SSWAP 010 进程正被对换 #define STRC 020 进程正被跟踪 #define STWED 040 另一跟踪标志,进程管理 运行状态(运行/就绪),当前运行进程,特点: P-stat 为SRUN P-flag 包含SLOAD标志 KISA6,KISD6指向该进程ppda区 可以在核心/用户态运行,所处存储区位置不同 就绪进程,特点: P-stat 为SRUN P-flag 可能包含SLOAD标志,也可能不包含 ppda区不是核心态第6页 运行-就绪通过系统进程swtch完成,所以转换首先一定是处于核心态,进程管理睡眠状态,等待时间发生而停止运行的一种状态,特点: P-stat 为SSLEEP或SWAIT,不参与竞争处理机 P-flag 可能包含SLOAD标志,也可能不包含 KISA6,KISD6不反映进程图像在内存的位置 睡眠原因:进程间同步与互斥引起 使用互斥资源无法满足 同步等待I/O结束 同步等待出现处理对象,如0#进程/sched暂时没有处理对象 进程间的其他同步操作,sleep(),wait() 临界区互斥,进程管理 高低优先权睡眠状态,核心态下执行sleep进入睡眠状态 P-pri由系统按照睡眠原因设置,-100-+127 SSLEEP: P-pri0,低优先权睡眠 父子进程同步:40 等低速设备I/O:10-20 唤醒:wakeup程序完成,唤醒后P-pri100。有时还要由sched完成内存/盘交换区的交换,进程调度算法 动态优先权法,Unix采用动态优先权法,采用的策略有: 核心态运行时,除非自动放弃,不重新调度,保证高速; 进程睡眠唤醒后,较其他就绪进程有高的优先权。因为该类进程将继续执行OS程序; 进程睡眠唤醒后,按照等待事件的紧迫程度,赋予不同优先权。即同一程序不同段有不同优先权; 高级用户进程较一般用户进程有较高的优先级; 使用处理机程度低、交互作用平凡的进程赋予较高优先权,以获得比较合理的响应时间。,进程调度算法 进程优先数计算方法(1),优先数确定的两种方法 设置方式:用于高/低优先权睡眠进程 计算方式:包括计算方法和计算时机 进程正在/即将转入用户态运行时,用计算方式确定其优先权 对于一般用户进程来说,用计算方式获得的优先数大于设置获得的优先数,进程调度算法 进程优先数计算方法(2),算式: p-pri=min127,(p-cpu/16+PUSER+p-nice) 说明: P-pri:字符型变量,-128+127,最低-100 PUSER:固定偏置值。设置目的是:为了使被唤醒的睡眠进程应具有的优先数相衔接。被唤醒进程优先数:-100100 V6:PUSER=100; S5:PUSER=60,进程调度算法 进程优先数计算程序,Setpri(up) /*up是proc结构指针 register *pp,p; pp=up; p=(ppp-cpu ,进程调度算法关于p-nice,P-nice反映进程具有的相对优先程度 一般用户可设置范围:020;高级用户:-12820 通过系统调用nice(priority)完成设置,代码: register n; n=u.uar0R0; /* u.uar0R0保存系统调用参数 if (n20) n=20; if (n0 ,进程调度算法关于p-cpu,P-cpu反映进程使用cpu程度 每个时钟周期+1 rt=tu/tl=tu/(tu+tnu) 其中:rt :进程使用cpu的时间比 tu:进程生成后使用cpu时间的累计值 tl:进程生成后所经时间 tnu:进程生成候不占用cpu的时间累计值,进程调度算法 计算进程优先数的3个时机,时钟中断处理程序中,每隔一秒,对所有优先数大于PUSER的进程复算优先数; 陷入处理结束前,重新计算本进程优先数; 现进程执行时钟中断处理程序时,如果中断前为用户态,每隔一秒,重新计算本进程优先数。,进程调度算法 进程切换调度的2个时机(1),当前运行进程不再具备运行条件,自动放弃CPU 进程结束 进程等待 子进程进入暂停状态,等待父进程处理 执行进程申请扩充主存,无法满足,入盘交换区 执行进程要求调入某一共享正文段,则先将该进程图像调出,等到适当时机按下列顺序调入: 共享正文段,ppda,数据段,用户栈段,进程调度算法 进程切换调度的2个时机(2),系统中存在较当前执行进程更适宜占用CPU的进程,于是系统在中断/陷入处理末尾强迫当前运行进程放弃CPU 强迫调度标志是runrun,它的设置时机为: 睡眠进程被唤醒,或被暂停运行进程变为运行状态时,发现其优先权高于现运行进程 Setpri程序中,发现计算所的进程优先数高于当前运行进程被调度运行时的优先数/curpri。下列2种情况现运行进程计算所的优先数大于原先值: 进程由核心态变为用户态 用户态下运行进程已占用了一段处理机时间,使p-cpu增大,进程调度算法 进程切换调度程序swtch,Swtch任务:选择进程占用CPU,保存/恢复现场 Swtch执行可能涉及三个处于核心态的进程 原运行进程,即调用swtch的进程,保存现场,恢复0# 系统调度进程0# :从内存就绪队列选一个进程占用CPU 新选中运行进程:1) 设置UISA,UISD寄存器组 2) 从核心栈中恢复PC,返回原核心态,进程的睡眠和唤醒,进程间实施互斥、同步机制时,需要进入睡眠状态 睡眠原因消失,进程被唤醒,进程睡眠sleep(),Sleep(chan,pri)可使进程进入高/低优先权睡眠 Chan:睡眠原因 Pri:睡眠后预置的优先数,0低优先权 主要工作: 设置欲睡眠进程的p-whan/原因,p-stat,p-pri,并调用swtch进行调度 rpp-wchan=chan; rpp-stat=SSLEEP/SWAIT; rpp-pri=pri 设置过程执行语句为临界区,执行前处理既优先级提高为6级(避免中断),进程睡眠sleep(),说明 若进程欲进入低优先权睡眠,首先应检测是否收到不可忽略的信号p-flag。如果收到,先转去执行信号处理程序; 系统设置runrun标志,说明是否有在盘交换区的进程准备就绪而因内存不足无法进入。 若runrun已经设置,则将低优先级睡眠进程入盘交换区,并调用sched.,睡眠唤醒

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论