第8章 实例分析-Linux

更新时间:2023-07-23 00:48:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

主讲教师:林

主讲教师:

教授

创始人: Linus Torvalds 里讷斯.托瓦兹出生于芬兰赫尔辛 基市。父亲尼尔斯· 托瓦兹(Nils Torvalds)是一名活跃的共产主义者 及电台记者。托瓦兹家族属于在芬兰 占6%的少数民族芬兰瑞典人。他毕业 于赫尔辛基大学计算机科学系,1997 年至2003年在美国加州硅谷任职于全 美达公司(Transmeta Corporation)参与该公司芯 片的code morph技术研发。后受聘于开源码发展实 验室(OSDL : Open Source Development Labs, Inc),全力开发Linux内核。现任职于Linux基金会。

Linux 名称的来由 Linux 操作系统刚开始时并没有被称作Linux, Linus 给他的操作系统取名为FREAX,这是一个free(自 由)和freak(奇异)的结合词,其含义是怪诞的、怪物、 异想天开等意思。在他将新的操作系统上载到本校的 FTP 服务器上时,管理员Ari Lemke很不喜欢这个名称。 他认为既然是Linus 的操作系统就取其谐音Linux 作为 该操作系统的目录吧,于是Linux 这个名称就开始流传 下来。 在Linus 的自传《Just for Fun》一书中,Linus 解 释说:“坦白地说,我从来没有想到过要用Linux 这个 名称发布这个操作系统,因为这个名字有些太自负了。 而我为最终发布版准备的是什么名字呢? Freax。实际

上,内核代码中某些早期的Makefile - 用于描述如何编 译源代码的文件 - 文件中就已经包含有"Freax"这个名字 了,大约存在了半年左右。但其实这也没什么关系,在 当时还不需要一个名字,因为我还没有向任何人发布过 内核代码。而Ari Lemke,他坚持要用自己的方式将内 核代码放到ftp 站点上,并且非常不喜欢Freax 这个名 字。他坚持要用现在这个名字(Linux),我承认当时我并 没有跟他多争论。但这都是他取的名字。所以我可以光 明正大地说我并不自负,或者部分坦白地说我并没有本 位主义思想。但我想好吧,这也是个好名字,而且以后 为这事我总能说服别人,就想我现在做的这样。"-Linus Torvalds《Just for fun》第84-88 页。

Linux的读法 linux发音五花八门版本颇多,见到和听到的不下10种。 根据linux的创始人Linus Torvalds的说法,Linux的发音和 “Minix”是押韵的。“Li”中“i”的发音类似于“Minix”中“i” 的发音,而“nux”中“u”的发音类似于英文单词“profess” 中“o”的发音。依照国际音标应该是/'linэks/——类似于 “里讷克斯”。但是,由于Linus Torvalds本人是芬兰人, 所以他的Linux读音不是/'linэks/,而是/'liniks/.。 有人综合网上和linux自己的读音,概括出几个自认为 最合适也最通用的读法:/li'n^ks/(“里那克斯”)或 /'li:nэks/(“里讷克斯”)或/li'nju:ks/(“里纽克斯”)。这几个应 该是谁都听得

懂的。至于哪个比较正宗,当然是linux的原 音。但事实上使用linux哪种读法的人似乎都不在少数。

第8章 实例分析: Linux操作系统本章讲述内容: 1. Linux的三种进程调度策略及消息队列; 2. Linux的多级页表地址转换机制 ; 3. Linux的文件系统Ext2和虚拟文件系统 VFS ; 4. Linux对字符设备和块设备的管理

8.1 Linux的处理机管理8.1.1 Linux的进程 1. Linux进程的两种运行模式 . Linux里,当进程运行用户程序时,称为“用 户模式”;当进程运行中出现系统调用或中断 事件,转去执行操作系统内核程序时,称为 “核心模式”。进程在核心模式时,从事资源 管理及各种控制活动;在用户模式时,在操作 系统管理和控制下做自己的工作。 .在Linux里处理机有两种运行状态:在核心态,

CPU执行操作系统的程序;在用户态,CPU执 行用户程序。这两种运行状态,会在一定时机 按需要进行转换。. Linux把进程定义为是“程序运行的一个实 例”。进程竞争并占用系统资源,向系统提出 各种请求服务;进程也是调度单位,任何时刻 只有一个进程在CPU上运行。

2. Linux进程实体的组成. Linux进程的四个部分

在Linux中,每个进程是一个任务(task),有四

个部分: ①进程描述符,即进程控制块; ②进程专用的系统堆栈空间; ③正文段,即供进程执行的程序段; ④进程专用的数据段和用户堆栈空间。.进程描述符和核心栈

每当产生一个新的进程,系统就为其分配 总量为8KB的空间 (即两个连续的内存块),用 于存放进程描述符和组成系统堆栈。如下页图 8-2所示。在进程由于系统调用而进入Linux内

核时(这时CPU被切换成核心态),就会使用为 其开辟的系统堆栈空间。堆栈

两个连续的 物理块(8KB)进程描述符 (1KB)

图8-1 进程描述符和 核心栈的存放空间

. Linux对进程描述符的管理 Linux在内核存储区里开辟一个指针数组task,

长度为NR_TASKS, 指针数组task 每个数组元素里存放 一个进程描述符 一个已创建进程的进 一个进程描述符 程描述符地址。即每 NR_TASKS 一个进程描述符 个元素 个数组元素都指向一 个已创建进程的进程 描述符,通过它,就 图8-2 Linux对进程描述符的管理 可以找到当前系统中 所有进程的进程描述符。通常, NR_TASKS 被定义为512,即限定Linux中可以同时并行工 作的进程数量为512。这样的管理结构如右上 图所示。

3. Linux进程描述符的内容 在Linux中,进程描述符是一个结构类型的 数据结构:task_struct,主要有以下信息: .进程标识 .进程状态 .进程调度信息 .接收的信号 .进程家族关系 .进程队列指针 .CPU的现场保护区 .与文件系统有关的信息

4. Linux的进程状态信

号 信号 如右图示,Linux的 可运行状态 进程有5种状态: 调度 僵死状态 创建 执行 就绪 终止 .可运行状态:进 被抢先 程已做好了运行的 事件 信号或事件 可中断状态 准备。该状态实际 不可中断状态 上包含两个状态, 图8-3 Linux的进程状态及变迁 要么在CPU上运行 (为执行状态),要么已经做好准备,随时 可以投入运行(为就绪状态)。 暂停状态

.可中断状态:进程由于等待某些条件,而处 于这种阻塞状态,直到那些条件出现将其唤醒。

.不可中断状态:这是另外一种阻塞状态。处 于这种状态的进程,表示进程不能被信号中断, 而是在等待硬件条件的到来。.暂停状态:运行进程由于接收到一个信号, 执行被暂时停止。处于该状态的进程,只能由 来自另一个进程发来的信号改变成就绪状态。 .僵死状态:进程已经被终止,正在结束中。

5. Linux的进程族系 Linux系统初启时,自动建立系统的第一个 进程:初始化进程。之后,所有的进程都由它 以及它的子孙创建。因此,Linux系统中的各个 进程,相互之间构成了一个树型的进程族系。8.1.2 Linux的进程调度 1. Linux的三种调度策略 . SCHED_FIFO—实时进程的先进先出调度策略 SCHED_FIFO是一种抢占式的调度策略。原则

上,把CPU分给进程后,该进程就占用CPU直 到释放为止。但若在此期间另有更高优先级的 FIFO进程就绪,那就会把CPU抢夺过来。若有 多个进程都有最高优先级,那就选择等待时间 最长的投入运行。该调度策略适合实时进程, 它们对时间性要求较强,每次运行所需的时间 较短。 . SCHED_RR—实时进程的轮转调度 SCHED_RR是一种抢占式的调度策略。分配给 进程一个时间片后,若在此期间有另一个更高 优先级的RR进程就绪,那么就允许它抢夺过

CPU投入运行。若有多个进程都具有最高优先 级,那就选择其中等待时间最长的投入运行。 可见,SCHED_RR调度策略适合于每次运行需 要时间较长的实时进程。 . SCHED_OTHER—非实时进程的轮转调度 SCHED_OTHER是基于动态优先级的轮转调度 策略,它适合于交互式的分时应用。在这种调 度策略里,进程的动态优先级用所谓的优先数 来表示:优先数越小,相应的优先级越高。操 作系统对核心态进程和对用户态进程,采取不 同的方法来改变其优先数,从而改变优先级 。

2. Linux的等待队列 Linux在处理各种等待时,是把等待队列 和等待的事件联系在一起的。也就是说,需要 等待事件的进程,将根据等待的事件进入不同 的等待队列。如下图所示因某事件等待 的队列头指针 next task next task NULL task

进程描述符 进程描述符

进程描述符

图8-5 Linux中的等待队列

8.1.3 L

inux进程间的通信—消息队列 . Linux为进程间的通信提供多种机制,如有消 息队列、信号、信号量、管道以及共享内存储 区等。信号用于一个进程向另一个进程发通知, 有某个事件发生;信号量用于进程间取得同步; 消息队列、管道、共享存储区,都用于在进程 之间传递数据。.消息队列是进程间的一种异步通信方法。所谓 “异步”,即发送消息的进程在消息发出之后, 不必等待接收进程做出反应,就可以去做其他 的事情了。

.在进程间通信前,先要建立消息队列。有了消 息队列,进程就可以向(或从)消息队列发送 (或接收)消息了。消息在消息队列里,按照 到达的先后顺序排成队。类型相同的消息,先 进入队列的先被接收。Linux对消息的长度没有 限制。消息队列使用完毕后,应该予以释放 (即删除)。

本文来源:https://www.bwwdw.com/article/86zm.html

Top