自学笔记6 - 重点总结
1. Unix/Linux进程管理
-
进程是对映像的执行。进程的产生是通过执行一个程序或指令,将程序加载到内存中成为一个独立的实体,并分配一个唯一的PID。
-
子进程与父进程的关系:在bash中再调用bash时,会形成父子关系。注意要正确处理父进程生成子进程后的情况。
-
进程的产生过程:
- 父进程调用
fork()
生成一个与自己一模一样的子进程。 - 子进程再调用
exec
执行实际的程序。
- 父进程调用
-
常驻内存的进程通常是服务型程序,被称为守护进程(daemon)。它们通常在文件名后会添加一个 'd' 以示区分。
-
在单一bash接口下进行多个工作时,可以在命令后加上
&
表示将命令放置于后台中执行。 -
进程同步是指控制和协调进程交互以确保其正确执行所需的各项规则和机制。其中,休眠和唤醒是最简单的同步工具。
-
进程的睡眠状态有两种:可中断的睡眠状态(
TASK_INTERRUPTIBLE
)和不可中断的睡眠状态(TASK_UNINTERRUPTIBLE
)。 -
进程的正常终止可以通过调用
exit(value)
或_exit(value)
系统调用来实现。
2. 多任务处理
- 多任务处理系统的基本实现包括:
type.h
文件:定义系统常数和表示进程的简单PROC
结构体。ts.s
文件:在32位GCC汇编代码中实现进程上下文切换。queue.c
文件:实现队列和链表操作函数,包括enqueue()
和dequeue()
。t.c
文件:定义多任务系统数据结构、系统初始化代码和进程管理函数。
3. 进程管理的系统调用
-
fork()
: 创建子进程并返回子进程的pid。在fork
函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。 -
wait(int *status)
: 父进程一旦调用了wait
就立即阻塞自己,直到有子进程退出为止。 -
exec()
: 用于在子进程中执行另一个程序,完全替换当前进程的执行映像。 -
exit()
: 用于退出当前进程。
4. 进程的执行模式
-
中断:外部设备发送给CPU的信号,请求CPU服务。
-
陷阱:错误条件,例如无效地址、非法指令、除以0等。
-
系统调用:允许Umode进程进入Kmode以执行内核函数的机制。
5. I/O重定向
-
文件流和文件描述符:每个文件流都是指向执行映像堆区中
FILE
结构体的一个指针。每个打开文件都用一个文件描述符(数字)表示。 -
文件流I/O和系统调用:库函数的调用会试图从文件流中获取数据。
6. 管道
-
命名管道(FIFO):有名称,以特殊文件的形式存在,用于进程间通信。
-
管道命令处理:通过管道将一个进程的输出传递给另一个进程作为输入,实现进程间通信。