1、用户进程如何向内核请求服务?
用户进程通常通过系统调用请求内核服务。系统调用一般被实现为硬件陷阱,它会改变CPU的执行模式和当前地址空间映射。用户在系统调用中提供的参数会在使用前由内核进行验证,以确保系统的完整性。
2、进程和内核之间的数据是如何传输的?有哪些可用的替代方法?
当内核被永久映射到地址空间时,进程和内核之间的数据传输可通过高效的 块复制指令 进行。
如果内核与进程交替映射,数据复制要么使用 临时映射 ,要么使用 特殊指令 从先前映射的地址空间进行复制,这两种方法比标准块复制指令慢达 2倍 。
3、为什么 FreeBSD 中提供了进程组?
进程组用于控制对终端的访问,并为向相关进程集合分发信号提供一种方式。
4、描述内核的四个与机器相关的功能。
内核与机器相关的功能包括:
- 机器相关的头文件处理
- PCI总线配置与初始化
- 虚拟内存管理
- 汇编语言例程
5、描述绝对路径名和相对路径名的区别。
以斜杠开头的路径名称为绝对路径名,内核从进程的根目录开始解释;
不以斜杠开头的路径名称为相对路径名,相对于进程的当前工作目录进行解释。
6、请说明在4.2BSD中添加mkdir系统调用的三个原因。
- 操作可实现原子性,系统崩溃时目录不会处于半构造状态;
- 运行网络文件系统时,文件和目录的创建与删除需原子指定以便序列化;
- 支持非UNIX文件系统(如NTFS)时,其他文件系统可能不支持链接操作,需显式的目录创建和删除请求。
7、定义分散 - 聚集 I/O。为什么它有用?
分散 - 聚集 I/O
分散 - 聚集 I/O 是 4.2BSD 引入的 I/O 能力。
- 分散输入 :使用
readv系统调用,允许一次读取的数据放入多个不同的缓冲区; - 聚集输出 :使用
writev系统调用,允许在一次原子写操作中将多个不同的缓冲区写入。
用途
- 允许进程地址空间不同部分的缓冲区进行原子写操作,无需将它们复制到单个连续缓冲区;
- 对于基于记录的底层抽象(如数据报),原子写是必要的;
- 能方便地将单个请求读入多个不同的缓冲区;
- 避免应用程序通过将数据读入大缓冲区再复制到目标位置来模拟分散数据,减少内存到内存复制的开销,避免显著增加受影响应用程序的运行时间。
8、管道(pipe)和套接字(socket)的区别是什么?
管道是线性字节数组,仅用作单向I/O流,无名称,不能用open打开,由pipe系统调用创建并返回两个描述符;在4.2BSD之前用文件系统实现,之后用套接字实现,FreeBSD为性能采用单独实现。
套接字是用于进程间通信的临时对象,只要有进程持有其描述符就存在,由socket系统调用创建并返回描述符,有不同类型支持多种通信语义,可命名,名称在通信域内有意义。
管道有数据按序、不重复、可靠传输和面向连接通信的特性,但无保留消息边界和支持带外消息的特性;套接字根据类型不同,特性多样,如数据报套接字提供不可靠、无连接的数据包通信,流套接字提供可靠、面向连接的字节流,可能支持带外数据传输,顺序数据包套接字提供顺序、可靠、不重复、基于连接且保留消息边界的通信。
9、描述如何创建管道中的一组进程。
当 shell 想要设置新管道时,首先创建管道中的第一个进程,该进程最初的进程组标识符与 shell 相同。在执行目标程序之前,第一个进程使用 setpgid 系统调用将其进程组标识符设置为与自身 PID 相同的值,从而创建一个新的进程组,该子进程成为进程组的领导者。随着 shell 为管道启动每个额外的进程,每个子进程使用 setpgid 加入现有的进程组。
10、描述三种系统活动类型。
三种系统活动类型包括:
- 底层操作系统相关活动
- 资源共享和调度活动
- 硬件与软件的交互活动
11、在内核上半部分执行的例程何时会被抢占?何时会被中断?
内核执行与中断处理机制
内核上半部分执行例程在执行系统调用等操作时,很少被抢占去运行其他用户进程。然而,如果必须等待某个事件或共享资源,它会主动放弃处理器。
值得注意的是,内核上半部分的执行可能会因以下两种情况被中断:
1. 需要运行实时进程
2. 内核下半部分的中断发生
当接收到中断时,处理该设备的内核进程会被调度运行。通常情况下,设备中断进程的优先级高于用户进程或内核上半部分运行的进程。因此,当中断使设备中断进程变为可运行状态时,它通常会抢占当前正在运行的进程。
12、为什么在内核下半部分执行的例程不能使用当前用户进程中的信息?
内核下半部分的活动相对于中断源是同步的,但相对于上半部分是异步的,并且软件不能依赖于中断发生时特定(或任何)进程正在运行,因此发起活动的进程的状态信息不可用。
13、为什么系统要尽可能将高优先级中断的工作推迟到低优先级软件中断进程中进行?
对于高速设备(如网络控制器),硬件中断需高优先级调度以快速响应,避免丢失数据包。
但后续处理(如将数据包传递给接收进程)虽耗时却无需快速完成,因此可低优先级调度,以免关键操作执行被不必要地长时间阻塞。
14、可执行文件中初始化数据是如何表示的?未初始化数据是如何表示的?为什么表示方式不同?
可执行文件中,初始化数据以数据镜像的形式存在,紧跟在文本镜像之后。未初始化数据不包含在可执行文件中,而是在需要时通过零填充内存创建。
表示方式不同的原因是未初始化数据在程序运行前值是未知的,可在需要时动态创建,通过零填充内存来实现,这样可以节省可执行文件的空间和加载时间。

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



