Unix 复习思考题
Unix 课程复习思考题
1、UNIX 操作系统最根本的功能特征是什么?包括哪些最基本的概念(动态/静态)?
UNIX 操作系统的根本特点:分时多用户、开放性。
分时多用户:多个用户多个进程同时在一个系统中运行,系统资源高度共享、有效协调 --- 并发
开放性:
- 标准化:结构上的一致
- 可移植性:应用软件的编码及系统应用接口
- 可互操作性:可保持用户原来的使用习惯,异种机之间的互操作
UNIX操作系统最根本的功能特征
-
交互式分时多用户
-
人机间实时交互数据
-
多个用户可同时使用一台机器
-
每个用户可同时执行多个任务
-
-
软件复用
- 每个程序模块完成单一的功能
- 程序模块可按需任意组合
- 较高的系统和应用开发效率
-
可移植性强
- 数千行汇编码,数十万行 C 语言代码
-
配置灵活,适应性强
- 小内核,参数灵活可调
- 核外应用系统,任意裁减
- 限制规则很少
-
界面方便高效
- 内部:系统调用丰富高效
- 外部:shell 命令灵活方便可编程
- 应用:GUI 清晰直观功能强大
-
安全机制完善
- 口令、权限、加密等措施完善
- 抗病毒结构
- 误操作的局限和自动恢复功能
-
多国语言支持
- 支持全世界现有的几十种主要语言
-
网络和资源共享
- 内部:多进程结构易于资源共享
- 外部:支持多种网络协议
最基本的概念:
- 进程(动态)
- 所有处在运行期间的程序实例都是进程,一个进程就是处在运行期间的一个程序实例,涵盖所有的动态概念
- 程序的一次执行实例。一个程序可同时有多个实例;系统中可同时有多个进程
- 文件(静态)
- 所有静态的无形数据和有形硬件设备(源程序、命令、图片、邮件、 打印机、内存、磁盘等)
2、UNIX系统假设底层硬件的工作方式是什么?
假设机器硬件支持的允许状态:用户态 & 核心态
硬件是按核心态和用户态来执行操作的,但对这两种状态下正在执行程序的多个用户是相同对待的。
3、操作系统核心是什么?核心通过什么方式和什么原则向上层应用程序提供了哪些服务?
操作系统核心是系统调用的集合及实现系统调用的内部算法
核心通过 函数形式 和 透明原则 向上层应用程序提供了如下服务:
- 进程管理:通过允许进程创建、终止、挂起及通信来控制进程的执行
- 时间管理:对进程在CPU上的执行进行公平调度
- 存储管理:对正在执行的进程分配主存
- 文件系统管理:为实现用户数据的有效存储和检索而分配二级存储
- 设备管理:允许进程对诸如终端、磁带机、磁盘机以及网络设备等进行有控制的存取
4、数据缓冲区高速缓冲建立的基础和原则是什么?要解决的根本问题是什么?这样设置高速缓冲有什么优缺点?
数据缓冲区高速缓冲建立的基础是 缓冲池技术
原则:
- 存放有刚使用过的数据尽量长时间地保留在内存中,以便马上还要使用时能在内存中找到
- 需要腾出内存空间时,把很久都未使用过(即最近最少使用)的数据交换到硬盘上去。这些数据马上还要使用的可能性最小
要解决的根本问题是:
- 磁盘机械运行速度大大低于处理机的运行速度
- 多进程并发运行,少量的磁盘(通道)I/O 成为瓶颈
- 数据访问的随机性,磁盘忙闲不均。
优点:
- 提供了对磁盘块的统一的存取方法
- 消除了用户对用户缓冲区中数据的特殊对齐需要
- 减少了磁盘访问的次数,提高了系统的整体I/O效率
- 有助于保持文件系统的完整性
缺点:
- 数据未及时写盘而带来的风险
- 额外的数据拷贝过程,大量数据传输时影响性能
5、多个进程在并行运行或串行运行时,与缓冲池的设置有什么关联影响?缓冲区设置的方式与数量对系统性能可能有哪些影响?
缓冲区算法有助于确保文件系统的完整性,因为他们维护一个公共的、包含在高速缓冲区中的磁盘块的单一映像。如果两个进程同时试图操控一个磁盘块,则缓冲区算法把它们的存取顺序排列,防止数据信息被破坏
高速缓冲的使用可减少访盘次数,从而提高整个系统的吞吐量,减少响应时间。欲从文件系统中读数据的进程可以在高速缓冲中找到数据块,从而避免对磁盘 I/O 的需要。内核进场使用延迟写以避免不必要的磁盘写,把该块留在高速缓冲中,并希望高速缓冲命中该块。显然对于具有很多缓冲区的系统来说高速缓冲命中的机会是较大的。然而,一个系统能够有益地配置的缓冲区数目受到主存总量的限制,它必须保证正在执行的诸进程有够用的主存。如果缓冲区占用了过多的主存,则系统会因过量的进程对换或调页而慢下来
高速缓冲的使用,使得当往用户进程中读或从用户进程中写时需要一次额外的数据拷贝过程。写数据的进程吧数据拷贝到内核,内核把数据拷贝到磁盘上;读数据的进程则把数据从磁盘读进内核,再从内核读到用户进程。当传输数据量很大时,这种过量的拷贝性能减慢,但是当传输的数据量很小时,它改进了性能,因为内核把数据缓冲起来,直到它认为往磁盘读诗合算的时候
6、UNIX 系统中的中断包括了哪些类别?处理各类中断的基本流程是什么?
中断分类:
- 硬件中断:来自时钟和各种外部设备
- 可编程中断:来自“软件中断”指令
- 例外中断:中断的特例,来自页面错误
基本流程:
- 保护现场:保存当前进程的上下文
- 确定中断源:根据中断向量查找中断处理程序
- 调用中断处理程序:完成处理任务
- 中断返回:恢复被中断程序的上下文
7、系统调用的基本实现方式是什么?
当用户态进程发起一个系统调用, CPU 将切换到 内核态 并开始执行一个 内核函数
- 应用程序 在 用户态 准备好调用参数,执行 int 指令触发 软中断 ,中断号为 0x80
- CPU 被软中断打断后,执行对应的 中断处理函数 ,这时便已进入 内核态
- 系统调用处理函数 准备 内核执行栈 ,并保存所有 寄存器 (一般用汇编语言实现)
- 系统调用处理函数 根据 系统调用号 调用对应的 C 函数—— 系统调用服务例程
- 系统调用处理函数 准备 返回值 并从 内核栈 中恢复 寄存器
- 系统调用处理函数 执行 ret 指令切换回 用户态
8、在操作系统中设置不同的处理机执行级别的目的是什么?通常系统中设置了哪些中断级别?
目的:用一组特权指令给处理机设置一个执行级,以屏蔽同级和更低级的中断,最大限度的减少其他事件的干扰,使当前任务顺利执行并尽快完成;开放更高级的中断以相应更紧迫的请求
| 中断事件 | 中断级别 |
|---|---|
| 硬件故障 | 高 |
| 时钟 | |
| 硬盘 | |
| 网络 | |
| 终端 | |
| 软件中断 | 低 |
9、什么是纯代码编程?纯代码编程的好处是什么?
纯代码编程是编程人员在开发过程中所有功能全部使用代码实现;和纯代码编程相对的是可视化编程,即可借助拖拽组件等可视化操作进行编程。
好处:
- 代码修改起来很方便
- 它可以进行封装,重用率高
- 出现错误容易找出来
- 合并代码不容易出现冲突
10、操作系统中包括了哪些构建原语?他们的基本功能是什么?他们的基本实现流程是什么?如何用他们来构建更大的功能模块?
操作系统中包括了两类构件原语:
-
输入 / 输出重定向
-
功能
- 输入重定向:命令的输入不再从标准输入文件中读取,而是从指定文件中读取
- 输出重定向:命令的结果不再输出到标准输出文件中,而是输出到其它指定地方
-
实现流程
-
首先 fork 一个子进程,后续步骤都在子进程中完成,父进程通过 waitpid() 系统调用等待子进程结束
-
打开 open() 系统调用打开 in.txt 和 out.txt,得到它们的描述符
-
通过 dup2() 系统调用把 STDIN 重定向到 fd_in,把 STDOUT 重定向到 fd_out
-
通过 system() 系统调用运行 shell 命令 sort
-
-
-
管道
- 功能:A 进程将标准输出重新定向到管道中去;B 进程将标准输入重新定向从管道中来
- 实现流程
- 管道是由内核管理的一个缓冲区
- 管道的一端连接一个进程的输出。这个进程会向管道中放入信息
- 管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息
- 一个缓冲区一般为 4K 大小,它被设计成为环形的数据结构,以便管道可以被循环利用
- 当管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息
- 当管道被放满信息的时候,尝试放入信息的进程会等待,直到另一端的进程取出信息
- 当两个进程都终结的时候,管道也自动消失
构建更大的功能模块
- 在程序内部:简单功能划分;纯代码设计
- 在程序外部:使用构件原语进行功能重叠和组装构建更大的功能模块
11、文件系统中划分数据块和数据片的目的是什么?其优缺点分别是什么?
划分数据块目的:提高传输速度,减少开销(overhead)
划分数据片目的:减少文件尾的碎片浪费
12、UNIX 的文件系统包括了哪些大的功能模块?什么是本地文件系统?什么是虚拟文件系统?设置虚拟文件系统的优缺点是什么?
UNIX的文件系统通常可由三大模块组成:
- 本地文件系统(UFS)
- 网络文件系统(NFS)
- 虚拟文件系统(VFS)
本地文件系统 是 UNIX 系统中的基本文件系统,它通常固定存放在本地机器的存贮设备上,任何一种结构形式的文件系统都必然会直接或间接地与某个本地文件系统相联系
虚拟文件系统 是整个操作系统的用户界面,它给用户提供一个统一的文件系统使用接口,避免用户涉及各个子文件系统的特征部分。用户感觉使用的是一个整体的,比本地机器上实际硬盘空间大得多的文件系统
设置虚拟文件系统的优点:
- 这种方式使得整个文件系统结构统一、模块性强、增加功能非常方便
- 对用户来说,整个文件系统的透明性好,使用简便,避免了用户在对不同类型的文件或不同地点的文件系统进行操作时,分别来设置参数和安排操作过程
设置虚拟文件系统的缺点:
- 为了能够支持各种实际文件系统,VFS定义了所有文件系统都支持的基本的、概念上的接口和数据结构
- 同时实际文件系统也提供 VFS 所期望的抽象接口和数据结构,将自身的诸如文件、目录等概念在形式上与VFS的定义保持一致。换句话说,一个实际的文件系统想要被Linux支持,就必须提供一个符合 VFS 标准的接口,才能与 VFS 协同工作。因此需要耗用一定的内存资源与硬件资源
13、文件系统中目录的逻辑结构是什么样的?存储结构又是什么样的?这种结构对整个文件系统有什么影响和限制?定长目录项的目录结构与变长目录项的目录结构有什么区别?怎样通过目录结构来计算文件系统的容量?
逻辑结构:树状层次结构
存储结构:链表
目录逻辑结构:
- 在 UNIX文件系统中,目录的组织形式采用的是树形结构, 一个逻辑文件系统就是一棵目录树。目录也被当作文件进行处理,一个目录文件的结构为表状结构,其中通常包含有若干表项,称为目录项,这些目录项既可以是普通文件的入口,也可以是子目录的入口。每一个目录项中通常包含两部分内容:①文件的i节点号②文件名
存储结构:
- 文件系统的存储结构 在UNIX系统中,一个物理磁盘通常被划分成一个或多个 逻辑文件系统(简称文件系统或子文件系统),每个逻辑文 件系统都被当作一个由逻辑设备号标识的逻辑设备。 UNIX的普通文件和目录文件就保存在这样的文件系统中。 逻辑文件系统的存储结构可分为两类型: 一级存储结构型:常用于运行环境较小的文件系统中 二级存储结构型:常用于运行环境较大(特别是硬盘空间 较大)的文件系统中。
影响和限制:
- 一级存储结构型:常用于运行环境较小的文件系统中 二级存储结构型:常用于运行环境较大(特别是硬盘空间 较大)的文件系统中
定长目录项的数据结构:
#define MAXNAMLEN 14
struct direct
{
short d_ino; /*目录项i节点号*/
char d_name [MAXNAMELEN]; /*目录项名字字符串*/
}
# 每个目录项的长度通常是确定的,为16个字节,其中前两个字节存放文件的i节点号d_ino,后面14个字节存放文件名 d_name。
变长目录项的数据结构:
#define MAXNAMLEN 255
struct direct
{
long d_ino; /* 目录项i节点号 */
short d_reclen; /* 目录项入口长度(占用长度)*/
short d_namelen;/* 目录项名字长度 */
char d_name [MAXNAMLEN+1] /* 名字字符串,+1为串结束符 \0 */
}
由于目录中各目录项的长度是变化的,因此必须在目录项 中标明本目录项的长度。前一个目录项释放时,把该目录项的空间全部合并到前一个目录项中,形成前面一个目录项占用空间大于实际使用的空间。
14、资源保护系统以什么方式保护了哪些类型的资源?上锁机制的流程和特点是什么?在不同的应用场合如何选择或设定不同的上锁机制?
资源保护系统以 quota 系统 和 上锁机制 保护了 静态硬资源 和 动态资源
quota 系统的主要功能是检测和限制用户对文件系统资源的使用
上锁机制是为了保持数据的一致性,能正常使用临界区资源,UNIX 文件系统提供的一种对数据(文件或记录)的上锁机制,即劝告锁,用户既可给整个文件上锁,也可给部分记录上锁
静态硬资源:包括存贮空间和索引节点,对这类资源的保护主要是通过 quota 系统提供的限量机制实现的
动态资源:主要是指临界区资源或独享资源,对这类资源的保护主要是通过上锁机制来实现的
在同一个文件或同一个记录上同时只能有一个互斥锁(或写 操作锁),但可以同时有多个共享锁(读操作锁)。共享锁 的级别低于互斥锁,互斥锁可以覆盖共享锁。
对一个文件上锁只是一种“自觉性”的保护措施——“劝 告锁”,进程在读写该文件之前都必须先检查该文件是否已 上锁,然后再进行相应的锁操作后才能对该文件进行读写。 否则将使该文件上原有的所有劝告锁失效。
15、文件的 i 节点有什么样的特点和功能?在对文件进行打开、读写、关闭操作时对 i 节点进行了哪些操作?
特点:
- 文件的内部名称(或代号),方便机器操作
- 每个文件都有一个且只有一个 inode 与之对应
- inode 存放文件的静态参数:存放地点、所有者、 文件类型、存取权限、文件大小等
- 每个文件都可以有多个名字,但都映射到同一个 inode 上
- 各 inode 之间以 inode 号相区别;
功能:
- 为了找到某一个文件在存储空间中存放的位置,用 i 节点对一个文件进行索引
打开操作:
- 系统找到这个文件名对应的 inode 号码
- 通过 inode 号码,获取 inode 信息
- 根据 inode 信息,找到文件数据所在的 block,读出数据
读写操作:
- directory 是一个列表,记录了一个文件 / 目录名称对应的 Inode number
- 当件系统进行读文件的时候,会先从 directory 里边找到和文件名字对应的 inode 节点号,然后再根据 inode 节点去查看信息找到对应的数据区,然后去数据区里边读取我们的文件内容
关闭操作:
- 如果文件表项的引用数由于系统调用 dup 或 fork 的结果而大于 1,就意味着还有其他用户文件描述符引用这个文件表项。这时,内核将引用数减 1,关闭操作便完成了
- 如果文件表项的引用数为 1,内核则释放该表项,使它重新可用,并释放在系统调用 opon 中分配的内存索引节点 i
- 如果其他进程还引用该索引节点,内核则使索引节点引用数减 1,并仍然保持它和其他进程的联系;否则,内核归还该引节点以便再次分配,因为其引用数已经为 0
16、进程的生命周期中划分了哪几种状态?这几种状态之间是怎么转换的?状态转换的时机和条件是什么?
进程的三个最基本的进程状态:运行态、就绪态、睡眠态
进一步细分,又可分为九种状态。在进程生命周期中必然处在以下九种状态之一,并且根据运行时间和条件的变化,在这九种状态之间进行转换
- 进程在用户态下执行
- 进程在核心态下执行
- 进程已经准备好运行,在内存中就绪
- 进程等待资源,在内存中睡眠
- 进程处于就绪状态,因内存不足,被放在交换区上等待
- 进程睡眠等待资源,因内存不足,被换到交换区上等待
- 进程正从核心态返回用户态,但核心抢先于它做了上下文切换,以调度另外一个进程
- 进程处于刚被创建的状态,此时进程既没有处于就绪状态,也没有进入睡眠状态
- 进程执行了系统调用 exit,处于僵死状态。此时进程刚消亡,并向父进程发送退出状态信息和计时统计信息
状态转换图
状态转换的条件和时机:
- 正在执行的进程执行完毕。这时,如果不选择新的就绪进程执行,将浪费处理机资源
- 执行中进程自己调用阻塞原语将自己阻塞起来进入睡眠等状态
- 执行中进程调用了P原语操作,从而因资源不足而被阻塞;或调用了v原语操作激活了等待资源的进程队列
- 执行中进程提出I/O请求后被阻塞
- 在分时系统中时间片已经用完
- 在执行完系统调用等系统程序后返回用户进程时,这时可看作系统进程执行完毕,从而可调度选择一新的用户进程执行
- 就绪队列中的某进程的优先级变得高于当前执行进程的优先级,从而也将引发进程调度
17、进程调度的基本原则和方式是什么?对时间片长短的设定对系统效率的影响是什么?
基本原则:多级反馈循环调度算法,公平共享调度策略
方式:把每一次硬件时钟中断称为一个时钟“滴答”,由若干个时钟滴答构成一个时间片。核心给每一个用户进程分配一个时间片,当该进程的时间片用完后,核心抢先该进程并调度另外一个进程运行。一段时间以后,核心又会重新调度该进程继续运行下去时间片设定对系统效率的 影响:从一个进程切换到另一个进程是需要一定时间的–保存和装入寄存器值及内存映像,更新各种表格和队列等。时间片设得太短会导致过多的进程切换,降低了CPU效率;而设得太长又可能降低系统实时性,引起对短的交互请求的响应变差
18、管道的实现机制什么?应用程序使用管道有什么好处和可能的不足?
实现机制:
- 管道是由内核管理的一个缓冲区
- 管道的一端连接一个进程的输出。这个进程会向管道中放入信息
- 管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息
- 一个缓冲区一般为 4K 大小,它被设计成为环形的数据结构,以便管道可以被循环利用
- 当管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息
- 当管道被放满信息的时候,尝试放入信息的进程会等待,直到另一端的进程取出信息
- 当两个进程都终结的时候,管道也自动消失
好处:
- 性能高
- 节约内存
- 基于数据处理能力的隐式执行控制
- 方便快捷
不足:
- 缓冲区有限
19、如何使用软中断信号来实现进程间的同步和互斥?
软中断实现同步(痛苦表情😖)
软中断实现互斥
1. 中断屏蔽法
利用 “开/关中断指令” 实现(与原语实现的思想一样,即,一个进程访问临界区前先关中断,访问完成后开中断,这样就不可能发生两个同时访问临界区的情况)
优点:简单,高效
缺点:不适用于多处理机;只适用于操作系统内核程序,不适用于用户进程(因为开/关中断指令只能运行在内核态,这组指令如果能让用户随意适用就很危险)
2. TestAndSet(TS 指令 / TSL 指令)
简称 TS 指令,也有地方称为 TestAndSetLock 指令,或 TSL 指令
TSL 指令是用硬件实现的,执行过程中不允许被中断,只能一气呵成
// 布尔型共享变量 lock 表示当前临界区是否被加锁
// true 表示加锁,false 表示未加锁
bool TestAndSet(bool *lock) {
bool old;
old = *lock;
*lock = true;
return old;
}
// 以下是使用 TSL 指令实现互斥的算法逻辑
while (TestAndSet(&lock)); // 上锁 并 检查
// 临界区代码段...
lock = false; // 解锁
// 剩余区代码段...
过程:若刚开始 lock 是 false,则 TSL 返回的 old 值为 false,while 循环条件不满足,直接跳过循环,进入临界区。若刚开始 lock 是 true,则执行 TSL 后 old 返回的值为 true,while 循环满足条件,会一直循环,直到当前访问临界区的进程在退出区进行解锁
对比:相比于软件实现方法,TSL 指令把 上锁 和检查 操作用硬件的方式变成了一气呵成的原子操作
优点:实现简单,无需像软件实现那样严格检查是否会有逻辑漏洞;适用于多处理机环境
缺点:不满足让权等待原则,暂时无法进入临界区的进程会占用 CPU 并循环执行 TSL 指令,从而导致忙等
3. Swap 指令(XCHG 指令)
也有叫 Exchange 指令,简称 XCHG 指令
Swap 指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成
// Swap 指令的作用是交换两个变量的值
Swap (bool *a, bool *b) {
bool temp;
temp = *a;
*a = *b;
*b = temp;
}
// 以下是使用 TSL 指令实现互斥的算法逻辑
// lock 表示当前临界区是否被加锁
bool old = true;
while (old == true)
Swap(&lock, &old);
// 临界区代码段...
lock = false; // 解锁
// 剩余区代码段...
过程:逻辑上与 TSL 并无太大的区别,都是先记录下此时临界区是否已经被上锁(记录在 old 变量上),再将上锁标记 lock 设置为 true,最后检查 old,如果 old 为 false 则说明之前没有别的进程对临界区上锁,则可跳出循环,进入临界区
优点:实现简单,无需像软件实现那样严格检查是否会有逻辑漏洞;适用于多处理机环境
缺点:不满足让权等待原则,暂时无法进入临界区的进程会占用 CPU 并循环执行 Swap 指令,从而导致忙等
20、UNIX系统中的进程是如何调度的?进程的调度优先数是如何计算的?
方式:把每一次硬件时钟中断称为一个时钟“滴答”,由若干个时钟滴答构成一个时间片。核心给每一个用户进程分配一个时间片,当该进程的时间片用完后,核心抢先该进程并调度另外一个进程运行。一段时间以后,核心又会重新调度该进程继续运行下去
计算方法:
在一个进程的时间片中,时钟可能要使它中断若干次,遇到多次“时钟滴答”。每次中断时,时钟中断处理程序都要重新计算所有进程(包括运行进程和等待进程)的CPU使用量,并由此调整各就绪进程的优先权值
进程的CPU使用量: decay(CPU) = CPU / 2 (其中的CPU是进程占用处理器的时间)
进程的优先权值(优先数)priority =(CPU使用量 / 2) + (基级用户优先权值)(其中的“基级用户优先权值”就是优先权阈值)
-
优先权值越大,则优先级越低;优先权值越小,则优先级越高
-
运行进程的运行时间越长,优先权值越高,优先级降低;就绪进程等待的时间越长,优先权值越低,优先级升高
21、上层应用对普通文件和设备文件都是按相同的方式来访问的,但操作系统内部是如何分别按不同方式来执行对普通文件和设备文件的操作?
在 icommon 数据结构中保存了文件的类型
CHR 和 BLK 字段,分别表示字符设备和块设备
一般普通文件保存在块设备中,设备文件一般都保存在字符设备中

浙公网安备 33010602011771号