Unix/Linux进程管理

多任务处理

同时执行几个独立的任务

进程

在操作系统中,任务也称为进程。进程是对映像的执行。

PROC结构体

多任务处理

  1. type.h文件:定义了系统常数和表示进程的简单PROC结构体
  2. ts.x文件在32位gcc汇编代码中可实现进程上下文切换。
  3. queue.c文件可实现队列和链表操作函数。
  4. t.c文件定义MT系统数据结构、系统初始化代码和进程管理函数。
MT系统的基本代码
  1. 虚拟CPU gcc -m32 t.o ts.s
  2. init()初始化PROC结构体,并输入FreeList中
  3. P()
  4. tswitch()、tswitch()中的save函数、scheduler()函数、tswitch()中的RESUME函数
  5. kfork()函数
  6. body()函数
  7. 空闲任务P0
  8. 运行多任务处理(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中各进程的来源

  1. 初始进程
  2. INIT进程
    当进程p1开始运行时,它将执行映像更改为INIT程序
  3. 守护进程
    p1复刻处许多子进程,大部分用来提供系统服务,它们在后台运行,不与任何用户交互,称为守护进程。
  4. 登录进程
    除了守护进程外,P1还复刻了许多LOGIN进程,每个终端上一个,用于用户登录。
  5. 可供用户执行命令的sh进程

进程的执行模式

内核模式和用户模式,简称Kmode和Umode。

用户模式转换到内核模式

  1. 中断
    外部设备发送给CPU的信号,请求CPU服务。
  2. 陷阱
    陷阱是错误条件,例如无效地址、非法指令、除以0等。
  3. 系统调用
    系统调用是一种允许Umode进程进入Kmode以执行内核函数的机制。

用于进程管理的Unix/Linux系统调用

  1. fork
    Usage:int pid = fork()
  2. wait
  3. exec
  4. exit

父进程与子进程

  1. 进程终止
    (1)正常终止。main()返回到crt0.o,调用库函数exit(0)来终止进程
    (2)异常终止。非法指令、越权、除零。
  2. 父进程等待操作

INIT进程处理孤儿进程

subreaper进程

prct1(PR_SET_CHILD_SUBREAPER)

通过exec更改进程执行映像

进程可以使用exec()将其Umode映像更改为不同的可执行文件.
  1. execve系统调用
  2. 命令行参数
  3. 环境变量
    当前sh定义的变量,由子sh或进程继承。

I/O重定向和管道的原则及方法

实现用于执行命令的sh模拟器

苏格拉底挑战