第8章 实例分析: Linux操作系统 本章讲述内容: 8.1 Linux的处理机管理; 8.2 Linux的存储管理; 8.3 Linuⅸ的文件管理; 8.4 Linux的设备管理
第8章 实例分析: Linux操作系统 8.1 8.2 8.3 本章讲述内容: 8.4 Linux的处理机管理; Linux的存储管理 ; Linux的文件管理 ; Linux 的设备管理
8.1Liux的处理机管理 。8.1.1 Linux的进程 1.Linuxi进程的两种运行模式 .Liux里,当进程运行用户程序时,称为“用户模式”;当进程运行中出现系统 调用或中断事件,转去执行操作系统内核程序时,称为“核心模式”。进程在核心模式 时,从事资源管理及各种控制活动:在用户模式时,在操作系统管理和控制下做自己的 工作:在Liux里处理机有两种运行状态:在核心态,CPU执行操作系统的程序;在用户 态,CPU执行用户程序。这两种运行状态,会在一定时机按需要进行转换。 .Lix把进程定义为是“程序运行的一个实例”。进程竞争并占用系统资源,向 系统提出各种请求服务;进程也是调度单位,任何时刻只有一个进程在CPU上运行。 2.Linuxi进程实体的组成 。Linux进程的四个部分 Linux中,每个进程是一个任务(task),有四个部分:进程描述符,即进程控制块: 进程专用的系统堆栈空间:正文段,即供进程执行的程序段:进程专用的数据段和用户 堆栈空间
8.1 Linux的处理机管理 • 8.1.1 Linux的进程 1. Linux进程的两种运行模式 Linux里,当进程运行用户程序时,称为“用户模式”;当进程运行中出现系统 调用或中断事件,转去执行操作系统内核程序时,称为“核心模式”。进程在核心模式 时,从事资源管理及各种控制活动;在用户模式时,在操作系统管理和控制下做自己的 工作。 . . 在Linux里处理机有两种运行状态:在核心态,CPU执行操作系统的程序;在用户 态,CPU执行用户程序。这两种运行状态,会在一定时机按需要进行转换。 . Linux把进程定义为是“程序运行的一个实例”。进程竞争并占用系统资源,向 系统提出各种请求服务;进程也是调度单位,任何时刻只有一个进程在CPU上运行。 2. Linux进程实体的组成 . Linux中,每个进程是一个任务(task),有四个部分:进程描述符,即进程控制块; 进程专用的系统堆栈空间;正文段,即供进程执行的程序段;进程专用的数据段和用户 堆栈空间。 Linux进程的四个部分
。进程描述符和核心栈 产生一个新进程时,系统就分配总量为8KB的空间 堆栈 (即两个连续的内存块),用于存放进程描述符和组成系统 进程的核 堆栈。进程因系统调用进入Linux内核时(这时CPU被切换 两个连续的 心栈(7KB) 成核心态),就使用系统堆栈。 物理块(8KB) ,Linux对进程描述符的管理 Linux在内核存储区里开辟一个指针数组 进程描述绮 (IKB) task,长度为NR TASKS,每个数组元素里 存放一个已创建进程的进程描述符地址。即 指针数组task 每个数组元素都指向一个己创建进程的进程 →一个进程描述符 描述符,通过它,就可以找到当前系统中所 个进程描述符 有进程的进程描述符。 3.Linux进程描述符的内容 NR TASKS +一个进程描述符 个元素 在Liux中,进程描述符是一个结构类型的数 据结构:task struct,.主要有以下信息: ·进程标识·进程状态 ·进程调度信息 ·接收的信号·进程家族关系·进程队列指针 CPU的现场保护区 ·与文件系统有关的信息
. 在Linux中,进程描述符是一个结构类型的数 据结构:task_struct,主要有以下信息: 接收的信号 进程队列指针 CPU的现场保护区 与文件系统有关的信息 产生一个新进程时,系统就分配总量为8KB的空间 (即两个连续的内存块),用于存放进程描述符和组成系统 堆栈。进程因系统调用进入Linux内核时(这时CPU被切换 成核心态),就使用系统堆栈。 . . 进程描述符和核心栈 两个连续的 物理块(8KB) 堆栈 进程描述符 进程的核 心栈(7KB) (1KB) Linux对进程描述符的管理 Linux在内核存储区里开辟一个指针数组 task,长度为NR_TASKS,每个数组元素里 存放一个已创建进程的进程描述符地址。即 每个数组元素都指向一个已创建进程的进程 描述符,通过它,就可以找到当前系统中所 有进程的进程描述符。 一个进程描述符 一个进程描述符 NR_TASKS 一个进程描述符 个元素 指针数组task 3. Linux进程描述符的内容 . . 进程标识 . 进程状态 . . . . 进程调度信息 进程家族关系
4.Linux的进程状态 暂停状态、 ,可运行状态:进程已做好了 信号 信号 运行的准备。该状态实际上包含两 可运行状态 个状态,要么在CPU上运行(为执 调度 创健 就绪 执行 僵死状态 行状态),要么已经做好准备,随 被抢宪 终止 时可以投入运行(为就绪状态)。 事件 信号或事件 ·可中断状态:进程由于等待某些条 可中断状态 件,而处于这种阻塞状态,直到那些条件出 不可中断状态 现将其唤醒。 。不可中断状态:这是另外一种阻塞状态。处于这种状态的进程,表示进程不能 被信号中断,而是在等待硬件条件的到来。 。暂停状态:运行进程由于接收到一个信号,执行被暂时停止。处于该状态的进 程,只能由来自另一个进程发来的信号改变成就绪状态。 。僵死状态:进程已经被终止,正在结束中。 5.Linux的进程族系 Liux系统初启时,自动建立系统的第一个进程:初始化进程。之后,所有的进程都 由它以及它的子孙创建。因此,Liux系统中的各个进程,相互之间构成了一个树型的 进程族系
暂停状态:运行进程由于接收到一个信号,执行被暂时停止。处于该状态的进 程,只能由来自另一个进程发来的信号改变成就绪状态。 不可中断状态:这是另外一种阻塞状态。处于这种状态的进程,表示进程不能 被信号中断,而是在等待硬件条件的到来。 可中断状态:进程由于等待某些条 件,而处于这种阻塞状态,直到那些条件出 现将其唤醒。 4. Linux的进程状态 可运行状态:进程已做好了 运行的准备。该状态实际上包含两 个状态,要么在CPU上运行(为执 行状态),要么已经做好准备,随 时可以投入运行(为就绪状态)。 暂停状态 可中断状态 不可中断状态 僵死状态 可运行状态 就绪 执行 调度 被抢先 创建 事件 信号 终止 信号或事件 . 信号 . . . . 僵死状态:进程已经被终止,正在结束中。 5. Linux的进程族系 Linux系统初启时,自动建立系统的第一个进程:初始化进程。之后,所有的进程都 由它以及它的子孙创建。因此,Linux系统中的各个进程,相互之间构成了一个树型的 进程族系
。8.1.2 Linux的进程调度 1.Linux的三种调度策略 。SCHED FIFO一实时进程的先进先出调度策略 SCHED FIFO是一种抢占式的调度策略。原则上,把CPU分给进程后,该进程就 占用CPU直到释放为止。但若在此期间另有更高优先级的FFO进程就绪,那就会把 CPU抢夺过来。若有多个进程都有最高优先级,那就选择等待时间最长的投入运行。 该调度策略适合实时进程,它们对时间性要求较强,每次运行所需的时间较短。 .SCHED RR一实时进程的轮转调度 SCHED RR是一种抢占式的调度策略。分配给进程一个时间片后,若在此期间有 另一个更高优先级的RR进程就绪,那么就允许它抢夺过CPU投入运行。若有多个进程 都具有最高优先级,那就选择其中等待时间最长的投入运行。可见,SCHED RR调度 策略适合于每次运行需要时间较长的实时进程。 .SCHED OTHER一非实时进程的轮转调度 SCHED OTHER是基于动态优先级的轮转调度策略,它适合于交互式的分时应用。 在这种调度策略里,进程的动态优先级用所谓的优先数来表示:优先数越小,相应的 优先级越高。操作系统对核心态进程和对用户态进程,采取不同的方法来改变其优先 数,从而改变优先级
• 8.1.2 Linux的进程调度 1. SCHED_FIFO—实时进程的先进先出调度策略 SCHED_FIFO是一种抢占式的调度策略。原则上,把CPU分给进程后,该进程就 占用CPU直到释放为止。但若在此期间另有更高优先级的FIFO进程就绪,那就会把 CPU抢夺过来。若有多个进程都有最高优先级,那就选择等待时间最长的投入运行。 该调度策略适合实时进程,它们对时间性要求较强,每次运行所需的时间较短。 SCHED_RR—实时进程的轮转调度 SCHED_RR是一种抢占式的调度策略。分配给进程一个时间片后,若在此期间有 另一个更高优先级的RR进程就绪,那么就允许它抢夺过CPU投入运行。若有多个进程 都具有最高优先级,那就选择其中等待时间最长的投入运行。可见,SCHED_RR调度 策略适合于每次运行需要时间较长的实时进程。 SCHED_OTHER—非实时进程的轮转调度 SCHED_OTHER是基于动态优先级的轮转调度策略,它适合于交互式的分时应用。 在这种调度策略里,进程的动态优先级用所谓的优先数来表示:优先数越小,相应的 优先级越高。操作系统对核心态进程和对用户态进程,采取不同的方法来改变其优先 数,从而改变优先级 。 Linux的三种调度策略 . .
2.Linux的等待队列 因某事件等待 的队列头指针 next next NULL 处理各种等待时,Linux把等待 task task task 队列和等待的事件联系在一起。需 要等待事件的进程,根据等待的事 件进入不同的等待队列。 进程描述符 进程描述符 进程描述符 8.1.3 Linux进程间的通信一消息队列 。Liux为进程间的通信提供多种机制,如有消息队列、信号、信号量、管道以及 共享内存储区等。信号用于一个进程向另一个进程发通知,有某个事件发生:信号量 用于进程间取得同步:消息队列、管道、共享存储区,都用于在进程之间传递数据。 ·消息队列是进程间的一种异步通信方法。所谓“异步”,即发送消息的进程在消 息发出之后,不必等待接收进程做出反应,就可以去做其他的事情了。 。在进程间通信前,先要建立消息队列。有了消息队列,进程就可以向(或从)消 息队列发送(或接收)消息了。消息在消息队列里,按照到达的先后顺序排成队。类 型相同的消息,先进入队列的先被接收。Lux对消息的长度没有限制。消息队列使用 完毕后,应该予以释放(即删除)
消息队列是进程间的一种异步通信方法。所谓“异步”,即发送消息的进程在消 息发出之后,不必等待接收进程做出反应,就可以去做其他的事情了。 Linux为进程间的通信提供多种机制,如有消息队列、信号、信号量、管道以及 共享内存储区等。信号用于一个进程向另一个进程发通知,有某个事件发生;信号量 用于进程间取得同步;消息队列、管道、共享存储区,都用于在进程之间传递数据。 处理各种等待时,Linux把等待 队列和等待的事件联系在一起。需 要等待事件的进程,根据等待的事 件进入不同的等待队列。 . 2. Linux的等待队列 因某事件等待 的队列头指针 next task next task NULL task 进程描述符 进程描述符 进程描述符 • 8.1.3 Linux进程间的通信—消息队列 . . 在进程间通信前,先要建立消息队列。有了消息队列,进程就可以向(或从)消 息队列发送(或接收)消息了。消息在消息队列里,按照到达的先后顺序排成队。类 型相同的消息,先进入队列的先被接收。Linux对消息的长度没有限制。消息队列使用 完毕后,应该予以释放(即删除)
8.2 Linux的存储管理 。 8.2.1 Linux的虚拟存储空间 1.Linux的虚拟存储空间 在Liux中,虚拟地址用32个二进制位表示。这意味系统向每个进程提供的虚存 空间,最多可以高达22字节=4GB。 .Liux把4GB的虚拟空间划分为两部分:最高的1GB用于内核本身,称为“系统 空间”,为所有的进程共享:较低的3GB供进程使用,称为“用户空间” 。进程都有自己的正文段,数据段, 堆栈段等。Linux按这种逻辑单位,把虚 进程A的 进程B的 进程N的 拟空间划分成若干分区,然后进行分页。 用户空间 用户空间 用户空间 4GB (3GB) (3GB) (3GB) 这样,进程每一个分区段位于一个连续 的虚拟空间 的虚拟空间里,那里的内容有相同的特 性,有利于对它们分别实行存储保护和 共享的系统空间(3GB) 共享。另外,虚拟空间在各个分区之间 可以不连续。即进程所用的虚拟地址并不一定是连成一片的,可以有空洞存在
进程都有自己的正文段,数据段, 堆栈段等。Linux按这种逻辑单位,把虚 拟空间划分成若干分区,然后进行分页。 这样,进程每一个分区段位于一个连续 的虚拟空间里,那里的内容有相同的特 性,有利于对它们分别实行存储保护和 共享。另外,虚拟空间在各个分区之间 可以不连续。即进程所用的虚拟地址并不一定是连成一片的,可以有空洞存在。 • 8.2.1 Linux的虚拟存储空间 1. Linux的虚拟存储空间 在Linux中,虚拟地址用32个二进制位表示。这意味系统向每个进程提供的虚存 空间,最多可以高达2 32 字节 = 4GB。 8.2 Linux的存储管理 . . Linux把4GB的虚拟空间划分为两部分:最高的1GB用于内核本身,称为“系统 空间”,为所有的进程共享;较低的3GB供进程使用,称为“用户空间”。 . 进程A的 用户空间 (3GB) 进程B的 用户空间 (3GB) 进程N的 用户空间 (3GB) 共享的系统空间(3GB) 4GB 的虚拟空间
2.多级页表的地址变换 .Liux向用户提供的最大虚拟空间为4GB。由于内存块长度是4KB,因此一个虚拟 地址空间最多可有22(4GB/4KB=M)个页面。即用户虚拟地址空间的页表,最多要用一 百万个表项来记录页面与物理块的对应关系,不利于存储空间的利用。 .Liux在对虚拟地址空间进行分页时,采用两级页表的机制:先是对虚拟地址空间 进行分页,形成页表:再对页表进行分页,形成页表的页表。 页面索引号 页号 位移量 32位虚拟地址: pI p2 10位→一 10位一 12位 用户虚拟 地址空间 个页面 页表 页表索引 1M个表项 1024个表项 M个页面口 (1024个页面) 个页面
2. 多级页表的地址变换 Linux向用户提供的最大虚拟空间为4GB。由于内存块长度是4KB,因此一个虚拟 地址空间最多可有2 20(4GB/4KB=1M)个页面。即用户虚拟地址空间的页表,最多要用一 百万个表项来记录页面与物理块的对应关系,不利于存储空间的利用。 . . Linux在对虚拟地址空间进行分页时,采用两级页表的机制:先是对虚拟地址空间 进行分页,形成页表;再对页表进行分页,形成页表的页表。 页面索引号 p1 页号 p2 位移量 32位虚拟地址: d 10位 10位 12位 一个页面 一个页面 用户虚拟 地址空间 1M个页面 1M个表项 (1024个页面) 1024个表项 页表 页表索引
3.二级页表的地址转换过程 。在知道一个虚拟地址后,就可根据地址的前10位,先去查页表索引,以便得到 该索引所对应的页表放在哪一个内存块 。再由地址中间的10位,去查这个页表,得到该页所对应的内存块的起始地址。 ·最后,与位移量d相加后,就得到最终所需要的物理地址。 p2 页表 内存 页表索引 1页 块 索项 p2 表项 1块 物理 地址 页
3. 二级页表的地址转换过程 在知道一个虚拟地址后,就可根据地址的前10位,先去查页表索引,以便得到 该索引所对应的页表放在哪一个内存块。 . . 再由地址中间的10位,去查这个页表,得到该页所对应的内存块的起始地址。 . 最后,与位移量d相加后,就得到最终所需要的物理地址。 p1 p2 d 索引项 页表索引 p1 1页 1页 表项 页表 p2 d 内存 物理 地址 1块 1块
。8.2.2管理虚拟存储空间的数据结构 ,Liux进程的各个分区可以是不连续的,因此形成了若干个离散的虚拟区间。为 了对它们加以管理,定义了vm area_struct型及mm struct型数据结构。 ,vm area_struct用于管理进程的每一个虚拟区间,mm struct用于管理进程的整个 虚拟空间、页表索引和页表。因此,一个进程可以有多个vm area struct?型数据结构, 但只有一个mm struct型数据结构。 vm area struct vm area struct task struct mm struct *mmap *vm next *vm next *ped *vm start *vm start mm map count vm end vm end : 页表 页表索引 一段 一段 虚拟区间 虚拟区间 页表
Linux进程的各个分区可以是不连续的,因此形成了若干个离散的虚拟区间。为 了对它们加以管理,定义了vm_area_struct型及mm_struct型数据结构。 • 8.2.2 管理虚拟存储空间的数据结构 . . vm_area_struct用于管理进程的每一个虚拟区间,mm_struct用于管理进程的整个 虚拟空间、页表索引和页表。因此,一个进程可以有多个vm_area_struct型数据结构, 但只有一个mm_struct型数据结构。 task_struct mm *mmap *pgd map_count mm_struct *vm_next *vm_start vm_end vm_area_struct *vm_next *vm_start vm_end vm_area_struct 一段 虚拟区间 一段 虚拟区间 页表 页表 页表索引