Linux操作系统源代码详细分析报告

Linux操作系统源代码详细分析报告
Linux操作系统源代码详细分析报告

Linux操作系统源代码详细分析

容简介:

Linux 拥有现代操作系统所有的功能,如真正的抢先式多任务处理、支持多用户,存保护,虚拟存,支持SMP、UP,符合POSIX标准,联网、图形用户接口和桌面环境。具有快速性、稳定性等特点。本书通过分析Linux的核源代码,充分揭示了Linux作为操作系统的核是如何完成保证系统正常运行、协调多个并发进程、管理存等工作的。现实中,能让人自由获取的系统源代码并不多,通过本书的学习,将大大有助于读者编写自己的新程序。

第一部分 Linux 核源代码

arch/i386/kernel/entry.S 2

arch/i386/kernel/init_task.c 8

arch/i386/kernel/irq.c 8

arch/i386/kernel/irq.h 19

arch/i386/kernel/process.c 22

arch/i386/kernel/signal.c 30

arch/i386/kernel/smp.c 38

arch/i386/kernel/time.c 58

arch/i386/kernel/traps.c 65

arch/i386/lib/delay.c 73

arch/i386/mm/fault.c 74

arch/i386/mm/init.c 76

fs/binfmt-elf.c 82

fs/binfmt_java.c 96

fs/exec.c 98

include/asm-generic/smplock.h 107

include/asm-i386/atomic.h 108

include/asm-i386/current.h 109

include/asm-i386/dma.h 109

include/asm-i386/elf.h 113

include/asm-i386/hardirq.h 114

include/asm-i386/page.h 114

include/asm-i386/pgtable.h 115

include/asm-i386/ptrace.h 122

include/asm-i386/semaphore.h 123

include/asm-i386/shmparam.h 124

include/asm-i386/sigcontext.h 125

include/asm-i386/siginfo.h 125

include/asm-i386/signal.h 127

include/asm-i386/smp.h 130

include/asm-i386/softirq.h 132

include/asm-i386/spinlock.h 133

include/asm-i386/system.h 137

include/asm-i386/uaccess.h 139

include/linux/capability.h 147 include/linux/elf.h 150

include/linux/elfcore.h 156 include/linux/interrupt.h 157 include/linux/kernel.h 158 include/linux/kernel_stat.h 159 include/linux/limits.h 160 include/linux/mm.h 160

include/linux/module.h 164 include/linux/msg.h 168

include/linux/personality.h 169 include/linux/reboot.h 169 include/linux/resource.h 170 include/linux/sched.h 171 include/linux/sem.h 179

include/linux/shm.h 180

include/linux/signal.h 181 include/linux/slab.h 184 include/linux/smp.h 184

include/linux/smp_lock.h 185 include/linux/swap.h 185 include/linux/swapctl.h 187 include/linux/sysctl.h 188 include/linux/tasks.h 194 include/linux/time.h 194 include/linux/timer.h 195 include/linux/times.h 196 include/linux/tqueue.h 196 include/linux/wait.h 198

init/main.c 198

init/version.c 212

ipc/msg.c 213

ipc/sem.c 218

ipc/shm.c 227

ipc/util.c 236

kernel/capability.c 237

kernel/dma.c 240

kernel/exec_domain.c 241

kernel/exit.c 242

kernel/fork.c 248

kernel/info.c 255

kernel/itimer.c 255

kernel/kmod.c 257

kernel/module.c 259

kernel/panic.c 270

kernel/sched.c 275

kernel/signal.c 295

kernel/softirq.c 307

kernel/sys.c 307

kernel/sysctl.c 318

kernel/time.c 330

mm/memory.c 335

mm/mlock.c 345

mm/mmap.c 348

mm/mprotect.c 358

mm/mremap.c 361

mm/page_alloc.c 363

mm/page_io.c 368

mm/slab.c 372

mm/swap.c 394

mm/swap_state.c 395

mm/swapfile.c 398

mm/vmalloc.c 406

mm/vmscan.c 409

第二部分 Linux 核源代码分析

第1章 Linux 简介

让用户很详细地了解大多数现有操作系统的实际工作方式是不可能的,因为大多数操作系统的源代码都是严格的。除了一些研究用的及为操作系统教学而设计的系统外。尽管研究和教学目的都很好,但是这类系统很少能够通过对正式操作系统的小部分实现来体现操作系统的实际功能。对于操作系统的一些特殊问题,这种折衷系统所能够表现的就更是少得可怜了。

在以实际使用为目标的操作系统中,让任何人都可以自由获取系统源代码,无论目的是要了解、学习还是改进,这样的现实系统并不多。本书的主题就是这些少数操作系统中的一个:Linux。

Linux的工作方式类似于Uinx,它是免费的,源代码也是开放的,符合标准规的32位(在64位CPU上是64位)操作系统。Linux拥有现代操作系统的所具有的容,例如:

* 真正的抢先式多任务处理,支持多用户。

* 存保护。

* 虚拟存。

* 支持对称多处理机SMP(symmetric multiprocessing),即多个CPU机器以及通常的单CPU(UP)机器。

* 符合POSIX标准。

* 联网。

* 图形用户接口和桌面环境(实际上桌面环境并不只一个)。

* 速度和稳定性。

严格说来,Linux并不是一个完整的操作系统。当我们在安装通常所说的Linux时,我们实际安装的是很多工具的集合。这些工具协同工作以组成一个功能强大的实用系统。Linux本身只是这个操作系统的核,是操作系统的心脏、灵魂、指挥中心(整个系统应该称为GNU/Linux,其原因在本章的后续容中将会给以介绍)。核以独占的方式执行最底层任务,保证系统正常运行—协调多个并发进程,管理进程使用的存,使它们相互之间不产生冲突,满足进程访问磁盘的请求等等。

在本书中,我们给大家揭示的就是Linux是如何完成这一具有挑战性的工作的。

1.1 Linux和Unix的简明历史

为了让大家对本书所讨论的容有更清楚的了解,让我们先来简要回顾一下Linux的历史。由于Linux是在Unix的基础上发展而来的,我们的话题就从Unix开始。

Unix是由AT&T贝尔实验室的Ken Thompson和Dennis Ritchie于1969年在一台已经废弃了的PDP-7上开发的;它最初是一个用汇编语言写成的单用户操作系统。不久,Thompson和Ritchie成功地说服管理部门为他们购买更新的机器,以便该开发小组可以实现一个文本处理系统,Unix就在PDP-11上用C语言重新编写(发明C语言的部分目的就在于此)。它果真变成了一个文本处理系统—不久之后。只不过问题是他们先实现了一个操作系统而已……

最终,他们实现了该文本处理工具,而且Unix(以及Unix上运行的工具)也在AT&T得到广泛应用。在1973年,Thompson和Ritchie在一个操作系统会议上就这个系统发表了一篇论文,该论文引起了学术界对Unix系统的极大兴趣。

由于1956年反托拉斯法案的限制,AT&T不能涉足计算机业务,但允许它象征性地收取费用发售该系统。就这样,Unix被广泛发布,首先是学术科研用户,后来又扩展到政府和商业用户。

伯克利加州大学是学术用户中的一个。在这里,Unix得到了计算机系统研究小组(CSRG)的广泛应用。并且在这里所进行的修改引发了Unix的一大系列,这就是广为人知的伯克利软件开发(BSD)Unix。除了AT&T 所提供的Unix系列之外,BSD是最有影响力的Unix系列。BSD在Unix中增加了很多显著特性,例如TCP/IP 网络,更好的用户文件系统(UFS),工作控制,并且改进了AT&T的存管理代码。

多年以来,BSD版本的Unix一直在学术环境中占据主导地位,但最终发展成为System V版本的AT&T的Unix则成为商业领域的领头羊。从某种程度上来说,这是有社会原因的:学校倾向于使用非正式但通常更好用的BSD风格的Unix,而商业界则倾向于从AT&T获取Unix。

在用户需求和用户编程改进特性的促进下,BSD风格的Unix一般要比AT&T的Unix更具有创新性,而且改进也更为迅速。但是,在AT&T发布最后一个正式版本System V Release 4(SVR4)时,System V Unix 已经吸收了BSD的大多数重要的优点,并且还增加了一些自己的优势。这部分由于从1984年开始,AT&T 逐渐可以将Unix商业化,而伯克利Unix的开发工作在1993年BSD4.4版本完成以后就逐渐收缩,以至终止了。然而,BSD的进一步改进由外界开发者延续下来,到今天还在继续进行。正在进行的Unix系列开发中至少有四个独立的版本是直接起源于BSD4.4,这还不包括几个厂商的Unix版本,例如惠普的HP-UX,都是部分地或者全部基于BSD而发展起来的。

实际上Unix的变种并不止BSD和System V。由于Unix主要使用C语言来编写,这就使得它移植到新的机器上相对比较容易,它的简单性也使其重新设计与开发相对比较容易。Unix的这些特点大受商业界硬件供应商的欢迎,比如Sun、SGI、HP、IBM、DEC、Amdahl等等;IBM还不止一次对Unix进行了再开发。厂商们设计开发出新的硬件,并简单地将Unix移植到新的硬件上,这样新的硬件一经发布便具备一定的功能。经过一段时间之后,这些厂商都拥有了自己的专有Unix版本。而且为了占有市场,这些版本故意以不同的侧重点发布出来,以更好地占有用户。

版本混乱的状态促进了标准化工作的进行。其中最主要的就是POSIX系列标准,它定义了一套标准的操作系统接口和工具。从理论上说,POSIX标准代码很容易移植到任何遵守POSIX标准的操作系统中,而且严格的POSIX测试已经把这种理论上的可移植性转化为现实。直到今天,几乎所有的正式操作系统都以支持POSIX标准为目标。

现在让我们回顾一下,在1984年,杰出的电脑黑客Richard Stallman独立开发出一个类Unix的操作系统,该操作系统具有完全的核、开发工具和终端用户应用程序。在GNU(“GNU誷 Not Unix”首字母的缩写)计划的配合下,Stallman开发这个产品有自己的技术理想:他想开发出一个质量高而且自由的操作系统。Stallman使用了“自由”(free)这个词,不仅意味着用户可以免费获取软件;而且更重要的是,它将意味着某种程度的“解放”:用户可以自由使用、拷贝、查询、重用、修改甚至是分发这份软件,完全没有软件使用协议的限制。这也正是Stallman创建自由软件基金会(FSF)资助GNU软件开发的本意(FSF 也在资助其他科研方面的开发工作)。

15年来,GNU工程已经吸收、产生了大量的程序,这不仅包括Emacs、gcc(GNU的C编译器)、bash(shell 命令),还有大部分Linux用户所熟知的许多应用程序。现在正在进行开发的项目是GNU Hurd核,这是GNU 操作系统的最后一个主要部件(实际上Hurd核早已能够使用了,不过当前的版本号为0.3的系统在什么时候能够完成,还是未知数)。

尽管Linux大受欢迎,但是Hurd核还在继续开发。原因有几个方面,其一是Hurd的体系结构十分清晰地体现了Stallman关于操作系统工作方式的思想,例如,在运行期间,任何用户都可以部分地改变或替换Hurd(这种替换不是对每个用户都是可见的,而是只对申请修改的用户可见,而且还必须符合安全规)。

动,因为程序员们希望能够自由地进行自己所喜欢的工作。只要有人希望为Hurd工作,Hurd的开发就不会停止。如果他们能够如愿以偿,Hurd有朝一日将成为Linux的强劲对手。不过在今天,Linux还是自由核王国里无可争议的统治者。

在GNU发展的中期,也就是1991年,一个名叫Linus Torvalds的芬兰大学生想要了解Intel的新CPU—80386。他认为比较好的学习方法是自己编写一个操作系统的核。出于这种目的,加上他对当时Unix变种版本对于80386类机器的脆弱支持十分不满,他决定要开发出一个全功能的、支持POSIX标准的、类Unix 的操作系统核,该系统吸收了BSD和System V的优点,同时摒弃了它们的缺点。Linus(虽然我知道我应该称他为Torvalds,但是所有人都称他为Linus)独立把这个核开发到0.02版,这个版本已经可以运行gcc、bash和很少的一些应用程序。这些就是他开始的全部工作了。后来,他又开始在因特网上寻求广泛的帮助。

不到三年,Linus的Unix—Linux,已经升级到1.0版本。它的源代码量也呈指数形式增长,实现了基本的TCP/IP功能(网络部分的代码后来重写过,而且还可能会再次重写)。此时Linux就已经拥有大约10万用户了。

现在的Linux核由150多万行代码组成,Linux也已经拥有了大约1000万用户(由于Linux可以自由获取和拷贝,获取具体的统计数字是不可能的)。Linux核GNU/Linux附同GNU工具已经占据了Unix 50%的市场。一些公司正在把核和一些应用程序同安装软件打包在一起,生产出Linux的发行版本,这些公司包括Red Hat和Caldera 公司。现在的GNU/Linux已经备受瞩目,得到了诸如Sun、IBM、SGI等公司的广泛支持。SGI最近决定在其基于Intel的Merced的系列机器上不再搭载自己的Unix变种版本IRIX,而是直接采用GNU/Linux;Linux甚至被指定为Amiga将要发布的新操作系统的基础。

1.2 GNU通用公共许可证

中国

这样一个如此流行的操作系统当然值得我们学习。按照通用公共许可证(GPL,General Public License)的规定,Linux的源代码可以自由获取,这满足了我们学习该系统的强烈愿望。GPL这份非同寻常的软件许可证,充分体现了上面提到的Stallman的思想:只要用户所做的修改是同等自由的,用户可以自由地使用、拷贝、查询、重用、修改甚至重新发布这个软件。通过这种方式,GPL保证了Linux(以及同一许可证保证下的大量其他软件)不仅现在自由可用,而且以后经过任何修改之后都仍然可以自由使用。

请注意这里的自由并不是说没有人靠这个软件盈利,有一些日益兴起的公司,比如发行最流行的Linux发行版本的Red Hat就是一个例子(Red Hat自从上市以来,市值已经突破数十亿美元,每年盈利数十万美元,而且这些数字还在不断增长)。但是任何人都不能限制其他用户涉足本软件领域,而且所做的修改不能减少其自由程度。

本书的附录B中收录了GNU通用公共许可证协议的全文。

1.3 Linux开发过程

中国

如上所述,由于Linux是一个自由软件,它可以免费获取以供学习研究。Linux之所以值得学习研究,是因为它是相当优秀的操作系统。如果Linux操作系统相当糟糕,那它就根本不值得我们使用,也就没有必要去研究相关的书籍。Linux是一个十分优秀的操作系统还在于几个相互关联的原因。

原因之一在于它是基于天才的思想开发而成的。在学生时代就开始推动整个系统开发的Linus Torvalds 是一个天才,他的才能不仅展现在编程能力方面,而且组织技巧也相当杰出。Linux的核是由世界上一些最优秀的程序员开发并不断完善的,他们通过Internet相互协作,开发理想的操作系统;他们享受着工作中的乐趣,而且也获得了充分的自豪感。中国

Linux优秀的另外一个原因在于它是基于一组优秀的概念。Unix是一个简单却非常优秀的模型。在Linux 创建之前,Unix已经有20年的发展历史。Linux从Unix的各个流派中不断吸取成功经验,模仿Unix的优点,抛弃Unix的缺点。这样做的结果是Linux 成为了Unix系列中的佼佼者:高速、健壮、完整,而且抛弃了历史包袱。

然而,Linux最强大的生命力还在于其公开的开发过程。每个人都可以自由获取核源程序,每个人都可以对源程序加以修改,而后他人也可以自由获取你修改后的源程序。如果你发现了缺陷,你可以对它进行修正,而不用去乞求不知名的公司来为你修正。如果你有什么最优化或者新特点的创意,你也可以直接在系统中增加功能,而不用向操作系统供应商解释你的想法,指望他们将来会增加相应的功能。当发现一个安全漏洞后,你可以通过编程来弥补这个漏洞,而不用关闭系统直到你的供应商为你提供修补程序。由于你拥有直接访问源代码的能力,你也可以直接阅读代码来寻找缺陷,或是效率不高的代码,或是安全漏洞,以防患于未然。

除非你是一个程序员,否则这一点听起来仿佛没有多少吸引力。实际上,即使你不是程序员,这种开发模型也将使你受益匪浅,这主要体现在以下两个方面:

* 可以间接受益于世界各地成千上万的程序员随时进行的改进工作。

* 如果你需要对系统进行修改,你可以雇用程序员为你完成工作。这部分人将根据你的需求定义单独为你服务。可以设想,这在源程序不公开的操作系统中将是什么样子。

Linux这种独特的自由流畅的开发模型已被命名为bazaar(集市模型),它是相对于cathedral(教堂)模

为能够发行一个新版本,这个新版本才会被推向市场。这些术语在Eric S. Raymond的《教堂与集市》(The Cathedral and the Bazaar)一文中有所介绍,大家可以在https://www.360docs.net/doc/2115568484.html,/~esr/writings/找到这篇文章。bazaar开发模型通过重视实验,征集并充分利用早期的反馈,对巨大数量的脑力资源进行平衡配置,可以开发出更优秀的软件。(顺便说一下,虽然Linux是最为明显的使用bazaar开发模型的例子,但是它却远不是第一个使用这个模型的系统。)

为了确保这些无序的开发过程能够有序地进行,Linux采用了双树系统。一个树是稳定树(stable tree),另一个树是非稳定树(unstable tree)或者开发树(development tree)。一些新特性、实验性改进等都将首先在开发树中进行。如果在开发树中所做的改进也可以应用于稳定树,那么在开发树中经过测试以后,在稳定树中将进行相同的改进。按照Linus的观点,一旦开发树经过了足够的发展,开发树就会成为新的稳定树,如此周而复始的进行下去。

源程序版本号的形式为x.y.z。对于稳定树来说,y是偶数;对于开发树来说,y比相应的稳定树大一(因此,是奇数)。截至到本书截稿时,最新的稳定核版本号是2.2.10,最新的开发核的版本号是2.3.12。对2.3树的缺陷修正会回溯影响(back-propagated)2.2树,而当2.3树足够成熟的时候会发展成为2.4.0。(顺便说一下,这种开发会比常规惯例要快,因为每一版本所包含的改变比以前更少了,核开发人员只需花很短的时间就能够完成一个实验开发周期。) https://www.360docs.net/doc/2115568484.html,及其镜像站点提供了最新的可供下载的核版本,而且同时包括稳定和开发版本。如果你愿意的话,不需要很长时间,这些站点所提供的最新版本中就可能包含了你的一部分源程序代码。

中国

第2章代码初识

本章首先从较高层次介绍Linux核源程序的概况,这些都是大家关心的一些基本特点。随后将简要介绍一些实际代码。最后介绍如何编译核。

2.1 Linux核源程序的部分特点

在过去的一段时期,Linux核同时使用C语言和汇编语言来实现。这两种语言需要一定的平衡:C语言编写的代码移植性较好、易于维护,而汇编语言编写的程序则速度较快。一般只有在速度是关键因素或者一些因平台相关特性而产生的特殊要求(例如直接和存管理硬件进行通讯)时才使用汇编语言。

正如实际中所做的,即使核并未使用C++的对象特性,部分核也可以在g++(GNU的C++编译器)下进行编译。同其他面向对象的编程语言相比较,相对而言C++的开销是较低的,但是对于核开发人员来说,这已经是太多了。

核开发人员不断发展编程风格,形成了Linux代码独有的特色。本节将讨论其中的一些问题。

2.1.1 gcc特性的使用

Linux核被设计为必须使用GNU的C编译器gcc来编译,而不是任何一种C编译器都可以使用。核代码有时要使用gcc特性,本书将陆续介绍其中的一部分。

一些gcc特有代码只是简单地使用gcc语言扩展,例如允许在C(不只是C++)中使用inline关键字(注释:一、inline 关键字用来定义一个类的联函数,引入它的主要原因是用它替代C中表达式形式的宏定义。表达式形式的宏定义一例:#define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2))

为什么要取代这种形式呢,且听我道来:

1.首先谈一下在C中使用这种形式宏定义的原因,C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的操作,因此,效率很高,这是它在C中被使用的一个主要原因。

2.这种宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型,这样,它的使用就存在着一系列的隐患和局限性。

3.在C++中引入了类及类的访问控制,这样,如果一个操作或者说一个表达式涉及到类的保护成员或私有成员,你就不可能使用这种宏定义来实现(因为无法将this指针放在合适的位置)。

4. inline 推出的目的,也正是为了取代这种表达式形式的宏定义,它消除了它的缺点,同时又很好地继承了它的优点。

为什么inline能很好地取代表达式形式的预定义呢?

对应于上面的1-3点,阐述如下:

1. inline 定义的类的联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高。

2.很明显,类的联函数也是一个真正的函数,编译器在调用一个联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。

3. inline 可以作为某个类的成员函数,当然就可以在其中使用所在类的保护成员及私有成员。

在何时使用inline函数:

首先,你可以使用inline函数完全取代表达式形式的宏定义。

另外要注意,联函数一般只会用在函数容非常简单的时候,这是因为,联函数的代码会在任何调用它的地方展开,如果函数太复杂,代码膨胀带来的恶果很可能会大于效率的提高带来的益处。联函数最重要的使用地方是用于类的存取函数。

如何使用类的inline函数:

简单提一下inline 的使用吧:

1.在类中定义这种函数:

class ClassName{

.....

....

GetWidth(){return m_lPicWidth;}; // 如果在类中直接定义,可以不使用inline修饰

....

....

}

2.在类中声明,在类外定义:

.....

....

GetWidth(); // 如果在类中直接定义,可以不使用inline修饰

....

....

}

inline return_type ClassName::GetWidth(){

return m_lPicWidth;

}

二、使用inline联函数替代宏调用

对于频繁使用的函数,C语言建议使用宏调用代替函数调用以加快代码执行,减少调用开销。但是宏调用有许多的弊端,可能引起不期望的副作用。例如宏:#define abs(a)((a)<0?(-a):(a)),当使用abs(i++)时,这个宏就会出错。

所以在C++中应该使用inline联函数替代宏调用,这样既可达到宏调用的目的,又避免了宏调用的弊端。

使用联函数只须把inline关键字放在函数返回类型的前面。例如:

inline int Add(int a,int b);//声明Add()为联函数

这样编译器在遇到Add()函数时,就不再进行函数调用,而是直接嵌入函数代码以加快程序的执行。

)指示联函数。也就是说,代码中被调用的函数在每次函数调用时都会被扩充,因而就可以节约实际函数调用的开销。

一般情况下,代码的编写方式比较复杂。因为对于某些类型的输入,gcc能够产生比其他输入效率更高的执行代码。从理论上讲,编译器可以优化具有相同功能的两种对等的方法,并且得到相同的结果。因此,代码的编写方式是无关紧要的。但在实际上,用某种方法编写所产生的代码要比用另外一些方法编写所产生的代码执行速度快许多。核开发人员知道怎样才能产生更高效的执行代码,这不断地在他们编写的代码中反映出来。

例如,考虑核中经常使用的goto语句—为了提高速度,核中经常大量使用这种一般要避免使用的语句。在本书中所包含的不到40 000行代码中,一共有500多条goto语句,大约是每80行一个。除汇编文件外,精确的统计数字是接近每72行一个goto语句。公平地说,这是选择偏向的结果:比例如此高的原因之一是本书中涉及的是核源程序的核心,在这里速度比其他因素都需要优先考虑。整个核的比例大概是每260行一个goto语句。然而,这仍然是我不再使用Basic进行编程以来见过的使用goto频率最高的地方。

代码必需受特定编译器限制的特性不仅与普通应用程序的开发有很大不同,而且也不同于大多数核的开发。大多数的开发人员使用C语言编写代码来保持较高的可移植性,即使在编写操作系统时也是如此。这样做的优点是显而易见的,最为重要的一点是一旦出现更好的编译器,程序员们可以随时进行更换。

核对于gcc特性的完全依赖使得核向新的编译器上移植更加困难。最近Linus对这一问题在有关核的列表上表明了自己的观点:“记住,编译器只是一个工具。”这是对依赖于gcc特性的一个很好的基本思想的表述:编译器只是为了完成工作。如果通过遵守标准还不能达到工作要求,那么就不是工作要求有问题,而是对于标准的依赖有问题。

在大多数情况下,这种观点是不能被人所接受的。通常情况下,为了保证和程序语言标准的一致,开发人员可能需要牺牲某些特性、速度或者其他相关因素。其他的选择可能会为后期开发造成很大的麻烦。

但是,在这种特定的情况下,Linus是正确的。Linux核是一个特例,因为其执行速度要比向其他编译器的可移植性远为重要。如果设计目标是编写一个可移植性好而不要求快速运行的核,或者是编写一个任何人都可以使用自己喜欢的编译器进行编译的核,那么结论就可能会有所不同了;而这些恰好不是Linux的设计目标。实际上,gcc几乎可以为所有能够运行Linux的CPU生成代码,因此,对于gcc的依赖并不是可移植性的严重障碍。

在第3章中我们将对核设计目标进行详细说明。

2.1.2 核代码习惯用语

核代码中使用了一些显著的习惯用语,本节将介绍常用的几个。当通读源代码时,真正重要的问题并不在这些习惯用语本身,而是这种类型的习惯用语的确存在,而且是不断被使用和发展的。如果你需要编写核代码,你应该注意到核中所使用的习惯用语,并把这些习惯用语应用到你的代码中。当通读本书(或者代码)时,看看你还能找到多少习惯用语。

为了讨论这些习惯用语,我们首先需要对它们进行命名。为了便于讨论,笔者创造了这些名字。而在实际中,大家不一定非要参考这些用语,它们只是对核工作方式的描述而已。

一个普通的习惯用语,笔者称之为“资源获取”(resource acquisition idiom)。在这个用语中,一个函数必须实现一系列资源的获取,包括存、锁等等(这些资源的类型未必相同)。只有成功地获取当前所需要的资源之后,才能处理后面的资源请求。最后,该函数还必须释放所有已经获取的资源,而不必考虑没有获取的资源。

我采用“错误变量”这一用语(error variable idiom)来辅助说明资源获取用语,它使用一个临时变量来记录函数的期望返回值。当然,相当多的函数都能实现这个功能。但是错误变量的不同点在于它通常是用来处理由于速度的因素而变得非常复杂的流程控制中的问题。错误变量有两个典型的值,0(表示成功)和负数(表示有错)。

如果执行到标号out2,则都已经获取了r1和r2资源,而且也都需要进行释放。如果执行到标号out1(不管是顺序执行还是使用goto语句进行跳转到),则r2资源是无效的(也可能刚被释放),但是r1资源却是有效的,而且必需在此将其释放。同理,如果标号out能被执行,则r1和r2资源都无效,err所返回的是错误或成功标志。

在这个简单的例子中,对err的一些赋值是没有必要的。在实践中,实际代码必须遵守这种模式。这样做的原因主要在于同一行中可能包含有多种测试,而这些测试应该返回相同的错误代码,因此对错误变量统一赋值要比多次赋值更为简单。虽然在这个例子中对于这种属性的必要性并不非常迫切,但是我还是倾向于保留这种特点。有关的实际应用可以参考sys_shmctl(第21654行),在第9章中还将详细介绍这个例子。

2.1.3 减少#if和#ifdef的使用

现在的Linux核已经移植到不同的平台上,但是我们还必须解决移植过程中所出现的问题。大部分支持各种不同平台的代码由于包含许多预处理代码而已经变得非常不规,例如:

这个例子试图实现操作系统的可移植性,虽然Linux关注的焦点很明显是实现代码在各种CPU上的可移植性,但是二者的基本原理是一致的。对于这类问题来说,预处理器是一种错误的解决方式。这些杂乱的问题使得代码晦涩难懂。更为糟糕的是,增加对新平台的支持有可能要求重新遍历这些杂乱分布的低质量代码段(实际上你很难能找到这类代码段的全部)。

中国

与现有方式不同的是,Linux一般通过简单函数(或者是宏)调用来抽象出不同平台间的差异。核的移植可以通过实现适合于相应平台的函数(或宏)来实现。这样不仅使代码的主体简单易懂,而且在移植的过程中还可以比较容易地自动检测出你没有注意到的容:如引用未声明函数时会出现错误。有时用预处理器来支持不同的体系结构,但这种方式并不常用,而相对于代码风格的变化就更是微不足道了。

顺便说一下,我们可以注意到这种解决方法和使用用户对象(或者C语言中充满函数指针的struct结构)来代替离散的switch语句处理不同类型的方法十分相似。在某些层次上,这些问题和解决方法是统一的。

可移植性的问题并不仅限于平台和CPU的移植,编译器也是一个重要的问题。此处为了简化,假设Linux 只使用gcc来编译。由于Linux只使用同一个编译器,所以就没有必要使用#if块(或者#ifdef块)来选择不同的编译器。

核代码主要使用#ifdef来区分需要编译或不需要编译的部分,从而对不同的结构提供支持。例如,代码经常测试SMP宏是否定义过,从而决定是否支持SMP机。

2.2 代码样例

了解Linux代码风格最好的方法就是实际研究一下它的部分代码。即使你不完全理解本节所讨论代码的细节也无关紧要,毕竟本节的主要目的不是理解代码,一些读者可以只对本节进行浏览。本节的主要目的是让读者对Linux代码进行初步了解,为今后的工作提供必要基础。该讨论将涉及部分广泛使用的核代码。

2.2.1 printk

printk(25836行)是核部消息日志记录函数。在出现诸如核检测到其数据结构出现不一致的事件时,核会使用printk把相关信息打印到系统控制台上。对于printk的调用一般分为如下几类:

* 紧急事件(emergency)—例如,panic函数(25563行)多次使用了printk。当核检测到发生不可恢复的部错误时就会调用panic函数,然后尽其所能地安全关闭计算机。这个函数中调用printk以提示用户系统将要关闭。

* 调试—从3816行开始的#ifdef块使用printk来打印SMP逻辑单元(box)中每一个处理器的相关配置信息,但是此过程只有在使用SMP_DEBUG标志编译代码的情况下才能够被执行。

* 普通信息—例如,当机器启动时,核必须估计系统速度以确保设备驱动程序能够忙等待(busy-wait)一个精确的极短周期。计算这种估计值的函数名为calibrate_delay(19654行),它既在19661行使用printk声明马上开始计算,又在19693行报告计算结果。另外,在第4章将详细的介绍calibrate_delay 函数。

如果你已经浏览过这些参照行,你可能已经注意到printk和printf的参数十分类似:一个格式化字符串,后跟零个或者多个参数加入字符串中。格式化字符串可能是以一组“”开始,这里的N是从0到7的数字,包括0和7在。数字区分了消息的日志等级(log level),只有当日志等级高于当前控制台定义的日志等级(console_loglevel,25650行)时,才会打印消息。root可以通过适当减小控制台的日志等级来过滤不是很紧急的消息。如果核在格式化字符串中检测不到日志等级序列,那么就会一直打印消息(实际上,日志等级序列并不一定要在格式化字符串中出现,可以在格式化文本中查找到它的代码)。

从14946行开始的#define块说明了这些特殊序列,这些定义可以帮助调用者正确区分对printk的调用。简单地说,我称日志等级0到4为“紧急事件”,等级5到等级6为“普通信息”,等级7自然就是我所说的“调试”(这种分类方法并不意味着其他更好的分类方法没有用处,而只是目前我们还不关心它而已)。在上面讨论的基础上,我们研究一下代码本身。

printk

25836:参数fmt是printf类型的格式化字符串。如果你对“...”部分的容不熟悉,那就需要参阅一本好的C语言参考书(在其索引中查找“变参函数,variadic function”)。另外,在安装的GNU/Linux中的stdarg帮助里也包含了一个有关变参函数的简明描述,在这儿只需要敲入“man stdarg”就可以看到。

简单地说,“...”部分提示编译器fmt后面可能紧跟着数量不定的任何类型的参数。由于这些参数在编译的时候还没有类型和名字,核使用由三个宏va_start、va_arg和va_end组成的特殊组及一个特殊类型—va_list对它们进行处理。

25842:msg_level记录了当前消息的日志等级。它是静态的,这看起来可能会有些奇怪—为什么下一次对printk的调用需要记录日志等级呢?问题的答案是只有打印出新行(\n)或者赋给一个新的日志等级序列以后,当前消息才会结束。这样,通过在包含消息结束的新行里调用printk,就保证了在多个短期冲突的情况下,调用者只打印唯一一个长消息。

25845:在SMP逻辑单元中,核可能试图从不同的CPU向控制台同时打印信息(有时在单处理机(UP)逻辑单元中也会发生同样问题,但由于中断还未被覆盖掉,所以问题也并不十分明显)。如果不进行任何协同的话,结果就将处于完全无法让人了解的杂乱无章的状态,每个消息的各个部分都和其他消息的各个部分混杂交织在一起。

相反,核使用旋转锁(spin-lock)来控制对控制台的访问。旋转锁将在第10章进行深入介绍。

如果你对flags 在传送给spin_lock_irqsave之前为什么不对它初始化感到疑惑,请不要担心:spin_lock_irqsave(对于不同的版本请分别参看12614行,12637行,12716行和12837行)是一个宏,而不是一个函数。该宏实际上是将值写入flags中,而不是从flags中读出值(在25895行中,存储在flags 中的信息被spin_unlock_irqrestore回读,请参看12616行,12639行,12728行和12841行)。

25846:初始化变量args,该变量代表printk参数中的“...”部分。

25848:调用核自身的vsprintf(为节省空间而省略)实现。该函数的功能与标准vsprintf函数非常相似,向buf中写入格式化文本(25634行)并返回写入字符串的长度(长度不包括最后一位终止字符0字节)。很快,你将可以看到为什么这种机制会忽略buf的前三个字符。

(正如25847行的注释中所述)我们应该注意到在这里并没有采取严格的措施来保证缓冲器不会过载。这里系统假定1024个字符长度的buf已经足够使用(参阅25634行)。如果核在这里能够使用vsnprintf函数的话,情况就会好许多。然而,vsnprintf还有另外一个参数限制了它能够写入缓冲器的字符长度。

25849:计算buf中最近使用的元素,调用va_end终止对“...”参数的处理。

次循环开始,都开始一个新的打印行。由于通常情况下printk只用于打印单行,所以在每次调用中,这种循环通常只执行一次。

25853:如果预先不知道消息的日志等级,printk会检查当前行是否以日志等级序列开头。

25860:如果不是,buf中开始未使用的三个字符就能够起作用了(第一次以后的每次循环,都会覆盖部分消息文本,但是这样并不会引起问题,因为这里的文本只是前面行中的一部分,它们已经被打印过,而且以后也不再需要了)。这样,就可以将日志等级插入buf中。中国

25866:此处有如下属性:p指向日志等级序列(消息文本紧随其后),msg指向消息文本—请注意25852行和25865行中对msg的赋值。中国

由于已知p用来指示日志等级序列的开头—该日志等级序列可能是由函数自身所创建的,日志等级可以从p中抽出并存到msg_level中。

25868:没有检测到新行,清空line_feed标志。

25869:这是前面谈到过的循环,循环将运行到本行结束(也就是检测到新行标志)或者缓冲器的末尾为止。

25870:除了将消息打印到控制台之外,printk还能够记录最近打印的长度为LOG_ BUF_LEN的字符组(LOG_BUF_LEN为16K,请参看25632行)。如果在控制台打开之前,核就已经调用printk,则显然不能在控制台上正确打印消息,但是这些消息将被尽可能地存储到log_buf中(25656行)。当控制台打开以后,缓存在log_buf中的数据就可以转储并在控制台上打印出来,请参看25988行。

log_buf是一个循环缓冲器,log_start和log_size变量(25657行和25646行)分别记录当前缓冲器的开始位置和长度。本行中的按位与(AND)操作实际上是快速求模(%)运算,它的正确性依赖于LOG_BUF_LEN 的值是2的幂。

中国

25872:保存变量跟踪记录循环日志的值。显然,日志大小会不断增长,直至达到LOG_BUF_LEN的值为止。此后,log_size将保持不变,而插入新字符将导致log_start的增长。

25878:请注意logged_chars(25658行)记录从机器启动之后由printk写入的所有字符的长度,它在每次循环中都会被更新,而不是在循环结束后才改变一次。基于同样的道理,log_start和log_size的处理方式也是一样。这实际上是一种优化的时机,本书将在结束对函数的介绍之后再对它进行详细讨论。

25879:消息被分为若干行,这当然要使用新行标志符来进行分割。一旦核检测到新行标志符,就写入一个完整行,从而循环的执行也可以提前终止。

25884:在这里我们先不考虑部循环是否会提前退出,从msg到p的字符序列是专门提供给控制台使用的(这种字符序列我称之为行,但是不要忘了,这里的行可能并不意味着新行终止,因为buf也许还没有终止)。如果该行的日志等级高于系统控制台定义的日志等级,而且当前又有控制台可供打印,那么就能够正确打印该行。(记住,printk可能在所有控制台打开之前就已经被调用过了。)

如果在该消息块中没有发现日志等级序列,并且在前面的printk调用中也没有对msg_level赋值,那么本行中的msg_level就是-1。由于console_loglevel总不小于1(除非root通过sysctl接口锁定),于是总是可以打印这些行。

25886:本行应该能够被打印。printk通过遍历打开的控制台驱动链表告知每一个控制台驱动去打印当前行设备驱动在本书的讨论围之外,因此,控制台驱动代码则并不包含在)。

25888:请注意这里消息文本的开头使用的是msg而不是p,这样就在没有日志等级序列的情况下写入消息了。然而,日志等级序列已经被存储到log_buf缓冲器中了。这样就使后来能够访问log_buf以获取消息日志等级的代码(请参看25998行),不会再产生显示混乱信息序列的现象。

25892:如果层for循环发现一新行,那么buf中的剩余字符(如果有的话)将被认为是新的消息,因此msg_level会被重置。但是无论怎样,外层循环都会持续到buf清空为止。

25895:释放在25845行获取的控制台锁(console lock)。

25896:唤醒等待被写入控制台日志的所有进程。注意即使没有文本被实际写入任何控制台,这个过程也仍然会发生。这样处理是正确的,因为无论是否要往控制台中写入文本,等待进程实际上都是在等待从log_buf中读出信息。在25748行,进程被转入休眠状态以等待log_buf的活动。在休眠、唤醒和等待队列中所使用的机制将在下一节中进行讨论。

25897:返回日志中写入的字符长度。

存在时,我们可以通过只在循环退出时将logged_chars更新一次来稍微提高运行速度。然而我们还可以通过其他努力来提高速度。由于我们可以预知消息的长度,因此log_size和log_start可以到最后再增长。让我们来实验一下这样能否提高速度,下面是一段经过理想优化的代码:

中国

请注意循环通常只需要执行一次,只有在log_buf末尾写入信息需要折行时才会多次执行。因而log_size 和log_buf只需要更新一次(或者当写入需要换行时是两次)。

这时速度的确提高了,但是有两个原因使我们并不能这样做。首先,核可能有自己特有的memcpy函数,我们必须确保对memcpy的调用不会再次进入对printk的调用(有一部分核移植版定义了自己特有的速度较快的memcpy函数版本,因此所有的移植都要在这一点上保持一致)。如果memecpy调用printk来报告失败,那么就有可能触发无限循环。

然而在这一点上也并不是真的无药可救。使用这种解决方案的最大问题在于该核循环的形式中也要留意新行标志符,因此使用memcpy将整个消息拷贝到log_buf中是不正确的:如果此处存在新行,我们将无法对其进行处理。

我们可以试验一个一箭双雕的办法。下面这种替代的尝试虽然可能比前面那种初步解决方法速度要慢,但是它保持了核版本的语意:

(请注意gcc的优化器十分灵敏,它足以能检测到循环部的表达式log_buf+LOG_BUF_LEN并没有改变,因此在上面的循环中试图手工加速计算是没有任何效果的。)

不幸的是,这种方法并不能比现在的核版本在速度上快许多,而且那样会使得代码晦涩难懂(如果你编写过更新log_size和log_start的代码,你就能清楚地了解这一点)。你可以自己决定这种折衷是否值得。然而无论怎样,我们学到了一些东西,通常,不管成功与否,改进核代码都可以加深你对核工作原理的理解。

2.2.2 等待队列

前一节我们曾简要的提到进程(也就是正在运行的程序)可以转入休眠状态以等待某个特定事件,当该事件发生时这些进程能够被再次唤醒。核实现这一功能的技术要点是把等待队列(wait queue)和每一个事件联系起来。需要等待事件的进程在转入休眠状态后插入到队列中。当事件发生之后,核遍历相应队列,唤醒休眠的任务让它投入运行状态。任务负责将自己从等待队列中清除。

等待队列的功能强大得令人吃惊,它们被广泛应用于整个核中。更重要的是,实现等待队列的代码量并不大。中国

1. wait_queue结构

18662:简单的数据结构就是等待队列节点,它包含两个元素:

* task—指向struct task_struct结构的指针,它代表一个进程。从16325行开始的struct task_struct 结构将在第7章中进行介绍。

* next—指向队列中下一节点的指针。因而,等待队列实际上是一个单链表。

通常,我们用指向等待队列队首的指针来表示等待队列。例如,printk使用的等待队列log_wait(25647行)。

2. wait_event

16840:通过使用这个宏,核代码能够使当前执行的进程在等待队列wq中等待直至给定condition(可能是任何的表达式)得到满足。

16842:如果条件已经为真,当前进程显然也就无需等待了。

16844:否则,进程必须等待给定条件转变为真。这可以通过调用__wait_event来实现(16824行),我们将在下一节介绍它。由于__wait_event已经同wait_event分离,已知条件为假的部分核代码可以直接调用__wait_queue,而不用通过宏来进行冗余的(特别是在这些情况下)测试,实际上也没有代码会真正这样处理。更为重要的是,如果条件已经为真,wait_event会跳过将进程插入等待队列的代码。

奇怪的是,这个小技巧并没有得到应有的重视。这里的主要思路是使被封闭的代码能够像一个单句一样使用。考虑下面这个宏,该宏的目的是如果p是一个非空指针,则调用free:

除非你在如下所述的情况下使用FREE1,否则所有调用都是正确有效的:

FREE1经扩展以后,else就和错误的if(FREE1的if)联系在一起。

有些程序员通过如下途径解决这种问题:

这两种方法都不尽人意,程序员在调用宏以后自然而然使用的分号会把扩展信息弄乱。以FREE2为例,在宏展开之后,为了使编译器能更准确地识别,我们还需要进行一定的缩进调节,最终代码如下所示:中国

这样就会引起语法错误—else和任何一个if都不匹配。FREE3从本质上讲也存在同样的问题。而且在研究问题产生原因的同时,就能够明白为什么宏体里是否包含if是无关紧要的。不管宏体部容如何,只要使用一组括号来指定宏体,就会碰到相同的问题。

引入do/while(0)技巧能够克服前面所出现的所有问题,现在我们可以编写FREE4。

将FREE4和其他宏一样插入相同代码之后,这段代码当然可以正确执行。编译器能够优化这个伪循环,舍弃循环控制,因此执行代码并没有速度的损失,我们也从而得到了能够实现理想功能的宏。

虽然这是一个可以接受的解决方案,但是我们不能不提到的是编写函数要比编写宏好得多。不过如果你不能提供函数调用所需的开销,那么就需要使用联函数。这种情况虽然在核中经常出现,但是在其他地方就要少得多。(不可否认,当使用C++、gcc或者任何实现了将要出现的修正版ISO标准C的编译器时,这种方案只是一种选择,就是最后为C增加联函数。)

3. __wait_event 中国

16824:__wait_event使当前进程在等待队列wq中等待,直至condition为真。中国

16829:通过调用add_wait_queue(16791行),局部变量__wait可以被到队列上。注意__wait是在堆栈中而不是在核堆中分配空间,这是核中常用的一种技巧。在宏运行结束之前,__wait就已经被从等待队列中移走了,因此等待队列中指向它的指针总是有效的。

16830:重复分配CPU给另一个进程直至条件满足,这一点将在下面几节中讨论。

16831:进程被置为TASK_UNINTERRUPTIBLE状态(16190行)。这意味着进程处于休眠状态,不应被唤醒,即使是信号也不能打断该进程的休眠。信号在第6章中介绍,而进程状态则在第7章中介绍。

16832:如果条件已经满足,则可以退出循环。

请注意如果在第一次循环时条件就已经满足,那么前面一行的赋值就浪费了(因为在循环结束之后进程状态会立刻被再次赋值)。__wait_event假定宏开始执行时条件还没有得到满足。而且,这种对进程状态变量state的延迟赋值也并没有什么害处。在某些特殊情况下,这种方法还十分有益。例如当__wait_event 开始执行时条件为假,但是在执行到16832行时就为真了。这种变化只有在为有关进程状态的代码计算condition变量值时才会出现问题。但是在代码中这种情况我没有发现。

16834:调用schedule(26686行,在第7章中讨论)将CPU转移给另一个进程。直到进程再次获得CPU 时,对schedule的调用才会返回。这种情况只有当等待队列中的进程被唤醒时才会发生。

16836:进程已经退出了,因此条件必定已经得到了满足。进程重置TASK_RUNNING的状态(16188行),使其适合CPU运行。

16837:通过调用remove_wait_queue(16814行)将进程从等待队列中移去。wait_event_interruptible 和__wait_event_interruptible(分别参见16868行和16847)基本上与wait_event和__wait_event相同,但不同的是它们允许休眠的进程可以被信号中断。信号将在第6章中介绍。

请注意wait_event是被如下结构所包含的。

和do/while(0)技巧一样,这样可以使被封闭起来的代码能够像一个单元一样运行。这样的封闭代码就是一个独立的表达式,而不是一个独立的语句。也就是说,它可以求值以供其他更复杂的表达式使用。发生这种情况的原因主要在于一些不可移植的gcc特有代码的存在。通过使用这类技巧,一个程序块中的最后一个表达式的值将定义为整个程序块的最终值。当在表达式中使用wait_event_interruptible时,执行宏体后赋__ret的值为宏体的值(参见16873行)。对于有Lisp背景知识的程序员来说,这是个很常见的概念。但是如果你仅仅了解一点C和其他一些相关的过程性程序设计语言,你可能就会觉得比较奇怪。

中国

__wake_up

centos操作系统简介

centos操作系统简介 CentOS(Community ENTerprise Operating System)是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用。两者的不同,在于CentOS并不包含封闭源代码软件。CentOS,我们有很多人叫它社区企业操作系统,不管你怎么叫它,它都是linux的一个发行版本。CentOS并不是全新的linux发行版,倘若一说到RedHat这个大名,大家似乎都听过,在RedHat家族中有企业版的产品,它是Red Hat Enterprise Linux(以下称之为RHEL),CentOS正是这个RHEL的克隆版本,RHEL是很多企业采用的linux发行版本,需要向RedHat付费才可以使用,并能得到付过费用的服务和技术支持和版本升级。这个CentOS可以像REHL一样的构筑linux系统环境,但不需要向RedHat付任何的费用,同样也得不到任何有偿技术支持和升级服务。 CentOS计划是在2003年红帽决定不再提供免费的技术支持及产品认证之后的部份"红帽重建者"(Red Hat rebuilders)之一。 CentOS和Linueox、组装Linux (White box Linux)、Tao Linux 、X/OS Linux,及科学Linux (Scientific Linux)等都以红帽所发布的源代码原件重建Red Hat Enterprise Linux的翻版,并修正了已经发现了的redhat的bug。 CentOS是"Caos Linux"独立计划的一个分枝,在Lawrence Berkeley 国家实验室担任管理员与程序设计师的Kurtzer表示。但后来Caos基金会最受欢迎的计划变成是RHEL 的重建。 历史 Red Hat公司的产品中,有RedHat Linux(如Redhat8,9)和针对企业发行的版本Red Hat Enterprise Linux,都能够通过网络FTP免费的获得并使用,但是在2003年的

习题答案-Linux操作系统原理实践教程-崔继-清华大学出版社

第1章 1、在VMwane中安装CentOS 7的基本步骤有哪些? (1)新建虚拟机 (2)虚拟机设置 (3)启动虚拟机 (4)设置安装信息,包括软件选择,安装位置,分区等 (5)完成最后安装 2、安装Linux时可以设置哪些分区?有哪些分区是必须的? 能够设置的分区可以根据安装系统时提示,主要包括:/,/boot,swap,/home,/opt 等等;其中/(根)分区是必须的。 第2章 1、针对Linux 系统启动运行,有哪些运行目标?每个运行目标的含义是什么? CentOS 从7.0 开始使用systemd 代替init 作为系统启动和服务器守护进程的管理器,负责在系统启动或运行时,激活系统资源,管理服务器进程。systemd 用目标(target)替代了运行级别的概念,提供了更大的灵活性,比如可以继承一个已有的目标,并添加其他服务来创建自己的目标。CentOS 7.0 之前的运行级别和systemd 目标之间的对应关系如下表所示。 2、Linux 有几种关机方法,每种关机操作有何异同? 关闭系统的命令有: shutdown(最安全的方式),halt,init,telinit,poweroff,reboot,具体含义可以参考

帮助手册页。 第3章 more、less、cat、wc 命令有什么区别? 这几个命令可用于对文本文件的处理显示,主要区别在:more命令以分页(一次一屏)显示文本信息;less类似于more,但增加了回滚功能;cat本意是连接文件并在标准输出上输出,也就是将文件一次全部输出;wc用于统计输出文件中的行数、单词数、字节数等。 第4章 (1)发出命令显示行号。 底端命令方式下 :set nu (2)保存到文件AboutLinux,并不退出。 底端命令方式下 :w AboutLinux (3)删除一句“It is this kernel that forms the base around which a Linux operating system is developed.”。 在命令方式下,先把光标移到It处,再按d$。(从当前光标处到行末的所有字符删除)(4)查找单词“Finland”。 命令方式下输入/Finland,回车后会在第一个Finland处停下来。 (5)把第一段的“Finland”单词后的内容换行,使其变成三段内容。 插入方式下,将光标移到Finland后,按回车键即可。(vi的换行标志是回车符) (6)将第二段的内容复制到文档的最后。 命令方式下:先用yy命令,然后移到文档最后,再按p键。 (7)删除第三段的内容。 命令方式下,光标移到第三段,用dd命令。(注,这里的段实际上是第3行。) (8)恢复被删除的一段内容。 命令方式下,用u命令。 (9)查找所有的“Minix”单词,并全部改为“MINIX”。 底端命令方式下,:1,$s/Minix/MINIX/g (10)不保存修改,退出vi。 底端命令方式下,:q! (11)使用vi再次打开文件AboutLinux,在第二段后插入“He began his work in 1991 when he released version 0.02 and worked steadily until 1994 when version 1.0 of the Linux Kernel was released.”。 shell命令提示符下输入:vi AboutLinux(打开保存的文件)

2016操作系统原理在线作业

窗体顶端 您的本次作业分数为:100分单选题 1.【第01~04章】以下描述中,()并不是多线程系统的特长。 A 利用线程并行地执行矩阵乘法运算。 B web服务器利用线程请求http服务 C 键盘驱动程序为每一个正在运行的应用配备一个线程,用来响应相应的键盘输入。 D 基于GUI的debugger用不同线程处理用户的输入、计算、跟踪等操作。 正确答案:C 单选题 2.【第01~04章】现代操作系统的基本特征是()、资源共享和异步性。 A 多道程序设计 B 中断处理 C 实现分时与实时处理 D 程序的并发执行 正确答案:D 单选题 3.【第01~04章】操作系统的进程管理模块并不负责()。 A 进程的创建和删除 B 提供进程通信机制 C 实现I/O设备的调度 D 通过共享内存实现进程间调度。 正确答案:C 单选题 4.【第01~04章】下列选择中,()不是操作系统必须要解决的问题。 A 提供保护和安全机制 B 管理目录和文件 C 提供应用程序接口

D 提供C++语言编译器 正确答案:D 单选题 5.【第01~04章】用户在程序中试图读存放在硬盘中某文件的第10逻辑块,使用操作系统提供的接口是()。 A 进程 B 系统调用 C 库函数 D 图形用户接口 正确答案:B 单选题 6.【第01~04章】操作系统的管理部分负责对进程进行调度。 A 主存储器 B 控制器 C 运算器 D 处理机 正确答案:D 单选题 7.【第01~04章】下面关于进程的叙述不正确的是()。 A 进程申请CPU得不到满足时,其状态变为就绪状态。 B 在单CPU系统中,任一时刻有一个进程处于运行状态。 C 优先级是进行进程调度的重要依据,一旦确定不能改变。 D 进程获得处理机而运行是通过调度而实现的。 正确答案:C 单选题 8.【第01~04章】下列选项中,操作系统提供给应用程序的接口是()。 A 系统调用 B 中断 C 库函数

西安交大网络教育秋操作系统原理在线作业习题答案100分

《操作系统原理》习题答案 一、单项选择题 1、(信号量)是一种只能进行P、V操作的特殊变量。 2、一个进程是(PCB结构与程序和数据的组合)。 3、操作系统中,当(时间片完),进程从执行状态转变为就绪状态。 4,设有三个作业J1,J2,J3同时到达,运行时间分别为T1,T2,T3,且T1≤T2 ≤ T3。若它们在一台处理机上按单道运行,采用短作业优先算法,则平均周转时间为(T1+ 2/3T2 + 1/3T3)。 5、在操作系统中,死锁出现是指(若干进程因竞争资源而无限等待其他进程释放已占有的资源) 6.若系统有三个并发进程,都需要同类资源4个,试问该系统不会发生死锁的最少资源数是( 10 ) 。 7、预防死锁的论述中,(可以通过破坏产生死锁的四个必要条件之一或其中几个的方法,来预防发生死锁)条是正确的论述。 8、关于死锁与不安全状态的关系,下列描述正确的有(死锁是一种不安全状态): 9、银行家算法是一种(死锁避免)算法。 10、以下哪种算法不属于多个分区的可变分区存储管理方式的主存分配算法(最后适应分配算法) 11、在固定分区管理方式中,处理器执行作业时,对每条指令中的地址要求满足(下限地址≤绝对地址≤上限地址) 12、以下叙述中,不正确的是(采用动态和静态重定位的系统都支持“程序浮动”) 13、在页式存储管理中,假定地址用m个二进制位表示,其中页内地址部分占用了n个二进制位,那么最大的作业允许有(2(m-n) )个页面。 14、关于一个分区的存储管理,以下叙述不正确的是(一个分区的存储管理中,必须采用动态重定位的方式进行地址转换) 15、下面哪种算法不属于页式虚拟存储管理中的页面调度算法(优先数调度算法) 16、缺页中断率与哪个因素无关(作业的逻辑地址) 17、很好地解决了“零头”问题的存储管理方法是(页式存储管理) 18、在存储管理中,(可变分区管理)可与覆盖技术配合. 19、虚拟存储器的最大容量(由计算机的地址结构决定) 20、下述(先进先出)页面淘汰算法会产生BELADY现象. 21、计算机系统的二级存储包括(主存储器和辅助存储器) 22、以下关于主存空间的说法中正确的是(操作系统与硬件的接口信息、操作系统的管理信息和程序等存放在主存储器的系统区) 23、联想存储器在计算机系统中是用于(地址变换) 24、以下有关可变分区管理中采用的主存分配算法说法中错误的是(最佳适应算法是最好的算法,但后过的较大作业很难得到满足)

Linux操作系统部分复习题答案

第一章 Linux系统简介 一、思考题 1.UNIX的大部分代码是用一种流行的程序设计语言编写的,该语言是什么? C语言 2.UNIX系统的特点有哪些? ·多任务 ·多用户 ·并行处理能力 ·设备无关性 ·工具 ·错误处理 ·强大的网络功能 ·开放性 3.什么是Linux?其创始人是谁? Linux是一个功能强大的操作系统,同时它也是一个自由软件,是免费的、源代码开放的、可以自由使用的UNIX兼容产品。其创始人是Linus 4.Linux操作系统的诞生、发展和成长过程始终依赖者的重要支柱都有哪些? ·UNIX操作系统 ·MINIX操作系统 ·GNU计划 ·POSIX标准 ·Internet 5.简述Linux系统的特点。 ·自由软件 ·良好的兼容性 ·多用户、多任务 ·良好的界面 ·丰富的网络功能 ·可靠地安全性、稳定性 ·支持多种平台 6.常见的Linux的发行版本有哪些? ·Red Hat Linux ·Caldera OpenLinux ·SuSE Linux ·TurboLinux ·红旗Linux ·中软Linux 二、选择题 1.Linux最初是以MINIX 操作系统为模板而开发出来的。 2.关于Linux内核版本的说法,下列选项中错误的是(C)。 A.表示为主版本号.次版本号.修正号B.1.2.3表示稳定的发行版 C.1.3.3表示稳定的发行版D.2.2.5表示对内核2.2的第5次修正(补充:次版本号为偶数的是稳定版本;为奇数的则是测试版本。)

3.Linux属于自由软件。 4.自由软件的含义是软件可以自由修改和发布。 5.一下不具有多任务性的操作系统是DOS 第二章 Linux系统入门 一、思考题 1.Linux系统有哪些运行级别?其含义是什么? 可用级别为0~6,其中0:关闭系统;6:重新启动,其他略。 2.Linux系统下经常使用的两种桌面环境是什么? GNOME和KDE 3.什么是X-Window系统?它有什么特点? 图形界面(X-Window)是在Linux操作系统中提供的图形化用户界面(GUI),其支持的视窗系统也称为X,它的特点有:它采用了“客户端-服务器”模式;它是一个跨平台的操作环境。 7.默认情况下,超级用户和普通用户的登录提示符分别是什么? # 和 $ 二、选择题 1.系统引导的过程一般包括如下的几步:①MBR中的引导装载程序启动。②用户登录。③Linux内核运行。④BIOS自检。正确的顺序是④①③②。 2.Linux中使用Ctrl+Alt+BackSpace 组合键可以关闭X-Window图形用户界面。 3.字符界面下使用init命令关机所用的参数是0 。(参数6是重新启动) 4.字符界面下使用shutdown命令重启计算机时所用的参数是–r 。 5.使用man命令调阅相关的帮助信息时,用于逐页地下翻的功能键是Space 。 第三章 shell与shell命令 一、思考题 1.shell的基本功能有哪些? 命令解释执行、文件名替换、输入/输出重定向、连同管道建立、系统环境设置和shell编程。 2.Linux系统中的主要目录有哪些? /:系统的根目录 /dev:系统的设备目录 /home:用户主目录 /root:root用户主目录 /boot:Linux的启动目录 /usr:用户级目录 3.工作目录及其父目录课分别用什么表示? . 和 .. 5.常用的shell环境变量有哪些? ·HOME:用户家目录的完全路径名 ·LOGNAME:登录用户名 ·IFS:命令行内部域分割符 ·PATH:由冒号分隔的目录路径名

操作系统原理-Linux下的内存分配与回收的管理

广州大学学生实验报告 开课学院及实验室:计算机科学与工程实验室2014年11月19日 学院计算机科学与 教育软件学院 年级/专 业/班 姓 名 学号 实验课 程名称 操作系统实验成绩 实验项目名称Linux下的内存分配与回收的管理 指导 老师 张艳玲 一、实验目的 在Linux环境下利用下列系统调用malloc(),free()编写一段程序实现内存分配与回收的管理。 二、实验器材 1、计算机一台。 2、Linux 三、实验内容 1.返回已分配给变量的内存地址; 2.返回释放后的内存地址; 3.释放已分配的内存空间后,返回释放内存后未使用内存的大小。 四、实验步骤、记录和结果 源代码有错,不能正常运行,使用纯C语言,修改正如下。 黄色底色的为新增代码新增注释为绿色底色 #include /* For _MAX_PATH definition */ #include //#include //#include #include //void main() int main() { // int *string; char *string; // string =(int*) malloc(10 ); string = (char*) malloc(sizeof(char)*10); if( string == NULL )

printf( "Insufficient memory available\n" ); else { printf( "Memory space allocated for path name\n" ); /*printf ("string=%d\n",string);*/ // cout<<"string="< #include int main(){ char *string = (char*) malloc(sizeof(char)*10);

南开18秋学期(1703)《操作系统原理》在线作业

(单选题) 1: 当进程执行中需要等待从磁盘上读取数据时,进程的状态将()。 A: 从就绪变为运行态 B: 从运行变为就绪态 C: 从阻塞变为就绪态 D: 从运行变为阻塞态 正确答案: (单选题) 2: 在操作系统分类中对于可靠性和安全性要求较高的是()。 A: 批处理系统 B: 分时处理系统 C: 实时处理系统 D: 个人机操作系统 正确答案: (单选题) 3: 在设备管理中引入I/O缓冲机制是为了缓和()之间的速度不匹配问题。A: 内存与处理器 B: 内存与外设 C: 处理器与外设 正确答案: (单选题) 4: 在页式存储管理中,其虚地址存储空间是() A: 一维的 B: 二维的 C: 三维的 正确答案: (单选题) 5: UNIX文件系统采用( )逻辑结构对文件进行管理。 A: 网状文件 B: 记录式文件 C: 索引文件 D: 3流式文件 正确答案: (单选题) 6: 在文件系统中,使用( )信息实现对文件的管理。 A: 文件存储位置 B: 文件目录 C: 文件内容 正确答案: (单选题) 7: 进程所具有的()及并发性是两个很重要的属性。 A: 动态性 B: 易用性 C: 顺序性 D: 静态性 正确答案: (单选题) 8: 所谓进程调度,其调度的对象和任务分别是( )。 A: 进程,从就绪队列中按一定的调度策略选择一个进程占用CPU B: 数据,将程序中使用的数据调入内存 C: 指令,将指令从外存储空间调入内存 正确答案: (单选题) 9: 计算机系统采用多道并发技术将会() A: 缩短每个程序的执行时间 B: 使系统效率随着并行道数的增加成正比增加 C: 使用设备时不发生冲突 D: 提高了系统的整体执行效率 正确答案: (单选题) 10: 在系统中增加cache可以缓解()之间的速度不匹配性。 A: 硬盘与内存

15春学期《操作系统原理》在线作业

15春学期《操作系统原理》在线作业 试卷总分:100 测试时间:-- 试卷得分100 一、单选题(共20 道试题,共40 分。)V 1. 文件系统采用多级目录结构可以() A. 节省存储空间 B. 解决命名冲突 C. 缩短文件传送时间 D. 减少系统开销 B 满分:2 分 2. 在下述存储管理技术中,只有()可提供虚拟存储基础 A. 动态分区法 B. 交换技术 C. 静态分页法 D. 动态分页 D 满分:2 分 3. 下列对于进程的描述哪项是错误的 A. 各进程之间的地址是相互独立的 B. 进程控制块PCB是在系统调用进程时随机生成的 C. 进程是静态的 D. 进程同程序相比具备并发和异步执行特征 C 满分:2 分 4. 程序执行时下一条执行指令的地址放在()寄存器中 A. IR B. PSW C. PC C 满分:2 分 5. 一个进程从内存中换出到外存时,该进程被称作为() A. 被阻塞 B. 被终止 C. 唤醒 D. 被挂起 D 满分:2 分 6. 在分页存储管理系统中,从页号到物理块号的地址映射是通过()实现的 A. 段表 B. 页表 C. PCB D. JCB B 满分:2 分 7. 在UNIX系统进程调度中,当计算的进程优先数越大时其优先级将() A. 越大 B. 越小 B B 满分:2 分 8. 在文件管理中,使用链式结构可以实现()

A. 磁盘驱动控制 B. 磁盘空间分配与回收 C. 文件目录查找 D. 页面置换 B 满分:2 分 9. 在时间片轮转(RR)法中,如果时间片过长,该算法会退化为()算法。 A. 短进程优先(SPN) B. 时间片轮转(RR) C. 先来先服务(FCFS) D. 优先级法(PS) C 满分:2 分 10. 当为一个新创建的进程分配资源和建立了PCB后,进程将进入() A. 运行态 B. 阻塞态 C. 就绪态 D. 退出态 C 满分:2 分 11. 在系统中增加cache可以缓解()之间的速度不匹配性。 A. 硬盘与内存 B. 内存与处理器 C. 内存与I/O设备 D. 硬盘与I/O设备 B 满分:2 分 12. 中断管理程序不包括下列哪项功能 A. 确定发生中断的特性 B. 将控制权切换到处理程序 C. 执行具体的处理过程 D. 将控制权切换到原执行程序 C 满分:2 分 13. 在时间片轮转(RR)法中,如果时间片过长,该算法会退化为()算法。 A. 短进程优先(SPN) B. 时间片轮转(RR) C. 先来先服务(FCFS) D. 优先级法(PS) C 满分:2 分 14. 下列分区管理的分配算法中,分配与释放时间性能最好的是() A. 最先匹配法 B. 最佳匹配法 C. 下次匹配法 D. 最坏匹配法 A 满分:2 分 15. 在下列的文件物理存储结构中最不便于进行文件扩充的结构是() A. 散列文件 B. 链接文件

Linux操作系统Ubuntu的详细介绍

Linux操作系统Ubuntu的详细介绍 Ubuntu是一个以桌面应用为主的Linux操作系统,下面由小编整理了Linux操作系统Ubuntu的详细介绍,希望对你有帮助。 Linux操作系统Ubuntu的详细介绍 1.简介 Ubuntu (官方中文译名:友帮拓)是一个南非的民族观念,着眼于人们之间的忠诚和联系。该词来自于祖鲁语和科萨语。Ubuntu(发音"oo-BOON-too"--“乌班图”,内置视频中曼德拉的发音为/u:bu:tu:/全部u发音/wu:/)被视为非洲人的传统理念,也是建立新南非共和国的基本原则之一,与非洲复兴的理想密切相关。Ubuntu 精神的大意是“人道待人”(对他人仁慈)。另一种翻译可以是:“天下共享的信念,连接起每个人”。“具有ubuntu 精神的人心胸开阔,乐于助人,见贤思齐而不忌妒贤能,因为他/她拥有适度的自信,而这源自如下认识:自己乃是属于一个更大的整体,当他人受到伤害或死去时,当他人受到折磨或压迫时,这个整体就会消失。”--大主教Desmond Tutu。作为一个基于GNU/Linux 的平台,Ubuntu 操作系统将ubuntu 精神带到了软件世界。

2.自由软件 Ubuntu 项目完全遵从开源软件开发的原则;并且鼓励人们使用、完善并传播开源软件。也就是Ubuntu目前是并将永远是免费的。然而,这并不仅仅意味着零成本,自由软件的理念是人们应该以所有“对社会有用”的方式自由地使用软件。“自由软件”并不只意味着您不需要为其支付费用,它也意味着您可以以自己想要的方式使用软件:任何人可以任意方式下载、修改、修正和使用组成自由软件的代码。因此,除去自由软件常以免费方式提供这一事实外,这种自由也有着技术上的优势:进行程序开发时,就可以使用其他人的成果或以此为基础进行开发。对于非自由软件而言,这点就无法实现,进行程序开发时,人们总得白手起家。基于上述原因,自由软件的开发是迅捷、高效和激动人心的! 3.不同之处 目前已有大量各种各样基于GNU/Linux的操作系统,例如:Debian,SuSE,Gentoo,RedHat 和Mandriva。在这行业已竞争纷繁的世界里,Ubuntu 是又一个参与者。那么Ubuntu 何以有所不同? Debian 是一个广受称道、技术先进且有着良好支持的发行版,Ubuntu 正是基于Debian之上,旨在创建一个可以为桌面和服务

《操作系统原理》考核方式

“面向三类需求的三位一体”的考评方式与标准 一.课程简介与特点 操作系统课程重点讲述操作系统的基本原理和实现技术,是理解计算机系统工作原理、用户界面接口技术、应用系统设计开发方法等基本知识结构的重要途径,其内容涉及理论、算法、技术、实现和应用等方面。 二.课程在培养方案中的目标与任务 通过本课程的学习,使学生认识到操作系统在计算机软硬件资源管理中的地位和作用,掌握操作系统的基本概念、原理和基本方法,掌握操作系统的开发模式、开发方法和操作系统的分析、设计能力,了解操作系统的发展方向,培养学生观察问题、分析问题、解决问题和实际动手能力。通过本课程的学习,从深层次了解操作系统的组成、结构和功能,增强学生大型系统软件的开发能力,并注重专业素养的不断提高,为学生以后参与系统软件分析和开发奠定基础。 三.课程考评方式与标准 1.考评形式 针对操作系统原理课程自身特点与培养目标,制定了“面向三类需求的三位一体”操作系统课程考评形式:面向社会需求、学术需求以及学生个人需求,建立知识、能力和素质一体化考试模式改革。 2.考核内容 三类需求包括社会需求、学术需求和学生需求。社会需求是社会及产业界对学生知识运用、工程实践、团队协作等实际应用能力的需求,强调学生知识能力技术并重;学术需求是高校及高校学者对学生缜密学术思维、学习态度、科学研究能力和知识创新能力的需求,强调学生知识能力系统化;学生需求是学生个体根据自身的兴趣专长和优势潜能,在自身综合发展上对学习知识、提高综合能力和素质等方面的个人需求。 因此,对学生知识、能力与素质的一体化考核即涵盖了以上三类需求中的具体要求。 3.考核内容比重与评分标准 面向三类需求的三位一体考试改革即是面向社会需求、学术需求和学生需求的三类综合需求,采用60%闭卷考试成绩+20%实践环节成绩+10%总结报告学术交流成绩+10%平时考核成绩的综合评定,建立对学生知识、能力和素质的一体化综

浙大远程操作系统原理在线作业及答案

操作系统原理在线作业 1.对磁盘进行移臂调度时,既考虑了减少寻找时间,又不频繁改变动臂的移动方向的调度算法是( C )。 A 先来先服务 B 最短寻找时间优先 C 电梯调度 D 优先级高者优先 2.下列进程调度算法中,综合考虑进程等待时间和执行时间的是( D )。 A 时间片轮转调度算法 B 短进程优先调度算法 C 先来先服务调度算法 D 高响应比优先调度算法 3.I/O系统有三种常用方式来与主机交换数据,它们是程序轮询方式、中断方式和DMA方式,其中DMA方式主要由硬件来实现,此时高速外设和内存之间进行数据交换( B )。 A 不通过CPU的控制,不利用系统总线 B 不通过CPU的控制,利用系统总线 C 通过CPU的控制,不利用系统总线 D 通过CPU的控制,利用系统总线 4. 某进程由于需要从磁盘上读入数据而处于等待状态.当系统完成了所需的读盘操作后,此时该进程的状态将( D )。 A 从就绪变为运行 B 从运行变为就绪 C 从运行变为阻塞 D 从等待变为就绪 5.在段页式存储管理系统中时,每次从主存中取指令或取操作数,至少要访问( C )主存。 A 1次 B 2次 C 3次 D 4次 6.设某进程的页访问串为:1、3、1、2、4,工作集为3块,问:按FIFO页面替换算法,当访问4号页面时,应淘汰( C )号页面。 A 1 B 2 C 3 D 4 7.假设一个正在运行的进程对信号量S进行了P操作后,信号量S的值变为-1,此时该进程将( A )。 A 转为等待状态 B 转为就绪状态 C 继续运行 D 终止 8. 下列选项中,降低进程优先级的合理时机是( A )。 A进程的时间片用完 B进程刚完成I/O,进入就绪队列 C进程长期处于就绪队列中 D进程从就绪态转为运行态9.两个进程合作完成一个任务,在并发执行中,一个进程要等待其合作伙伴发来信息,或者建立某个条件后再向前执行,这种关系是进程间的( A )关系。 A 同步 B 互斥 C 竞争 D 合作 10. 当被阻塞进程所等待的事件出现时,如所需数据到达或者等待的I/O操作已完成,则调用唤醒原语操作,将等待该事件的进程唤醒。请问唤醒被阻塞进程的是( D )。 A 父进程 B 子进程 C 进程本身 D 另外的或与被阻塞进程相关的进程 11.文件系统接到用户给出的“打开”文件的操作命令后,文件系统要完成的工作之一是(C ) A 根据用户提供的参数在文件的目录项中填入文件名等文件属性 B 确定文件的存储结构 C 把存储介质上的文件有关属性(目录)读入内存 D 按照给定的该文件的记录号查找索引表 12.从使用的角度来分析设备的特性,可以把设备分成( D )。 A 物理设备和逻辑设备 B 字符设备和块设备 C 低速设备和高速设备 D 独占设备和共享设备 13.分段系统中信息的逻辑地址到物理地址的变换是通过( A )来实现的。 A 段表 B 页表 C 物理结构 D 重定位寄存器 14.在哲学家进餐问题中,若仅提供5把叉子,则同时要求进餐的人数最多不超过( C )时,一定不会发生死锁。 A 2 B 3 C 4 D 5 15. 下列选项中,导致创建新进程的操作是(C)。I.用户登录成功 II.设备分配 III.启动程序执行 A 仅I和II B 仅II和III C 仅I和III D I、II和III 16.在请求调页系统中有着多种置换算法,选择最先进入内存的页面予以淘汰的算法称为( A )。 A FIFO算法 B OPT算法 C LRU算法 D NRU算法 E LFU算法 17. 并行技术可使系统的各种硬件资源尽量并行工作,这样的程序执行环境具有独立性、随机性和( D )。 A 封闭性 B 多发性 C 顺序性 D 资源共享性 18.当处理机系统中,可并行的是( D )。Ⅰ. 进程与进程Ⅱ. 处理机与设备Ⅲ. 处理机与通道Ⅳ. 设备与设备 A Ⅰ、Ⅱ和Ⅲ B Ⅰ、Ⅱ和Ⅳ C Ⅰ、Ⅲ和Ⅳ D Ⅱ、Ⅲ和Ⅳ 19.总体上说,请求分页是个很好的虚拟内存管理策略。但是,有些程序设计技术并不适合于这种环境。例如:(D )。 A 堆栈 B 线性搜索 C 矢量运算 D 二分法搜索 20.使用银行家算法来避免死锁的操作系统是( D )。 A Windows XP B Linux C FreeBS D UNIX D A、B、C都不是 21. 现代操作系统的基本特征是( D )、资源共享和异步性。

《Linux 操作系统》课程介绍

0《Linux操作系统》 一、课程定位 《操作系统》在高职高专计算机网络技术专业中是核心课程,主要是培养学生linux操作系统应用的能力。该课程具有很强的实践性,重在操作和应用技能的培养,在计算机网络技术课程结构体系中具有重要地位。 1、课程的作用 《Linux操作系统》是计算机应用技术专业核心课程,linux是一个功能强大而且十分灵活的操作系统,安全行、稳定性好,很少受到病毒和黑客的攻击。通过本课程的学习,提高学生对LINUX操作系统的认识,并通过案例教学和项目实训培养学生综合运用知识的初步能力,是从事各种网络管理、维护及设计的基础。并为后续课程学习、顶岗实习实施、就业等提供强大的支撑和促进作用。 2、课程任务和目标 本课程的主要任务是: 本课程计算机学科的软件工程专业中是一门专业方向课,理论学时12,实验学时28。其任务是讲授Linux操作系统的使用,包括文本界面的常用Shell命令、图形界面的多种实用程序以及Linux提供的多种Internet服务功能,比较全面地了解Linux操作系统提供的功能和服务。 本课程的目标是: (一)知识目标: 对单一网络环境(WIN)的拓展,学生学完该课程后应该掌握Linux操作系统的常用命令的使用、图形界面的多种实用程序的使用、多种Internet服务功能的配置。

(二)能力目标: 1.表达能力:熟练使用LINUX常用软件(文档、电子表格、演示文稿等)。 2.服务器架设能力:熟练使用LINUX,应用LINUX构建网络服务应用。 3.故障处理能力:能够利用学过的LINUX知识,处理日常LINUX系统运行中遇到的故障并排除故障。 4.综合能力:在使用计算机过程中,能够熟练使用LINUX,并能在LINUX进行文件编译,可以使用LINUX上常用软件。 (三)情感目标:培养并加强学生自主探索学习的能力,相互协作解决问题的意识。 二、课程内容设置 1、课程内容设置理念 (1)以计算机网络管理的职业需求为导向。 (2)以应用Linux系统构建网络服务器,进行系统的管理与维护为重点。 (3)依据“教、学、做”一体化教学模式设计教学内容。 2、教学单元设计:七章14个实验

Linux操作系统原理与运用(复习题).doc

《Linux操作系统原理与运用》一、填空题(每题2分) 1、(PCB)操作系统控制进程的唯一数据结构。 2、Linux文件系统中每个文件用(i节点)来标识。 3、安装Linux系统对硬盘分区时,必须有两种分区类型:(文件系统分区)和(交换分区)。 4、编写的Shell程序运行前必须赋予该脚本文件(执行)权限。 5、Linux内核引导时z从文件(/ect/fstab)中读取要加载的文件系统。 6、在用vi编辑文件时,将文件内容存入test.txt文件中,应在命令模式下键入 (_wtest.txt) o 7、检查已安装的文件系统/dev/had5是否正常,若检查有错,则自动修复,其命令及参数是fsck-a/dev/had5o & shell不仅是用户命令的解释器,它同时也是一种功能强大的编程语言,bash_> Linux 的缺省shelL 9、一个批处理型作业,从进入系统并驻留在外存的后备队列上开始,直到作业运行完毕,可能要经历以下三级调度(低级)、(中级)、(高级)。 10、设有n个进程共享一个临界区,若最多允许m个进程(mvn )同时进入临界区,则所采用的信号量的初值应为仲),信号量值的变化范围为()。 11、一段时间内仅允许一个进程访问的资源称为(临界资源)。 12、分页系统的页长为1KB ,虚拟地址0x3C8F对应的页号为(FH ),页内地址为 (8FH )o 13、在Linux系统中所有内容都被表示为文件,组织文件的各种方法称为(文件系统)。 二选择题 1、没有题目。(A ) A、只有一个 B、可以有多个 C、不能被挂起 D、必须在执行完后才能被撤下2、已经获得除(C )以外的所有运行所需资源的进程处于就绪状态。 A、储存器 B、打印机 C、CPU D、磁盘空间

2019年交大-操作系统原理

2019年春季《操作系统原理》在线作业 一、单选题(共30 道试题,共60 分。)V 1. 从总体上说,多道程序设计技术可()单位时间的算题量。 A. 增加 B. 减少 C. 维持 正确答案:A 满分:2 分 2. 多道程序设计系统中,让多个计算问题同时装入计算机系统的主存储器()。 A. 并发执行 B. 顺序执行 C. 并行执行 D. 同时执行 正确答案:A 满分:2 分 3. 通常,文件的逻辑结构中()组织方式,既适合于交互方式应用,也适合于批处理方式应用。 A. 堆文件 B. 流式文件 C. 索引顺序文件 D. 顺序文件 正确答案:C 满分:2 分 4. 下面关于设备属性的论述中,正确的是()。 A. 字符设备的基本特征是可寻址到字节,即能指定输入的源地址或输出的目标地址 B. 共享设备必须是可寻址的和可随机访问的设备 C. 共享设备是指同一时间内允许多个进程同时访问的设备 D. 在分配共享设备和独占设备时都可能引起进程死锁 正确答案:B 满分:2 分 5. 在请求调页系统中有着多种置换算法:选择最先进入内存的页面予以淘汰的算法称为()。 A. FIFO算法 B. OPT算法 C. LRU算法 D. NRU算法 正确答案:A 满分:2 分 6. 下列第()项不是文件系统的功能? A. 文件系统实现对文件的按名存取 B. 负责实现数据的逻辑结构到物理结构的转换 C. 提高磁盘的读写速度 D. 提供对文件的存取方法和对文件的操作 正确答案:C 满分:2 分 7. 为了提高计算机的处理机和外部设备的利用率,把多个程序同时放入主存储器,在宏观上并行运行是()。 A. 分时操作系统 B. 实时操作系统 C. 批处理系统

linux操作系统简介IC设计

LINUX 介绍 LINUX版本简介 Linux有很多发行版本,目前流行的有Red Hat Linux、Debian Linux、Red Flag Linux等。Red Hat Linux 由Red Hat公司(红帽子公司)发行,是商业上运作最成功的一个Linux发行套件。由于Red Hat Linux普及程度很高,可免费得到,更重要的是大多数IC设计工具支持Red Hat Linux,因此Red Hat Linux适合于作为IC设计工具的平台。 目前Red Hat有两种发行版。一种是企业版Red Hat Enterprise Linux(RHEL),付费购买后,红帽子公司会提供技术支援服务。另一种是免费版Red Hat Fedora Core(RHFC),可免费下载,但红帽子公司不提供技术支援。 收费的Red Hat企业版产品有Red Hat Enterprise Linux AS(Advanced Server),Red Hat Enterprise Linux ES(Entry Server)、Red Hat Enterprise Linux WS(Workstation)等。AS是最高端产品,ES是AS的精简版本,WS是ES的进一步简化版,主要针对桌面办公。目前企业版已发行到AS5版本。 免费的Red Hat Fedora Core,第一版是Fedora Core 1(FC1),相当于早期Redhat 9.0的更新版(也可称为Redhat 10.0)。目前Red Hat Fedora Core系列的最新版本是Fedora Core 9(FC9)。 Redhat企业版和Fedora免费版的联系很密切。例如,AS4相当于FC3,AS5相当于FC4。考虑到安全行和稳定性,企业版的更新速度相对较慢,很多软件包比较陈旧,比如最关键的内核等。而Fedora Core 的更新速度很快。主流IC工具在发行前,通常会在发行时的企业版的流行版本基础上进行测试。对当前IC 设计工具来说,软件兼容较好的是AS4和Fedora Core 5(FC5)。以下选择FC5进行介绍,其他版本也是类似的。 基本知识 1、硬盘类型 目前主要的硬盘驱动类型有下列三类,不同的硬盘在LINUX下有不同的标识方法。 IDE:Integrated drive electronics (电子集成驱动器) SCSI:Small computer system interface(小型计算机接口) SA TA:Serial ATA (串口硬盘) 2、LINUX下的硬盘分区 在Linux中,任一个物理设备,都对应为/dev目录下的一个文件。Linux分区命名如下: 若是IDE硬盘,第一块硬盘对应为/dev/had,第二块为/dev/hdb。 若是SCSI或SA TA硬盘,第一块硬盘对应为/dev/sda,第二块为/dev/sdb。 had(或sda)后面的数字含义为:1至4代表主分区号(一块硬盘最多有四个主分区),5开始以后代表的是逻辑分区号。 例子:某电脑只有一块硬盘,类型为SA TA,C盘是唯一的主分区,在这里代号为/dev/sda1;D盘为逻辑分区,在这里代号为/dev/sda5;同理E、G、H盘对应为/dev/sda6、/dev/sda7、/dev/sda8。 3、文件系统 在XP和LINUX下的主要文件系统有: FAT16:DOS与WINDOWS95以上支持,只支持2G以下分区,目前已基本不用。 FAT32:DOS与WINDOWS95以上支持,支持2G以下分区,目前在XP中应用广泛,在LINUX下,可方便挂载访问,建议使用这种文件系统。 NTFS:WINDOWS2000以上支持(主要用于网络版windowsNT),稳定型好,但在FC5下,要另外安装驱动程序才能挂在访问,不建议使用这种文件系统。

Linux操作系统原理与应用

操作系统概述 在计算机应用的过程中,人们接触最频繁的是操作系统,例如磁盘操作系统DOS、易于使用的图形界面操作系统Windows、开放源代码的操作系统Linux等。但是,操作系统往往是比较复杂的系统软件,相对于使用而言,要掌握它的运行机制就不是那么容易。 1.1 认识操作系统 可以从不同的角度来认识操作系统。从使用者的角度看,操作系统使得计算机易于使用。从程序员的角度看,操作系统把软件开发人员从与硬件打交道的繁琐事务中解放出来。从设计者的角度看,有了操作系统,就可以方便地对计算机系统中的各种软、硬件资源进行有效的管理。 1.1.1 从使用者角度 人们对操作系统的认识一般是从使用开始的。打开计算机,呈现在眼前的首先是操作系统。如果用户打开的是操作系统字符界面,就可以通过命令行完成需要的操作。例如,要在Linux下复制一个文件,则输入: cp /floppy/TEST mydir/test 上述命令可以把/floppy目录下的TEST文件复制到mydir目录下,并更名为test。 为什么可以这么方便地复制文件?操作系统为此做了什么工作?首先,文件这个概

念是从操作系统中衍生出来的。如果没有文件这个实体,就必须指明数据存放的具体物理位置,即位于哪个柱面、哪个磁道、哪个扇区。其次,数据转移过程是复杂的I/O操作,一般用户无法关注这些具体的细节。最后,这个命令的执行还涉及其他复杂的操作,但是,因为有了操作系统,用户只需要知道文件名,其他繁琐的事务完全由操作系统去处理。 如果用户在图形界面下操作,上述处理就更加容易。实际上,图形界面的本质也是执行各种命令,例如,如果复制一个文件,那么就要调用cp命令,而具体的复制操作最终还是由操作系统去完成。 因此,不管是敲击键盘或者单击鼠标,这些简单的操作在指挥着计算机完成复杂的处理过程。正是操作系统把繁琐留给自己,把简单留给用户。 1.1.2 从程序开发者角度 从程序开发者的角度看,不必关心如何在内存存放变量、数据,如何从外存存取数据,如何把数据在输出设备上显示出来,等等。例如,cp命令的C语言实现片段如下: inf=open("/floppy/TEST",O_RDONLY,0); out=open("/mydir/test",O_WRONLY,0600); do{ l=read(inf,buf,4096); write(outf,buf,l); } while(l); close(outf); close(inf); 在这段程序中,用到四个函数open(),close(),write()和read(),它们都是C语言函数库中的函数。进一步研究可知,这些函数都要涉及I/O操作,因此,它们的实现必须调用操作系统所提供的接口,也就是说,打开文件、关闭文件、读写文件的真正操作是由操作系统完成的。这些操作非常繁琐,对于不同的操作系统其具体实现也可能不同,程序开发者不必关心这些具体操作。 1.1.3 从操作系统在整个计算机系统中所处位置 如果把操作系统放在整个计算机系统中考虑,则如图1.1所示。

相关文档
最新文档