Unix/Linux进程管理
多任务处理
同时执行几个独立的任务
进程
在操作系统中,任务也称为进程。进程是对映像的执行。
PROC结构体
多任务处理
- type.h文件:定义了系统常数和表示进程的简单PROC结构体
- ts.x文件在32位gcc汇编代码中可实现进程上下文切换。
- queue.c文件可实现队列和链表操作函数。
- t.c文件定义MT系统数据结构、系统初始化代码和进程管理函数。
MT系统的基本代码
- 虚拟CPU
gcc -m32 t.o ts.s
- init()初始化PROC结构体,并输入FreeList中
- P()
- tswitch()、tswitch()中的save函数、scheduler()函数、tswitch()中的RESUME函数
- kfork()函数
- body()函数
- 空闲任务P0
- 运行多任务处理(MT)系统
动态进程创建
进程终止
休眠和唤醒实现进程同步、进程关系
实现休眠操作,在PROC结构体中添加一个event字段,并实现ksleep(int event)函数,是进程进入休眠状态。
调用kwakeup(event),唤醒正处于休眠状态等待该事件值的所有程序。
正常终止:进程调用exit(value),发出exit(value)系统调用来执行在操作系统内核中的kexit(value)
异常终止:进程因某个信号而终止。
二叉树的形式实现家族树、父进程等待子进程
进程家族树通过个PROC结构中的一对子进程和兄弟进程指针以二叉树的形式实现,如
PROC *child,*sibling, *parent;
等待子进程终止
在任何时候,进程都可以调用内核函数pid = kwait(int *status)等待僵尸子进程。
上下文切换
进程处理
UNIX/LINUX中各进程的来源
- 初始进程
- INIT进程
当进程p1开始运行时,它将执行映像更改为INIT程序 - 守护进程
p1复刻处许多子进程,大部分用来提供系统服务,它们在后台运行,不与任何用户交互,称为守护进程。 - 登录进程
除了守护进程外,P1还复刻了许多LOGIN进程,每个终端上一个,用于用户登录。 - 可供用户执行命令的sh进程
进程的执行模式
内核模式和用户模式,简称Kmode和Umode。
用户模式转换到内核模式
- 中断
外部设备发送给CPU的信号,请求CPU服务。 - 陷阱
陷阱是错误条件,例如无效地址、非法指令、除以0等。 - 系统调用
系统调用是一种允许Umode进程进入Kmode以执行内核函数的机制。
用于进程管理的Unix/Linux系统调用
- fork
Usage:int pid = fork()
- wait
- exec
- exit
父进程与子进程
- 进程终止
(1)正常终止。main()返回到crt0.o,调用库函数exit(0)来终止进程
(2)异常终止。非法指令、越权、除零。 - 父进程等待操作
INIT进程处理孤儿进程
subreaper进程
prct1(PR_SET_CHILD_SUBREAPER)
通过exec更改进程执行映像
进程可以使用exec()将其Umode映像更改为不同的可执行文件.
- execve系统调用
- 命令行参数
- 环境变量
当前sh定义的变量,由子sh或进程继承。
I/O重定向和管道的原则及方法
实现用于执行命令的sh模拟器
苏格拉底挑战