Linux操作系统原理与应用--陈莉君chp3

合集下载

Linux原理及应用

Linux原理及应用

2.1 Linux进程

系统为每个进程分配一个独立的虚拟地址空间。 进程的虚拟地址空间被分做两个部分:


用户空间。用户进程本身的程序和数据(可执行映 象)映射到用户空间中。 系统空间。内核被映射到所有进程的系统空间中。 它们只允许在具有较高特权的内核态下访问。进程 运行在特权较低的用户态下时,不允许它直接访问 系统空间。进程只能通过系统调用(system call)转换 为内核态后,才能访问系统空间。一个进程在运行 过程中,总是在两种执行状态之间不断地转换。

policy表示进程的进程调度策略,可以通过系统调用 sys_sched_setscheduler()更改(kernel/sched.c)。Linux操作系 统采用的调度策略见下表 。
调度策略 SCHED_OTHER SCHED_FIFO SCHED_RR 值 0 1 2 说明 非实时进程,基于优先权的轮转法 实时进程,先进先出算法 实时进程,基于优先权的轮转法
LINUX原理及应用
武汉大学计算机学院 郑鹏 Email:pzheng51@
第2章 Linux进程管理



程序是为了完成某种任务而设计的软件,是存储在 磁盘上包含可执行的机器指令和数据的静态实体。 进程是一个程序的一次执行的过程,在操作系统中 执行特定的任务,是一个随执行过程不断变化的实 体。进程是Linux系统中基本的调度单位。 进程具有独立的权限与职责,如果系统中某个进程 崩溃,它不会影响到其余的进程。每个进程运行在 其各自的虚拟地址空间中,通过内核控制下的通信 机制,它们之间才能发生联系。 进程在生命期内将使用系统中的资源。它利用系统 中的CPU来执行指令,用物理内存来放置指令和数 据。使用文件系统提供的功能打开并使用文件,同 时直接或者间接地使用物理设备。

Linux操作系统原理与应用--陈莉君chp3

Linux操作系统原理与应用--陈莉君chp3

进程P
弟进程
指向父进程
指向子进程
指向兄进程
指向弟进程
进程控制块-部分内容的描述
上面通过对进程状态、标识符及亲属关系的描 述,我们可以把这些域描述如下: task_struct{ long state; /*进程状态*/ int pid,uid,gid; /*一些标识符*/ struct task_struct *parent, *child, *o_sibling, *y_sibling /*一些亲属关系*/ … }
进程调度-衡量值得运行的程度
static inline int goodness(struct task_struct * p, struct task_struct *prev) { int weight; /* 权值,作为衡量进程是否运行的唯一依据 */ if (p->police!=SCHED_OTHER) /*实时进程*/ {weight = 1000 + p->rt_priority; goto out } weight = p->counter; /*普通进程*/ if(!weight) / *p用完了时间片*/ goto out; if(p ==prev) /* 细微调整 */ weight+= 1; weight+=p->priority out: return weight }
调度函数schedule( ) 片段
如果prev进程时间片用完,而且还是实时进程, 就给它分配新的时间片,并让它到可运行队列 末尾:
if (prev->policy == SCHED_RR&&!prev->counter) { prev->counter = prev->priority; move_last_runqueue(prev); }

Linux操作系统(RHEL7/CentOS7)3.3系统和服务管理

Linux操作系统(RHEL7/CentOS7)3.3系统和服务管理

3.3 系统和服务管理3.3.1 系统和服务管理器:systemd1.SysV init、Upstart init、systemdRHEL7采用systemd作为默认init程序,所以runlevel的概念基本上也就不存在了。

2.unitsystemd开启和监督整个系统是基于unit的概念。

unit是由一个与配置文件对应的名字和类型组成的(例如:avahi.service unit有一个具有相同名字的配置文件,是守护进程A vahi的一个封装单元)。

unit有以下7种类型:(1)service:(2)socket:(3)device:(4)mount:(5)automount:(6)target:(7)snapshot:3.systemd提供以下主要特性(1)使用socket的前卫的并行性能:(2)D-Bus激活策略启动服务:(3)提供守护进程的按需启动策略。

(4)保留了使用Linux cgroups进程的追踪功能:(5)支持快照和系统状态恢复:(6)维护挂载和自挂载点:(7)实现了各服务间基于依赖关系的一个精细的逻辑控制:4.systemd的主要工具(1)systemctl命令:查询和控制systemd系统和系统服务管理器的状态。

(2)journalctl命令:查询系统的journal(日志)。

(3)systemd-cgls命令:以树形列出正在运行的进程,可以递归显示Linux控制组内容。

3.3.2 监视和控制systemd的命令:systemctl起。

示例如下:3.3.3 改变目标(运行级别)systemd使用比sysvinit的运行级更为自由的target概念作为替代。

第3运行级用multi-user.target替代。

第5运行级用graphical.target替代。

runlevel3.target和runlevel5.target分别是指向multi-user.target和graphical.target的符号链接。

Linux内核入门学习方法

Linux内核入门学习方法

Linux内核入门学习方法作者介绍:刘冰,西安邮电大学研一在读,跟随陈莉君导师求学,刚刚踏入Linux内核的高山密林之中。

在学习Linux内核的过程中,由于Linux还在蓬勃的生长发展,内核还是会经常变化,我们会在实践学习,比如修改编译内核、调试系统时遇到许许多多的问题,想要快速的掌握一些相关的知识,并不是一件容易的事情。

我在学习内核的过程中摸索了一些方法出来。

找资料途径上,在信息量爆炸的今天,要学习一个经常变化的东西,比如新版Linux 内核的特性,主要是通过官方文档,或搜索引擎查找,找到的平台大部分都是博客等,可以根据它的排版、热度等来对其进行一个可信度的初判,可以自己通过实验进行验证,要敢于质疑;有了初步了解以后,要学习一个开源程序的实现、运行原理,可以找到它的源代码进行深入的学习,linux 内核的源代码可读性很好,里面有适量的代码注释和完善的接口注释,可以利用vscode软件对代码进行一个深入的追踪学习,我整理了一些vscode阅读代码的技巧:/XdoSy。

如果要学习的是一些沉淀了已久的知识,最好是根据一些相关评价,找一本经典教程来深入学习,比如学习数据结构,网上推荐最多的便清华大学严蔚敏老师写的《数据结构(C 语言版)》,上面宝贵的不仅是条理清晰的知识点,从中还能体会到作者更科学的思维方式。

书上代码对抽象性原则的躬身力行让我对C 语言有了全新的认识,将书里的算法尽可能的用代码实现一下使我受益良多。

理论方面,理解每个术语、英文缩写的含义和由来,有助于我们为总体目标的出现梳理出一个符合逻辑的产生发展过程,便于我们对总目标知识的掌握和记忆;实验方面,要与自己学的理论知识相结合,敢于创新,加深对理论的理解和对技术的掌握。

笔记找一个可以构建知识网络的笔记软件,可以将知识点连接起来,在出现以前学过的知识点时可以关联起来,温故知新,在获取新知识的同时也在不断巩固旧的知识。

推荐软件比如印象笔记、思源笔记等。

Linux操作系统原理与应用第3章

Linux操作系统原理与应用第3章

下一行合并为一行。
第3章 vi文本编辑器
d+定位符 删除从光标位置到指定位置范围内的字符。常用的有:
d0、d^ d$ dG db de dw 删除光标左面的文本。0或^代表行首。 删除光标右面的文本。$代表行尾。 删除光标所在行之后的所有行。G代表最后一行。 删除光标处前的字符直到词首。b代表词首。 删除光标处的字符直到词尾。e代表词尾。 删除光标处的字符直到下一个词的词首。w代表下一 词词首。
2. 文本的删除
删除(delete)文本的最简单方法是将光标移到要删除的 字符上,然后,每按一下x键或Delete键就会删掉一个字符。 若要删除的文本较多时,可以使用下面更加灵活的删除命 令。 删除命令: x、X 与Delete键相同。 dd D J 删除光标所在的行。 删除光标右面的文本。 删除当前行尾的换行符,使当前行与 删除光标处、光标前的字符。x的作用
始输入。
第3章 vi文本编辑器
插入命令:
a、A 在光标位置后、行尾后开始插入。
i、 I
在光标位置前、行首前开始插入。i的
作用与Insert键相同。
o、O 的新行开始插入。
在光标所在行之后、光标所在行之前
图3-4所示为插入命令的用法。
第3章 vi文本编辑器
图3-4 插入命令用法示意
第3章 vi文本编辑器
和系统管理员的编辑利器。初学者经过一段时间的使用,
也会逐渐习惯vi的操作方式,并形成自己特有的操作风格。
第3章 vi文本编辑器
3.1.2 vi的工作模式
vi是一个多模式的软件,它有三种工作模式。在不同的 工作模式下,它对输入的内容有不同的解释。 1. 命令模式(Command mode) 在命令模式下,输入的任何字符都作为命令来解释执

Linux操作系统应用kj3-3

Linux操作系统应用kj3-3

技能拓展
任务总结
操作练习
3
准备批量创建的9个 用户分别为hbzy、hbvtc、 pan、shen、li、sun、 wei、wang、tang,这 些用户都属于mygroup 组群,组群GID为600。 (有关用户及组群具体 创建详见学习情境四)。
Linux 操作系统应用
上一页
下一页
退出
3.3 子情境:vi编辑器的使用
步骤7 替换字符串
按【:】键进入最后行模式,输入“1,9 s/hbzyvtc/hbvtc/g” 将1-9行中的字符串“hbzyvtc”替换成“hbvtc”。
技能拓展
任务总结 操作练习
步骤8 保存文件
按【:】键进入最后行模式,输入“wq”, 保存编辑内容并 退出vi。
Linux 操作系统应用
上一页
下一页
(2) 文本编辑模

文本编辑模式用于字符编辑,在命令模式下输入i (插入命令)、a(附加命令)等命令后进入文本 编辑模式。
(3) 最后行模式
在命令模式下,按【:】键进入最后行模式,命 令执行完毕后,vi自动回到命令模式。
vi的三种工作模式之间的相互转换的关系如图315所示。
命令模式

自动返回
Esc
i或a
Linux 操作系统应用
上一页
下一页
退出
3.3 子情境:vi编辑器的使用
• 任务实施
任务描述
实施流程
相关资讯 任务准备 任务实施 任务检测 技能拓展
步骤5 修改用户 名和用户
识别码
UID
按【i】键切换到文本编辑模式,第2行的用户名hbzy改 为hbzyvtc;用户识别码601改为602;
按相同的方法,依次将第3-9行的用户名hbzy分别改为 pan、shen、li、sun、wei、wang、tang,用户识别码601 分别改为603、604、…、609。如图3-21所示。

Linux26内核调度机制剖析与改进-计算机系统应用

Linux26内核调度机制剖析与改进-计算机系统应用

Practical Experience 实践经验 191
计 算机 系统 应用
2009 年 第 11 期
rq->active = rq->expired; rq->expired = array; array = rq->active; rq->expired_timestamp = 0; rq->best_expired_prio = MAX_PRIO; } 这段代码的作用 是执行两 个数组(活 动数组 active 和过期数组 expired)的切换。首先,如果活 动数组中没有进程了,则通过指针操作来 切换两个数 组。之前我们看到在过期数组中的进程时 间片已经被 计算好了。所以在两个数组切换后,过期 数组中的进 程都变为活动进程,交换数组的时间就是 交换指针的 时间。这种交换就是 O(1)调度算法的核心。整个 O(1) 算法的工作机制可以用图 1 形象地描述:
图 3 schedul e()函数的运行流程
2009 年 第 11 期
计 算机 系统 应用
3.2 内核抢占 2.4 版之前的 Linux 和大部分 Unix-Lik e 操作系
统一样,只支持用户 抢占,不支持内 核抢占[2]。为了 提高对交互式进程的支持并更好地实现软 实时工作方 式,2.6 内核引入了内核抢占。现在,只要重新调度 是安全的,那么内核就可以在任何时间抢 占正在执行 的进程[2]。
4 一种改进的实时调度算法
为了使 Linux 2.6 内核支持硬实时应用环境,笔 者给出了一种改进的实时调度算法——改 进的最小裕 度优先(LSF)调度算法。 4.1 改进的最小裕度优先调度算法
最小裕度优先(Least Slack First)调度算法是实 时系统中较为常见的动态优先级调度算法 ,它是对最 早截止期优先(EDF)算法的改进[3]。这种算法依据富裕 时间来确定任务的优先级,该富裕时间即为“裕度”。 裕度小的,优先级高,反之则低。在该算 法中,通过 结合任务执行的缓急程度来给任务分配优 先级。它克 服了 EDF 算法中因仅仅考虑截止期限而带来的缺陷。 在 LSF 算法中,裕度 S 定义如下:

Linux内核定时器--原版PPT优秀课件

Linux内核定时器--原版PPT优秀课件
变的值,大多数体系结构的HZ值是可调的
7
2.1.1 理想的HZ值
自Linux问世以来,i386体系结构中时 钟中断频率就设定为100HZ,但是在2.5开发 版本内核中,中断频率被提高到1000HZ。
提高节拍率意味着时钟中断产生得更 加频繁,所以中断处理程序也会更频繁的 执行,带来以下几点好处: • 更高的时钟中断解析度可提高时间驱动事 件的解析度。 • 提高了时间驱动事件的准确度。
13
2.2.1 jiffies的回绕
• Jiffies变量总是无符号长整数,因此,在32 位体系结构上时32位,在64位体系结构上 时64位。32位的jiffies变量,如果HZ = 100, 497天后会溢出,如果HZ = 1000,49.7天后 会溢出。而64位则别指望能看到溢出。
• 访问jiffies的代码仅会读取jiffies_64的低32位, 通过get_jiffies_64()函数,可以读取整个64 位,多数代码只需要访问低32位就够了。
/*还没有超时,继续执行任务*/ }
/*超时了,发生错误*/
15
• 正常的情况下,上面的代码没有问题。但是当 jiffies接近最大值的时候,就会出现回绕问题, 如下图所示:
• 1. 循环中第一次比较时,jiffies = J1,没有超时 • 2. 循环中第二次比较时,jiffies = J2,实际已经
执行中断处理程序,占用CPU时间过多。 • 减少了处理器对其他工作的时间,更频繁
的打乱处理器高速缓存并增加耗电。
11
2.2 jiffies
• 全局变量jiffies用来记录自系统启动以来产 生得节拍的总数。例如:系统启动了N秒, 那么jiffies就为N x HZ。
• Jiffies的类型为无符号长整型(unsigned long),用其它任何类型存放都不正确。

linux内核编程

linux内核编程
Linux内核的模块机制允许内核在运行时动态地载入和删除内 核代码。这样基本内核镜像可以尽可能的小。也给我们编写内核程 序提供方便,我不需要把自己编写的内核程序编译进内核,不用重 启机器,需要的时候加载相应的模块,不需要时卸载。
Linux内核模块管理工具
• • • • insmod rmmod depmod modprobe 安装内核模块 卸载内核模块 创建模块依赖文件 提供依赖性分析,错误检查等功能和选项
实例3 运行截图
Linux内核调试方法
• Oops和panic
企业版的linux厂商一般将他们的内核定制为发生一个oops是就使内 核崩溃(panic)。 oops(慌张)消息包含系统错误的细节,如 CPU 寄 存器的内容。在 Linux 中,调试系统崩溃的传统方法是分析在发生崩溃 时发送到系统控制台的 oops 消息。
Linux内核配置和编译
• 内核配置பைடு நூலகம்
make config(基于文本的命令行配置工具) make menuconfig (基于ncurse库编制的图形配置工具) make xconfig (基于X11的图形配置工具) make gconfig (基于gtk+的图形配置工具)
make defconfig(为你的体系结构创建一个默认配置)
obj-m 表明生成的是外部模块 make -C $(KDIR) M=$(shell pwd) modules
该命令首先改变目录到-C选项指定的位置(即内核源代码目录),其 中保存有内核顶层Makefile。M=选项让该Makefile在构造modules目标 前返回到模块源代码目录。 Modules目标指向obj-m变量中设定的模块。
Linux内核编程
四川大学计算机学院网络安全实验室 陈家军

(第4章进程及进程管理)习题四答案介绍

(第4章进程及进程管理)习题四答案介绍

沈华
湖北工业大学计算机学院
P 对公共变量 Q 的访问 V
end coend 信号量 mutex 的取值范围为:mutex.value ∈[1, - (n-1)]。 ①值为 1 时,表示没有进程访问公共变量 Q; ②值为 0 时,表示有一个进程正在访问公共变量 Q; ③值<0 时,表示有一个进程正在访问公共变量 Q,同时又| mutex.value |个进程 等待访问公共变量 Q。
沈华
湖北工业大学计算机学院
19. 20. 21. }
} }//while
4-6 进程有哪几个基本状态?在一个系统中为什么必须区分出这几种状态。 答:进程有三个基本状态:运行状态、就绪状态和等待状态(又称阻塞、挂起、 睡眠) 。 因为多道程序设计技术的引入,使得多个进程可以并发执行。并发执行的进程 之间由于合作具有直接制约关系或由于共享资源具有间接制约关系,使得它们 的执行过程具有“执行——暂停——执行——暂停——执行——…”的动态特 征,因此需要对进程在其生命周期内所处于的不同状态进行区分,以便对进程 进行分析、管理和控制。
4-4 图 4-2 标明程序段执行的先后次序。其中 I 表示输入操作、C 表示计算操作、 P 表示打印操作,下角标说明是对哪个作业进行上述操作。请指明: (1)哪些操作必须有先后次序,其原因是什么? (2)哪些操作可以并发执行,其原因又是什么? 答: (1)Ii 必须先于 Ci 执行,Ci 必须先于 Pi 执行,这是因为同一个作业的这三 个操作之间具有逻辑上的严格的先后执行次序;Ii 必须先于 Ii+1 执行,Ci 必须先 于 Ci+1 执行,Pi 必须先于 Pi+1 执行,这是因为 Ii 和 Ii+1 共享输入设备、Ci 和 Ci+1 共享 CPU、Pi 和 Pi+1 共享输出设备。 (2)Ii+1 和 Ci、Pi-1 可以并发执行,因为这三个进程分属于不同的作业,且它们 占据的是不同的资源。

Linux内核配置系统浅析

Linux内核配置系统浅析
% . s :% . c $ ( C C )$ ( C F L A G S )S$ <o$ @
有很多子目录下都有同样的要求,就需要在各自的 Makefile 中包含此编译规则,这会比较麻烦。而 Linux 内核中则把此类的编译规则统一放置 到 Rules.make 中,并在各自的 Makefile 中包含进了 Rules.make(include Rules.make),这样就避免了在多个 Makefile 中重复同样的规则。 对于上面的例子,在 Rules.make 中对应的规则为:
在 IBM Bluemix 云平台上开发并部署 您的下一个应用。开 Nhomakorabea您的试用
本文首先分析了 Linux 内核中的配置系统结构,然后,解释了 Makefile 和配置文件的格式以及配置语句的含义,最后,通过一个简单的例子-TEST Driver,具体说明如何将自行开发的代码加入到 Linux 内核中。在下面的文章中,不可能解释所有的功能和命令,只对那些常用的进行解 释,至于那些没有讨论到的,请读者参考后面的参考文献。
可以看出,vmlinux 是由 HEAD、main.o、version.o、CORE_FILES、DRIVERS、NETWORKS 和 LIBS 组成的。这些变量(如 HEAD)都是用 来定义连接生成 vmlinux 的目标文件和库文件列表。其中,HEAD在arch/*/Makefile 中定义,用来确定被最先链接进 vmlinux 的文件列表。比 如,对于 ARM 系列的 CPU,HEAD 定义为:
1. 配置系统的基本结构
Linux内核的配置系统由三个部分组成,分别是: 1. Makefile:分布在 Linux 内核源代码中的 Makefile,定义 Linux 内核的编译规则; 2. 配置文件(config.in):给用户提供配置选择的功能; 3. 配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供基于字符界面、基于 Ncurses 图形界面以 及基于 Xwindows 图形界面的用户配置界面,各自对应于 Make config、Make menuconfig 和 make xconfig)。 这些配置工具都是使用脚本语言,如 Tcl/TK、Perl 编写的(也包含一些用 C 编写的代码)。本文并不是对配置系统本身进行分析,而是介绍如 何使用配置系统。所以,除非是配置系统的维护者,一般的内核开发者无须了解它们的原理,只需要知道如何编写 Makefile 和配置文件就可 以。所以,在本文中,我们只对 Makefile 和配置文件进行讨论。另外,凡是涉及到与具体 CPU 体系结构相关的内容,我们都以 ARM 为例,这 样不仅可以将讨论的问题明确化,而且对内容本身不产生影响。 回页首

Linux内核链表及其在虚拟文件系统中的应用

Linux内核链表及其在虚拟文件系统中的应用

2011年3月第16卷第2期西 安 邮 电 学 院 学 报JO U RN AL O F XI A N U NI VERSIT Y O F P OST S A N D T EL ECO M M U N ICA T IO NS M ar.2011Vo l 16No 2收稿日期:2011 01 20基金项目:西安邮电学院中青年科研基金资助项目(103 0439)作者简介:梁琛(1978 ),女,讲师,硕士,研究方向:Linux 操作系统、嵌入式系统,E mail:mumulc @x ;陈莉君(1964 ),女,教授,硕士,研究方向:L inux 操作系统。

Linux 内核链表及其在虚拟文件系统中的应用梁 琛,陈莉君(西安邮电学院计算机学院,陕西西安 710121)摘要:为了提高代码的重用性,L inux 内核提供了一种抽象的双向循环链表结构。

通过对这种双向循环链表及其在Linux 虚拟文件系统中的应用进行分析,可以了解这种链表的巧妙之处。

这种链表可以将不同结构体类型的数据链接起来,并可以使用相同的链表操作,从而能有效地提高编程效率。

关键词:L inux 内核;链表;虚拟文件系统中图分类号:T P311.5 文献标识码:B 文章编号:1007 3264(2011)02 0029 05在C 语言程序中经常用到双向循环链表来组织数据,链表中每个结点的信息是定义在结构体类型中的,当使用的结构体类型不同时,需要创建不同的链表,并且需要为每一个链表编写插入、删除、查找等基本操作函数,但是通常链表这些基本操作的执行步骤是基本相同的,而只是由于结构体类型不同,就需要重写代码,花费程序员大量不必要的时间。

在Linux 内核源代码中也大量用到了这种数据结构,如果需要为每一个链表都编写基本操作函数,就会有大量的重复性代码。

在研究Linux 的虚拟文件系统时,发现其中使用的双向循环链表并不需要编写这样的冗余代码,而是提供了一种更好的使用方式,使得不同结构体类型的结点都可以通过这种链表链接起来,而且可以使用相同的链表操作,从而提高代码的重用性。

Linux原理及应用08

Linux原理及应用08

8.1.3 登录及退出 登录及退出Linux
2.退出Linux系统 当用户执行完各种操作后,应及时退出系统.可以 在系统命令提示符后面输入命令logout,然后按下 回车键. $logout 系统进行相应处理后,重新在屏幕上显示登录提示 信息. 有些Linux系统的退出命令是exit.还有其他退出系 统的方法,最常用的是在Shell提示符之后,同时按 下Ctrl+D键: $Ctrl+D
8.1.3 登录及退出 登录及退出Linux 3.Passwd命令 用户口令是整个Linux系统的安全核心,Linux 系统中的每一个用户除了有用户名外,还有对 应的用户口令.当建立新用户后,需要为用户 设置一个初始口令.在新用户第一次登录时, 必须使用系统管理员所设置的口令才能登录成 功,然后新用户应该立即将口令修改为自己容 易记忆的其他口令. 可以使用passwd命令来修改自己的口令.
8.2.2 文件及目录操作命令
在cp命令中,文件名部分可以使用通配符.此外cp还可以将 数个文件名各不相同的文件复制至同一个目录下,此时的命令 格式为: cp文件名1 文件名2 文件名3… 目录名 例如把用户zheng主目录下的a.txt文件复制到d1目录下,可使 用命令: $cp a.txt d1 若要将目标文件的文件名改为newdoc,可使用命令: $cp a.txt d1/newdoc 若要将d1目录及其下的所有文件包括子目录复制到backup目录, 可使用以下命令: $cp -r d1 backup 将a.txt,d1/newdoc两个文件复制到目录/tmp下,可使用以下 命令: $cp a.txt d1/newdoc /tmp
-a:列出指定目录下所有子目录与文件,包含隐藏文件. -l:以长格式来显示文件的详细信息,包括权限,所有者,建立日期, 时间,大小等. -F:在列出的文件或目录项后加一个符号表示文件类型,如"/"表示 目录,"*"表示可执行文件,"@"表示连接文件,"l"表示管道文件, 没有任何标志则表示普通文件. -R:递归处理,列出指定目录与子目录下的文件. -m:输出按字符流格式,以逗号分隔文件名.

操作系统原理与实践教程(第三版)第3章习题答案

操作系统原理与实践教程(第三版)第3章习题答案

第3章处理器管理(1) 为什么程序并发执行会产生间断性特征,并失去封闭性和可再现性?解:之所以产生间断性特征是因为多个程序在并发执行时,需要为了完成同一项任务而相互合作,并发执行的程序间的这种相互制约导致了“暂停—执行—暂停”的间断性运行规律。

失去封闭性是因为程序在并发执行时,多个程序需要共享系统中的多种资源。

所以,这些资源的状态是由多个程序改变的,从而使程序的运行失去了封闭性。

失去可再现性是因为程序在并发执行时,由于失去了封闭性,从而导致其失去可再现性。

(2) 什么是进程?为什么要在操作系统中引入进程?解:进程是可并发执行且具有独立功能的程序在一个数据集合上的运行过程,它是操作系统进行资源分配和调度的基本单位。

“进程”概念是人们为了使程序能够并发执行,并且能对并发的程序加以描述和控制而引入的。

(3) 试从并发性、独立性、动态性上比较程序和进程的不同。

解:●并发性是进程的重要特征,同时也是OS 的重要特征。

引入进程的目的正是为了使其程序能和其它进程的程序并发执行,而程序是不能并发执行的。

●独立性是指进程实体是一个能独立运行的基本单位,同时也是系统中独立获得资源和独立调度的基本单位。

而对于未建立任何进程的程序,都不能作为一个独立的单位参加运行。

●动态性是进程最基本的特性,可表现为由创建而产生,由调度而执行,因得不到资源而暂停执行,以及由撤销而消亡,因而进程有一定的生命期;而程序只是一组有序指令的集合,是静态实体。

(4) 什么是PCB?它具有什么作用?为什么说PCB是进程存在的唯一标识?解:进程控制块(Process Control Block,PCB)是操作系统为了管理进程而设置的一个专门的数据结构,用它来记录进程的外部特征,描述进程的运动变化过程。

它的作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能和其它进程并发执行的进程.因为系统利用PCB来控制和管理进程,所以PCB是系统感知进程存在的唯一标志。

Linux原理及应用06

Linux原理及应用06

6.1.2 Linux的i节点(inode)


Linux的一个目录是一个驻留在磁盘上的文件,称为 目录文件。系统对目录文件的处理方法与一般文件相 同。目录由若干目录项组成,每个目录项对应目录中 的一个文件。 在一般操作系统的文件系统中,目录项由文件名和属 性、位置、大小、建立或修改时间、访问权限等文件 控制信息组成。Linux继承了UINX的文件管理方法, 把文件名和文件控制信息分开管理,文件控制信息单 独组成一个称为i节点(inode)的结构体。inode实质上 是一个由系统管理的“目录项”。每个文件对应一个 inode,它们有唯一的编号,称为inode号。Linux的目 录项只由两部分组成:文件名和inode号。
6.1.6 Linux文件系统的发展


Linux最初引进了Minix文件系统。Minix文件系统 有较大的局限性,如其文件名最长不能超过14个字 符且最大文件大小为64M字节。1992年4月推出了 第一个专门为Linux设计的文件系统,被称为扩展 文件系统或EXT。1993年扩展文件系统第二版或 EXT2被设计出来并添加到Linux中。 当EXT文件系统增加到Linux的时候进行了一个重 要的开发。真实的文件系统通过一个接口层从操作 系统和系统服务中分离出来,这个接口叫做虚拟文 件系统(VFS)。VFS允许Linux支持许多(通常是不 同的)文件系统,每一个都向VFS表现一个通用的 软件接口。
6.1.6 Linux文件系统的发展



为了在系统发生断电或者其它系统故障时保证整体数 据的完整性,人们开发出了日志文件系统。 所谓日志文件系统是在传统文件系统的基础上,加入 文件系统更改的日志记录,它的设计思想是:跟踪记 录文件系统的变化,并将变化内容记录入日志。 日志文件系统在磁盘分区中保存有日志记录,写操作 首先是对记录文件进行操作,若整个写操作由于某种 原因(如系统掉电)而中断,系统重启时,会根据日志 记录来恢复中断前的写操作。在日志文件系统中,所 有的文件系统的变化都被记录到日志,每隔一定时间, 文件系统会将更新后的元数据及文件内容写入磁盘。

Linux原理及应用13

Linux原理及应用13

12.3.3 如何用命令安装和拆卸文件系统
使用mount命令实例
[root@localhost/]#cd mnt root@localhost/]#cd [root@localhost mnt]#mount –rw /dev/fd0 /mnt mnt]#mount /mnt [root@localhost/]# umount /mnt root@localhost/]#
12.3.1 文件系统的配置信息
fstab文件中记录的格式如下:
/device /mountpoint fstype parameters fs_freq fs_passno
各项参数含义:
/device 为需要安装的设备 /mountpoint /mountpoint文件系统安装点 fstype 文件系统类型 parameters mount命令“-o”选项后面使用的参数,各参数用逗号分隔 fs_freq 由dump程序决定是否备份该文件系统 fs_passno 由fsck程序决定引导时检查磁盘文件系统的顺序,根文件 系统为1,其余值为2,如果没有指定,表示引导时文件系统不被检查 # 表示注释性内容,跟空行一样被省略
ftp
rc3.d
rc5.d
init.d
bin
etc
pub
12.1 Linux目录构造 Linux目录构造
Linux文件系统的目录结构以及个目录的功 能如下:
/ Linux是由根目录开始拥有一大堆子目录, 而某个硬盘分区可能只安装在某个子目录 上,这些挂上另一个分区的子目录称为安 装点(mount point)。 系统开机信息 开机时所必备的一般用户命令 设备结点文件 系统启动和运行时所需的配置和脚本文件
12.3.1 文件系统的配置信息

Linux系统及应用 教学大纲

Linux系统及应用  教学大纲

Linux系统及应用一、课程说明课程编号:090219Z10课程名称:Linux系统及应用/Linux Operating System and Application课程类别:专业教育课程学时/学分:32/2先修课程:操作系统原理(或操作系统及安全)、计算机程序设计基础(C 语言)、数据结构适用专业:计算机科学与技术、信息安全教材、教学参考书:1. 陈莉君等.Linux操作系统原理与应用.北京:清华大学出版社,2006年2. 刘胤杰等.Linux操作系统教程.北京:机械工业出版社,2005年3. Amir Afzal.Unix初级教程,英文影印.北京:电子工业出版社,2002年4. 周巍松等.Linux系统分析与高级编成技术.北京:机械工业出版社,2000年5. 时培植等.Linux操作系统.北京:人民交通出版社,2000年6. 陈莉君.Linux操作系统内核分析.北京:人民邮电出版社,2000年二、课程设置的目的意义Linux作为一个开源计算机操作系统,广泛应用于服务器、桌面及嵌入式应用领域。

本课程为《操作系统原理》的后续课程,主要针对一个实际的计算机操作系统,一个方面通过对Linux内核的分析,加深学生对操作系统原理的理解,另一方面,帮助学生了解以UNIX为代表的操作系统的基本原理、基本技术和基本结构,了解在Linux平台上的开发应用过程,培养学生的分析问题和解决问题的实际能力。

三、课程的基本要求知识:了解Linux及Unix操作系统发展历史;了解Linux相关系统管理命令和shell程序设计;了解Linux操作系统的内核机制即内核任务和bottom half 队列的运行机理;将操作系统基本原理与Linux系统内核的进程管理、存储器管理、设备管理及文件系统的具体实现相结合;了解Linux字符设备和块设备驱动程序设计方法;了解Linux高级程序设计步骤及相关API。

能力:初步掌握Linux常用命令,并培养shell程序初级编程能力;通过对Linux内核的深入剖析,加深对操作系统原理的理解,并培养对Linux操作系统的系统级分析能力;初步掌握Linux内核模块编程、Linux简单字符设备和块设备编程能力;培养能够进行Linux系统级应用设计能力。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

调度函数schedule( ) 片段
如果prev进程处于浅度睡眠状态,而且它有未 处理的信号,就应当唤醒它,给它一个被选择 执行的机会。
if (prev->state == TASK_INTERRUPTIBLE && signal_pending(prev)) prev->state = TASK_RUNNING;
如果prev进程不是可运行状态,说明它必须等 待某一外部资源,那就让它去睡觉,因此,必 须从运行队列链表中删除prev:
第三章 进程
进程介绍
进程控制块
进程的组织方式
进程调度 进程的创建
与进程相关的系统调用及其应用 与调度相关的系统调用及应用
进程介绍-程序和进程
进程介绍-进程层次结构
ini t
A C D
B E
进程介绍-进程状态
运行态

阻塞态
就绪态
进程介绍-进程示例
#include <sys/types.h> /* 提供类型pid_t的定义,在PC机上与int型 相同 */ #include <unistd.h> /* 提供系统调用的定义 */ main() { pid_t pid; /*此时仅有一个进程*/ printf(“PID before fork():%d\n”,(int)getpid()); pid=fork(); /*此时已经有两个进程在同时运行*/ if(pid<0) printf("error in fork!"); else if(pid==0) printf("I am the child process, my process ID is %d\n",getpid()); else printf("I am the parent process, my process ID is %d\n",getpid()); }
每个进程都属于某个用户组。
task_struct结构中定义有用户标识符UID(User Identifier)和组标识符GID(Group Identifier) 这两种标识符用于系统的安全控制 系统通过这两种标识符控制进程对系统中文件和 设备的访问。
进程控制块-进程之间的亲属关系
父进程
兄进程
为什么在这些时机返 回?
进程调度-与调度相关的域
need_resched:调度标志,以决定是否调用 schedule( )函数。 counter: 进程处于可运行状态时所剩余的时钟节 拍(即时钟中断的间隔时间,为10ms或1ms)数。 这个域也叫动态优先级。 priority: 进程的基本优先级或叫“静态优先级” rt_priority: 实时进程的优先级 policy: 调度的类型,允许的取值是: SCHED_FIFO:先入先出的实时进程 SCHED_RR:时间片轮转的实时进程 SCHED_OTHER:普通的分时进程。
进程介绍-进程示例
编译并运行这个程序: $gcc fork_test.c -o fork_test $./fork_test PID before fork():1991 I am the parent process, my process ID is 1991 I am the child process, my process ID is 1992
进程的组织方式-可运行队列
把可运行状态的进程组成一个双向循环链表,也叫可 运行队列(runqueue) 在task_struct结构中定义了两个指针。 struct task_struct *next_run, *prev_run;
init_task起链表头的作用
在调度程序运行过程中,允许队列中加入新出现的可 运行态进程,新出现的可运行态进程插入到队尾
进程的组织方式-进程链表
在task_struct中定义如下: task_struct *prev_task, *next_task
宏for_each_task()遍历整个进程链表 #define for_each_task(p) \ for (p = &init_task ; (p = p->next_task) != &init_task ; )
进程的组织方式-哈希表
哈希函数 #define pid_hashfn(x) \ ((((x) >> 8) ^ (x)) & (PIDHASH_SZ - 1))
图为地址法处理冲突时的哈希表 假定哈希表义为: struct task_struct *pidhash[PIDHASH_SZ] 对给定的PID,如何快速找到对应进程?
时间片过长会导致系统对交互的响应表现欠佳 时间片太短会明显增大进程切换带来的处理器 时间。 Linux调度程序提高交互式程序的优先级,让它们 运行得更频繁,于是,调度程序提供较长的默认时 间片给交互式程序 Linux调度程序还根据进程的优先级动态调整分配 给它的时间片
进程调度-调度时机
进程状态转换的时刻:进程终止、进程睡眠 当前进程的时间片用完时; 设备驱动程序运行时; 从内核态返回到用户态时;
TASK_STOPPED 暂停
schedule() ptrace()
do_exit()
TASK_ZOMBIE 僵死
进程控制块-进程标识符
每个进程都有一个唯一的标识符,内核通过 这个标识符来识别不同的进程 。
进程标识符PID也是内核提供给用户程序的接口, 用户程序通过PID对进程发号施令 。 PID是32位的无符号整数,它被顺序编号
调度函数schedule( ) 片段
如果prev进程时间片用完,而且还是实时进程, 就给它分配新的时间片,并让它到可运行队列 末尾:
if (prev->policy == SCHED_RR&&!prev->counter) { prev->counter = prev->priority; move_last_runqueue(prev); }
进程控制块-如何存放
把PCB与内核栈放在一起具有以下好处: (1) 内核可以方便而快速地找到PCB,用伪代码描述如 下: p = (struct task_struct *) STACK_POINTER & 0xffffe000 (2) 避免在创建进程时动态分配额外的内存 在Linux中,为了表示当前正在运行的进程,定义了一 个current宏,可以把它看作全局变量来用,例如 current->pid返回正在执行的进程的标识符
进程调度-调度算法考虑的因素
公平:保证每个进程得到合理的CPU时间。 高效:使CPU保持忙碌状态,即总是有进程 在CPU上运行。 响应时间:使交互用户的响应时间尽可能短。 周转时间:使批处理用户等待输出的时间尽 可能短。 吞吐量:使单位时间内处理的进程数量尽可 能多。
进程调度-调度算法
进程控制块-如何存放
C语言使用下列的联合结构表示这样一个混合结构: union task_union { struct task_struct task; unsigned long stack[2408]; }; Linux调用alloc_task_struct()函数分配8KB的 task_union 内存区,调用free_task_struct()函数释 放它
再运行一遍,输出结果可能不同。 读者考虑一下描述的数据结构
Linux中把对进程的描述结构叫做task_struct: struct task_struct { … … }
传统上,这样的数据结构被叫做进程控制块 PCB(process control blaock)
时间片轮转调度算法
系统使每个进程依次地按时间片轮流地执行 优先权调度算法 非抢占式优先权算法 抢占式优先权调度算法 多级反馈队列调度 优先权高的进程先运行给定的时间片,相同优先 权的进程轮流运行给定的时间片 实时调度 一般采用抢占式调度方式
进程调度-时间片
时间片表明进程在被抢占前所能持续运行的 时间。
进程的组织方式-等待队列
等待队列表示一组睡眠的进程 可以把等待队列定义为如下结构: struct wait_queue { struct task_struct * task; struct wait_queue * next; }; 如何让正在运行的进程等待某一特定事件? Linux内 核中实现了sleep_on()函数,请给出该函数的实现。 如果要让等待的进程唤醒,就调用唤醒函数wake_up (),它让待唤醒的进程进入TASK_RUNNING状态。
进程调度-衡量值得运行的程度
static inline int goodness(struct task_struct * p, struct task_struct *prev) { int weight; /* 权值,作为衡量进程是否运行的唯一依据 */ if (p->police!=SCHED_OTHER) /*实时进程*/ {weight = 1000 + p->rt_priority; goto out } weight = p->counter; /*普通进程*/ if(!weight) / *p用完了时间片*/ goto out; if(p ==prev) /* 细微调整 */ weight+= 1; weight+=p->priority out: return weight }
进程控制块-Linux进程状态及转换
fork() SIGCONT 收到信号 wake_up() TASK_RUNNING 就绪 资源到位 wake_up() schedule() TASK_UNINTERRUPTIBLE 深度睡眠 等待资源到位 sleep_on() schedule() 占有CPU 执行 等待资源到位 interruptible_sleep_on() schedule() 时间片耗尽 TASK_INTERRUPTIBLE 浅度睡眠 资源到位 wake_up_interruptible() 或收到信号 wake_up()
相关文档
最新文档