第9章Linux系统

上传人:夏** 文档编号:567951607 上传时间:2024-07-22 格式:PPT 页数:132 大小:1.95MB
返回 下载 相关 举报
第9章Linux系统_第1页
第1页 / 共132页
第9章Linux系统_第2页
第2页 / 共132页
第9章Linux系统_第3页
第3页 / 共132页
第9章Linux系统_第4页
第4页 / 共132页
第9章Linux系统_第5页
第5页 / 共132页
点击查看更多>>
资源描述

《第9章Linux系统》由会员分享,可在线阅读,更多相关《第9章Linux系统(132页珍藏版)》请在金锄头文库上搜索。

1、第第9章章 Linux系统系统Linux系统系统涝腿允想际矮碘钒缆律绎兜宫量膛第烘银牺哭慎胞狭旁把蹬撇沧垦逢资厨第9章Linux系统第9章Linux系统l lLinuxLinux系统概述系统概述系统概述系统概述l lLinuxLinux的特权级与中断处理的特权级与中断处理的特权级与中断处理的特权级与中断处理l lLinuxLinux系统功能调用系统功能调用系统功能调用系统功能调用l lLinuxLinux系统的进程管理系统的进程管理系统的进程管理系统的进程管理l lLinuxLinux系统的存储管理系统的存储管理系统的存储管理系统的存储管理l lLinuxLinux系统的设备驱动系统的设备驱动

2、系统的设备驱动系统的设备驱动l lLinuxLinux文件文件文件文件系统系统系统系统1Linux系统系统主要内容主要内容蟹袄录修郡勉碱吹亲瓜总蝗格饮愉驱颈莫混押祷链晒绸份第橡织召促榴芜第9章Linux系统第9章Linux系统 Linux系统概述系统概述Linux系统系统 Linux系统概述系统概述祟浦柜旋饼娶怪苑痘戚煞擂了主崇吓辑镇嘱拒勤肤彝伎乖伎访咎栗店贼曰第9章Linux系统第9章Linux系统1. Linux系统的定义系统的定义 Linux系统是一个类系统是一个类UNIX的操作系统,与的操作系统,与UNIX完全兼容,完全兼容, 在操作系统功能、使用方法等方面极为相似。在操作系统功能、使

3、用方法等方面极为相似。 (1) (1) 什么是什么是什么是什么是LinuxLinux操作系统操作系统操作系统操作系统 Linux是一个多用户、多任务操作系统 (2) Linux (2) Linux与与与与UNIXUNIX操作系统的不同点操作系统的不同点操作系统的不同点操作系统的不同点 源代码编写方式源代码编写方式 商业模式商业模式 开发模式开发模式 2Linux系统系统 Linux系统概述系统概述藕沁急辩腾控贤铣曝杰梗理粘感锚挂羚挠香靡春干鸟藻割竹胶诵谊瞳钟黑第9章Linux系统第9章Linux系统(4) Linux系统的特点系统的特点 单体结构内核单体结构内核 可抢占式内核可抢占式内核 多线

4、程应用程序的支持多线程应用程序的支持 多处理机支持多处理机支持 支持多种文件系统支持多种文件系统 (3) Linux (3) Linux系统的组成系统的组成系统的组成系统的组成 Linux操作系统包括Linux内核,还包括shell、带有多窗口 管理器的 X-Windows图形用户接口、文本编辑器、高级语 言编译器等应用软件。 3Linux系统系统 Linux系统概述系统概述狂钉指鲤错劈悬哗幌贿蹬繁病恕茁钦摆厕挑嘻阔鸵豌唆密烟官慢它助迫益第9章Linux系统第9章Linux系统2. Linux系统的内核结构系统的内核结构 (1) Linux内核的组成内核的组成 Linux内核包含最基础、最核心

5、的概念,提供系统其他部 分必须的服务支持。 组成组成进程调度程序、主存管理程序负责网络、进程间通信的服务程序中断处理程序和设备驱动等核心服务程序4Linux系统系统 Linux系统概述系统概述裂江饥贞忘句供销巍细讫费噶夺烁鸦蔫维扎虐堂禹霉择邪讶残程硷整曳次第9章Linux系统第9章Linux系统5(2) Linux系统的核心结构系统的核心结构系系 统统 调调 用用 界界 面面程程 序序 库库进程通信进程通信进程调度进程调度存储管理存储管理文件子系统文件子系统高速缓冲高速缓冲字符设备字符设备 块设备块设备 设备驱动程序设备驱动程序用户程序用户程序 硬硬 件件 控控 制制 硬硬 件件 用户级用户级

6、核心级核心级硬件层硬件层进程管理与存储管理进程管理与存储管理网络管理网络管理网络协议网络协议网络驱动网络驱动Linux系统的核心结构示意图Linux系统系统 Linux系统概述系统概述裹殖蛰颗炭氦奢谅茧牧奴计郸皱皂傀耿昏托逐核枉旧饯炮申友脯手柴蔬脉第9章Linux系统第9章Linux系统 Linux系统的特权级与中断处理系统的特权级与中断处理Linux系统系统 Linux系统的特权级与中断处理系统的特权级与中断处理范霜嗓焊曾并惭宣盾室撂符咸哩沃题挑僳洗舜互亢祭丽巢珊改焰卞急遣昧第9章Linux系统第9章Linux系统61. Linux系统的特权级系统的特权级Linux系统使用两个级别 (处理机

7、提供四个特权级) :特权级0 核态 (内核模式)特权级3 用户态 (用户模式)2. Linux系统中断处理的上半部和下半部系统中断处理的上半部和下半部 (1) (1) 为什么要区分上半部和下半部为什么要区分上半部和下半部为什么要区分上半部和下半部为什么要区分上半部和下半部Linux系统系统 Linux系统的特权级与中断处理系统的特权级与中断处理为提高中断处理的效率,中断处理程序的执行必须快速、简洁。为此,Linux系统将中断处理程序分为两部分。将中断响应后必须立即处理的工作即刻执行,这就是中断处理程序的上半部 (tophalf)。将更多的处理工作向后推迟执行,这就是中断处理程序序的下半部(bo

8、ttom half)。展宪距软燕畅科蹭跳方汾冲邪幢联敦诸专射蓑邦盏阔凸睦垫卤涂鼎谐粕炬第9章Linux系统第9章Linux系统7 (2) (2) 中断处理程序的上半部中断处理程序的上半部中断处理程序的上半部中断处理程序的上半部上半部是中断处理中有严格时间限制的工作,是关键而 紧迫的部分;上半部的工作是不可被打断的,即在屏蔽所有中断的情 况下进行的。例:与硬件设备应答或使硬件复位的工作。 (3) (3) 中断处理程序的下半部中断处理程序的下半部中断处理程序的下半部中断处理程序的下半部下半部处理那些可以稍后完成的工作; 下半部的执行是可以打断的,即是在开中断的情况下执 行。Linux系统系统 Li

9、nux系统的特权级与中断处理系统的特权级与中断处理男丛利楚嚎涣黍尖礼诗稚挫侈灾晕蛔麓条俺言函茂幽式同箱喂惜烤妈惭抽第9章Linux系统第9章Linux系统8 3. 中断处理下半部的实现机制中断处理下半部的实现机制 Linux系统中,用于实现实现将工作推后执行的内核机制称为 “下半部机制”,下半部机制主要有tasklet和工作队列两种。 (1) tasklet (1) tasklet tasklet通过软中断实现通过软中断实现 一个软中断被标记后才能执行,称为触发软中断。 待处理的软中断会在以下时机被检查和执行:从一个硬件中断返回时;在ksoftirqd内核线程中;在显示检查和执行待处理的软中断

10、的代码中。Linux系统系统 Linux系统的特权级与中断处理系统的特权级与中断处理般犹度说矮异整凿摆验特写凛拟通面蹭蛋贸犊林梯魁瓷挎嗡司彩俞毙轧馒第9章Linux系统第9章Linux系统9 Tasklet软中断软中断 tasklet的软中断表示是的软中断表示是TASKLET_SOFTIRQ; Taskle由结构体由结构体tasklet_struct结构表示结构表示 struct tasklet_struct struct tasklet_struct *next; /* 链表中的下一个taskle */ unsignet long state; /* taskle的状态 */ atomic_

11、t count; /* 引用计数器 */ void (*func) (unsigned long); /* taskle的处理函数 */ unsigned long data; /* 给taskle处理函数的参数 */ tasklet由由tasklet_schedule()函数调度函数调度 Linux系统系统 Linux系统的特权级与中断处理系统的特权级与中断处理痊头宴胳滦江颖惺末肌渐叉舍红掇朗撮盎刽擒您装佐棋迂组颂茸病钱萌伸第9章Linux系统第9章Linux系统10 (2) (2) 工作队列工作队列工作队列工作队列 工作队列机制将中断处理程序的下半部交给一个内核线 程去执行。 下半部是在进

12、程上下文 (用户地址空间)执行,可以睡眠和 被重新调度。 注:这一点与上述的tasklet不同。如果下半部工作需要睡 眠 (如需要执行阻塞式I/O操作时,或要等待信号灯)时应 选择工作队列机制;否则可选择tasklet机制。Linux系统系统 Linux系统的特权级与中断处理系统的特权级与中断处理臭鲍狄奋眠媚掺毋翟灾寿诬端阜皇丢汲畅陨锹苛饥椎谋贵傍莽迪灯肘见溅第9章Linux系统第9章Linux系统11 工作者线程工作者线程 该线程接收由各内核中断处理程序交给它的下半部。 该线程内核线程实现的。执行的函数是 work_thread(), 对应的数据结构是工作队列链表。 工作队列链表工作队列链表

13、 由若干个work_struct结构组成。 work_struct结构Linux系统系统 Linux系统的特权级与中断处理系统的特权级与中断处理呐柴羞秀终房绘戍栅着恋确沧中敏鄙肮呢哆孔步柱禹钙廷魏主杉巷系探辅第9章Linux系统第9章Linux系统12 work_struct结构 每个work_struct结构描述如下 struct work_struct unsigned long pending; /* 该工作正在等待处理?*/ struct list_head entry; /* 勾链字 */ void (*func) (void *); /* 该工作的处理函数 */ void *dat

14、a; /* 传递该该处理函数的参数 */ void *wq_data; /* 内部使用 */ struct timer_list timer; /* 延迟的工作队列所用的定时器 */ Linux系统系统 Linux系统的特权级与中断处理系统的特权级与中断处理溺饥恭瞎是浆哼椒驹瓮撮篓傻锌爷议臭镰拇哆寡日切爆谜野沛宙欢竣禾啃第9章Linux系统第9章Linux系统13 执行函数执行函数work_thread()work_thread() 执行一个死循环; 若工作队列链表不空时,执行链表上的所有工作。工 作被执行完毕,它就将相应的work_struct对象从链表 上移走; 当链表为空时,它进入睡眠状

15、态; 当有下半部插入到队列时,函数是work_thread() 被唤醒,将继续处理新加入的下半部 。Linux系统系统 Linux系统的特权级与中断处理系统的特权级与中断处理浦泵勾童开官鄂铆丰丫尖沽葬押询篱船阿逻雍锈仙拿桥透炎权否解猎咎蕉第9章Linux系统第9章Linux系统Linux系统的系统的功能调用功能调用Linux系统系统Linux系统功能调用系统功能调用嘎及胁氟仗蛊谗墒灿渍账每产扦有醛匹产胺出班界凳双丑处铬犁引大钱彩第9章Linux系统第9章Linux系统141. Linux系统功能调用的过程系统功能调用的过程l在Linux系统中,系统调用通过异常类型实现;l当执行了int 0x8

16、0指令而发生的软件中断;l系统自动将用户态切换为核心态来处理该事件,执行自陷处理程序 (系统调用处理程序)。 Linux系统系统Linux系统功能调用系统功能调用颂盲游市现泌造颜乘抛碱钉辕碎咐粤菊亭釉酶抢膝秦找音脉砧则际存萧凰第9章Linux系统第9章Linux系统15(1) (1) 系统功能调用过程系统功能调用过程系统功能调用过程系统功能调用过程 abc(); abc(); syscall; system_call: sys_abc SYSEXITsysabc() 用户态用户态核心态核心态用户程序系统调用 在libc标准库中的封装例程系统调用处理程序系统调用服务例程Linux系统调用过程Li

17、nux系统系统Linux系统功能调用系统功能调用石孤察嗽只作豹驴赴钥誉磊沈躺凌骡崩可截楼个州矽汛诅袍蛀七蛙檀撤闯第9章Linux系统第9章Linux系统16(2) (2) 例:例:例:例:getuidgetuid系统调用过程系统调用过程系统调用过程系统调用过程 int main() getuid(); int getuid(void) long_res; int $0x80; ENTRY(system_call) pushl % esx SAVE_ALL GET_CURRENT(%ebx) call sys_getuid16 RESTORE_ALLasmlinkage longsys_getu

18、id16(void) return high2lowuid (current_uid);用户程序用户程序系统调用处理程序系统调用处理程序标准标准C库库内核例程内核例程getuid系统调用过程Linux系统系统Linux系统功能调用系统功能调用谢浙蹋鬃腆袋标厌毙螺葛桐五虽腋贮戌形艾您绪元沿鳃悉蹲咸坐骑拯焦瓮第9章Linux系统第9章Linux系统172. Linux系统功能调用的实现机制系统功能调用的实现机制 (1) Linux (1) Linux系统调用的进入系统调用的进入系统调用的进入系统调用的进入 Linux系统的软中断指令是系统的软中断指令是int 0x80汇编语言指令汇编语言指令 该指

19、令的执行会发生中断该指令的执行会发生中断 处理机的状态由用户态自陷到内核态处理机的状态由用户态自陷到内核态 从从system_call()开始执行系统调用处理程序。开始执行系统调用处理程序。 当系统调用处理完毕后,通过当系统调用处理完毕后,通过iret汇编语言指令返回到用汇编语言指令返回到用 户态。户态。Linux系统系统Linux系统功能调用系统功能调用援都致述靶呀哲贡存灶撑妨勿詹芬仍渡封谰浊竟苹揉摈情邑谨恳诛墨廖臀第9章Linux系统第9章Linux系统18 (2) (2) 系统调用号系统调用号系统调用号系统调用号 linux中,每个系统调用被赋予一个唯一的系统调用号 系统调用号定义在in

20、clude/asm-i386/unistd.h头文件中 系统调用号格式如下 #define _NR_restart_syscall 0 #define _NR_exit 1 #define _NR_fork 2 #define _NR_read 3 #define _NR_write 4 #define _NR_open 5 #define _NR_mq_getsetattr 282 Linux系统系统Linux系统功能调用系统功能调用蛹敌略戊臀骂絮酞孝惹剩父边妥萧棒抹坷庞陇哎疡轮抬瓷记涌旭丑码斜榜第9章Linux系统第9章Linux系统19 (3) (3) 系统调用表系统调用表系统调用表系统

21、调用表 系统调用表记录了内核中所有已注册过的系统调用, 它是系统调用的跳转表。 系统调用表是一个函数指针数组,表中依次保存所有 系统调用的函数指针 Linux系统调用表保存在arch/i386/kernel/下的entry.S中Linux系统系统Linux系统功能调用系统功能调用抡绘门藕耪扣妨贤诌旅琴俺河惯赤葛饼旷蝴清婴揖詹淑待询梯惑篇满刁夫第9章Linux系统第9章Linux系统20 系统调用表格式如下系统调用表格式如下 ENTRY(sys_call_table) .long sys_restart_syscall /* 0 */ .long sys_exit /* 1 */ .long s

22、ys_fork /* 2 */ .long sys_read /* 3 */ .long sys_write /* 4 */ .long sys_open /* 5 */ .long sys_mq_getsetattr /* 282 */ Linux系统系统Linux系统功能调用系统功能调用皆谴煮羹虫糜外酣蚁譬学蹬搜颈蜜渠瑶酌忍系物阐剁雕雅侈吉昂莱氖扭奶第9章Linux系统第9章Linux系统21 (4) (4) 系统调用处理程序系统调用处理程序系统调用处理程序系统调用处理程序 系统调用处理程序是系统调用处理程序是system_call(),主要工作如下,主要工作如下宏SAVE_ALL保护现场

23、; 正确性检查 ;依eax中所包含的系统调用号,调用其对应的服务例 程;系统服务例程结束时,通过宏RESTORE_ALL恢复寄 存器;最后通过iret指令返回。 Linux系统系统Linux系统功能调用系统功能调用断隋挑闷肆饥妆国鞠将坯绥走啄致随节线睬碟葬贮息旱终玻伺崭轩巍渊亮第9章Linux系统第9章Linux系统223. 增加一个新的增加一个新的系统功能调用的方法系统功能调用的方法 (1) (1) 添加新的服务例程添加新的服务例程添加新的服务例程添加新的服务例程 在/usr/src/linux/kernel/sys.c文件中增加一个新的函数, 该函数的名字是sys_mysyscall 例:

24、例:一个简单的系统调用,其功能是返回一个整型值 asmlinkage int sys_mycall(int number) return number; Linux系统系统Linux系统功能调用系统功能调用首伺空欲九葛帚蛀凌僚贿冰擞椰尸表冠汲紧亚诗式法华蛛钱师昌佩恬涕环第9章Linux系统第9章Linux系统23 (2) (2) 增加新的系统功能调用号增加新的系统功能调用号增加新的系统功能调用号增加新的系统功能调用号 在文件在文件include/asm-i386/unistd.hinclude/asm-i386/unistd.h中添加一项中添加一项 #define _NR_mysyscall

25、XX XX XX为新增加的系统调用号,此数字选一未用值为新增加的系统调用号,此数字选一未用值。 例例 #define _NR_restart_syscall 0 #define _NR_exit1 #define _NR_mq_getsetattr 282 #define _NR_mysyscall 283 Linux系统系统Linux系统功能调用系统功能调用脚攘筷稍闸瘫租钨圭厄契恫评少饵迢猩蛛蛮滩叮篙紧组肢鳃热怂谷膝担葵第9章Linux系统第9章Linux系统24 (3) (3) 修改系统调用表修改系统调用表修改系统调用表修改系统调用表 在文件/arch/i386/kernel/entry.

26、S中的系统调用表sys_call_table中添加新增的系统调用sys_call_table数组包含指向内核中每个系统调用的指针 例例 ENTRY(sys_call_table) .long sys_restart_syscall /* 0 */ .long sys_exit /* 1 */ .long sys_mq_getsetattr /* 282 */ .long sys_mysyscall /*283*/Linux系统系统Linux系统功能调用系统功能调用柬局宵唇丙桃艘堰撅搔捐慌托匹多铂筛揭娜炳准赞贪吴片思靠窃狞泻困睹第9章Linux系统第9章Linux系统25 (4) (4) 重新编

27、译内核并启动新内核重新编译内核并启动新内核重新编译内核并启动新内核重新编译内核并启动新内核 为使新的系统调用生效,需要重建Linux的内核。 这需要以超级用户身份登录后重新编译内核。 (5) (5) 在用户程序中访问新的系统调用在用户程序中访问新的系统调用在用户程序中访问新的系统调用在用户程序中访问新的系统调用 在用户程序中,测试新增加的系统调用是否能正确使用。Linux系统系统Linux系统功能调用系统功能调用载邮房跌休拨衍素婉茫卒涂赎籽氰趋墩同豢母卒苗涸挑欢耪乾刊以锨劫饯第9章Linux系统第9章Linux系统Linux系统的系统的进程管理进程管理Linux系统系统Linux系统的进程管理

28、系统的进程管理询小意理哩呛村汾何症空余删长档捡若渣揉古两痊辑僧舷全伐不函驹扰硕第9章Linux系统第9章Linux系统261. Linux系统进程与线程系统进程与线程 (1) Linux (1) Linux系统中的进程系统中的进程系统中的进程系统中的进程 进程是程序在处理机上的一次执行过程。进程是处于执行 期的程序,它是分配系统资源和调度的实体。 进程包括可执行的程序代码、打开的文件、挂起的信号、 内核数据、地址空间、处理机状态、一个或多个可执行 的线程等。 (2) Linux (2) Linux系统中的线程系统中的线程系统中的线程系统中的线程 Linux系统将线程看作是一种特殊的进程。线程被

29、视为一 个与其他进程共享某些资源的进程。 Linux系统系统Linux系统的进程管理系统的进程管理掸肺嫁表论糯磁谤良已廊浮始楔白嘉号松彩疟储质尊绝旋胖控炽也校邀萧第9章Linux系统第9章Linux系统272. Linux系统的进程描述符系统的进程描述符 Linux内核使用进程描述符 (又称为进程控制块)来描述一个 进程的完整信息。(1) (1) 进程控制块的结构进程控制块的结构进程控制块的结构进程控制块的结构 Linux系统系统Linux系统的进程管理系统的进程管理讥浙特誉吾科麻遍阵海卞脆见乞刃蒋甫爹辙苟从嗅粪供钉雏涕沿蘸挎阿痉第9章Linux系统第9章Linux系统28指向进程基本控制块的

30、指针进程状态state进程标识进程调度有关的字段进程亲属关系的字段指向当前目录的指针指向文件描述符的指针指向主存描述符的指针指向信号结构的指针指向tty结构的指针task_structthread_info当前目录文件描述符主存描述符所接收的信号与进程相关的tty指向进程队列priopidtgidpgrpsessinthread_inforun_listttyreal_parentparentchildrensiblingfsfilesmmsignal进程控制块的结构进程控制块的结构 进程控制块结构LinuxLinux系统系统LinuxLinux系统的进程管理系统的进程管理痉非嫂谢剩昭匀密臀套

31、烂了赣搬何俯吨禁妙哩胳监芽恃翔坝茧妖湘藩钞卑第9章Linux系统第9章Linux系统29(2) (2) 进程控制块的主要内容进程控制块的主要内容进程控制块的主要内容进程控制块的主要内容 进程标识符进程标识符 进程标识符process ID 进程描述符中的标识符字段字段名字段名说明说明pid进程的PIDtgid线程组领头进程的PIDpgrp进程组领头的进程PIDsession会话领头进程的PIDLinux系统系统Linux系统的进程管理系统的进程管理酗玖逞钓避沮查弱椅酉锣厦吐惰闪拽袭摇挚梁全泥恋闸导官河水炳卿灸横第9章Linux系统第9章Linux系统30 进程状态进程状态 反映进程当前状态,包

32、括以下几种可能的状态 可运行状态 TASK_RUNNING 可中断的等待状态 TASK_INTERRUPTIBLE 不可中断的等待状态 TASK_UNINTERRUPTIBLE 暂停状态 TASK_STOPPED 终止状态 TXIT_ZOMBIELinux系统系统Linux系统的进程管理系统的进程管理苫仰再沼壁勇东找廉闪雌懈龄贮弯苑秧悲浚匆锯戚世柱钵淮枉贫伦鲁甥锌第9章Linux系统第9章Linux系统31 进程基本信息进程基本信息 每个进程都有一个进程基本信息块。在进程描述符的thread_info字段中包含了指向该结构的指针 与进程调度有关的信息与进程调度有关的信息 可运行进程链表 (最多

33、可有140个) 进程的亲属关系进程的亲属关系 进程描述符中的亲属关系字段字段名字段名说明说明real_parent指向创建p进程的父进程的描述符,若该父进程不再存在,就指向1#进程parent指向p进程的当前父进程,它的值通常与real_parent一致,偶尔也可不同children链表的头部,链表中的所有进程都是p进程创建的子进程sibling指向兄弟进程链表中的下一个或前一个元素的指针Linux系统系统Linux系统的进程管理系统的进程管理塑穆碴登豹灼巡谦微赃龄明鬼遂砌悠臃郑汹一贼遁寨亢桌鳞杯狱第锤忱熏第9章Linux系统第9章Linux系统32 其他字段其他字段 在进程描述符的threa

34、d_info字段中包含了指向各种结构的 指针。 fs 指向当前目录结构 fs_steuct files 指向文件描述符结构 files_struct mm 指向主存描述符结构 mm_struct signal 指向信号结构 signal_struct tty 指向进程相关的 tty_struct结构Linux系统系统Linux系统的进程管理系统的进程管理纲炮怪划弟陀篷砖廊写鹿剧烬哟嫩坟堡揽汝比布虑柯粱取燕能竖宏焊栓梢第9章Linux系统第9章Linux系统33 (1) TASK_RUNNING ( (1) TASK_RUNNING (可运行状态可运行状态可运行状态可运行状态) ) 它或者正在执

35、行,运行状态它或者正在执行,运行状态 或者在运行队列中等待执行,就绪状态或者在运行队列中等待执行,就绪状态 (2) TASK_INTERRUPTIBLE ( (2) TASK_INTERRUPTIBLE (可中断的等待状态可中断的等待状态可中断的等待状态可中断的等待状态) ) 进程正在等待某一事件的发生(如某一硬件中断或一个信 号),它处于挂起或称睡眠状态。 (3) TASK_UNINTERRUPTIBLE ( (3) TASK_UNINTERRUPTIBLE (不可中断的等待不可中断的等待不可中断的等待不可中断的等待 状态状态状态状态) ) 除了不会因为接收到信号而被唤醒从而投入运行外,这个

36、 状态与可中断等待状态相同。3. Linux系统进程状态及变迁系统进程状态及变迁Linux系统系统Linux系统的进程管理系统的进程管理炉眯吝幂酒侗嚣君瀑窍闲睬刻诧碾忘戍址吟漾挪棘梦督粱栓茂往敞袋禽底第9章Linux系统第9章Linux系统34(4) TASK_ZOMBIE (4) TASK_ZOMBIE (僵死状态僵死状态僵死状态僵死状态) ) 表示进程已经结束,但其父进程还没有调用wait4()系统 调用。子进程的进程描述符在此之前仍然被保留(5) TASK_STOPPED (5) TASK_STOPPED (停止停止停止停止) ) 表示进程停止执行,进程没有投入运行也不能投入运行。 通常

37、这种状态发生在接收到SIGSTOP、SIGTSTP、 SIGTTIN、SIGTTOU等信号的时候。Linux系统系统Linux系统的进程管理系统的进程管理时酿撰窜屋众跟挣婚婪齿孟浮峨序倔蹭陆志季鼎金翻铜刀祟刽芒刷升志氧第9章Linux系统第9章Linux系统35(6) Linux(6) Linux系统进程状态的变迁系统进程状态的变迁系统进程状态的变迁系统进程状态的变迁 运行运行TASKUNNING进程调度等待某事件等待的事件发生 创建创建新进程新进程 就绪就绪TASKUNNING 进程进程 终止终止 等待等待TASKINTERRUPTIBLETASKUNINTERRUPTIBLE被抢占创建进程

38、完成Linux系统进程状态变迁图Linux系统系统Linux系统的进程管理系统的进程管理花莆蜜札俩菠架绩孩手芬砂股鳃世金股偏歉裳尖刊兴甩讨贴使惕僚功包极第9章Linux系统第9章Linux系统36 (1) (1) 进程创建进程创建进程创建进程创建 Linux系统用fork()系统调用创建一个进程。 写时拷贝写时拷贝 在创建新进程时内核不复制父进程的整个地址空间, 而是让父进程和子进程以读方式共享同一拷贝 只有当一方真正需要写入时,数据才被复制,这时, 父、子进程才拥有各自的拷贝4. Linux系统进程创建与终止系统进程创建与终止 系统提供系统提供fork()和和clone()系统调用系统调用

39、fork()用来创建一般进程 clone()用来创建轻量级进程 (线程) Linux系统系统Linux系统的进程管理系统的进程管理投恤吵蘑凯合段诫驮公善符天什爸目抗镭伸孜册朴壮鳃彼教痛昧别痘木绊第9章Linux系统第9章Linux系统37(2) (2) 进程终止进程终止进程终止进程终止 Linux系统提供exit()系统调用以终止某一个进程。其主要 功能由do_exec()函数完成。 进程终止后,此进程处于僵死状态,但系统还保留了它的 进程描述符。只有父进程发出了与被终止进程相关的 wait()系统调用后,子进程的task_struct结构才能释放。 Linux系统系统Linux系统的进程管理

40、系统的进程管理声呆宠而棋冰演孜蜂墩工潜夕烹摄足随豫充一慌印对们肄踌端曝靳储嘎或第9章Linux系统第9章Linux系统38 (1) (1) 进程等待进程等待进程等待进程等待 两种等待状态两种等待状态 TASK_INTERRUPTIBLE 和 TASK_UNINTERRUPTIBLE 区别:处于TASK_UNINTERRUPTIBLE状态的进程如果接收到一个信 号会被提前唤醒并响应该信号,而处于TASK_INTERRUPTIBLE状态 的进程会忽略信号。 5. Linux系统的进程等待与唤醒系统的进程等待与唤醒 进程等待的主要步骤进程等待的主要步骤 调用declare_waitqueue()创建

41、一个等待队列的元素。 调用add_wait_queue()将该元素加入到等待队列。 进程的状态设置为TASK_INTERRUPTIBLE状态 TASK_UNINTERRUPTIBLE状态。 转进程调度程序schedule() 。 Linux系统系统Linux系统的进程管理系统的进程管理图邯网劳洋厚地岸飘正炔嵌犊税瑞铲常后慌束官只蜂凌蒸搂辆乖耍涨垢印第9章Linux系统第9章Linux系统39(2) (2) 进程唤醒进程唤醒进程唤醒进程唤醒 进程唤醒的主要步骤进程唤醒的主要步骤 当进程状态设置为TASK_INTERRUPTIBLE,则由信号唤醒进程, 这是所谓的伪唤醒 (不是直接由所等待的事件唤

42、醒),因此需要检 查并处理信号。 若检查条件为真 (所等待的事件发生),转;若条件不为真,转进 程调度schdule()。 当进程被唤醒时 (因事件发生),检查条件是否为真,若为真转; 否则转进程调度schdule()。 当条件满足时,进程状态设置为 TASK_RUNNING,并将该进程 移出等待队列。 该函数将进程状态设置为TASK_RUNNING,再将此进程加入到 可执行队列。若被唤醒进程的优先级比当前正在运行的进程的优 先级高,设置need_resched标志。 Linux系统系统Linux系统的进程管理系统的进程管理芯维籍毡漫廷咕彼御逛傀年箱饭鹿塔旺皿挚岭只仁嵌寂滋沤鞍软悬节粥檀第9章

43、Linux系统第9章Linux系统Linux系统的系统的进程调度进程调度Linux系统系统Linux系统的进程调度系统的进程调度武啥训渍怪僻骤拘所管瘸手眼掏尖夕饶矩闷贾蘑盂谬叫像舆单芍报来囊挥第9章Linux系统第9章Linux系统401. Linux进程调度目标和特点进程调度目标和特点 进程调度程序是内核的组成部分,负责选择下一个要运 行的进程。进程调度可看作在可运行态进程之间分配有限的处理器 时间资源的内核子系统。进程调度程序是如Linux这样的多任务操作系统的基础。 (1) Linux (1) Linux进程调度策略进程调度策略进程调度策略进程调度策略 基于动态优先级和可变时间的调度基于

44、动态优先级和可变时间的调度 调度方式为可抢占式调度调度方式为可抢占式调度Linux系统系统Linux系统的进程调度系统的进程调度慌仪压咳朱嚣写留泅汲虹钵撕殴汹时穴逝铆绥翠羚阔尾臣珐刁擞诫套彤嚷第9章Linux系统第9章Linux系统41 (2) (2) 调度目标调度目标调度目标调度目标 实现算法复杂度为实现算法复杂度为O(1)级的调度级的调度 进程调度算法保证在恒定的时间内完成 算法执行时间与系统中处于就绪 (可运行)状态的进程个 数无关 提高交互性能提高交互性能提高交互性能,保证系统能快速响应 保证公平保证公平 在合理设定的时间范围内,没有进程会出现饥饿状态 也不会有进程获得大量的时间片 实

45、现实现SMP可扩展性可扩展性Linux系统系统Linux系统的进程调度系统的进程调度一击锈蛋管枢荆撇讨债阔剐鄂抓费牧早淆镜殊诌嘎桥股片删喻风标亡台奏第9章Linux系统第9章Linux系统42 (3) I/O (3) I/O消耗型和处理器消耗型的进程消耗型和处理器消耗型的进程消耗型和处理器消耗型的进程消耗型和处理器消耗型的进程 I/O消耗型进程消耗型进程 大部分时间是使用外部设备,交互式进程具有此特征。 处理器消耗型进程处理器消耗型进程 大部分时间是使用CPU,计算进程具有此特征。 交互式的程序都是I/O消耗型的。 Linux为了保证交互式应用,优化了进程的响应,更倾向 于优先调度I/O消耗型

46、进程,但并未忽略处理器消耗型程 序。Linux系统系统Linux系统的进程调度系统的进程调度第虫扭克钢秤骄手穆费乐丙楷层垃包揣入埃嗓枣幼袭涪串裁知罩黔饺邹暴第9章Linux系统第9章Linux系统43 (4) (4) 进程调度的特点进程调度的特点进程调度的特点进程调度的特点 Linux系统实现了基于进程过去行为的启发式算法;系统实现了基于进程过去行为的启发式算法; Linux系统选择优先级高的进程先运行,相同优先级的进系统选择优先级高的进程先运行,相同优先级的进 程按循环方式调度;程按循环方式调度; 动态优先级依进程占有动态优先级依进程占有CPU的情况、休眠时间的长短来的情况、休眠时间的长短来

47、 增、减增、减 ; 系统根据进程优先级调整分配给它的时间片;系统根据进程优先级调整分配给它的时间片; 实施可抢占调度方式实施可抢占调度方式 Linux系统系统Linux系统的进程调度系统的进程调度蠢乌怪严愿疯域躁收忙掖慢皮兆络罪搜构融俘化寇褪冶饮汞趋氧雨泊筛卑第9章Linux系统第9章Linux系统442. 可变优先级可变优先级 (1) (1) 基于优先级的调度基于优先级的调度基于优先级的调度基于优先级的调度 优先级高的进程先运行,低的后运行,相同优先级的进程 按轮转方式进行调度。 (2) (2) 静态优先级静态优先级静态优先级静态优先级 静态优先级的确定静态优先级的确定 在进程创建时,新创建

48、的进程继承 父进程的静态优先级 静态优先级的取值范围静态优先级的取值范围 100 (最高优先级) 139 (最低 优先级),取值越小,优先级越高; 静态优先级的改变静态优先级的改变 用户可以通过系统调用改变nice值, 从而改变自己拥有的静态优先级。Linux系统系统Linux系统的进程调度系统的进程调度奴凉腆莆坍冗怂陡豫枪鞭啊丹阁硕驳穗贬铁几秦暑煤迎蜘镍措滨瓷颠梳衔第9章Linux系统第9章Linux系统45 (3) (3) 动态优先级动态优先级动态优先级动态优先级 每个进程有一个动态优先级每个进程有一个动态优先级 它是进程调度程序选择可运 行进程所使用的参数,其取值范围是100 (最高优先

49、级) 139 (最低优先级) 动态优先级的计算动态优先级的计算 动态优先级动态优先级 = max(100,min(静态优先级静态优先级 bonus + 5,139) bonus是范围 0 10的值, 值小于5表示降低动态优先级以示惩罚 值大于5表示增加动态优先级以示奖励 进程调度使用的是动态优先级,通过effective_prio( )函数 来计算一个进程的动态优先级。Linux系统系统Linux系统的进程调度系统的进程调度侮暑辽瓢厩帛湛习惯驹叠簇离隙焉呛联崩炸挛吐改蒂包积卜幼骤失擂煽践第9章Linux系统第9章Linux系统46 (4) (4) 确定确定确定确定I/OI/O消耗型和处理器消耗

50、型进程的方法消耗型和处理器消耗型进程的方法消耗型和处理器消耗型进程的方法消耗型和处理器消耗型进程的方法 依据依据 进程睡眠时间的长短进程睡眠时间的长短 若进程睡眠时间长 I/OI/O消耗型消耗型消耗型消耗型 若进程睡眠时间短 处理器消耗型处理器消耗型处理器消耗型处理器消耗型 方法方法 Linux记录进程睡眠和执行时间 (存放在task_struct的 sleep_avg域中),范围:0 MAX_SLEEP_AVG,默认值 为10ms 当当进程从开始休眠到要恢复执行这一时间内sleep_avg 增加,直到达到MAX_SLEEP_AVG为止; 进程每执行一个时钟节拍, sleep_avg递减直到0

51、为止。 Linux系统系统Linux系统的进程调度系统的进程调度嘘惋凰巩敷嘘五蚂项镇韭狂逗黍暑仪被泼硬曙析雹伪柞荣异渴扑莉耍厦旅第9章Linux系统第9章Linux系统47 进程休眠时间与进程休眠时间与bonus值的关系值的关系 平均休眠时间 bonus值 大于或等于0, 小于 100ms 0 大于或等于100,小于 200ms 1 大于或等于200,小于 300ms 2 大于或等于300,小于 400ms 3 大于或等于400,小于 500ms 4 大于或等于500,小于 600ms 5 大于或等于600,小于 700ms 6 大于或等于700,小于 800ms 7 大于或等于800,小于

52、900ms 8 大于或等于900,小于 1000ms 9 大于1s 10 Linux系统系统Linux系统的进程调度系统的进程调度逼臀订再东刺悸除讳骇芝辟太帧妮才玲琢列弦撕珊极单镶艇辞傈井违调承第9章Linux系统第9章Linux系统483. 可变时间片可变时间片 (1) Linux (1) Linux系统的进程调度的目标系统的进程调度的目标系统的进程调度的目标系统的进程调度的目标 对交互式进程,系统提供较长的时间片对交互式进程,系统提供较长的时间片 调度程序根据进程的优先级动态调整分配给它的时间片调度程序根据进程的优先级动态调整分配给它的时间片Linux系统系统Linux系统的进程调度系统的

53、进程调度 (2) (2) 时间片的计算时间片的计算时间片的计算时间片的计算 基本时间片基本时间片 静态优先级本质上决定了进程的基本时间片 (140 静态优先级) 20 若静态优先级 120 (140 静态优先级) 5 若静态优先级 120 静态优先级越高(值越小),基本时间片越长。基本时间片 =称尊牢批屠仕妆酿定再汰歹苇腔演酋媳桐件滔耪逢簇憎曰呢铣晰户祷庸穿第9章Linux系统第9章Linux系统49表6.6 普通进程的静态优先级和基本时间片的典型值说明说明静态优先级静态优先级nice值值基本时间片基本时间片最高静态优先级100-20800ms高静态优先级110-10600ms缺省静态优先级1

54、200100ms低静态优先级130+1050ms最低静态优先级139+195ms初始创建的进程父进程的值父进程的值父进程的一半Linux系统系统Linux系统的进程调度系统的进程调度更高的优先级更高的优先级更高的交互性更高的交互性更低的优先级更低的优先级更低的交互性更低的交互性最小最小5ms默认默认100ms最大最大800ms进程静态优先级与基本时间片的关系图莹驼次悉樊瘁枚舔腋捐搅焚屋鹰钡梁钓嘴搀概悼篡艘觅门谴姨糜赢咸如包第9章Linux系统第9章Linux系统50 (3) (3) 时间片处理的时机时间片处理的时机时间片处理的时机时间片处理的时机 创建新进程时的处理创建新进程时的处理新创建的子

55、进程和父进程均分父进程剩余的时间片 进程用完时间片时的处理进程用完时间片时的处理 当一个进程的时间片用完时,依任务的动态优先级重 新计算时间片; task_timeslice()函数为给定任务返回一个新的时间片。Linux系统系统Linux系统的进程调度系统的进程调度 可变时间片可变时间片当一个进程的时间片用完时,根据进程的动态优先级重新计算时间片。壕衬容顶狙五许韩惰绦蔑昏柿款讫渐炊救疚频铣惜东肠批斌乓噬熬袒毫门第9章Linux系统第9章Linux系统51 (4) (4) 时间片的使用时间片的使用时间片的使用时间片的使用 一个进程拥有的时间片可分多次使用,放弃一个进程拥有的时间片可分多次使用,

56、放弃CPU时进时进 入活动队列入活动队列 当一个进程的时间片耗尽时,认为是过期进程,进入过当一个进程的时间片耗尽时,认为是过期进程,进入过 期队列期队列Linux系统系统Linux系统的进程调度系统的进程调度插败句脐斟库黎嘿嘱胳札唬虎缀玩块董肛逞甩碟的颁欺野车思颧漫玖秃膊第9章Linux系统第9章Linux系统52 (5) (5) 活动队列和过期队列活动队列和过期队列活动队列和过期队列活动队列和过期队列 每个处理器维护两个优先级数组 活动数组和过期数组 活动数组上的可执行队列中的进程都有剩余时间片活动数组上的可执行队列中的进程都有剩余时间片 过期数组上的可执行队列中的进程都已耗尽时间片过期数组

57、上的可执行队列中的进程都已耗尽时间片 当一个进程的时间片耗尽时,被移至过期队列中; 当活动数组上的可执行队列中的所有进程都已耗尽时时间 片,这时,在活动数组和过期数组之间切换指针。Linux系统系统Linux系统的进程调度系统的进程调度桔墓裴乃拱竖氧罢撩乐时丑女旦独襟扎鼻肪巢邵仔赊刚诅悦椅虐泡团湃货第9章Linux系统第9章Linux系统534. Linux进程调度算法中使用的数据结构进程调度算法中使用的数据结构 (1) (1) 可执行队列可执行队列可执行队列可执行队列 (runqueue (runqueue结构结构结构结构) ) 可执行队列是给定处理机上的可执行进程链表runqueue结构

58、类型 名称 说明spinlock_t lock 保护进程链表的自旋锁 prio_array_t *active 指向活动进程链表的指针prio_array_t *expired 指向过期进程链表的指针prio_array_t2 arrays 活动进程和过期进程的两个集合 Linux系统系统Linux系统的进程调度系统的进程调度殃蝉屹经坏预吩贵宰疵利扒荔以轻啥僵笋瓤伺篱草葡座礼蔓鉴买屋谬皖期第9章Linux系统第9章Linux系统54 (2) (2) 优先级数组优先级数组优先级数组优先级数组 优先级数组是 prio_array 类型的结构体,该数组描述了可 运行进程的集合,包括 140个双向链表

59、头个双向链表头 (每个链表对应一个优先级队列) 一个进程优先级位图一个进程优先级位图 该数组所包含的进程总数该数组所包含的进程总数 struct prio_array int nr_active; /* 任务数目*/ unsigned bitmapBITMAP_SIZE; /* 优先级位图*/ struct list_head queueMAX_PRIO; /*优先级队列*/ Linux系统系统Linux系统的进程调度系统的进程调度轻台遗回愉辙幽痒域靛羔云阮雏毅守柑搀硝耽求迟钻酌性瞅祟眶暇拢季捅第9章Linux系统第9章Linux系统55 优先级数组图示优先级数组图示 *active*expi

60、redarrays0arrays1 task task优先级优先级0优先级优先级139 task task优先级优先级0优先级优先级139过期进过期进程数组程数组活动进活动进程数组程数组runqueue结构中的两个进程数组Linux系统系统Linux系统的进程调度系统的进程调度擦辽贱谍同道冉离雁督入耘舶惩莲毯吊泡吭拆垃嫡甩晃赃焚凳坪沥井肄袍第9章Linux系统第9章Linux系统56 优先级位图的处理优先级位图的处理 初始时,所有位被置为0; 当某个拥有一确定优先级的进程准备运行时 (状态为 TASK_RUNNING) ,位图中相应位置1; 调度时,查找系统中优线级最高的进程就转化为查找 位图

61、中被置为1的第一个位。 由于优先级个数是定值,所以查找时间恒定,不受系统由于优先级个数是定值,所以查找时间恒定,不受系统 中可执行进程数目的影响,使中可执行进程数目的影响,使Linux系统的进程调度算系统的进程调度算 法具有法具有O(1) 的算法复杂度。的算法复杂度。 Linux系统系统Linux系统的进程调度系统的进程调度荔糕伍拷煽酉事挞于崎宅瘁胶仿拂卒茄惦沿铜后诸僻醛剂焊抽思窝疚皮翠第9章Linux系统第9章Linux系统575. Linux进程调度程序进程调度程序scheduler( ) (1) (1) 调度时机调度时机调度时机调度时机 当进程要休眠时当进程要休眠时 当进程被抢占时当进程

62、被抢占时 系统发生抢占时系统发生抢占时 (2) (2) 进程调度程序的主要工作进程调度程序的主要工作进程调度程序的主要工作进程调度程序的主要工作 在活动优先级数组中找到第一个被设置的位;在活动优先级数组中找到第一个被设置的位; 选择该优先级链表里的第一个进程;选择该优先级链表里的第一个进程; 调上下文切换函数调上下文切换函数context_switch( )。Linux系统系统Linux系统的进程调度系统的进程调度浆原各都由磨都岛诗别舒薯佯崩垢贫畏蒙段悠饵巨狠堤卡阉赘操陋悸语槽第9章Linux系统第9章Linux系统58 (3) Linux O(1) (3) Linux O(1)级进程调度图解

63、级进程调度图解级进程调度图解级进程调度图解位位9进程链表进程链表优先级位图优先级位图 0 1 0 1 9位位 6位位 9位位13 位位6进程链表进程链表位位130进程链表进程链表位位130LinuxO(1)级进程调度算法图解Linux系统系统Linux系统的进程调度系统的进程调度朵茸琉歪赶碳驳日嚎假仗馁迄骏虾炙膛陨男柔噶摔忻快坍兵滨零浮把玲曾第9章Linux系统第9章Linux系统Linux系统的系统的存储管理存储管理Linux系统系统Linux系统的存储管理系统的存储管理闲磷块昂舌底讥仇怀颂蝎宰碗徘砖昌土腰盆储奄蓖预哈滓钥秧锑求奄冠挥第9章Linux系统第9章Linux系统591. Linu

64、x系统段页式地址变换系统段页式地址变换 (1) Linux (1) Linux系统的分段系统的分段系统的分段系统的分段Linux系统处在用户态时,使用用户代码段和用户数据 段来对指令和数据寻址在核态时,使用内核代码段和内核数据段来对指令和 数据寻址每个分段是一个连续的线性地址空间,从0开始直到 2321的寻址长度。 Linux系统系统Linux系统的存储管理系统的存储管理伯曰诱既径驳狐搏搏姑梗迹敦哄弄阅浪双缮足摘该脖芋绵降军啸序唇恢痈第9章Linux系统第9章Linux系统60 (2) 80x86 (2) 80x86分页结构分页结构分页结构分页结构 80x86微处理器的分页单元处理4KB的页。

65、一个32位的线 性地址分为3个域。 页目录页目录 页表页表 页内位移页内位移31 22 21 12 11 0 页目录页目录字段指向页目录项; 页表页表字段指向进程的一个页表项; 页内位移页内位移则是页内偏移量 80X86分页机构Linux系统系统Linux系统的存储管理系统的存储管理监享畸螺葱镰喧帧膛候吴八奢婚坚侣跟才鲸茄糕仇培蛤垣撒肌蜜柿掇蒜际第9章Linux系统第9章Linux系统61 (3) (3) 三级页表三级页表三级页表三级页表 第一级第一级 全局目录全局目录 (PGD) PGD中的表项指向页目录中的一个表项 二级页表二级页表 页目录页目录 (PMD) PMD中的表项指向页表PTE中

66、的一个表项 三级三级 页表页表 该表项指向物理页 (页框) 的主存地址 Linux系统系统Linux系统的存储管理系统的存储管理报则灾邵湘失前渣廊业吃钡律停曾研窟纤温至谬粗角跋脸构血鞠扁劳奄恬第9章Linux系统第9章Linux系统62 (4) (4) 线性地址转换为物理地址线性地址转换为物理地址线性地址转换为物理地址线性地址转换为物理地址 地址转换过程地址转换过程 Linux系统通过三级页表完成线性地址到物理地址的转换页目录页目录 页表页表 页内位移页内位移31 22 21 12 11 0cr3+:+:页目录表页目录表页表页表物理页物理页+由线性地址转换为物理地址Linux系统系统Linux

67、系统的存储管理系统的存储管理辕所咎乏乱酮镣谣婪卿酥嘶冀括治聂焊什台袋装薪竟仓辛操啊读们骚铂贷第9章Linux系统第9章Linux系统63 地址变换步骤地址变换步骤 由cr3指示的当前页目录的物理地址与分页结构中的页 目录字段的内容相加指向页目录表项; 由页目录表项内容得到当前使用的页表的始地址,通过 分页结构中的页表字段的内容找到该页表项; 由页表项指示的该页的物理页 (页框)的主存地址与分页 结构中的页内位移相加,得到最终的物理地址。Linux系统系统Linux系统的存储管理系统的存储管理梆巡嗅嚼篡萄文预癸嘿瘤雍尘叹力泽拆谎硫萎板门惠仟秘训倚奴终聪症应第9章Linux系统第9章Linux系统

68、642. Linux系统动态内核管理系统动态内核管理 (1) (1) 物理页的描述物理页的描述物理页的描述物理页的描述 Linux系统主存分配的基本单位是物理页 (又称为页框) 主存管理单元MMU以页为单位进行分配和处理 32位体系结构支持4KB的页,64位体系结构支持8KB的页 内核用struct page结构描述页框 struct page flags; /* 页的状态页的状态 */ _count; /* 该页被引用的次数该页被引用的次数 */ *virtual; /* 页的虚拟地址,记录页在虚拟主存中的地址页的虚拟地址,记录页在虚拟主存中的地址 */ ; Linux系统系统Linux系统

69、的存储管理系统的存储管理田瘤称饶倡氢料兹腾旭糕爸急膨喂丁讶怂丰蔼咨电燥宋寝下罚选洋趋益软第9章Linux系统第9章Linux系统65 (2) (2) 物理主存分区物理主存分区物理主存分区物理主存分区 内核将系统中的所有页框划分为不同的区,具有相似特 征的页框归为同一个分区。 Linux系统共分为三种分区系统共分为三种分区 ZONE_DMA 这个分区包含的页只能用来执行DMA操作,大小为16MB; ZONE_NORMAL这个分区包含的页都是能正常映射的页,大小为16MB 896MB ZONE_HIGHMEM这个分区包含的是“高端主存”,其中的物理页并不能永久地映射到内核地址空间,大小为896MB

70、。 Linux系统系统Linux系统的存储管理系统的存储管理兆摇杏亥蠕议聘释忙猾庙许青染唱狗芽辛纵圣厘瓮锭磷宫领孪浆违镰曾中第9章Linux系统第9章Linux系统66 (3) (3) 分区页框的分配分区页框的分配分区页框的分配分区页框的分配 Linux内核通过页框和区对主存进行管理,实现了请求 主存的底层机制; 内核提供提供一组访问接口 (函数或宏) 可以直接的方 式获得动态主存,注意这种方式只能由内核使用。 Linux系统系统Linux系统的存储管理系统的存储管理密苑辆捻糠嚏怖市工雏适狭邹气乖低细紫洞调融赖献彩亏芋瑶靴阎圭椭起第9章Linux系统第9章Linux系统67 (4) (4) 分

71、区页框分配器分区页框分配器分区页框分配器分区页框分配器 分区页框分配器( Zoned page frame allocator)是一个内 核子系统,它负责对连续页框的主存分配。 分区页框分配器的组成如下图 分区页框分配器的组成Linux系统系统Linux系统的存储管理系统的存储管理管理区分配器管理区分配器每CPU页框 高速缓存每CPU页框 高速缓存每CPU页框 高速缓存 伙伴系统 伙伴系统 伙伴系统 ZONE_DMA 主存管理区 ZONE_NORMAL 主存管理区 ZONE_HIGHMEM 主存管理区炊组江劲员睛罢魄森趴晒申砾首制伐弊粗雀掣企诌申被帮促胺佛浅科麻残第9章Linux系统第9章Li

72、nux系统68 (5) (5) 伙伴系统算法伙伴系统算法伙伴系统算法伙伴系统算法 主存管理中的外碎片问题主存管理中的外碎片问题 当频繁地请求和释放不同大小的连续页框,就会导致在已分配页 框内产生许多小的、分散的空闲页框; Linux系统采用伙伴系统算法记录当前空闲的连续页框块的情况, 以尽量避免为满足小块的请求而分割大的空闲块。 伙伴系统算法中页框的组织伙伴系统算法中页框的组织 将所有的空闲页框分组为11个块链表; 每个块链表分别包含大小为1、2、4、8、16、32、64、128、256、 512、1024个连续页框; 每个块的第一个页框的物理地址是该块大小的整数倍。 Linux系统系统Lin

73、ux系统的存储管理系统的存储管理准笆笼心奔舞畸递耘骗蛔办亢智意想刑世呜绚辨棋蒙栖辩莽给谷淮脖芭牧第9章Linux系统第9章Linux系统69(6) (6) 页框的分配过程页框的分配过程页框的分配过程页框的分配过程 以分配以分配256个页框的块为例说明伙伴系统算法的页框的个页框的块为例说明伙伴系统算法的页框的 分配过程分配过程 首先在256个页框的链表中检查是否有空闲块满足需要; 若没有,则在512个页框的链表中找满足需要的空闲块 若存在这样的块,算法将这512的页框分为2半; 一半用来满足请求,另一半插入到256个页框的链表中; 若还没有,则在1024个页框的链表中找满足需要的空闲块; 若存在

74、,则将256块用来满足要求,其余部分分为256块 和512块分别插入到相应的链表中; 若不存在;算法放弃并给出不能满足分配的信息。 Linux系统系统Linux系统的存储管理系统的存储管理柠枕豁铱庞秤凹靳塘惊镐酋构闭胚拜傅秆苗蕉影培厌俐荧逻扒惦骏扦暇萧第9章Linux系统第9章Linux系统70(7) (7) 页框的释放过程页框的释放过程页框的释放过程页框的释放过程 分配过程的逆过程就是页框的释放过程分配过程的逆过程就是页框的释放过程 内核试图将大小为b 的一对空闲伙伴块合并为一个大小为 2b的单独块。满足以下条件的两个块称为伙伴: 两个块的大小相同,记为b; 它们的物理地址是连续的; 第一块

75、的第一个页框的物理地址是2b212的倍数。 算法是迭代的,如果它成功合并所释放的块,它会试图 合并2b的块,以再次试图形成跟更大的块。 Linux系统系统Linux系统的存储管理系统的存储管理乃缄岔蔓爱袱扶苍靴饲仿软成邓督轮据赌聚咋市鼠藩翘祝峰赡睡研誊恕香第9章Linux系统第9章Linux系统713. Linux系统的进程地址空间系统的进程地址空间 Linux内核提供用于页框分配和释放的函数 (或宏)。这些函数只能由内核直 接使用,用户进程请求主存时不能直接使用。 当用户进程请求动态主存时,内核采用推迟分配的方法,即用户并没有获 得请求的页框,而仅仅获得对一个新的线性地址区间的使用权。 这一

76、线性地址区间成为进程地址空间的一部分,称为“线性区”。 (1) (1) 进程地址空间的描述进程地址空间的描述进程地址空间的描述进程地址空间的描述 进程的地址空间由每个进程的线性地址区组成,是一个独 立的连续区间。 描述进程地址空间的信息存放在主存描述符中。主存描述 符由mm_struct结构体表示,进程描述符的mm字段指向这 个结构。 Linux系统系统Linux系统的存储管理系统的存储管理宿试吾范篡吾替赛堰庐翠政症膨越哭铁芬隶碳饮取绳俩渝希呸躯锑擎稻柬第9章Linux系统第9章Linux系统72 (2) (2) 进程线性区的描述进程线性区的描述进程线性区的描述进程线性区的描述 进程的地址空间

77、由若干个线性区组成; 线性区域 (又称为主存区域)用vm_area_struct结构体描述。 (3) (3) 主存描述符与主存区域描述符的关系主存描述符与主存区域描述符的关系主存描述符与主存区域描述符的关系主存描述符与主存区域描述符的关系 进程地址空间可以由多个主存区域组成,描述这些主存区 域的数据结构vm_area_struct组成一个链表; mm_struct中的mmap指向这个链表的头结构。 Linux系统系统Linux系统的存储管理系统的存储管理供昼农烹毡化带钧扑妆穆揣径虚曼对伸斡扳烹服陈臼译架粪棘减嘱揽昏近第9章Linux系统第9章Linux系统73 主存描述符mm_struct和主

78、存区域描述符vm_area_struct,这 两类数据结构的关系如图所示。 主存描述符、线性区描述符与进程线性地址空间Linux系统系统Linux系统的存储管理系统的存储管理线性地址空间线性地址空间主存线性区域主存线性区域 vm_area_struct 结构结构主存描述符主存描述符mm_struct 结构结构 mmap 扮慕额镇猿孜鸿迢劲骂衔敢尿偏欢纳诗节罩任私维惦鹊肝止谎兑狞辖侯轻第9章Linux系统第9章Linux系统Linux系统的系统的设备驱动设备驱动Linux系统系统Linux系统的设备驱动系统的设备驱动犬腰斧家尺鹊彩抒圃朗峰跌券窟昭隙夹议负象古贡沸券脯贬佛爵蚌晶剔戎第9章Linux

79、系统第9章Linux系统741. Linux系统设备的分类系统设备的分类 (1) (1) 字符设备字符设备字符设备字符设备 字符设备是能够像字符流的方式被有序访问的设备。 这类设备以字节为单位进行数据处理。 (2) (2) 块设备块设备块设备块设备 块设备是能随机访问固定大小数据 (又称为块)的设备。 常见的块设备有硬盘、软盘驱动器、CD-ROM驱动器和闪 存等。 块设备以块为单位进行处理,大多数块设备采用缓冲技术。Linux系统系统Linux系统的设备驱动系统的设备驱动苏寻扩朱例聪酞夸沽造悍诞枕雏尉阁桐磷账蝎寞揖苦猩迁谗蚤浪楞官注报第9章Linux系统第9章Linux系统752. 设备文件及

80、标识设备文件及标识 (1) (1) 设备文件设备文件设备文件设备文件 Linux系统将设备称为设备特殊文件,是文件类型的一种。 (2) (2) 主、次设备号主、次设备号主、次设备号主、次设备号 在Linux系统中描述文件的数据结构称为文件索引节点。 设备特殊文件的索引节点包含硬件设备的一个标识符,该 标识符对应字符设备或块设备。 Linux系统系统Linux系统的设备驱动系统的设备驱动畏污熟想烹滑宽凸综锯杭蛀她斗勾葱店暖猿坞己粳眉操贮壤衫淹浑蔗捎屏第9章Linux系统第9章Linux系统76 主设备号主设备号 主设备号标识设备的类型。 具有相同主设备号 (即类型一样)的所有设备共享相同的 文件

81、操作集合。 次设备号次设备号 次设备号标识主设备号相同的一组设备中的一个特定的 设备。 如由相同的磁盘控制器管理的一组磁盘,具有相同的主 设备号和不同的次设备号。Linux系统系统Linux系统的设备驱动系统的设备驱动穗字嘿诫幼魁责门灾还汝译乍椰酣惰踏玲惶铰伸璃震粕荚围航王粘食檀彭第9章Linux系统第9章Linux系统77 (3) VFS (3) VFS对设备文件的处理对设备文件的处理对设备文件的处理对设备文件的处理 虚拟文件系统VFS (Virtual Filesystem)负责处理与UNIX标 准文件系统相关的所有系统调用,为各种文件系统提供一 个通用的接口。 VFS在打开设备文件时改变

82、缺省的文件操作。它将缺省的 文件操作 (f_op )字段改变为块设备 (或字符设备)的文件操 作表 (def_bik_fops)的地址 。 对设备文件的每次系统调用都将转换成与设备相关的操作 函数调用。 当与设备相关的操作函数被调用后,就可以对硬件设备进 行操作,以完成进程所请求的I/O传输。 Linux系统系统Linux系统的设备驱动系统的设备驱动儡呼离乘锅褥诫要氖秀绩那辉惟挟扇痕山凄毖驴芽所飘秸驶李睦瘩邱薄嫂第9章Linux系统第9章Linux系统78缺省的块设备文件操作表def_bik_fops表 方法方法用于块设备文件的函数用于块设备文件的函数openblkdev_open()rele

83、aseblkdev_close()llseekblkdev_llseek()readgeneric_file_read()writeblkdev_file_write()块设备文件操作表Linux系统系统Linux系统的设备驱动系统的设备驱动怀配翟硼兰湖钩吐鬃透铝笆唇蜂潮盟绥蔽李诅鳖荧蒲橱刀疑号腮定蕊卷畏第9章Linux系统第9章Linux系统793. Linux块设备的处理块设备的处理 (1) (1) 块设备处理中内核组件之间的关系块设备处理中内核组件之间的关系块设备处理中内核组件之间的关系块设备处理中内核组件之间的关系 虚拟文件系统虚拟文件系统VFS磁盘高速缓存 文件系统映射层 通用块层

84、I/O调度程序 块设备驱动程序 块设备驱动程序磁盘磁盘块设备驱动程序涉及的内核组件Linux系统系统Linux系统的设备驱动系统的设备驱动许嘉斗瞻鳃馆脉淤腹丘讥芳胆伎赴链草昏岗昔烩屑洱霉浮泉棍砧娶鲸折账第9章Linux系统第9章Linux系统80 (2) (2) 以进程的以进程的以进程的以进程的read()read()系统调用为例,分析内核组件的系统调用为例,分析内核组件的系统调用为例,分析内核组件的系统调用为例,分析内核组件的 调用过程调用过程调用过程调用过程 在读操作之前,相应的设备文件已打开; VFS通过块设备文件操作表调用适当的VFS函数,传递的 参数是:文件描述符、文件的偏移量; V

85、FS相应的函数首先访问磁盘高速缓存,若所需数据在高 缓存中,不必启动磁盘读操作;否则启动磁盘读操作。假 定为后者; 在磁盘文件系统映射层,计算请求数据的逻辑块号,根据 该文件的索引节点中的索引结构确定该逻辑块号对应的磁 盘物理块号。然后,对块设备发出读请求;Linux系统系统Linux系统的设备驱动系统的设备驱动泞穷痊抠冕期辊弹去吹趴篆逃挡横诌蚊萎擂狮龋仍揪配映卖娩源笔揣壮巾第9章Linux系统第9章Linux系统81 通用块层接收到所需数据所在的磁盘块号、操作类型,给 I/O调度程序发出启动磁盘读操作的命令; I/O调度程序根据预先定义好的I/O调度策略,将待处理的 I/O数据传送请求进行归

86、类。其目的是尽量将在磁盘上物 理介质相邻的数据请求聚集在一起,以使I/O处理的效率最 高; 最后,块设备驱动程序向磁盘控制器的硬件接口发出设备 启动命令,从而进行实际的数据传送。 Linux系统系统Linux系统的设备驱动系统的设备驱动王因谍晰郡妊躺掀吧沪抚钉抡贷抛磁穗兴逻泅裂锰撑泌摄苍曰冗皖孔雨理第9章Linux系统第9章Linux系统824. 用于块设备处理的数据结构用于块设备处理的数据结构 设备驱动程序涉及的数据结构有设备请求队列和bio请求块。 (1) bio (1) bio结构结构结构结构 bio是描述块设备是描述块设备I/O操作的描述符操作的描述符 包括一个磁盘存储区标识符 (存储

87、区的起始扇区号和扇区总数); 一个或多个描述与I/O操作相关的主存区的段。 bio结构以片段为单位的链表形式来组织块结构以片段为单位的链表形式来组织块I/O操作操作 一个片段是一小块连续的主存。当缓冲区分散在主存的多个位置 时,bio 结构体也能对内核保证 I/O操作的执行。 在bio结构体中有几个相关的域 bi_io_vec、bi_vcnt和bi_idx。 Linux系统系统Linux系统的设备驱动系统的设备驱动斩养衫樟雅柔沏炸蚕硷恼缕樊誊湖边瘁尿胖准武擞树长涌哪伦荒问挝染柴第9章Linux系统第9章Linux系统83 bi_io_vec、bi_vcnt和和bi_idx bi_io_vec域

88、指向一个bio_vec数组 该数组包含了提供特定I/ O操作所需要使用到的所有片 段。 在指定的I/ O操作中,bi_vcnt域用来描述bi_io_vec所指 向的 bio_vec数组中的向量数目。 当块I/O操作执行完毕后,bi_idx域指向数组的当前索引。 Linux系统系统Linux系统的设备驱动系统的设备驱动晋囚阀畔摹踌银透编旺棉芬慨椽邢耸绅蜂匠翌悉姨南蓬绦六片库违膜稚盛第9章Linux系统第9章Linux系统84 bio结构、结构、bio_vec结构数组和结构数组和page结构之间的关系结构之间的关系 bio_vec结构数组 总数为 bi_vcntbio_idxbio_io_vecb

89、io_vec bio_vec bio_vec bio_vec页页面面页页面面页页面面页页面面 I/O操作的第一个片段由bio结构中的bio_io_vec字段所指向,其他的 片段在其后依次存放,共有bi_vcnt个片段; 当I/O操作开始执行时,使用着各个片段,这时,bi_idx域会不断地 更新,它总是指向正在操作的当前片段。 bio结构、bio_vec结构数组和page结构之间的关系Linux系统系统Linux系统的设备驱动系统的设备驱动架丁汀责绪妒襄濒燃烤茬已孪旨隧衣撅厄揭蹭秦崔著樱摆吝猜终屋鸥壁丁第9章Linux系统第9章Linux系统85 (2) (2) 设备队列和请求描述符设备队列和请

90、求描述符设备队列和请求描述符设备队列和请求描述符 设备请求队列设备请求队列 设备请求队列是一个双向链表,包含待处理的请求,由 request_queue结构描述。 请求描述符请求描述符 请求描述符request描述每个块设备待处理的请求。 Linux系统系统Linux系统的设备驱动系统的设备驱动岔雏前譬高掏傻朴区酣看弧淤粹组数莲钳样埋怖疗晌杂楚诗涧瑞抹除柴称第9章Linux系统第9章Linux系统86字段字段说明说明queue_head待处理请求的链表request_fn实现驱动程序的策略例程入口点的方法back_marge_fn检查是否可能将bio合并到请求队列的最后一个请求中的方法fron

91、t_marge_fn检查是否可能将bio合并到请求队列的第一个请求中的方法marge_requests_fn合并请求队列中两个相邻请求的方法make_request_fn将一个新请求插入到请求队列时调用的方法prep_rq_fn将处理请求的命令发送给硬件设备的方法queue_flags描述请求队列状态的标志request_queue结构的字段结构的字段request_queue结构的字段Linux系统系统Linux系统的设备驱动系统的设备驱动租币汕宿萌饱熙酒收叁对擅苗设彝铣攻旷疗脏肌慎敝驰提枷躬顾赤斌哮息第9章Linux系统第9章Linux系统87 一个新请求加入设备请求队列时的操作一个新请求

92、加入设备请求队列时的操作 若队列中存在一个与新请求的磁盘扇区相邻的请求,则 将新请求与这个已存在的请求合并成为一个请求; 若无相邻的请求,新请求插入到按扇区递增的合适的位 置; 如果队列中不存在该请求合适的插入位置,新请求被插 入到队列的尾部; 如果队列中存在一个驻留时间过长的请求,那么新请求 插入到队尾,以防止旧请求发生饥饿。 Linux系统系统Linux系统的设备驱动系统的设备驱动蕊袖耐只声税藻谨盛北督债喧虚兢幽港淮蚊锤停呀括怕将歌盂芽舆栽时在第9章Linux系统第9章Linux系统885. 输入输入/ /输出调度程序输出调度程序 (1) (1) 输入输入输入输入/ /输出调度程序的工作输

93、出调度程序的工作输出调度程序的工作输出调度程序的工作 I/O调度程序的主要工作是管理块设备请求队列,延迟激活 块设备驱动程序,对队列中的请求进行排序,以减少磁盘 寻址时间。 (2) (2) 合并与排序合并与排序合并与排序合并与排序 合并合并 将两个或多个I/O请求结合成一个新请求称为合并,使新请 求只对一个或多个相邻的磁盘扇区进行操作。 排序排序 将设备请求队列按磁盘扇区增长的方向排序,使磁头可以 按其前进方向上移动,这样就缩短了系统对所有I/O请求处 理的总时间 。Linux系统系统Linux系统的设备驱动系统的设备驱动绘缓寻弥氖潍咖刚侩蝴推子竭猖钻鸦破碉榨棚胞现老羚伍赴胯迈武毡诚凄第9章L

94、inux系统第9章Linux系统89 (3) (3) 电梯调度电梯调度电梯调度电梯调度 电梯调度算法电梯调度算法 是从当前I/O请求的磁盘位置开始,沿着臂的移动方向将请求按磁盘 扇区的顺序排序,总是选择离当前位置最近的那个I/O请求,如果在 磁盘移动方向上无请求访问时,就改变移动方向再选择。 新请求加入设备队列时的操作新请求加入设备队列时的操作 如果队列中已存在一个与新请求的磁盘扇区相邻的请求,那么,将 新请求与这个已存在的请求合并成为一个请求; 如果没有相邻的请求,新请求插入到按扇区递增的合适的位置,以 保证队列中的请求是以被访问的磁盘位置为序来排序的; 如果队列中不存在该请求合适的插入位置

95、,新请求被插入到队列的 尾部。 Linux系统系统Linux系统的设备驱动系统的设备驱动韧讫阅壤故珠绕恶咕苟冗与辗驳茨托楷主帐信刁扎香幻僻贞毫产氰册计蛤第9章Linux系统第9章Linux系统906. 策略例程策略例程 (1) (1) 什么是策略例程什么是策略例程什么是策略例程什么是策略例程 设备驱动程序包含一个函数或一组函数,这些函数称为 策略例程; 策略例程与设备控制器一起来处理设备请求队列的I/O请 求。 (2) (2) 策略例程的调用策略例程的调用策略例程的调用策略例程的调用 I/O调度程序通过请求队列描述符中的requst_fn方法来调 用策略例程,并将请求队列描述符的地址传递该该例

96、程。 Linux系统系统Linux系统的设备驱动系统的设备驱动笨旨连督屿颅螺玩浪粮循秘宵吉轮窃捶酣捶盏挣舀躲曳员荡无熙忻乃效芽第9章Linux系统第9章Linux系统91 (3) (3) 策略例程处理策略例程处理策略例程处理策略例程处理I/OI/O请求的方法请求的方法请求的方法请求的方法 一种简单的方式一种简单的方式 策略例程等待直到数据传送完成,然后将已经处理过的 I/O请求从队列中删除,继续处理下一个请求,直到队列 为空才结束。 另一个处理方式是中断方式另一个处理方式是中断方式 其处理效率高,为许多现代设备驱动程序所采用。Linux系统系统Linux系统的设备驱动系统的设备驱动铬按巨缺糯鉴

97、喝困川都聊纤旅虹屯荔灿夜宿液汽嗽金善炙藉诱语粗汀框力第9章Linux系统第9章Linux系统92 (4) (4) 在中断方式下,通用块层、在中断方式下,通用块层、在中断方式下,通用块层、在中断方式下,通用块层、I/OI/O调度程序、设备驱调度程序、设备驱调度程序、设备驱调度程序、设备驱 动程序的策略例程和中断处理程序之间的关系动程序的策略例程和中断处理程序之间的关系动程序的策略例程和中断处理程序之间的关系动程序的策略例程和中断处理程序之间的关系 通用块层将一个I/O操作请求发送给I/O调度程序; I/O调度程序在相应的块设备请求队列上进行处理,产生 一个新请求或扩展一个已有的请求,然后终止;

98、块设备队列若为空,当加入一个新请求时块设备驱动程序 被激活;否则,会一个接一个地处理请求队列上的每一个 请求。设备驱动程序调用策略例程,选择一个待处理的请 求,设置磁盘控制器,以便在数据传送完成时产生一个中 断,然后策略例程终止;Linux系统系统Linux系统的设备驱动系统的设备驱动鲜义漂克铬屯烁篡万匣粹淄桑冬则裔能析嘱鸯蝉宁猩雕卢灰舶诈旅骋追爬第9章Linux系统第9章Linux系统93 当磁盘控制器产生中断时,在该设备对应的中断处理程序 会重新调用策略例程。这时,策略例程可能处理以下两 种情况之一: 当前请求的所有数据块已经传送完成,则将该请求从 设备请求队列中删除,然后开始处理下一个请

99、求; 当前请求的所有数据块还没有传送完成,则为当前请 求再启动一次数据传送,这通常称为中断驱动。 Linux系统系统Linux系统的设备驱动系统的设备驱动饱支贸薯炳付俘说咏孰橇攘肃沦呀蓄颈珠娄竟绿抹帚酝蓑赦晴吾邻卷挺揍第9章Linux系统第9章Linux系统Linux文件系统文件系统Linux系统系统Linux文件系统文件系统悠又求幕斡逢名同欧另漏蓖迭渭凿顿相浑趣屏乳赃手骏范奈鸽措救磊吹茎第9章Linux系统第9章Linux系统941. 虚拟文件系统虚拟文件系统(VFS)概述概述 (1) (1) 什么是虚拟文件系统什么是虚拟文件系统什么是虚拟文件系统什么是虚拟文件系统 虚拟文件系统也称为虚拟文

100、件系统转换,它是一个内核软件层,用 来处理与UNIX标准文件系统相关的所有系统调用。 (2) (2) 虚拟文件系统支持的文件类型虚拟文件系统支持的文件类型虚拟文件系统支持的文件类型虚拟文件系统支持的文件类型 磁盘文件系统磁盘文件系统 磁盘文件系统管理本地磁盘分区中可用的存储空间或者其它可以 起到磁盘作用的设备 (如USB闪存)。 Linux使用的文件系统,如Ext2、Ext3和Reiser文件系统; UNIX家族的文件系统,如System文件系统、USF、MINIX文件 系统以及ScoUnix Ware; 微软公司的文件系统,如MS-DOS、VFAT及NTFS。 Linux系统系统Linux文

101、件系统文件系统放摇蚌惋涨辑延傀锡喳诗观粱今苏那玛又氧麻惦伪累氧鼓遍担报斗擎启睹第9章Linux系统第9章Linux系统95 网络文件系统网络文件系统 网络文件系统支持对其他网络计算机上文件系统包含 文件的访问。 虚拟文件系统支持的网络文件系统有NFS、AFS、CIFS 等。 特殊文件系统特殊文件系统 特殊文件系统不管本地或远程磁盘空间,包含操作系统 内核的数据结构,它提供一种便利的方式让系统程序员 可以访问这些 数据结构 。 其例子是/proc文件系统。文件系统文件系统Linux文件系统文件系统遇师身厄女洋溅缝潦冉溺菏晚蕾姐贩膳谎株喝拱埂钒桐遍辑吼旬纱硷吭彭第9章Linux系统第9章Linux

102、系统962. VFS通用文件系统模型与通用文件系统模型与VFS对象对象 (1) VFS (1) VFS通用文件系统模型通用文件系统模型通用文件系统模型通用文件系统模型 VFS提供了一个通用的文件系统模型提供了一个通用的文件系统模型 该模型包括了所有不同类型的文件系统常用的功能和操 作,它定义了所有文件系统都支持的基本的、概念上的 接口和数据结构。 VFS提供了一个抽象层提供了一个抽象层 该抽象层提供的统一接口隐藏了实际文件系统的具体的 实现细节。 文件系统文件系统Linux文件系统文件系统召果厢演烦陈墓褐晨普捆朱怒诣律编扇藏臻济者支蜗膳骤围褒荔墒垒楔风第9章Linux系统第9章Linux系统9

103、7 VFS使用的例使用的例用户程序中的写操作的实施过程用户程序中的写操作的实施过程 一个用户程序中的写操作请求通过VFS的映射、实际文件 系统的具体实施,最终将信息写到物理介质上。文件系统文件系统Linux文件系统文件系统 write(); 用户程序用户程序sys_write()文件系统写方法文件系统写方法VFS虚拟文件系统虚拟文件系统具体文件系统具体文件系统 如如Ext2物理存储介质物理存储介质一个用户程序写操作的实现步骤镀桐忿山安孺歹饱猛香它溯安窒具篷么悦握方词岔距箱烂读晃渤桐场水樟第9章Linux系统第9章Linux系统98 (2) VFS (2) VFS对象类型对象类型对象类型对象类型

104、 超级块对象超级块对象 (superblock object) 代表已安装的文件系统,存放已安装文件系统的所有信息。 索引节点对象索引节点对象 (inode object) 代表一个文件,描述一个具体文件的所有信息。 目录项对象目录项对象 (dentry object) 代表一个目录项,是路径名的一个组成部分 。 文件对象文件对象 (file object) 它代表由进程打开的文件。 文件系统文件系统Linux文件系统文件系统设呼斑基幌欠择焕栏楚某掐点舌虏三勉焚吏替驳碴语或戌仁产咽泛图臂陋第9章Linux系统第9章Linux系统993. 与进程相关的数据结构与进程相关的数据结构 每个进程都有当

105、前目录 (或根目录),进程活动期间都要打开各种文件。 Linux系统使用fs_struct和file_struct结构体描述以上信息。 (1) fs_struct (1) fs_struct结构体结构体结构体结构体 描述进程的当前目录 (或根目录)的信息; 每个进程描述符的fs字段就指向该进程的fs_struct结构体 文件系统文件系统Linux文件系统文件系统fs_struct结构的主要字段 字字 段段说说 明明count共享此结构的进程个数*root根目录的目录项对象*pwd当前工作目录的目录项对象*rootmut根目录所安装的文件系统对象*pwdmut当前工作目录所安装的文件系统对象 淤

106、偷肃砸穆占惦尘篱义前赵益拉瞪趟嘻咏厂翻学遭霸记飞夜捂匿什晋宏开第9章Linux系统第9章Linux系统100 (2) file_struct (2) file_struct结构体结构体结构体结构体 描述与每个进程所有相关的信息,如打开的文件及文件描 述符等; 该结构的地址存放在进程描述符的file字段中。 文件系统文件系统Linux文件系统文件系统fs_struct结构的主要字段 字字 段段说说 明明count共享此结构的进程个数max_fds文件对象当前的最大数目*fd指向文件对象指针数组的指针*close_on_exec指向执行exec()时需要关闭的文件描述符的指针*open_fds指向

107、打开文件描述符的指针*fd_array文件对象指针的初始化数组 赏疟与嘎卿有苟啪痢肘扑耍帘慎谭谣祟苍艾呐秆胜选率胜暮厌挪闲豌都陕第9章Linux系统第9章Linux系统4. VFS系统调用的实现系统调用的实现 (1) (1) 路径名的查找路径名的查找路径名的查找路径名的查找 路径名查找的实质是从文件路径名查找相应的索引节点。 若路径名的第一个字符是“/”,那么这个路径名是绝对路径,因此从currentfsroot (进程的根目录)所标识的目录开始搜寻;否则路径名是相对路径,因此应从currentfspwd (进程的当前目录)所标识的目录开始搜寻; 内核检查与第一个名字匹配的目录项,以获得相应的

108、索引节点,然后从磁盘中读出索引节点的目录文件; 然后,检查与与第二个名字匹配的目录项,以获得相应的索引节点。对于包含在路径名中的每一个名字,这个过程反复执行。 Linux系统使用了目录项高速缓存,以加快路径名查找的速度。 文件系统文件系统Linux文件系统文件系统101荫腥洱痪弥盲陷飞滩横藤羹或窝快给泳俘伐亨统细感拉冀包柄筛深稻戈锗第9章Linux系统第9章Linux系统 (2) open( ) (2) open( )系统调用的实现系统调用的实现系统调用的实现系统调用的实现 调用形式调用形式 open()系统调用的服务例程为sys_open()函数,该函数接受 的参数: filename:要打

109、开的文件路径名 fiags :访问模式的标志 mode :该文件被创建时所需要的许可权 若该系统调用成功,返回文件描述符 (即为fd表中的索引号); 否则返回1。 文件系统文件系统Linux文件系统文件系统102驹锻麓罐载昭宣详论法懈喻所铰喳聋邯舆靳双擦彩矮拎甭屹丘营史弦音望第9章Linux系统第9章Linux系统 sys_open() sys_open()函数的主要工作函数的主要工作 调用getname()函数,从进程地址空间中读取文件路径名; 在currentfilefd中查找一个空位置,获得在fd表中的索引号,即 为该打开文件的描述符; 调用file_open()函数,传递参数,包括路径

110、名、访问模式标志、许 可权位掩码,检查操作的合法性,并设置相应的标志; 分配一个新的文件对象,设置相应的f_flags和f_mode字段; 将f_op字段设置为相应索引节点对象i_fop字段的内容,为进一步的文件操作建立所有的方法; 返回文件对象地址; 调用getname()函数,从进程地址空间中读取文件路径名; 将currentfilefdfd置为返回的文件对象的地址; 返回fd (文件描述符)。 文件系统文件系统Linux文件系统文件系统103迭广铂裂炸八肥灾眠颊瘩咳闺砖动喊权讥义洒岳恃讶缘酱俺遣壹穷煤戳倦第9章Linux系统第9章Linux系统 (3) read( ) (3) read(

111、 )和和和和write()write()系统调用的实现系统调用的实现系统调用的实现系统调用的实现 调用形式调用形式 read( )和write()系统调用非常相似,所需参数都为3: fd: 文件描述符; buf: 主存区地址,该缓存区包含要传送的数据; count:指定的应传送的字节数。 返回:成功传送的字节数;或发送一个错误条件的信号并返回1。 read( )系统调用的访问例程称为系统调用的访问例程称为sys_read() write()系统调用的访问例程称为系统调用的访问例程称为sys_write() 这两个系统调用几乎执行相同的步骤 文件系统文件系统Linux文件系统文件系统104佯勋雕

112、涕才砷夫庆雨矽郸侨涪陇箍兄烛她请餐酶党农冲灌坷侨书喝迎类逆第9章Linux系统第9章Linux系统5. Ext2文件系统概述文件系统概述 Ext2是Linux系统所固有的,它运行稳定且高效。 (1) Ext2 (1) Ext2文件系统的特征文件系统的特征文件系统的特征文件系统的特征 可选择最佳块大小,提高系统性能可选择最佳块大小,提高系统性能 块大小可以从1024B到4096B字节之间选择; 根据预测的文件平均长度来选择最佳块大小,可以减 少磁盘传送次数,从而减轻系统开销。 文件系统文件系统Linux文件系统文件系统105迁欣汾俯袒馏张赢凿现仗籽各摊赠差团人昏欺录杉族羊喷羔愈犀彻垂缨烽第9章L

113、inux系统第9章Linux系统 可选择分区上的索引节点数,有效地利用磁盘空间可选择分区上的索引节点数,有效地利用磁盘空间根据给定的分区大小来预测可存放的文件数,以此来确定该分区上可分配的索引节点数。这样可以有效地利用磁盘空间 。 以块组结构减少磁盘的平均寻道时间以块组结构减少磁盘的平均寻道时间Ext2文件系统将磁盘块分组,每组包含存放在相邻磁道上的数据块和索引节点。这种块组结构使得对存放在一个单独块组中的文件进行访问时,减少了磁盘的平均寻道时间。文件系统文件系统Linux文件系统文件系统106港涤仙野栋摧砚粕拆券团贞俏劲杉团打陈山唱鹰你询黄提伐粒鳖寺占拆朋第9章Linux系统第9章Linux

114、系统 (2) Ext2 (2) Ext2文件类型文件类型文件类型文件类型 Ext2文件类型如下表所示文件类型如下表所示文件系统文件系统Linux文件系统文件系统Ext2文件类型 文件类型文件类型说说 明明0未知1普通文件2目录3字符设备文件4块设备文件5命名管道6套接字7符号链接107伶披却需我横佣质伏践瘁炸压撕倦饱能哗瓤舷尤击卫账佬椽咆午纤德挠傈第9章Linux系统第9章Linux系统108 普通文件普通文件普通文件是最常见的,它在刚创建时是空白的,并不需要磁盘数据块,只有在开始有数据时才分配数据块。 目录文件目录文件 目录文件是一种特殊文件,它由Ext2目录项组成; Ext2目录项是一个类

115、型为ext2_dir_extry_2的结构,它 将文件名和索引节点号存放在一起。 ext2_dir_extry_2结构的主要字段和说明如下表所示。文件系统文件系统Linux文件系统文件系统枚犯煮序讽册溃枷级荫所镍乙话啡掷熬劣垛囊硕凿抹介递苯嗽辉谈咳禽碎第9章Linux系统第9章Linux系统 设备文件、命名管道文件和套接字设备文件、命名管道文件和套接字 这类文件不需要数据块,所有必要的信息都存放在索引节点中。 符号链接符号链接 当符号链接的路径名小于60个字符时,它就存放在索引节点上的i_blocks字段中,这样就不需要数据块。文件系统文件系统Linux文件系统文件系统ext2_dir_ext

116、ry_2的结构文件类型文件类型说说 明明inode索引节点号rec_len目录项长度name_len文件名长度file_type文件类型name文件名109彦施顷杰汤短彪狸芬痹苦释斌仰绩证骗异栏堵记抢宽镊奄攻痊堪渤层秩驾第9章Linux系统第9章Linux系统6. Ext2磁盘数据结构磁盘数据结构 (1) Ext2(1) Ext2文件系统在磁盘上的分布文件系统在磁盘上的分布文件系统在磁盘上的分布文件系统在磁盘上的分布 磁盘的第一块为引导扇区,包括一个分区表和初始引导程 序,用来引导操作系统; 磁盘的其余部分分成为块组,从块组0到块组n,所有块组 大小相同并顺序存放。 Ext2文件系统在磁盘上的

117、分布如下图所示。 文件系统文件系统Linux文件系统文件系统110楷增再绝距裹晨车决层氧辽豌偷诽吏厨崭在锥菇锁尤叉筹渐聚形涛兜耶汪第9章Linux系统第9章Linux系统Ext2文件系统在磁盘上的分布文件系统在磁盘上的分布文件系统文件系统Linux文件系统文件系统数据块位图一个块引导块块号块号0块号1块号n超级块组描述符索引节点位图索引节点表数据块n个块一个块一个块n个块n个块一个磁盘上可建立多少个块组决定于分区的大小和块的 大小,主要限制在于数据块位图。数据块位图用来标识一个组中块的占用/空闲状况,并存 放在一个单独的块中。 Ext2分区和块组的分布图112宦影筐艰皂掠赶趴绳得绰耐堤派灵开旗

118、室碰靖抛翟豆淮诊球懊削讶摈或籍第9章Linux系统第9章Linux系统 (2) Ext2 (2) Ext2磁盘块组结构磁盘块组结构磁盘块组结构磁盘块组结构 Ext2磁盘块组包括超级块、组描述符、数据块位图、索引节点位 图、索引节点表和数据块。 超级块超级块每个块组中的超级块存放在一个称为ext2_super_block的结构中。 组描述符组描述符每个块组都包含一个组描述符,它是一个ext2_group_desc结构。 索引节点表索引节点表 索引节点表由若干个连续的块组成,索引节点表的第一块的块号存放在组描述符的bg_inode_table字段中。 文件系统文件系统Linux文件系统文件系统11

119、3谅啄癣箱审延裹简防泌沸吵卞双邮辙糊挫惑诀彬弓欧蓑幢望锯主宏开结殉第9章Linux系统第9章Linux系统7. Ext2磁盘空间管理磁盘空间管理 (1) (1) 从文件的偏移量从文件的偏移量从文件的偏移量从文件的偏移量f f 确定相应数据块在磁盘上的块确定相应数据块在磁盘上的块确定相应数据块在磁盘上的块确定相应数据块在磁盘上的块 号需要的操作号需要的操作号需要的操作号需要的操作 从偏移量从偏移量f导出文件的逻辑块号导出文件的逻辑块号 (逻辑记录逻辑记录)f/文件系统的逻辑块大小(结果取整) 将文件的逻辑块号将文件的逻辑块号 (逻辑记录逻辑记录)转化为相应的磁盘块号转化为相应的磁盘块号 磁盘索引

120、节点上的i_block字段包含Ext2_n_blocks (通常为15)个指 针元素,这些元素中包含已分配给文件的磁盘块号。 在 Linux系统中,这15个元素组成的数组按如下方式使用 0 11用作直接索引;12用作一级间接索引; 13用作二级间接索引;14用作三级间接索引。文件系统文件系统Linux文件系统文件系统114詹悍已平肿凭畸赎表般听恢辈判暮橇堡妨咨百巧诅递山簇惭水铭葬高爪镶第9章Linux系统第9章Linux系统 (2) Ext2 (2) Ext2文件系统的索引结构文件系统的索引结构文件系统的索引结构文件系统的索引结构 直接索引直接索引 0 11个数组单元内存放的是文件的逻辑记录所

121、在的磁盘块号; 直接索引可登记逻辑记录号从0到11范围内的映射关系。 一级间接索引一级间接索引 第12个数组单元内存放的是一级间接索引表所占用的磁盘块号; 一级间接索引表中每一个表项的内容是文件的逻辑记录所在的磁盘 块号。 设 b = 4KB (磁盘块的大小),每个逻辑记录号占4B字节,这样一个 磁盘块用作索引表时,可有n个表项:n = b/4 = 1K个; 可登记逻辑记录号从12 (b/4+11) 范围内的映射关系。 文件系统文件系统Linux文件系统文件系统115椎桓慰凶锨春滋聊哦况抚属品良沽纫山絮酒烹衔袒贝智癸磋鼠螟破艘有剿第9章Linux系统第9章Linux系统 二级间接索引二级间接索

122、引 第13个数组单元内存放的是二级间接索引表所占用的磁盘块号; 二级间接索引表共有n个表项,每一个表项都分别指向一个一级间 接索引表,即每一个表项的内容分别是各一级间接索引表所在的磁 盘块号; 在每个一级间接索引表中的每一个表项中存放的是逻辑记录所在的 磁盘块号。 二级间接索引表可有(b/4)2个表项; 可登记逻辑记录号从(12+1024) (12+1024) +(102421)范围内的映 射关系。 文件系统文件系统Linux文件系统文件系统116献赦嗽爱粟翠脚伊唬逼柜诣畜禁挞曰岛盟枪外悬拨伍潜怕桂蛮给腆屿弗吝第9章Linux系统第9章Linux系统 三级间接索引三级间接索引 第14个数组单元

123、内存放的是三级间接索引表所占用的磁 盘块号; 按以上方法类推。 三级间接索引表可有(b/4)3个表项; 可登记逻辑记录号 (12+1024+10242) (12+1024+10242)+(102431) 范围内的映射关系。 文件系统文件系统Linux文件系统文件系统117损迁云危涣歉响埃话亮夕谐闭外诀描徘决废涵谴偏军吊玉膜醛虞芭绷师誓第9章Linux系统第9章Linux系统 Ext2文件系统的索引结构图示文件系统的索引结构图示 文件系统文件系统Linux文件系统文件系统一级间接索引一级间接索引二级间接索引二级间接索引三级间接索引三级间接索引 01234567891011121314Ext2文件

124、系统的索引结构118翌膛俩鸯蛹巫匿学鲤醒浪凳匿屿馒靡票河硅码般悼浇到汽枕弓制嘶义筏禁第9章Linux系统第9章Linux系统第第9章章 Linux系统系统小结小结Linux系统系统小结小结控钻锁男湿封睹凶卿瘁粪俊葡帘鳃蛊莉户侵靖獭蝎乔伞瑞逼脆毅羹翰牧愉第9章Linux系统第9章Linux系统l lLinuxLinux系统概述系统概述系统概述系统概述Linux操作系统的类型Linux操作系统的特点l lLinuxLinux系统的特权级与中断处理系统的特权级与中断处理系统的特权级与中断处理系统的特权级与中断处理Linux系统的特权级Linux系统中断处理区分上半部和下半部的目的上半部、下半部的主要

125、工作和特点l lLinuxLinux系统功能调用系统功能调用系统功能调用系统功能调用Linux系统功能调用的过程在Linux系统中增加一个新的系统功能调用需做的工作119Linux系统系统小结小结侠册诉蝇蚊曰曙武线勒克靶任谍课科硒渗阂砖折衙函茨沏矢金挚贾炒碰图第9章Linux系统第9章Linux系统l lLinuxLinux系统的进程管理系统的进程管理系统的进程管理系统的进程管理Linux系统进程的状态Linux系统进程状态变迁图 Linux系统进程创建的写时拷贝技术l lLinuxLinux系统的进程调度系统的进程调度系统的进程调度系统的进程调度Linux系统进程调度策略、调度方式Linux

126、系统动态优先级与哪些因素有关进程的睡眠时间与动态优先级的关系Linux系统可变时间片与静态优先级的关系活动进程数组与过期进程数组Linux系统进程调度算法的主要工作120Linux系统系统小结小结中佩凤鹿司乳绒顾跨类挟馋志肉麻疲诱跨擅峰浩疲共踢桔嘘忙骂论误硅婿第9章Linux系统第9章Linux系统l lLinuxLinux系统的存储管理系统的存储管理系统的存储管理系统的存储管理Linux系统通过三级页表完成的地址转换过程Linux系统的三种分区伙伴系统算法伙伴系统算法中页框的组织页框的分配过程页框的释放过程Linux系统进程地址空间的组成121Linux系统系统小结小结呜鹰何癣漆廊牵碎蛆撅珠

127、蓬持肌染南禽卉歼里响轨丧股正换奎铸拨肘奉栏第9章Linux系统第9章Linux系统l lLinuxLinux系统的设备驱动系统的设备驱动系统的设备驱动系统的设备驱动Linux系统设备的分类设备文件、主设备号、次设备号bio结构、设备请求队列I/O调度程序的主要工作合并、排序电梯调度算法122Linux系统系统小结小结趟课练噪灭冲网暗这圣龙工病桨凯叉圣估柬越弹蝗豪高物哇桶凌咐潦早缆第9章Linux系统第9章Linux系统l lLinuxLinux文件系统文件系统文件系统文件系统VFS虚拟文件系统、支持的文件系统类型VFS通用的文件系统模型包含的内容fs_struct结构体和file_struct结构体的作用open( )系统调用的主要工作Ext2文件系统的特征Ext2的类型Ext2文件系统在磁盘上的分布Ext2文件索引结构123Linux系统系统小结小结辐轩亭螟乓碑佩罚襟糙钡耻思欠算墅魁茹辜琐穆万枕量淫揪坞耕巡核路诡第9章Linux系统第9章Linux系统

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号