第三章关于进程管理的读书笔记
第三章
Linux进程管理
主要内容:讨论Linux进程管理;阐述多任务处理原则;介绍进程概念;并以一个编程示例来说明多任务处理。
*** 多任务处理**
同时进行几项独立活动的能力。
*** 进程概念**
操作系统是一个多任务处理系统。操作系统中任务也称为进程。正式定义:对映象的执行。
PROC(包括两个进程控制模块PCB和任务控制模块TCP)一般结构
往后的讨论中提及的仅仅为单CPU系统。
*** 多任务处理系统(MT)**
- Type.h文件
定义了系统常数和进程表示的简单PROC1.
拓展MT系统时,应该向PROC结构体中增加更多的字段
-
ts.s文件
在32位GCC汇编代码中可以实现进程上下文切换
-
queue.c文件
实现对列和链表的操作函数。Enqueue()函数按照优先级将PROC输入队列之中;优先级高的进程FIFO。Dequeue()函数返回从队列或链表中删除的第一个元素。printList()打印链表元素。
-
t.c文件
定义MT系统数据结构、系统初始化代码和进程管理函数。
main函数
*** 进程同步**
- 睡眠模式
改编后的PROC
实现算法
-
唤醒操作
Kwakeup()函数算法:
-
进程终止
终止方式:正常终止(进程调用exit(value),发出_exit(value)系统调用执行系统内核中的kexit(value));异常终止(进程因为某个信号而异常终止) -
Kexit()算法
P1进程(INIT进程)某个进程死亡之后,他的所有子进程都由P1来管理。也就是说只要有其他程序存在,P1就不会消失。
- 家族进程树
sibling同级子进程
子进程进入ZOMBIE状态,唤醒父进程,空间由父进程释放。
- 等待子进程终止
Kwait()函数算法
唤醒父进程
P1的重要作用
- MT系统中的进程管理
编程实现目标:
*** Unix/Linux中的进程**
-
进程来源
操作系统启动时,操作系统内核的启动代码会强行创建一个PID=0的初始进程,即通过PROC结构体进行创建,初始化PROC内容,并让运行指向proc[0].系统初始化 之后,P0妇科了一个子进程P1,并将进程切换为以用户模式运行P1。 -
INIT和进程守护
当进程P1开始运行时,他将其执行映象更改为INIT程序;P1成为INIt程序,其映象成为init程序。P1开始复刻许多子进程,子进程的大部分都给系统提供服务。他们在后台运行,不予任何用户交互。这些进程被称为守护进程。如下
-
登录进程
P1进程除了守护进程外还复刻了许多LOGIN进程每个终端一个,用于用户登录。每一个登录进程都会打开三个与自己终端相关的文件流。包括标准输入stdio、标准输出stdout和用于标准错误消息的stderr。Stdin(文件描述符=0),stdout(1),stderr(2)
Sh进程
登陆成功后,登录进程会获得用户的gid和uid从而成为进程用户他将目录更改为用户的主目录并执行列出程序,通常是命令解释程序sh。 -
进程的执行模式
U/L中进程有两张不同的模式执行,即内核模式和用户模式(Kmode和Umode)
在Kmode下,通过cpu的转态寄存器从K状态装换到U状态。Umode只能通过以下三种方式进入Kmode
*** 进程管理的系统调用**
- Fork()函数
创建子进程并返回子进程的PID,如果失败则返回-1.
-
进程执行顺序
子进程与父进程和系统中的其他所有进城竞争CPU执行时间。谁先运行,鉴于它的优先级,优先级是动态的(当然还有时间)
-
进程终止
正常终止:父进程通过系统调用找到僵尸子进程,获得pid和退出状态
异常终止:程序陷入异常时,他会被陷入内核,内核将异常程序陷阱错误类型转换为一个幻数(信号),将信号转递给进程,使进程终止。
- 等待进程终止
任何一个时候,一个进程都可以使用
Kwait()算法
- Linux中的subreaper
内核3.4以后,Linux处理孤儿进程的方式略有不同。进程可以用系统调用将自己定义为subreaper:
这样一来,init进程P1不再是孤儿进程的父进程。标记为subreaper的最近活跃祖先进程将成为新的父进程。如果没有这样一个进程,孤儿进程依然会进入新的父进程。
-
exec():更改程序进程执行映像
进程可以使用exec()将其Umode映象更改为不同的(可执行)文件
-
环境变量
环境变量是为当前sh定义的变量,由子sh或进程继承。
使用env或printenv查看环境变量
实例
*** I/O重定向**
-
文件流和文件描述符
标准文件流(每一个文件流对应Linux内核中的一个打开文件)
-
文件流I/O和系统调用
-
重定向标准输入
用新的文件来代替文件描述符0。方法如下
- 重定向标准输出
重定向操作如下
*** 管道**
用于进程交换数据的单项进程间通信通道。(单向性决定只能一端写、一端读)
普通管道用于相关进程。命名管道是不相关进程之间的FIFO通信通道。读取和写入通道通常是同步、阻塞操作。
- 管道编程
U/L为管道提供系统调用支持
Pd中保存了两个文件描述符,pd[0]用于向管道读取,1则向管道写入。
管道操作实现
-
管道命令处理
-
命名管道(FIFO)
使用rm或unlink删除
Sh命令与C语言中创建的进程都可以使用管道。