Unix/Linux系统编程第三章学习笔记
作者:20191322wyl
目录知识点归纳
多任务处理
- 在单处理器系统中,一次只能执行一个任务。多任务处理是通过在不同任务之间多路复用CPU的执行时间来实现的。它是所有操作系统的基础。
- 逻辑并行性称为“并发”;
进程
- 进程是对映像的执行。
多任务处理系统(MT)
组成部分:
- type.h文件:定义了系统常数和表示进程的简单PROC结构体
- ts.s文件:在32位GCC汇编代码中可实现进程上下文切换
- queue.c文件:可实现队列和链表操作函数
- t.c文件:t.c文件定义MT系统数据结构、系统初始化代码和进程管理函数
进程同步
睡眠模式
当某进程需要某些当前没有的东西时,例如申请独占一个存储区域、等待用户通过标准输入来输入字符等,它就会在某个事件值上进人休眠状态,该事件值表示休眠的原因。
唤醒操作
多个进程可能会进人休眠状态等待同一个事件,这是很自然的,因为这些进程可能都需要同一个资源,例如一台当前正处于繁忙状态的打印机。在这种情况下,所有这些进程都将休眠等待同一个事件值。当某个等待时间发生时,另一个执行实体(可能是某个进程或中断处理程序)将会调用kwakeup(even),唤醒正处于休眠状态等待该事件值的所有程序。如果没有任何程序休眠等待该程序,kwakeupO就不工作,即不执行任何操作。注意,被唤醒的进程可能不会立即运行。它只是被放入readyQueue中,排队等待运行。当被唤醒的进程运行时,如果它在休眠之前正在试图获取资源,那么它必须尝试重新获取资源。这是因为该资源在它运行时可能不再可用。ksleepO和kwakeupO函数一般用于进程同步,但在特殊情况下也用于同步父进程和子进程。
进程终止
- 正常终止:进程调用exit(value),发出_exit(value)系统调用来执行在操作系统内核
中的kexit(value),这就是我们本节要讨论的情况。 - 异常终止:进程因某个信号而异常终止。信号和信号处理将在后面第6章讨论。在这两种情况下,当进程终止时,最终都会在操作系统内核中调用kexi()。
Unix/Linux中的进程
- 中断:中断是外部设备发送给CPU的信号,请求CPU服务。当在Umodie下执行时,CPU中断是启用的,因此它将响应任何中断。在中断发生时,CPU将进入Kmode来处理中断,这将导致进程进人Kmode。
- 陷附:陷是错误条件,例如无效地址、非法指令、陈以0等、这些错误条件被CPU识别为异常,使得CPU进人Kmode来处理错误。在Unix/Linux中,内核陷阴处理程序将陷研原因转换为信号编号,并将信号传递给进程。对于大多数信号,进程的默认操作是终止。
- 系统调用:系统调用(简称syscall)是一种允许Umode进程进入Kmode以执行内核函数的机制。当某进程执行完内核函数后,它将期望结果和一个返回值返回到Umode,该值通常为0(表示成功)或-1(表示错误)。如果发生错误,外部全局变量errno(在erno.h中)会包含一个ERROR代码,用于标识错误。
进程管理的系统调用
- fork
- wait
- exec
- exit
I/O重定向
- 标准输入:如果用一个新打开的文件来替换文件描述符0,那么输入将来自该文件而不是原始输入设备。
- 标准输出:更改文件描述符1,指向打开的文件名,然后stdout的输出将会转到该文件而不是屏幕;同样也可以将stderr重定向到一个文件。
Linux系统中的管道编程
问题与解答
进程中断以后由哪个处理器继续控制?
对于普通中断,控制首先转移给中断处理器,它做一些基本的辅助工作,然后转到与已经发生的特定类型的中断相关的操作系统例程。
实践
运行代码C3.7观察管道操作
代码已上传至码云