UNIXLinux操作系统内核结构课件

PPT
  • 阅读 116 次
  • 下载 0 次
  • 页数 197 页
  • 大小 546.015 KB
  • 2022-11-12 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档40.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
UNIXLinux操作系统内核结构课件
可在后台配置第一页与第二页中间广告代码
UNIXLinux操作系统内核结构课件
可在后台配置第二页与第三页中间广告代码
UNIXLinux操作系统内核结构课件
可在后台配置第三页与第四页中间广告代码
UNIXLinux操作系统内核结构课件
UNIXLinux操作系统内核结构课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 197
  • 收藏
  • 违规举报
  • © 版权认领
下载文档40.00 元 加入VIP免费下载
文本内容

【文档说明】UNIXLinux操作系统内核结构课件.ppt,共(197)页,546.015 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-3250.html

以下为本文档部分文字说明:

2022年11月12日UNIX_Linux操作系统内核结构电子科技大学信软学院教师介绍刘玓教授大型主机教学团队主任大型主机与网络安全工程系主任Email:liudi@uestc.edu.cn主要研究方向:操作系统、大型主机、网络应用课程概述一.课程内容简

介1、讲授范围具体的技术系统及其算法和实现流程,而不是操作系统基本原理;2、通用操作系统的现状和分类DOS类----结构简单、使用方便、效率低、安全性低UNIX类----运行高效、结构通用、安全可靠、适应能力强

、系统较复杂MVS类----功能强大、处理能力巨大、系统复杂、较封闭大巨型机+z/OS小中型机+UNIX微型机+Windows功能强大简单易用3、根本特点分时多用户、开放性分时多用户:多个用户多个进程同时在一个系统中运行系统资源高度共享、有效协调开放性:

标准化——结构上的一致性可移植性——应用软件的编码及系统应用接口可互操作性——可保持用户原来的使用习惯异种机之间的互操作4、教学难点多用户多进程——同步/互斥、数据一致性、访问安全性开放性——硬件依赖性、结构伸缩性、广泛适应性二、教学目的1、了解主流操作系统的发展方向低端操作

系统VS高端操作系统2、掌握UNIX类操作系统的内部结构和主要算法文件、文件系统、进程、时钟、输入输出3、学习大型程序设计的方法和理念系统结构、功能流程、数据安全、思维模式4、奠定系统开发和应用开发的基础功能选

择、层次划分、应用系统模式的确定三、教材《UNIX操作系统设计》(TheDesignoftheUNIXOperatingSystem)(美)MauriceJ.Bach著陈葆珏王旭柳纯录冯雪山译机械工业出版社2005年10月出版四、考核说明本课程为

“考查”,请以选“考试”的同学进行更正。成绩构成:平时成绩+期末报告第一章系统概貌•1.1发展状况1、发展历史及版本v.01970年KenThompson和DennisRitchiePDP-7汇编语言UNICSv.11971年PDP-11汇编语言UNIX

v.21972年增加管道功能v.51973年DennisRitchieBlanguage----Clanguage重写UNIX第一个高级语言OSv.61975年对外发表UNIX大学和科研单位应用v.71978年第一个商业版本我国开始深入研究应用的最早版本SystemIII1981年完全转向为社会提

供的商品软件SystemV1983年系统功能稳定完善公布号:1.0、2.0、2.3、3.5、4.0、4.2、4.3现在最后版本为SystemVRelease4(SVR4)2、主要分支和兼容版本➢BSD加州大学伯克利分校➢

XENIX/OpenServerMicrosoft、SCO公司➢HP-UXHP公司➢AIXIBM➢SolarisSUN公司➢IRIXSGI公司➢UltrixDEC公司➢Linux开放源代码3、基本功能特征①交互式分时多用户•人机间实时交互数据•多个用户可同时使用

一台机器•每个用户可同时执行多个任务②软件复用•每个程序模块完成单一的功能•程序模块可按需任意组合•较高的系统和应用开发效率③可移植性强•数千行汇编码,数十万行C语言代码④配置灵活,适应性强•小内核,

参数灵活可调•核外应用系统,任意裁减•限制规则很少⑤界面方便高效•内部:系统调用丰富高效•外部:shell命令灵活方便可编程•应用:GUI清晰直观功能强大⑥安全机制完善•口令、权限、加密等措施完善•抗病毒结构•误操作的局限和自动恢复功能⑦多国语言支持•支持全世

界现有的几十种主要语言⑧网络和资源共享•内部:多进程结构易于资源共享•外部:支持多种网络协议说明:1、其它操作系统可能包含部分上述UNIX的特征,但非全部(如NT就有部分多用户系统特征)2、这些特征有些是核心直接实现的,有些是由核心提供实现

这种特征的方便性和可能性,而由使用者来实现的。•1.2系统结构硬件内核kernelshwhodatewcvigrepdatea.outlsapp_1app_2app_nUNIX操作系统的整体结构系统调用(systemcall)以函数

形式提供给核外的命令和上层应用系统使用的一组程序,涵盖操作系统的所有功能。是应用程序请求操作系统服务的唯一通道。内核(kernel)系统调用的集合及实现系统调用的内部算法就形成操作系统核心•1.3用户看法进程和文件是UNIX操作系统中最基本的两个概念(抽象)进程

:所有处在运行期间的程序实例都是进程一个进程就是处在运行期间的一个程序实例涵盖所有的动态概念文件:所有静态的无形数据和有形硬件设备源程序、命令、图片、邮件、打印机、内存、磁盘等1.3.1文件系统/binusretchometmpdevwh

olsbinlibrcttysstteachtty0hd02adminhwconfliuwangchenaadir2saveUNIX文件系统树示例UNIX文件系统的特征:1、树状层次结构树根、树枝、树叶、路径2、对文件数据的一致对待文件为有序

无格式的字节流,逻辑意义由使用者解释3、文件管理建立、删除、修改、备份、移动、替换存储空间的分配和释放4、文件的访问和保护索引节点(inode)、文件描述符(fd)用户分组、权限划分5、设备文件管理统一各外部设备的访问模式char

buffer[2048];main(intargc,char*argv[]){intfdold,fdnew;if(argc!=3){printf(“need2argumentsforcopyprogram\n”);exit(1);}fdold=open(ar

gv[1],O_RDONLY);if(fdold==-1){printf(“cannotopenfile%s\n”,argv[1]);exit(1);}fdnew=creat(argv[2],0666);if(fdnew==-1){printf(

“cannotcreatefile%s\n”,argv[2]);exit(1);}copy(fdold,fdnew);exit(0);}copy(intold,intnew){intcount;while((co

unt=read(old,buffer,sizeof(buffer)))>0)write(new,buffer,count);}1.3.2处理环境程序:可执行的文件文件头包括:·文件的幻数(magicnumber)·编译器的版本号·机器类型·数

据段、正文段、工作变量的段大小·程序入口点文件头正文段数据段工作变量段BSS(符号表、重定位信息等)进程:程序的一次执行实例一个程序可同时有多个实例;系统中可同时有多个进程父进程:调用系统调用fork的进程子进程:由系统调用

fork产生的新进程执行程序:调用execl,用被执行程序的内容覆盖本进程地址空间abc执行abcxyz用xyz覆盖abc执行xyzxyz例子:执行可运行文件copy,其功能是拷贝文件,其运行格式为:copyoldfilenewfile另一个名为cpfile的程序具

体调用copy,其源程序如下:main(intargc,char*argv[]){if(fork()==0)execl(“copy”,argv[1],argv[2]],0);wait((int*)0);printf(“copydone\n”);}在用户环境下,程序的执行通

常由命令解释器shell来完成,标准的命令格式为:cmd[-options][arguments]shell可识别的命令类型有:1、简单命令catfile12、多条命令who;date;ps3、复合命令ps–e|grepstudent2(ls;catfile3;pw

d)>run_log4、后台命令ls–lR/home/teacher>tlist&1.3.3构件原语“软件复用”和“模块组装”理念程序内部:简单功能划分;纯代码设计程序外部:使用构件原语进行功能重叠和组装UNIX包含两种构件原语:①输入输出重定向②管道I/O重定向(I/

Oredirect):一个进程通常(default)打开三个文件:标准输入文件(fd=0)标准输出文件(fd=1)标准错误输出文件(fd=2)例如:grepabcgrepabc<file1grepabc<file1>file2grepabc<

file1>file22>file3管道(pipe):A进程将标准输出重新定向到管道中去;B进程将标准输入重新定向从管道中来。例如:ps-e|grepstudent3|wc-l查看当前系统中与用户stude

nt3相关的进程有多少A进程的输出B进程的输入•1.4操作系统服务UNIX操作系统提供五种主要的服务(也是UNIX核心的五个重要组成部分):1.进程管理建立、终止、挂起、通信等2.时钟管理分时共享cpu,时间片

,调度3.存储管理二级存贮器(内存和对换区),分配主存4.文件系统管理二级存贮结构。分配和收回存贮区和索引节点5.设备管理对I/O设备进行有控制的存取(多进程系统的特征)内核提供的服务的特点:服务是透明的①文件

类型透明:用户可不关心是普通文件还是外部设备,但O.S自己要关心文件类型!②文件系统的透明:文件系统类型、存放的物理位置。③存贮方式透明:文件的存放位置、存放方式、存放格式④各用户进程能得到核心相同服务:无论系统程序还是用户程序,平等对待,分时运行

•1.5硬件假设(假设机器硬件只支持的运行状态)UNIX系统上进程的执行分成两种状态:用户态、核心态用户态:进程正在执行用户代码时的状态核心态:进程正在执行系统代码(系统调用)时的状态用户态和核心态的区别:①用户态:进程只能存取自己的地址空间核心态:进程可存取核心和

用户地址空间②用户态:不能存取特权指令,只能存取自己的指令和数据核心态:除了能存取自己的指令和数据外,还可存取特权指令一个进程在运行时必须处在,而且只能处在或者核心态或者用户态下:核心态的进程不是与用户进程平行运行的孤立的进程集合,而是每个用户进程的一部分。“核心分配资源”:一个在核心状态下执行

的进程分配资源。一个进程某时在“用户态”下运行,另一时刻又在“核心态”下运行,在其生命周期内可能在这两种状态间切换多次用户态核心态012345timeA|B|C|D|A|核心——处在核心态下的进程的相

应部分的集合硬件是按核心态和用户态来执行操作的,但对这两种状态下正在执行程序的多个用户是相同对待的。readwriteopenA进程B进程C进程1.5.1中断与例外•中断(要保存上下文):来自进程之外的事件(外设、

时钟等)引起的,发生在两条指令执行之间,中断服务完毕后从下一条指令继续执行。(中断服务是由核心中特殊的函数,而不是特殊的进程来执行的)•例外(不保存上下文):来自进程内部的非期望事件(地址越界,除数为0等),发生在一条指令执行过程中,例外事件

处理完后重新执行该指令。1.5.2处理机执行级用一组特权指令给处理机设置一个执行级,以屏蔽同级和低级的中断,最大限度地减少其它事件的干扰,使当前任务顺利执行并尽快完成;但开放更高级的中断,以响应更紧迫的请求。中断事件中断级别硬件

故障高低时钟硬盘网络终端软件中断1.5.3存储管理UNIX系统中的存储管理原则(或特点):1.当前正在执行的进程(全部或部分)驻留在主存中;2.核心是永远驻留在主存中的(是永远活动的!);3.编译程序产生的指令地址是虚地址(逻辑地址);4.程序运行时核心与

硬件(存储管理部件MMU)一起建立虚地址到物理地址的映射。核心永远是活跃的普通进程具有特定的生命周期(除非人为设定为无限循环)readwriteopenclose...核心代码段A进程B进程openreadreadwrite映射映射只是

用户进程中的核心态下运行的代码段常驻内存,而非整个用户进程常驻内存。这些代码段是“可再入段”(或纯代码段、可共享代码段),被各用户进程段共享,为提高运行速度,避免频烦访问磁盘,故常驻内存,这些代码段的集合就是OS的内核。第二章核心导言•2.1UNIX操作系统的体系结构“文

件”和“进程”是UNIX系统的两个最基本实体和中心概念,UNIX系统的所有操作都是以这两者为基础的。整个系统核心由以下五个部分组成:①文件系统:文件管理和存储空间管理(节点和空间管理)②I/O设备管理:核心→缓冲→块设备(随机存取设备)核心→原始设备(raw设备,字符设备,

裸设备)③进程控制:进程的调度、同步和通讯④存贮管理:在主存与二级存储之间对程序进行搬迁⑤时钟管理:把cpu的时间分配给当前最高优先权的进程。硬件硬件控制字符设备块设备设备驱动程序高速缓冲文件子系统系统调用界面程序库进程控制子系统进程间通

讯调度程序存储管理用户程序用户级核心级核心级硬件级陷入•2.2系统概念2.2.1文件系统概貌1.索引节点(indexnode——inode)inode特征:•文件的内部名称(或代号),方便机器操作;•每个文件都有一个且只有一个inode与之对应;•inode存放文件的静态参数:存放地点

、所有者、文件类型、存取权限、文件大小等;•每个文件都可以有多个名字,但都映射到同一个inode上;•各inode之间以inode号相区别;2.链结(link)——对应命令名ln文件i节点abcxyz文

件名·一个文件可有多个名字,多个名字都对应同一个文件i节点,每个名字就是该文件节点的一个链结;.一个普通文件的名字个数,就是该文件的链结数;·每个链接名可以放在不同的目录下(同一个文件系统下);·删除一个链接名时,文件链接数减一。

如链接数不为零,则文件(节点)仍然存在。使用文件链结的目的:①方便用户的使用习惯,如“列目录”,可用ls、dir、list、lc等;②误删文件时可补救,又不多占空间。abc和xyz具有相同的i结点号;③减少移植应用程序时,因

使用指定位置的文件,而拷贝该文件到指定位置去的麻烦。3.符号链结(symbollink)——对应命令名ln-s文件i节点abcxyz文件名•给文件的名字再取一个名字,而不是给文件节点再取一个名字。•链接的是“符

号”而不是文件,因此“符号”可以是不存在的文件,即无意义的字符串。•abc和xyz具有不同的inode号,xyz的内容是它所指向的名字的字符串,大小是字符串长度为3字节。•“普通链结”中各名字必须在同一文件系统中,“符号链结”可在不同

的文件系统中。4.活动i节点表(索引节点表)——inode表在内存中存放当前要使用的文件inode的表(或称为活动i节点表),表中的每一个表项对应一个当前正被使用的文件的状态信息。这样要使用(打开)同一个文件的进程不必再到盘

上去寻找了,(共享!)5.用户打开文件表(或称用户文件描述符表)在系统中每一个进程都有一个描述该进程的数据结构user(类似于描述文件的i节点),在user中有一个数组,存放一组指针指向系统打开文件表中该进程打开的文件所对应的表项。structfil

e*u_ofile[NOFILE]NOFILE为每个进程最多可同时打开的文件数,这与系统中的进程数和内存大小以及交换区大小等有关系,一般为20~100。这个u_ofile数组就是该进程的用户打开文件表。6.系统打开文件表(file表)系

统打开文件表主要存放被打开文件的读写指针。因为一个进程在一个时间片内可能读写不完所需内容,需要在下一个时间片继续从上一个时间片结束时的读写位置开始读写,故在进程生存期间应保持一读写指针。此外file表中还存放被打开文件的动态信息:如文件

状态、引用计数(当前使用该文件的进程数)等。A进程B进程file表活动inode表用户打开文件表系统打开文件表活动i节点表为什么要单独设立一个file表来存放读写指针呢?由于可能有多个进程要共享一个被打开文件的inode,而每个进程的读写

指针都不相同,故不能放在inode表中。另一方面,要使不同进程的打开文件指针(文件描述符)或同一进程的不同打开文件指针能够共享一个打开文件指针(协同操作),就不能把读写指针放进某一个进程的用户打开文件表中。因此只能在

用户打开文件表和活动inode表之外再建立一个系统打开文件表(file表)来存放读写指针。UNIX操作系统中共享活动文件的方法:在内存中某个活动文件的副本只有一个,不同的进程采用不同的指针指向这文件的副本。由于任一时刻只有一个进程

在运行(微观上看),故该文件也只要求内存中有一个副本即可,只是各个进程有自己的读写指针而已。这是在UNIX系统中共享文件(包括用户文件和系统文件)的主要方法。对其它资源的共享采用的是与之相似的另外几种方法。

2.2.2进程相关概念:映像——程序以及与动态执行该程序有关的各种信息的集合(类似于历史档案)。它包括存储器映象、通用寄存器映像,地址映射空间、打开文件状态等。进程——对映像的执行。对映像的执行也就是

一个程序在虚拟机上动态执行的过程。1.可执行文件的构成:进程是可执行文件的一次执行实例,高级语言程序经过编译或汇编语言程序经过汇编后所产生的、缺省名为a.out的可执行文件的结构包括图示四个部分:文件头正文段数据标识段其它信息段文件头——·文件的幻数(magicnumber)·编译器的

版本号·机器类型·正文段、数据标识段、其它信息段的大小·程序入口点正文段——程序的功能代码数据标识段——标识未初始化的数据要占用的空间大小其它信息段——主要用于存放符号表2.程序的执行一个进程在执行系统调用exec时,把可执行文件装入本进程的三个区域中:正文区:对应可执行文件的

正文段数据区:对应可执行文件的数据标识段堆栈区:新建立的进程工作区堆栈主要用于传递参数,保护现场,存放返回地址以及为局部动态变量提供存储区。进程在核心态下运行时的工作区为核心栈,在用户态下运行时的工作区为用户栈。核心栈和用户栈不能交叉使用。堆栈使用举例。有如下程序,在主程序中调用

函数,并进行参数传递:main(intargc,char*argv[]){charbuf[1024];intnumber;…readfile(buf,number);…}readfile(charbuffer[],intline){char*pointe

r;inttemp;…}空栈栈顶指针栈底指针低地址高地址用户栈进入主程序时的堆栈状况栈顶指针栈底指针低地址高地址调用main()时argc,argv本程序返回地址栈底指针暂存处buf,number栈顶指针栈底指针低地址高地址调用readfile时a

rgc,argv本程序返回地址栈底指针暂存处buf,numberbuffer,linereadfile的返回地址栈底指针暂存处pointer,temp3.进程的标识进程由其进程标识号PID来识别。0#进程是由机器上电时“手工”创建的,调用fork创建了1#进程后,成为对换进程(swap)。

1#进程init进程,由它来创建系统初始化过程中所需的其它所有的进程。父进程调用fork系统调用的进程子进程由系统调用fork产生的进程除0#进程外,其它所有进程都是另一个进程调用fork后产生的。4.进程状态及状态转换①运行状态此时进程正在占用处理机,进程的全

部映像驻在内存中。②就绪状态此时进程基本具备了运行条件,正在等待使用处理机。③睡眠状态进程不具备运行条件,需等待某种事件的发生,无法继续执行下去。运行睡眠就绪唤醒中断5.在UNIX环境下,进程有如下特征:①每个进程

在核心进程表(proc数组)都占有一项,在其中保留相应的状态信息。②每个进程都有一个“每进程数据区(perprocessdataarea----ppda)”保留相应进程更多的信息和核心栈;③处理机的全部工作

就是在某个时候执行某个进程④一个进程可生成或消灭另一进程⑤一个进程中可申请并占有资源⑥一个进程只沿着一个特定的指令序列运行,不会跳转到另一个进程的指令序列中去,也不能访问别的进程的数据和堆栈。(抗病毒传播的重要原因之一)第三章数据缓冲区高速缓冲硬件缓存(cach

e)由一种高速寄存器(register)组成,主要解决CPU与RAM之间的速度差问题。数据缓冲区高速缓冲(buffer)由软件实现的解决文件系统和物理硬盘之间的数据同步的一种方法。数据缓冲区高速缓冲是UNIX特

有的对数据并发访问的一种控制机制。问题的提出:1、磁盘机械运行速度大大低于处理机的运行速度;2、多进程并发运行,少量的磁盘(通道)I/O成为瓶颈;3、数据访问的随机性,磁盘忙闲不均解决办法:1、建立一个被称为数据缓冲区高速缓

冲(简称高速缓冲)的内部数据缓冲区池(bufferpool)来存放要用的数据;2、写数据时把数据尽量多地尽量长时间地保存在缓冲池中延迟写出到磁盘上以备后续进程使用3、读数据时先在缓冲池中查找已有的数据如没有,再从磁盘读取,并保存在缓冲池中事先

预读数据到缓冲池中3.1缓冲区及缓冲区首部缓冲区池由若干个缓冲区组成,每一个缓冲区又由两部分组成:一个实际存放数据的存储区和一个标识该缓冲区的缓冲区首部。存储区因为缓冲区首部与数据存储区之间有一一对应的关系,所以通常把两者统称为缓冲区。缓冲区是缓冲区池中数据存储的基本单位。缓冲

区首部缓冲区首部的定义:structbuf{缓冲区标志标识缓冲区状态缓冲区链接指针向前向后串成链表空闲缓冲区链表指针联结空闲缓冲区设备号标识缓冲区块号union{缓冲区中的数据类型数据块超级块柱面块i节点块}b_u

n其它控制信息}3.2缓冲池的结构1、最近最少使用(LRU)算法:LeastRecentlyUsed①程序设计采用模块化和层次化结构,尽量避免使用goto语句,程序跳转少,适应“流水线(pipeline)”体系结构的系统;②特定时间段内,程序在

一个相对集中空间(代码段)内运行,涉及的数据(广义的:文件名、变量、指针和数组等)的个数相对较少;③当前使用过的数据,马上还要使用的可能性最大,较长时间未用过的数据,即将使用的可能性最小。2、缓冲池设计基本原则:①存放有刚使用过的数据尽量长时间

地保留在内存中,以便马上还要使用时能在内存中找到;②需要腾出内存空间时,把很久都未使用过(即最近最少使用)的数据交换到磁盘上去。这些数据马上还要使用的可能性最小。3、空闲缓冲区链表核心维护了一个空闲缓冲区链表,它按照最近被使用的先后次序排列。空闲链表是一个以空闲缓冲区链表头开始的“双向循

环链表”。链表的开始和结束都以链表头为标志。链表头空闲缓冲区1空闲缓冲区2空闲缓冲区3空闲缓冲区n4、空闲缓冲区链表操作①取用任意空闲缓冲区从空闲缓冲区链表的表头位置取下一个空闲缓冲区,后面的空闲缓冲区依次向前移动。②释放一个空闲缓冲区把这个装有数据的空闲缓冲区

附加到空闲链表的链尾。只有当该空闲缓冲区所装数据出错时才挂到链头。③取用装有指定内容的空闲缓冲区从链表头开始查找,找到后取下使用,用完后放到链尾。当系统不断从链头取用空闲缓冲区,又把使用过的(装有数据的)缓冲区挂到链尾,一个装有有效数据的缓冲区就会逐渐向链表头移动。在链表头位置的就是“

最近最少使用”的空闲缓冲区。5、空闲缓冲区分类系统中共设置了四个空闲缓冲区链表,根据缓冲区的不同用途而把它的放入不同的空闲缓冲区链表中。避免在取用空闲缓冲区时,逐个判断缓冲区中的内容。这四个空闲链表是:0#空闲缓冲区链表——存放文件系统超级块1#空闲缓冲区链表——存放通常使用的数据块2#空

闲缓冲区链表——存放延迟写、无效数据或错误内容3#空闲缓冲区链表——存放没有对应存储空间的缓冲区首部如果某种类型的空闲缓冲区不够用时,核心也从其它空闲缓冲区链表中取用空闲缓冲区。6、缓冲区设置当核心需有一个空闲缓冲区时,它根据要装入的

数据类型,从相应的空闲缓冲区链表的表头位置取下一个空闲缓冲区,装入一个磁盘数据块;根据该数据块所对应的设备号和块号数据对计算其hashno(散列、杂凑)值,根据其hashno的值放入到相应hash链表的链头。hashno=((diskno+blkno)/RND)%BUFHSZdisk

no:设备号blkno:块号BUFHSZ:最大hash值,通常为63。RND:随机数,其值为:RND=MAXBSIZE/DEV_BSIZEMAXBSIZE:最大文件系统块的大小DEV_BSIZE:物理设备块大小hashno的取

值范围:0~627、缓冲池的结构具有相同hashno的缓冲区链接在同一个hash链表中,因此系统中共有63个hash链表,分别链接hashno为0~62的缓冲区。每一个hash链表都是一个由链表头指向

的双向循环链表,查找某一个指定hashno值的缓冲区时,也是从相应的hash链表的表头位置开始向表尾方向进行查找。这63个hash链表就构成了数据缓冲区高速缓冲的缓冲池,所有的缓冲区都存放在缓冲池中的某一个链表中。链表头缓冲区1缓冲区

2缓冲区3缓冲区nhash链表的结构缓冲区缓冲区缓冲区缓冲区缓冲区缓冲区缓冲区缓冲区缓冲区空闲链表头Hash链表头hashno=0hashno=1hashno=62缓冲池的结构8、缓冲区的使用如果要找特定缓冲区,根据hashno从相应的hash链表的表头处开始逐个向后查找;如果找到

,则直接取用,并将其移动到hash链的链头;如果未找到,则从相应的空闲缓冲区链表的表头处取下一个空闲缓冲区,填入相应数据,重新计算其hashno,并放到新的hash链表的表头;释放缓冲区时,将该缓冲区仍保留在原hash队列中,同时挂接到空闲缓冲区链表的表尾。

(同时在两个队列中)申请缓冲区的两个途径:要指定缓冲区——在hash链表中查找要空闲缓冲区——在空闲链表中查找9、进一步说明一个缓冲区只有当它是空闲状态时,它才同时处在hash链表和空闲链表中。如果不空闲,则它只能处在某一个hash链表中。在空闲缓冲区链表中的缓冲区一定在某个hash链表中;在h

ash链表中的缓冲区不一定在空闲链中。不存在脱离hash链表的另一个空闲的缓冲区链表。缓冲池中的缓冲区个数是固定不变的,每个缓冲区在不同时刻存放着不同的磁盘数据块,具有不同的hash值,因此处在不同的hash链表中。缓冲区中的数据与某个磁盘数据块一一对应,这种

对应有两个特点:①一个磁盘数据块在缓冲池中最多只能有一个副本;②缓冲区与数据块的对应是动态的,LRU数据块将被释放。3.3缓冲区的检索算法在UNIX文件系统中的下层,即直接与逻辑存储设备联系的部分,包含如下基本算法:getblk申请一个缓冲区brelse释放一个缓冲区bread读一个磁盘

块breada读一个磁盘块,预读另一个磁盘块bwrite写磁盘块1、申请一个缓冲区算法getblk根据缓冲池的结构,核心申请一个缓冲区分配个磁盘块时,可能出现的五种典型状况:①该块已在hash队列中,并且缓冲区是空闲的;②hash队列中找不到该块

,需从空闲链表中分配一个缓冲区;③hash队列中找不到该块,在从空闲链表中分配一个缓冲区时,发现该空闲缓冲区标记有“延迟写”,核心必须写出缓冲区内容到磁盘上,再重新分配一个空闲缓冲区;④hash队列中找不到该块,并且空闲链表已空;⑤该块已在hash队列中,但该缓

冲区目前状态为“忙”。2、释放一个缓冲区算法brelse➢唤醒等待缓冲区的所有进程➢提高处理机的执行级别以封锁同级或低级的中断➢将该缓冲区放到空闲队列的尾部(缓冲区有效)或头部(缓冲区无效)➢降低处理机的执行级别以开放中断3、读一个

磁盘块bread➢由getblk算法申请一个可用的缓冲区➢如果缓冲区中的内容有效,则直接返回该缓冲区➢如果缓冲区中的内容无效,则启动磁盘去读所需的数据块➢等待磁盘操作完成后返回算法bread输入:文件系统号输出:含有数据的缓

冲区{得到该块的缓冲区(算法getblk);if(缓冲区数据有效)return(缓冲区);启动磁盘读;sleep(等待“读盘完成”事件);return(缓冲区);}4、读一个磁盘块并预读另一个磁盘块breada预读的前提:程序是在一个有限的空间内运行,程序对数据的访问是可预见的。预读

的命中率:不一定达到100%,但良好的系统结构和算法可使命中率达到较高的水平。预读的结果:放在缓冲池内,以免需要的时候再去启动磁盘读数据块。算法breada输入:(1)立即读的文件系统块号(2)异步读的文件系统块号输出:含有立即读的数据的缓冲区{if(第一块不在高速缓冲中){为第一块获得缓

冲区(getblk);if(缓冲区内容无效)启动磁盘读;}if(第二块不在高速缓冲中){为第二块获得缓冲区(getblk);if(缓冲区数据有效)释放缓冲区(brelse);else启动磁盘读;}if(第一块本来就在高速缓冲中){读第一块(bread);retu

rn(缓冲区);}sleep(第一个缓冲区包含有效数据的事件);return(缓冲区);}5、写磁盘块bwrite启动磁盘驱动程序的写操作如果是“同步写”,则本进程睡眠等待磁盘写操作的完成,磁盘写操作完成后,中断唤醒本进程,本进程释

放该缓冲区并返回;如果是“异步写”,则无需等待磁盘写操作的完成,将缓冲区放到空闲链表的表头,以便随后某个进程申请空闲缓冲区时,将其写到磁盘上去。本进程不再关心该缓冲区实际被写出的时间和结果,而直接返回去作其

它事情。事实上无论是同步写还是异步写,其根本区别在于本进程是否等待磁盘驱动程序完成操作后所发出的中断信号。算法bwrite输入:缓冲区输出:无{启动磁盘读;if(I/O同步){sleep(等待“I/O完成”事件);释放缓冲区(br

else);}elseif(缓冲区标记着延迟写)为缓冲区做标记以放到空闲缓冲区链表头部;}3.3数据缓冲区高速缓冲的优缺点优点:✓提供了对磁盘块的统一的存取方法✓消除了用户对用户缓冲区中数据的特殊对齐需要✓减少了磁盘

访问的次数,提高了系统的整体I/O效率✓有助于保持文件系统的完整性缺点:✓数据未及时写盘而带来的风险✓额外的数据拷贝过程,大量数据传输时影响性能第四章文件和文件系统的内部结构现代UNIX的文件系统通常可由三大模块组成:①本地文件系统(UFS)——UserFileSystem

②网络文件系统(NFS)——NetworkFileSystem③虚拟文件系统(VFS)——VirtualFileSystem本地文件系统(UFS)是UNIX系统中的基本文件系统,它通常固定存放在本地机器的存贮设备上,任何一种结构形式的文件系统都必然会直接或间接地与某个本地文件系统相

联系。本地文件系统的构成一个根文件系统+若干子文件系统所组成根文件系统存放本操作系统的最主要和最基本的部分可独立启动运行系统起动后,根文件系统就不能卸下来子文件系统主要存放应用程序和用户文件一般不能独立启动系

统运行过程中可随时安装和卸下网络文件系统(NFS)是本地机器上的文件系统和远地机器上的文件系统之间的介质,它管理和控制所有有关对远地文件的各种操作,给本地用户提供一个访问远地文件的使用方便的高层接口,避免用户直接涉及网络通讯方面的具体细节。虚拟文件系统(VFS)VFS是整个操作系统的

用户界面,它给用户提供一个统一的文件系统使用接口,避免用户涉及各个子文件系统的特征部分。用户感觉使用的是一个整体的,比本地机器上实际硬盘空间大得多的文件系统。虚构文件系统接受来自用户的操作请求,根据该操作所访问的文件是存放在本地机器上,还是存放在远地机器上而分

别把操作交给本地文件系统或网络文件系统;本地文件系统或网络文件系统(实际上再传给远地机器上的本地文件系统)进行相应的操作后,将结果返回到虚拟文件系统中再传回给用户。网络虚拟文件系统VFS网络文件系统NFS本地文件系统UFS物理存储介质虚拟文件系统VFS网络文件系统NFS本地文

件系统UFS物理存储介质用户用户A机器B机器基于虚拟文件系统的体系结构4.1文件系统结构4.1.1本地文件系统1.文件的存贮结构UNIX的普通文件的逻辑结构是无格式的有序字节流,而它们的物理存贮结构是以索引方式来组织

的。每个文件都是由一个索引节点i节点来表示的,每个i节点由其i节点号来标识。i节点通常以静态的形式存放在磁盘的i节点表中。每个磁盘i节点表项是由数据结构icommon定义的,描述对应文件的静态参数。超

级块磁盘i节点表数据存储区磁盘icommon表icommonicommonicommonicommonicommon➢文件所有者标识(UID)➢用户组标识(GID)➢文件类型(FIFO、DIR、CHR

、BLK、REG、LNK等)➢文件保护模式(存取许可权)mode➢文件存取时间(atime,mtime,ctime)➢链接数目link➢文件大小size➢文件数据块索引表indextableicommon与inode的关系进程要读

写一个文件时,先在内存的活动i节点表(即inode表)中申请一个空闲的活动i节点,并把磁盘上i节点(icommon)中的各项参数读入其中,当核心操作完成后,如果必要,就把在内存中的活动i节点写回到磁盘上去。内存活

动i节点由数据结构inode来定义,它除了包含磁盘上对应的icommon中的各项参数外,还包含有其它的参数,如该活动i节点的状态、文件所在的逻辑设备号、i节点号、活动i节点链接指针,最近使用的i节点在目录中的位置等动态信息。structinode{活动i节点链接指针状态标

志设备号i节点号最近访问的i节点在目录中的位置空闲i节点链接指针structincommon{文件模式和类型(FIFO、DIR、CHR、BLK、REG、LNK等)文件链接数文件所有者标识数(UID)文

件所属用户组标识数(GID)文件大小文件最近存取时间(atime,mtime,ctime)数据块索引表其它信息}}2、数据块索引表数据块索引表用于检索本文件占用的数据块。它包含12项直接索引表目和3项间接索引表目

。根据要读写的数据在文件中的位置可计算出该数据所在的逻辑块号,查索引表就可找到逻辑块所在的文件系统块号。系统根据计算出来的逻辑块号判断是否包含在直接索引表中,如果是,则取出直接索引表中的文件系统块号;如不是,则看是否包含在一次间接索引块中,否

则再寻找二次和三次间接索引块。最长要存取三次间址索引块才能找到相应数据的文件系统块号(要取出数据则要读4次磁盘)。直接0直接1直接2直接11一次间址二次间址三次间址数据块索引表一级间址块二级间址块三级间址块数据块3、inode表的结构在内存中

,活动i节点表类似于数据缓冲区高速缓冲中的缓冲池结构。活动i节点表中的每一项就是一个活动i节点缓冲区,用来存放一个被打开文件的inode。(以下把活动i节点缓冲区简称为“活动i节点”)。空闲的活动i节点相互链接在一起构成“空闲活动i节点链表”,这是一个双

向(非循环)链表,分别由链头指针和链尾指针指向空闲活动i节点链表的开始和结束。如下图所示:链表头空闲i节点1空闲i节点2空闲i节点3空闲i节点n空闲活动i节点链表为双向(非循环)链表,分别由链表头指针和链表尾指

针指向空闲链表的首尾。NULL链表尾活动i节点hash链表当某个文件(即某个磁盘i节点)被打开时,根据该i节点所对应的设备号和i节点号计算其hash值:hn=(devno+inumber)%64可得到0~63共64个

hash值。具有相同hash值的活动i节点链接在同一个hash链表中,这样内存中就有64个hash链表,每个hash链表都是由hash链头开始的双向链表(与数据缓冲区链表不同的是此处的空闲和非空闲链表都是非循环的)。内

存活动i节点表就是由这64个hash链表组成。如下图所示:inodeinodeinodeinodeinodeinodeinodeinodeinode空闲链表头Hash链表头hn=0hn=1hn=63NULL空闲链表尾活动inod

e表的结构4、文件系统的存储结构在UNIX系统中,一个物理磁盘通常被划分成一个或多个逻辑文件系统(简称文件系统或子文件系统),每个逻辑文件系统都被当作一个由逻辑设备号标识的逻辑设备。UNIX的普通文件和目录文件就保存在这样的文件系统中。逻辑文件系统的存

储结构可分为两类型:一级存储结构型:常用于运行环境较小的文件系统中二级存储结构型:常用于运行环境较大(特别是硬盘空间较大)的文件系统中①、一级存储结构型这种类型的逻辑文件系统由超级块、索引节点表块和数据区组成,(如果是根文件系统,就还包括引导块)。整个存储结构是一维的。引

导块超级块i节点表块数据区引导块:boot程序超级块:fs结构,存放文件系统的静态参数i节点表块:磁盘icommon表数据区:各数据块②、两级存储结构型这种存储结构的文件系统由两级组成:第一级由超级块和若干个柱面组块(cylindergroupblock)所组成(

如果是根文件系统则还包括引导块)。第二级(即柱面组块)又是由超级块拷贝块、柱面组信息块,i节点表块和数据区所组成。文件系统的存储结构是二维的。目前大多数在大存储环境下运行的UNIX版本都采用这种存贮结构,其优点是能快速

定位数据块。第一级存储结构引导块超级块1号柱面组块2号柱面组块……n号柱面组块第二级存储结构超级块拷贝块柱面组信息块i节点表块数据区超级块是由fs定义的数据结构,用于存放文件系统的静态参数:structfs{内存

超级块链接指针超级块的磁盘地址柱面组块的位移量最近修改时间文件系统大小文件系统块大小柱面组数柱面组大小片大小文件系统标识数文件系统标志区最近访问的柱面组号确定分配算法的参数}超级块拷贝块:在每个柱面组块中存放有一个超级块拷贝块,其目的是使系统在超级块被意

外破坏时,能从任何一个柱面组中进行恢复而不致使整个文件系统陷入瘫痪。每个柱面组中的超级块拷贝块的存放位置为安全起见不一定都装在柱面组中的最前面,而是可浮动地装在该柱面组中的任何位置。一般性的方法是:如果第n号柱面组中的超级块拷贝块开始于该柱面

组中的第i磁道,则第n+1柱面组中的超级块拷贝块开始于该柱面组中的第i+1磁道。文件系统一旦建立后,它们的位置就是固定不变的。柱面组信息块(cg块)柱面组信息块中存放的是有关该柱面组的静态参数,它由数据结构cg来定义:structcg{内存中柱面组块的链接指针本柱面组块中i节

点表大小本柱面组块中数据区大小最近一次所用块的位置最近一次所用片的位置最近一次所用i节点的位置本柱面组空闲数据块总数i节点位示图空闲块位示图}位示图:位示图为一张表,其中的每一个二进制位(bit)的值来表示某一个资源(例如数据块或i节点)的状态,这样每检测一个字节的值就可

以知道八个资源的状态;每检测一个四字节的整数的值就可以知道32个资源的状态。系统只需要维护一张较小的表(位示图)就可以快速地检测指定资源的忙闲状态,或快速查找可用的空闲资源。5、文件系统的数据块在文件系统中,按存储单位来划分

,由大到小可有下列层次:文件系统(filesystem)柱面组(cylindergroup)柱面(cylinder)磁道(track)扇区(sector)DEV_BSIZE512字节文件系统的逻辑块大小:DEV_BSIZE*2ⁿ即1k、2k、4k、8k、16k…

目的:提高传输速度,减少overhead文件系统的逻辑片大小:DEV_BSIZE*2ⁿ即1k、2k、4k、8k、16k…目的:减少文件尾的碎片浪费。6.目录和目录项在UNIX文件系统中,目录的组织形式采

用的是树形结构,一个逻辑文件系统就是一棵目录树。目录也被当作文件进行处理,一个目录文件的结构为表状结构,其中通常包含有若干表项,称为目录项,这些目录项既可以是普通文件的入口,也可以是子目录的入口。每一个目录项中通常包含两部分内容:文件的i节点号文件名目录/h

ome/student/xiaolan的路径和目录结构2。2。。153home0tst85bin85。2。。153。2。。290log376student376。153。。584xiaolan584。376。

。409bckup230src409。584。。//home/bin/home/log/home/student/home/student/xiaolan/home/student/xiaolan/src/home.student/xiaolan/bckup每个目录项由数据结构direct来定义

:#defineMAXNAMLEN14structdirect{shortd_ino;/*目录项i节点号*/chard_name[MAXNAMELEN];/*目录项名字字符串*/}每个目录项的长度通常是确定的,为16个字节,其中前两

个字节存放文件的i节点号d_ino,后面14个字节存放文件名d_name。这种定长目录项在算法实现方面比较简单,在使用灵活方面都有所不便,并且可能因许多目录项名字长度不足14字符面有空间浪费。在UNIX的每个文件系统中,有三个i节点号是有固定用途的:0号i节点:表示空目

录项,当某个目录项被删除时,该目录项的i节点号被置为0。1号i节点:表示坏块文件,所有的磁盘坏块都划归到该节点上;2号i节点:固定表示该逻辑文件系统的根(root)目录;3号i节点:表示该文件系统中的lost+found目录。7、变长目录项的目录结构#defineMAXNA

MLEN255structdirect{longd_ino;/*目录项i节点号*/shortd_reclen;/*目录项入口长度(占用长度)*/shortd_namelen;/*目录项名字长度*/chard_name[MAXNAMLEN+1]/*名字字符串

,+1为串结束符\0*/}由于目录中各目录项的长度是变化的,因此必须在目录项中标明本目录项的长度。前一个目录项释放时,把该目录项的空间全部合并到前一个目录项中,形成前面一个目录项占用空间大于实际使用的空间。在增加新目

录时,先查看目录中各目录项是否占用多余空间,如有,则进行压缩,把释放的空间分配给新目录项。变长目录结构增加了算法复杂性和工作量,通常用在硬件性能较高的大型系统中。8、文件名和文件名缓冲区核心在内存中建立了一个高速的名字缓冲区,用来存放最近使用过的文件名,核心认为“最近使用过的文件名

马上还要使用的可能性最大”。名字缓冲区是由ncache定义的数据结构,只包含文件名和索引节点指针等重要信息:structncache{hash链表指针LRU链表指针文件i节点指针/*这里只需要节点指针,因内存中已有活动i节点表*/文件父目录节点指针文件名确认信息}链表头

名字缓冲区1名字缓冲区2名字缓冲区3名字缓冲区n名字缓冲区(ncache)链表为定长双向循环链表为提高查找文件名的速度,还根据每个ncache的hash值,将其挂接到一个hash链表中。ncache的hash值用下列公式计算:hn=7&(*namep+*(namep-1+slen)+

slen+(int)VP)namep:为指向名字字符串的指针slen:为名字长度VP:为父目录节点指针计算出相应的hash值(0~7)。共建立8个hash链,每个hash链是一个以链表头开始的双向循环链表,每个ncache任何时候都同时既在

hash链上,又在LRU链上。ncachencachencachencachencachencachencachencachencacheLRU链表头Hash链表头hn=0hn=1hn=7名字缓冲区(ncache)池结构9、资源保护UNIX文件系统中的资源保护系统主要是对系统

中的两类资源进行保护:①静态硬资源包括存贮空间和索引节点,对这类资源的保护主要是通过quota系统提供的限量机制实现的。②动态资源主要是指临界区资源或独享资源,对这类资源的保护主要是通过上锁机制来实现的。1)quota系统quota系统

的主要功能就是检测和限制用户对文件系统资源的使用。在每个逻辑文件系统(包括根文件系统和各子文件系统)中都可以建立一个磁盘quota文件来限制用户对本文件系统资源的使用。每个quota文件是由多个dqblk数据结构

所组成的表格,每个dqblk都针对一个用户,用于存放该文件系统对该用户的限制参数。如果一个用户的使用空间包含多个文件系统,则需在每个文件系统的硬盘quota文件中给该用户分配一个dqblk项。structdqblk{盘块数硬限制盘块数软限制已用盘块数

节点数硬限制节点数软限制已用节点数盘块数时间限制节点数时间限制}系统在运行时,在内存中建立了一个活动dqblk链表(类似于活动i节点表),每个活动dqblk由其hash值而分别处在64链中的某个链表上,如果某个活动dqblk是空闲的,它同时

又处在空闲活动dqblk链表中(与活动i节点表的结构完全一样)。quota限量系统构成quota资源限量系统对盘块数限制对节点数限制软限制(选择限制)硬限制(绝对限制)软限制(选择限制)硬限制(绝对限制)无时间限制有时间限制无时

间限制有时间限制2)上锁机构为保持数据的一致性,能正常使用临界区资源,UNIX文件系统提供了一种对数据(文件或记录)的上锁机制,即劝告锁(advisorylock),用户既可给整个文件上锁,也可给部分记录上锁。劝告锁包含两种类

型:共享锁(读操作锁)互斥锁(写操作锁)在同一个文件或同一个记录上同时只能有一个互斥锁(或写操作锁),但可以同时有多个共享锁(读操作锁)。共享锁的级别低于互斥锁,互斥锁可以覆盖共享锁。对一个文件上锁只是一种“自觉性”的保护措施——“

劝告锁”,进程在读写该文件之前都必须先检查该文件是否已上锁,然后再进行相应的锁操作后才能对该文件进行读写。否则将使该文件上原有的所有劝告锁失效。4.1.2虚拟文件系统1.文件结点在本地文件系统中,每个文件都由一个索引节点inode来代表,对一个文件名的操作都被转换成对该文件的ino

de进行相应的操作。类似地,在虚拟文件系统中,每个文件都是由节点vnode来代表,对文件名的操作都被转换成对该文件的vnode进行相应的操作。v节点中包含了它所代表的活动文件的有关信息,如文件状态、上锁情况、引用计数

、文件类型等,它由数据结构vnode来定义:structvnode{节点状态标志/*是否为所在OS的根,是否上锁,有否等待上锁进程,是否已被修改*/访问计数值/*多少进程在共享该节点*/上锁情况/*上了多少共享锁,互斥锁**/该v节点操作指针/*指向操作函数组

*/节点类型/*VREG,VDIR,VBLK,VCHR,VLNK,VFIFO*/设备号/*所在设备*/}VFS接受用户的操作请求,把用户对文件名的操作转换成对相应的v节点操作,如果该文件实体在本地机器上,则虚拟文件系统把v节点转换成本地文件系统中对应的i节点,并把用户操作转给本地文件系统去完成;

如果文件实体在远地机器上,虚拟文件系统把操作转给网络文件系统,由网络文件系统起动网络驱动程序,执行对网络上其它机器上某个文件的操作。事实上对远地文件的操作最终落实到远地机器的本地文件系统(对它的i节点的)操作上。v节点与i节点有许多相似之处,都是对文件的属性进行描述,但又有较大的差异

。两者的关系是:①i节点是v节点的基础。任何v节点都直接或间接地与某个i节点相联系,而不论该i节点代表的文件实体存放在本地机器上还是存放在远地机器上。②v节点是i节点的高层节点。它是活动i节点在虚拟文件系统中的代表。两者的区别:①v节点

是一个动态的概念。在系统中只有当前活动的文件(即正被使用的文件)才有对应的v节点;而磁盘上某个当前未被使用的文件仍然有磁盘i节点与之对应。②v节点在磁盘上没有对应的数据区,当某个v节点所代表的文件使用完毕被关闭时,该v节点也随之完全消失;而不像i节点被释放时,要把被修改过的信息拷

贝到磁盘上。2.子文件系统一个虚拟文件系统通常可由多个子文件系统组成,这些子文件系统既可能是本地的,也可能是远地的。当这些子文件系统被安装到虚拟文件系统中时,为了方便地识别和找到它们,给它们各建立了一个控制块vfs作为代表,

(类似于文件在虚拟文件系统中用vnode作代表)。vfs中包含的是该子文件系统的一些基本信息,它由数据结构vfs定义。structvfs{该子文件系统的操作指针安装点的v节点状态标志/*只读、上锁、有等待上锁进程等*/基本文

件系统块大小文件系统标识数/*指明是本地还是远地的文件系统*/安装表项指针}各个vfs链接成一个单向链表:VFS链NULLrootvfsvfsvfsvfs子文件系统被安装时,在系统安装表中给该子文件系统建立了一个安装表项,使得每个子文件系统的vfs都与一个安装表项一一对应,每个安装表项由

数据结构mount定义:structmount{该文件系统的vfs指针设备号超级块缓冲区指针各项quota值该文件系统根节点指针安装点节点指针}要对某个子文件系统进行操作,能够方便地由vfs链表找到该子文件系统的超级块:由vfs→mount→buffer→超级块(fs)3、虚拟文件系统的

实现通常用户与虚拟文件系统之间的交互界面是32个基本的系统调用,其中26个系统调用是实现对虚拟文件系统中的各个文件进行建立,删除、打开、关闭、查询、链接、修改、换名等操作。用户通过文件名对文件的操作在虚拟文件系统中都

被转换为相应的vnode的操作。在虚拟文件系统中的任何一个文件,无论它是属于本地文件系统还是属于远地文件系统,其vnode都具有完全相同的形式。但是如果两个文件分别存放在不同的机器上,则在某一台机器上即使是对它们进行同一类型的操作(如读文件),也显然会是执行两个完全不同的程序(一个是起

动本地磁盘,而另一个则是设置网络准备进行通讯)。在虚拟文件系统中,给每个vnode都设置了一个操作指针,指向由26个功能函数(完成某一特定任务的函数)指针所组成的操作函数组,这26个指针分别指向对vnode进行各种基本操作的函数,如建立、删除、打开、关

闭、查询、修改、链接、读写等。操作函数组由vnodeops定义:structvnodeops{int(*vn_open)();打开文件int(*vn_close)();关闭文件int(*vn_rdwr)();读写文件int(*vn_ioctl

)();输入输出控制int(*vn_select)();同步操作int(*vn_getattr)();读取属性参数int(*vn_setattr)();设置属性参数int(*vn_access)();检查访问权限int(*vn_lookup)();根据文件名寻找V节点int(*v

n_create)();建立文件int(*vn_remove)();删除文件int(*vn_link)();链接文件int(*vn_rename)();文件更名int(*vn_mkdir)();创建目录int(*vn_rmdir)();删

除目录int(*vn_readdir)();读取目录int(*vn_symlink)();符号链接int(*vn_readlink)();读取符号链接文件名int(*vn_fsync)();内存信息复制到磁盘int(*vn_inactive)();释放V节点对应的i节点int(*

vn_bmap)();逻辑块到物理块的映射int(*vn_strategy)();启动设备int(*vn_bread)();读入数据块int(*vn_brelse)();释放数据缓冲区int(*vn_lockctl)();上锁控制int(*vn_fid)

();建立文件标识结构}以上在vnodeops定义的操作,是UNIX中对文件的最基本操作,对文件的其它任何操作都是通过对这些基本操作的组合来实现的。如果根据虚拟文件系统中文件种类的不同,而分别设置这26个功能函数指针,使这些指针指向完成特定功能的函数,从而形成不同类别的操作函数组,就可适合对不

同种类文件的打开、读写、链接、更名等基本操作。这就是虚拟文件系统的基本操作模式。在虚拟文件系统中定义了两个类型为vnodeops的操作函数组ufs_vnodeops和nfs_vnodeops。ufs_vnodeops:其中的26个功能函数指

针按vnodeops中的功能次序被初始化为指向本地文件系统中,执行对文件进行建立、删除、打开、关闭、修改、链接和读写等操作的函数名;nfs-vnodeops:其中的26个功能函数指针也按vnodeops中的功能次序被初始化为指向网络文件系统中,执行对远地文件进行建

立、删除、打开、关闭、修改、链接和读写等操作的函数名。在vnode被建立时,根据它所代表的文件是本地的还是远地的,而将vnode中的操作指针分别指向ufs_vnodeops或nfs_vnodeops。当

用户对文件名的操作被转换为对相应vnode的操作后,再将该操作转换为调用vnode中操作指针所指向的操作函数指针组中相应功能的函数,即可完成用户指定的适合于该vnode的操作。由于有这种执行流程的自动转换功能,因此无论对代表本地文件还是远地文件的vnode,都采用同一操作过程,从而实现整个文件系统

对用户的透明性,这使用户可以完全不必知道要操作文件的具体存放地址和对不同类型文件的操作差异。这就是虚拟文件系统基本原理。虚拟文件系统中对文件的操作流程用户按文件名执行系统调用文件名查找系统操作指针文件的vnodeufs_vnodeopsnfs_vnodeopss

pec_vnodeops本地文件操作函数远地文件操作函数设备文件操作函数在虚拟文件系统中,除了ufs_vnodeops和nfs_vnodeops以外,还初始化了另外三个vnode的操作函数组,即bdev_vnodeops、fifo_vnodeops和spec_

vnodeops,这三个操作函数组是分别为块设备类型、fifo类型和特殊设备类型文件的vnode准备的基本操作函数。核心对这些特殊文件的vnode进行操作时,也采用与普通文件的vnode相同的操作过程,从而增加了整个文件系统的模块化和规范化。UNIX的开放性也由此突出

地体现出来。要增加什么样的功能或文件类型(如DOS)只需增加一个相应的操作函数组(如DOS-vnodeops)和相应的操作函数即可。VFSUFS_vnodeopsNFS_vnodeopsDOS_vnodeopsMVS_vnodeops与

虚拟文件系统中文件的表示方式类似,每一个子文件系统被安装时,在内存中都由一个vfs结构来代表,核心对各子文件系统的操作都是首先通过对它们所对应的vfs结构进行操作来完成的。由于这些子文件系统既有本地的,也有远地的,对它们的具体操作必然不相同。采用与vnode类似方法,在每个v

fs结构中也设置一个操作指针,指向一个由vfsops定义的对文件系统进行操作的函数指针组,vfsops中共有六个功能函数指针,指向对文件子系统的安装、卸下、读取文件系统设计信息和刷新超级块缓冲区等操作的函数名。vfsops定义如下:structvfsops{int(*vfs_mount)

();安装文件系统int(*vfs_umount)();卸下文件系统int(*vfs_root)();找到根目录的vnodeint(*vfs_statfs)();读取文件系统统计信息int(*vfs_syn

c)();将内存缓冲区内容复制到外存int(*vfs_vget)();由文件标识数找到相应的vnode}在系统中初始化了两个这样的操作函数组,即ufs_vfsops和nfs_vfsops,分别适合对本地子文件系统和远地子文件系统的操作。在某个子文件系统被安装时,根据它是本地的还

是远地的,而将它的vfs结构中的操作指针指向ufs_vfsops或nfs_vfsops。这样在对某个子文件系统进行操作时,不论它是本地的还是远地的都执行同一操作过程,即调用操作函数组中相应指针所指的函数即可完成希望的操作。链接指针

链接指针链接指针rootvfsvfsvfs根文件系统子文件系统子文件系统操作指针超级块安装表项文件系统操作函数组v节点操作函数组bufmountvfsopsvnodevnodeops文件系统的安装节点NULL......虚

拟文件系统中主要数据结构之间的关系虚拟文件系统小结在虚拟文件系统中,无论是代表各种类型文件的vnode之间,还是代表不同地点的各子文件系统的vfs之间,操作过程都是统一的,只是在进行虚拟文件系统之下的功能操作时,才根据各自的操作指针自动转到不同的函数中去。这种方式使得整个文件系统结构统

一,模块性强,增加功能非常方便;对用户来说,整个文件系统的透明性好,使用简便,避免了用户在对不同类型的文件或不同地点的文件系统进行操作时,分别来设置参数和安排操作过程。4.2文件系统算法文件系统的低层算法是建立在缓冲区算法的基础之上的,主要包括以下几项:分配活动索引节点释放活动索引节点

逻辑位移量到文件系统块的映射把路径名转换为索引节点给新文件分配磁盘i节点释放磁盘i节点1、分配活动索引节点iget核心根据文件系统号和i节点号,在内存活动i节点表中申请一个空闲的活动i节点,再把磁盘上对应的i节点(icommon)拷贝到这个

空闲的活动i节点中。如果要找的i节点已经在内存的活动i节点表中,则增加该i节点的引用计数,并将其上锁返回;如果要找的i节点不在内存的活动i节点表中,则在空闲活动i节点表中申请一个活动i节点,将磁盘icommon读入其中,重新计算其hash值后

放到新的hash链表中。算法iget输入:文件系统索引节点号输出:上锁状态的索引节点{while(未完成){if(是索引节点高速缓冲中的索引节点){if(索引节点为上锁状态){sleep(索引节点变成开锁状态事件);con

tinue;}/*对安装节点进行特殊处理*/if(是空闲链表上的索引节点)从空闲链表上移去该节点;索引节点引用计数值加一;return(索引节点);}/*接下页*//*不是索引节点高速缓冲中的索引节点*/if(空闲链表上没有索引节点)return(错误);从空闲链表上移出一个新的索

引节点;重置文件系统号和索引节点号;从老的hash队列中撤掉索引节点,把索引节点放到新的hash队列中;从磁盘上读索引节点(bread);索引节点初始化(如访问计数值置为1);return(索引节点);}}2、释放活动索引节点iput当核心使用完一个文件要释放其i节点

时,首先将该索引节点的引用计数(referencecount)减一。如果引用计数不为零,则表明还有其它进程在使用该文件(节点),本进程直接返回。如果引用计数为零,则表明没有其它进程使用该索引节点了。此时

如果该节点的链接数为零,则表明要删除该文件,释放磁盘icommon和数据块;如果链接数不为零,则把修改过的icommon从inode中写回到磁盘上。最后再把该inode释放到空闲活动inode表中。算法iput输入:指向内存索引节点的指针输出:无{如果索引节点

未上锁,则将其上锁;将索引节点的引用计数值减一;if(引用计数值为0){if(索引节点的链接数为0){释放文件所占的磁盘块(free);将文件类型置为0;释放索引节点(ifree);}if(文件被存取或索引节点被改变或文件内容被改变)修改磁盘索引

节点;把该索引节点放到空闲链表中;}为索引节点解锁;}3、逻辑位移量到文件系统块的映射bmap进程用读写指针读写文件时,是以字节为单位来标识的;文件系统下层算法是以数据块来读写数据的,因此必须要把字符偏移量转换成块位移量。文件占用的数据块在icommon的数据块索引表中标识。由字节偏移量除以

块大小得到块偏移量,判断块偏移量在直接索引表中还是间接表中,如果在直接索引表中,则直接得到块号;如果在间接索引表中,则需先读入间接块,并计算在间接块中的下标,再得到数据块的块号。算法bmap输入:(1)索引节点号(2)字节偏移量输出:(1)文件系统中的块号(2)块中的字节偏移量(3)块中

的I/O字节数(4)提前读块号{由字节偏移量计算出在文件系统中的逻辑块号;为I/O计算出块中的起始字节;/*输出2*/计算出拷贝给用户的字节数;/*输出3*/检查是否可用提前读并标记索引节点;/*输出4*/决定间接级;/*接下页*/while(没有在必须的间接级上){从文件中的逻辑

块号计算索引节点中或间接块中的下标;从索引节点或间接块上得到磁盘块号;如果需要,应释放先前读的磁盘块缓冲区(brelse);if(再也没有间接级了)return(块号);读间接磁盘块(bread);按照间接级调节文件中的逻辑块号;}}4、把路径名转换为

索引节点namei用户对文件的操作通常是采用带路径的文件名的形式来进行。需要把带路径的文件名转换为文件的索引节点。在namei中,从第一个路径名分量开始,逐个路径名分量进行查找,在指定的目录中从头至尾在各目录

项中顺序匹配要查找的路径名分量。找到相应的目录项后,取出其中的i节点号,进入下一级目录查找再下一个分量,直到最后一个路径名分量。算法namei输入:路径名输出:上了锁的索引节点{if(路径名从根开始)工作索引节点=根索引节点(iget);else工作索引节点=当前目录索引节点(iget);

while(还有路径名){从输入读下一个路径名分量;验证工作索引节点确是目录,存取权限OK;if(工作索引节点为根且分量为“..”)continue;/*循环回到while*/通过重复使用算法bmap、bre

ad和brelse来读目录(工作索引节点);/*接下页*/if(分量与工作索引节点中的一个登记项匹配){得到匹配分量的索引节点号;释放工作索引节点(iput);工作索引节点=匹配分量的索引节点(iget);}else/*目录中无此分量*/return(无此索引节点)

;}return(工作索引节点);}5、给新文件分配磁盘i节点ialloc①、根据预分配的i节点号,实际分配一个i节点(icommon)。预分配的i节点是上一次分配的i节点后面的一个i节点(与预读数据块具有相似的原理)。②、如果分配不成功

,则采用下面的算法快速扫描一遍部分柱面组,寻找空闲i节点。具体算法是:从预分配i节点所在柱面组的下一个柱面组开始寻找,如果没有找到,就加上一个偏移量后到另外一个柱面组中去寻找;如果还不成功,又再加上一个偏移量

到另外一个柱面组中去寻找,如此进行下去。第n次位移的位移量为2n,单位为柱面组,终止条件是2n大于等于文件系统的最大柱面组数,即:Emax=log2(NCG)Emax取最大整数。如果第i次位移时当前柱面组号加上2n后大于最大柱面组号,则把第i次位移点取为当前柱面组

号加上2n后与最大柱面组号的差值。③、如果上述快速扫描完成后仍然没有找到空闲的i节点,则从预分配点所在柱面组后面的第二个柱面组开始,依次逐个地在各个柱面组中寻找空闲i节点。④、如果到达最大柱面组处时还未找到,就再从0号柱面组开始到预分配点所在柱面组为止寻找空闲i节点

。⑤、如果还未找到,表明该文件系统中已没有空闲的i节点可供分配了。0号柱面组123456789预分配处(1)(2)(3)预分配处:2号柱面组(1)开始(第0次位移):2+20=3(2)3+21=5(3)5+22=9(4

)9+23=17,17-9=8(5)8+24=24,24-9=13,13-9=4,但是24>9,故终止;再从4号柱面组开始向后顺序查找。如果到9号柱面组还未找到,则查找0号和1号柱面组。(4)说明:①、这种分配也适合分配磁盘块,实

际上ialloc和alloc合用同一个程序;②、本算法在一级存贮结构的文件系统中也适用,只是将上述的柱面组换成存放硬盘i节点表的各项盘块即可;③、具体在某一个柱面组中寻找空闲i节点时,是通过查看位示图来进行的

;④、这种算法使得各柱面组中的空闲i节点数分布比较均匀,因为起始点(即预分配的i节点所在的柱面组)是随机任意的(或相邻磁道)。6、释放磁盘i节点ifree当删除一个文件时,需要把该文件对应的icommon释放掉。核心首先释放该icommon中数据块索引表中标明

的数据块,修改超级块中的空闲数据块数,以及数据块位示图;再修改超级块中的空闲i节点数和i节点位示图。第五章文件系统的系统调用本章主要介绍针对上层用户使用的系统调用。用户通过使用本章介绍的系统调用来申请操作系统中有关文件和文件系统操作的各项功能。本章介绍的算法是基于第四章所介绍的底

层文件系统算法之上的,主要包括七大类操作:返回文件描述符类操作路径名转换类操作分配索引节点类操作文件属性类操作文件输入输出类操作文件系统装卸类操作文件系统目录树操作1、打开文件open2、读文件read3、写文件write4、调整文件读写指针lseek5、关闭文件close6、创

建文件creat7、改变目录chdir8、改变根目录chroot9、改变所有者和文件读写权限chownchmod10、查询文件的状态信息stat/fstat数据结构stat的定义:structstat{dev_tst_dev;文件所在的设备号ino_tst_ino;

文件的I节点号ushortst_mode;读写保护模式shortst_nlink;文件的链接数shortst_uid;用户标识shortst_gid;组标识dev_tst_rdev;文件的起始位置off_tst_s

ize;文件大小time_tst_atime;最近访问时间time_tst_mtime;最近修改时间time_tst_ctime;最近(状态)改变时间longst_blksize;文件块大小longst_

blocks;文件所用块数}实例:打印一个文件的I节点号、文件名和文件大小(类似于ls命令的功能):#include<stdio.h>#include<sys/types.h>#include<sys/stat

.h>main(intargc,char*argv[]){structstatmystat;stat(argv[1],&mystat);printf(“%d%s%d\n”,mystat.st_ino,*argv[1],mystat.st_si

ze);}11、建立无名管道pipepipe(fdptr)fdptr[0]读管道指针fdptr[1]写管道指针无名管道只能是建立管道的进程的子进程,才能共享无名管道。mknod("pipe_name",rw_mode)建立有名管

道使用有名管道的进程间可以没有任何父子关系。fdptr[1]fdptr[0]管道的结构和读写指针21011109834567读写指针移动方向读指针写指针管道读写的四种典型状况:1、写管道,管道中有空闲的存储空间满足写操作;2、读管道,管道中有足够的数据满足读操作;3

、读管道,管道中没有足够的数据满足读操作;4、写管道,管道中没有足够的空闲空间存放数据。12、复制用户文件描述符dupdup把一个文件描述符复制到本用户的打开文件表中从头的第一个可用的空表项中。新的表项(文件描述符)由dup返回。由于文件描述符被复制,因此两个文

件描述符指向同一个系统打开文件表项,即指向同一个文件读写指针,该读写指针的引用计数加一。dup的应用举例:标准输出重定向command>abc①、fd=open("abc","w")②、close(1)③、dup(fd)④、close(fd)⑤、command用户打

开文件表file表inode表012fd键盘屏幕abc...............13、安装文件系统mount只有超级用户可以安装和拆卸文件系统安装点目录通常为空目录安装点的引用计数只能为一在mount表中占用一个表项,保持了安装点和被安装文件系统根节点之间的对应

关系读入被安装文件系统的超级块,并保持指向超级块的指针例如:mount("/dev/dsk1","/usr",0)把逻辑设备(子文件系统)/dev/dsk1以可读可写的方式安装到目录/usr下面。把子文件系统/d

ev/dsk1安装到/usr目录下活动i节点表mount表mount执行后的相关数据结构进程在存取一个目录节点时,可能遇到该目录是一个安装点,这时就要从安装点所在文件系统跨越到被安装的子文件系统中,这种跨越是在检查到该目录节点上有“安装点”标志时进行。包含这

种跨越动作的常用系统调用包含:分配内存活动i节点算法iget新算法见图5.25把路径名转换为索引节点算法namei新算法见图5.2614、给已存在的文件创建新的目录项(名字)linklink(source,target)source和target只能在同一个文件系统

中只有超级用户能够链接目录,普通用户只能链接文件具体算法图5.2915、删除一个目录项unlinkunlink(pathname)把父目录中相应目录项的i节点号置为0文件的链接数减一,(如果链接数为0,则释放i节点和数据块)。具体算法图5.31文件系统管理fsckfsck命令通常由具有超级用户权

限的系统管理员执行,用于检测和修复文件系统的错误.运行时显示如下过程信息:**Phase1–CheckBlocksandSizes检查索引节点表中文件大小和所用块数**Phase2–CheckPathnames检查目

录和文件路径的正确性**Phase3–CheckConnectivity检查各目录之间的联结关系**Phase4–CheckReferenceCounts检查各文件的引用计数**Phase5–CheckFreeList检查文件系统的空闲

块表第六章进程结构1、进程的状态和状态的转换进程的基本状态可分为:运行态就绪态睡眠态进一步细分,又可分为九种状态:①、进程在用户态下执行;②、进程在核心态下执行;③、进程已经准备好运行,在内存中就绪;④、进程等待资源,在内存中睡眠;⑤、进程处于就绪状态,因内

存不足,被放在交换区上等待;⑥、进程睡眠等待资源,因内存不足,被换到交换区上等待;⑦、进程正从核心态返回用户态,但核心抢先于它做了上下文切换,以调度另外一个进程;⑧、进程处于刚被创建的状态,此时进程既没有处于就绪状态,也没有进入睡眠状态;⑨、进程执行了系统调用exit,处于僵死状态。此

时进程刚消亡,并向父进程发送退出状态信息和计时统计信息。进程在其生命周期中必然处在这九种状态之一,并且根据运行时间和条件的变化,在这九种状态之间进行转换,这种有方向规定的状态转换路径,就构成了进程的状态转换图——有向图

。2、进程的特征:①、每个进程在核心进程表(proc数组)都占有一项,在其中记录了进程的状态信息;②、每个进程都有一个“每进程数据区(perprocessdataarea——ppda)”,保留相应进程更多的信息和核心栈;③、处理机的全部工作就是在某个时候执行某个进程;④、一个进程可生

成或消灭另一进程;⑤、一个进程中可申请并占有资源;⑥、一个进程只能沿着一个特定的指令序列运行,不会跳转到另一个进程的指令序列中去,也不能访问别的进程的数据和堆栈。(抗病毒传播的重要原因之一)3、进程的解释在UNIX系统中进程的概念包含什么意义?在较高级的方面进程是一个重

要的组织概念。可以把计算机系统看作是若干进程组合的活动。进程是系统中活动的实体,它可以生成和消灭,申请和释放资源,可以相互合作和竞争,而真正活动的部件如处理机和外部设备则是看不见的。在较低级方面进程是不活动的实体,而处理机则是活动的,处理机的任务就是对进程进行操作,处理机

在各个进程映像之间转换。4、进程映像进程映像虽然包括很多方面,但关键问题是存储器映像。当一个进程暂时退出处理机时,它的处理机映像(也就是各个寄存器的值)就成为存贮器映像中的一部分。当该进程再次被调度使用处理机时,又从存储器映像中恢复处理机映像。一般说来,进程的结

构,即进程映像是指其存储器映像,由下列几部分组成:①进程控制块(PCB)②进程执行的程序,即共享正文段(TEXT)③进程执行时所需要使用的数据,即数据段(DATA)④进程执行时使用的工作区,即栈段1)、进程控制块PCBPCB包括两部分信息:一部分是不论进程当前是否在处理机上运行,系统都要查询

和修改的一些控制信息,它们构成一个数据结构proc(进程基本控制块)。所有进程的proc结构就构成了核心“进程表”——“进程表”中每一项都是一个存放某进程控制信息的proc结构。另一部分信息当进程不在处理机上运行时,系统不会对它们进行查询和处

理,这些信息构成另一个数据结构user,它是对proc的扩充,称为“进程扩充控制块user结构”。2)、共享正文段:进程执行的程序用可再入码编写并可使若干个进程共享执行的部分构成共享正文段(纯正文段,不可修改段),它包括再入的程序和常数。3)

、数据段:进程执行时用到的数据构成数据段。如果进程执行的某些程序为非共享程序,则它们也构成数据段的一部分。4)、栈段:进程在核心态下运行时的工作区为核心栈,在用户态下运行时的工作区为用户栈。在进行函数调用时,栈用于

传递参数,保护现场,存放返回地址以及为局部动态变量提供存储区。核心栈的结构和操作方式与用户栈相同,只是存放进程在核心态下调用函数时的有关信息。5、进程映像在存贮器中的分布:存放进程映像的地方有两个:①、内存②、磁盘交换区——内存的扩充部分进程的映像分为常驻内存部分和

非常驻内存部分常驻内存部分:进程基本控制块proc进程共享正文段的控制信息text非常驻内存部分:进程扩充控制块user进程在核心态下的工作区(核心栈)数据段进程在用户态下的工作区(用户栈)共享正文段处

理机正在执行本进程时:该进程映像全部(或所需部分)在内存中处理机执行其它进程时:该进程映像所占用的内存可能被分配给其它进程,如果是这样,则当前进程的映射要被调出到对换区中去,等到重新满足运行条件并获得处理机时,再次被调入内存运行。UNI

X系统中所采用的进程映像调入调出措施,可以大大提高内存的利用率,增加系统的吞吐量,以便同时为尽可能多的分时用户提供服务。在进程映像占用的内存被分配给其他进程之前,不但该进程的程序和数据需要调出内存,该进程的控制信息

也被调出内存。但为了该进程能够再次被调入内存,内存中需要保留一部分必要的信息,这就把进程控制信息也分成了常驻内存和非常驻内存两部分:常驻内存控制信息块是系统需要经常查询以及恢复整个进程映象时所不可缺少的信息。非常驻内存控制信息块可以随进程状态的变化而在内外存之间交换的进程控制信息中的其余部分。为

了方便进程映像在内外之间交换,UNIX系统中把进程非常驻内存部分作为一个整体,占用连续的存贮区,其顺序是:首先是user结构(进程扩充控制块)和核心栈,然后是数据段和用户栈。进程user结构和核心栈合并构成进程

的“本进程数据区——ppda区(perprocessdataarea)。ppda区以及用户数据段和用户栈,要调入内存则一起调入,要调出则一起调出。图示为进程映像的组织方式。............proc表(进程基本控制表)text表(共享正

文段控制表)用户栈用户数据段核心栈user内存正文段磁盘正文段ppda常住内存非常住内存6、进程上下文(context)一个进程的上下文包括五个方面:①、被进程正文所定义的进程状态②、进程所使用的全局变量和数据结构的值③、机器寄存器的值④、进程表项proc结构和user结构中的

值⑤、用户堆栈和核心堆栈中的值“执行一个进程”——指系统在该进程的上下文中执行,也就是进程的上下文确定和限制了进程的运行环境和空间。核心从一个进程转到另一个进程执行时,叫做“上下文切换”,也就是系统从

一个进程上下文确定的环境换到另一个进程上下文确定的环境中去执行。并且保留前一个进程的必要信息,能够在以后需要时又再切换回前一个进程,并恢复它的执行。相关说明:①、用户态和核心态之间的转换是执行状态的转换而不是上下文的切换。②、在遇到中断信号时,核心在当前进程的

上下文中对中断服务,而不论该中断是否是本进程引起的。系统在核心态下对中断进行服务,而不是产生或调度一个特殊进程来处理中断。被中断的进程无论是在用户态下执行还是在核心态下执行,核心都保留必要的信息以便处理中断完后能恢复本进程的执行。③、进

程映像和进程上下文的区别进程映像——主要是指进程的结构和内部组织形式进程上下文——构成进程映像的各部分的各种取值的集合7、进程状态及映像的对应关系①、运行状态此时进程正在占用处理机,进程的全部映像(或正在运行的部分)驻留在内存中,存储管理器(MMU)中装配的是本

进程映象的地址映射参数,系统变量U与本进程的user结构对应。处理机可能是在执行用户进程本身,也可能是在执行系统程序,前一种情况称为进程在用户态下运行,后一种情况称为进程在核心态下运行。在核心态下的进程虽然执行的是操作

系统内部的程序,但由于所用的系统栈和进程控制块仍然是本进程的,所以此时进程可能是在调用系统调用,或是在进行中断处理,信号处理等。②、就绪状态处于就绪状态下的进程基本具备了运行条件,正在等待使用处理机。这时进程的映像可能全部在内存,也可能只有需要运行的部分在内存。MMU装配的不是本进程映像的地址映

射参数,系统变量U也不与本进程的user结构对应。系统中通常有若干的不同优先级的就绪队列,每个就绪队列中有若干的就绪进程在排队等待运行。③、睡眠状态进程不具备运行条件,需等待某种事件的发生,无法继续执行下去。此时进程的映像根据内存的空闲程度,可能全部在内存中、可能部分在内存中、也可能全部都在

交换区上。在程序实现上,造成进程睡眠的唯一直接原因是调用了sleep()函数,调用sleep()的原因有多种:a、进程在运行过程中要使用某种资源,如缓冲区,但由于该资源已被占用,不能立即得到满足,不得不进入睡眠状态,等待其它进

程释放该资源。b、进程实施同步或互斥,如父进程对子进程进行跟踪时,子进程等待父进程发控制命令,或父进程等待子进程完成某一次操作等。c、等待输入/输出操作的完成d、进程完成某一项任务后,暂时停止自身的运行,等待新任务的来临,如0号进程或shell进程等。8、睡眠与唤醒

一般而言,一个进程除非自己调用了sleep函数,否则是在执行一个系统调用期间进入睡眠的(why?):该进程执行一个操作系统陷入(trap),进入核心,然后可能进入睡眠等待某个资源(或软资源或硬资源)。进

程在一个事件上睡眠是它们处于睡眠状态,直到该事件发生。当进程等待的事件发生时,等待该资源的进程就被唤醒并进入“就绪”状态,而不是直接进入“运行”状态。sleep函数运行时完成下面三项主要工作:①、将进程的状态标志设置为睡眠②、记录下睡眠原因③、修改进程优先级。这个优先级是进

程下次被唤醒时所具有的竞争处理机的能力,它因不同的睡眠原因而异,因为不同的事件要求响应的紧急程度是不同的。睡眠原因睡眠优先数进程对换PSWPinode操作PINOD块设备操作PRIBIOPRIUBAPIERO管道操作PPIPE虚拟文件操作PVFS等待操作P

WAIT上锁操作PLOCK资源等待PSLEP用户状态PUSER初始值NZERO系统中各种睡眠原因相应的优先权优先数小,优先级高优先数大,优先级低9、系统调用接口在为UNIX系统编写的C语言编译程序中,定义了一个与系统调用名字一一对应的函数库,使应用

程序能够执行系统调用。库函数中包含一条操作系统陷入(trap)指令,把程序的运行模式由用户态转变为核心态。每一个库函数在执行trap指令时,使用与机器有关的方式向核心传送一个操作系统陷入号,即系统调用号。C编译程序中的库函数是在用户态下运行的,当库函数执行t

rap指令时,产生一个中断信号,调用中断处理程序处理中断请求(进入核心态,执行系统调用),中断向量就是系统调用号。系统调用接口是中断处理程序的特例!

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?