多任务处理:
在单处理器(单CPU)系统中,一次只能执行一个任务。多任务处理是通过在不同任务之间多路复用CPU的执行时间来实现的,即将CPU执行操作从一个任务切换到另一个任务。不同任务之间的执行切换机制称为上下文切换,将—个任务的执行环境更改为另一个任务的执行环境。如果切换速度足够快就会给人一种同时执行所有任务的错觉。这种逻辑并行忡称为 “并发”。在有多个CPU或处理器内核的多处理器系统中,可在不同CPU上实时、 并行执行多项任务。

进程:
进程是对映像的执行。一个进程是一个对资源的动态利用的过程,系统内核通过一个独特的数据结构来表示,它被称为进程控制块PCB或任务控制块TCB

多任务处理系统包括:
1,type.h文件定义了系统常数和表示进程的简单PROC结构体。
2,ts.s文件在32位GCC汇编代码中可实现进程上下文切换。
3,queue.c文件可实现队列和链表操作函数。其中enqueue()函数按优先级将PROC输入队列中。在优先级队列中,具有相同优先级的进程按先进先出的顺序排序。
4,t.c文件定义MT系统数据结构、系统初始化代码和进程管理函数

其中PROC结构体包括:
1,next是指向下一个PROC结构体的指针
2,ksp字段是保存的堆栈指针,存储了放弃使用CPU的进程的上下文;
3,pid标识一个进程的ID编号;
4,ppid为父进程的编号;
5,status是进程的当前状态;
6,priority是进程的调度优先级;
7,kstack是进程执行时的堆栈。

进程同步:
1,睡眠模式
当某进程需要某些当前没有的东西时,它就会在某个事件值上进入休眠状态。为实现休眠操作,我们可以在 PROC结构体中添加一个event字段,并实现ksleep(int event)函数,使进程进入休眠状态。接下来,我们将假设对 PROC结构体进行修改以包含加粗显示的添加字段。
2,唤醒操作
当某个等待时间发生时,另一个执行实体(可能是某个进程或中断处理程序)将会调用 kwakeup(event)。唤醒正处于休眠状态等待该事件值的所有程序。如果没有任何程序休眠等待该程序,kwakeup()就不工作,即不执行任何操作。

进程终止:
1,正常终止:进程调用exit(value),发出_exit(value)系统调用来执行在操作系统内核中的kexit(value)。
2,异常终止:进程因某个信号而异常终止

MT系统中的进程管理:
进程来源
操作系统内核会强行创建PID=0初始进程,然后,系统执行初始进程P0,然后,挂载一个跟文件系统,最后,P0复刻出一个子进程P1。
INIT和守护进程
P1运行时,将执行映像更改为init程序,P1通常被称为init进程,P1的大部分子进程都是用来提供系统服务的,称为守护进程。
sh进程
当用户成功登录时,LOGIN 进程会获取用户的 gid 和 uid,从而成为用户的进程。它将目录更改为用户的主目录并执行列出的程序,通常是命令解释程序 sh。现在,用户进程执行sh,因此用户进程通常称为 sh 进程。它提示用户执行命令。一些特殊命令,如cd(更改目录)、退出、注销等,由sh 自己直接执行。其他大多数命令是各种 bin 目录(如/bin、/sbin、/usr/bin、/usr/local/bin 等)中的可执行文件。对于每个(可执行文件)命令,sh 会复刻一个子进程,并等待子进程终止。子进程将其执行映像更改为命令文件并执行命令程序。子进程在终止时会唤醒父进程 sh,父进程会收集子进程终止状态、释放子进程 PROC 结构体并提示执行另一个命令等。除简单的命令之外,sh 还支持 I/O 重定向和通过管道连接的多个命令。

Unix/Linux中的进程:

进程的执行模式
1,中断是外部设备发送给 CPU的信号,请求 CPU 服务。当在 Umode 下执行时,CPU 中断是启用的,因此它将响应任何中断。在中断发生时,CPU 将进入 Kmode 来处理中断,这将导致进程进人 Kmode。
2,陷阱:陷阱是错误条件,例如无效地址、非法指令、除以0等,这些错误条件被 CPU识别为异常,使得 CPU 进入 Kmode 来处理错误。在 Unix/Linux 中,内核陷阱处理程序将陷阱原因转换为信号编号,并将信号传递给进程。对于大多数信号,进程的默认操作是终止。
3,系统调用:系统调用(简称syscall)是一种允许 Umode 进程进入 Kmode 以执行内核函数的机制。当某进程执行完内核函数后,它将期望结果和一个返回值返回到 Umode,该值通常为0(表示成功)或-1(表示错误)。如果发生错误,外部全局变量errno(在 errno.h中)会包含一个 ERROR 代码,用于标识错误。
1,用二叉树的形式实现进程家族树,2,实现ksleep()和kwakeup
2,进程同步函数
3,实现kexit()和kwait()进程管理函数
4,添加“W”命令来测试和演示等待操作

fork()
int pid = fork()
fork()创建子进程并返回子进程的pid,如果fork()失败则返回-1