学习笔记6:多任务管理和进程管理
3.1 多任务管理
多任务处理是指同时执行多项独立活动的能力,它是操作系统的基础,也是并行编程的基础。
3.2 进程的概念
操作系统是一个多任务处理系统,任务也称作进程。正式定义中,进程是对映像的执行。操作系统内核将一系列执行视为使用系统资源的单一实体,包括内存空间、I/O设备以及最重要的CPU时间。每个进程用一个独特的数据结构表示,叫做进程控制块或任务控制块。
3.3 多任务处理系统
多任务处理系统(MT)由以下几个部分组成:
3.3.1 type.h文件
type.h文件定义了系统常数和表示进程的简单PROC结构体。
/*********** type.h file ************/
#define NPROC 9
#define SSIZE 1024
// PROC status
#define FREE 0
#define READY 1
#define SLEEP 2
#define ZOMBIE 3
typedef struct proc {
struct proc *next;
int *ksp;
int pid;
int status;
int priority;
int kstack[SSIZE];
} PROC;
3.3.2 ts.s文件
ts.s文件包含了32位GCC汇编代码,可实现进程上下切换。
3.3.3 queue.c文件
queue.c文件包含了可实现队列和链表操作的函数。enqueue()函数按优先级将PROC输入队列中,而在优先级队列中,具有相同优先级的进程按先进先出的顺序排序。dequeue()函数可返回从队列或链表中删除的第一个元素。printList()函数可打印链表元素。
3.3.4 t.c文件
t.c文件定义了MT系统数据结构、系统初始化代码和进程管理函数。
3.3.5 多任务处理系统代码介绍
- 虚拟CPU:MT系统在Linux下编译链接为gcc -m32 t.c ts.s,然后运行a.out。
- init():当MT系统启动时,main()函数调用init()以初始化系统。
- P0调用kfork()来创建优先级为1的子进程P1,将其输入就绪队列中。
- tswitch(): 实现进程上下切换。
- tswitch()中的SAVE函数:把返回地址保存在堆栈上。
- scheduler(): 选择下一个正在执行的任务。
- tswitch()的RESUME函数:转而指向另一个任务的PROC。
- kfork(): 创建一个子任务并将其输入readyQueue。
- body(): 所有创建的任务都执行同一个body()函数。
- f: kfork一个新的子进程来执行body()。
- s: 切换进程。
- q: 终止进程。
- 空闲任务P0:具有最低的优先级。
- 运行多任务处理系统:gcc -m32 t.c ts.s。
3.4 进程同步
3.4.1 睡眠模式
当某进程需要某些当前没有的东西时,它会在某个事件值上进入休眠状态。
3.4.2 唤醒操作
唤醒正在休眠状态等待该事件值的所有程序。
3.5 进程终止
- 正常终止:进程调用exit,发出_exit(value)系统调用来执行在操作系统内核中的kexit(value)。
- 异常终止:进程因某个信号而异常终止。
3.6 MT系统中的进程管理
- 用二叉树的形式实现进程家族树。
- 实现ksleep()和kwakeup()进程同步函数。
- 实现kexit()和kwait()进程管理函数。
- 添加“w”命令来测试和演示等待操作。
3.7 Unix/Linux中的进程
-
进程来源
- 当操作系统启动时,操作系统内核的启动代码会强行创建一个PID=0的初始进程。然后系统执行它。在初始化系统后,P0复刻一个子进程P1,并把进程切换为以用户模式运行P1.
-
INIT和守护进程
- P1的大部分子进程都是用来提供系统服务的。它们在后台运行,不与任何用户交互。它们被称为守护进程.
-
登录进程
- 除了守护进程,P1复刻了许多登录进程,每个终端上一个,用于用户登录。每个登录进程打开三个与自己的终端相关联的文件流(stdin, stdout, stderr).
-
sh进程
- 当用户成功登录时,LOGIN 进程会获取用户的 gid 和 uid,从而成为用户的进程。它将目录更改为用户的主目录并执行列出的程序,通常是命令解释程序 sh。现在,用户进程执行sh,因此用户进程通常称为sh进程。它提示用户执行命令。一些特殊命令,如cd(更改目录)、退出、注销等,由sh 自己直接执行。其他大多数命令是各种 bin 目录(如/bin、/sbin、/usr/bin、/usr/local/bin 等)中的可执行文件。对于每个(可执行文件)命令,sh 会复刻一个子进程,并等待子进程终止。子进程将其执行映像更改为命令文件并执行命令程序。子进程在终止时会唤醒父进程 sh,父进程会收集子进程终止状态、
苏格拉底挑战问答