信息安全系统设计与实现 第三章 Unix/Linux进程管理

多任务处理

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

进程的概念

执行映像:包含执行代码、数据和堆栈的存储区。进程是对映像的执行——这部分内容类似操作系统课程——在操作系统内核中,每个进程用一个独特的数据结构表示,叫作进程控制块(PCB)或任务控制块(TCB)等

多任务处理系统

多任务处理(MT)系统,说明多任务处理、上下文切换和进程处理原则。

1、type.h文件

#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; 

2、ts.s文件

.globl running,scheduler, tswitch
tSwitch:
SAVE:pushl %eax :
pushl %ebx
pushl %ecx
pushl %edx
pushl %ebp
pushl %esi
pushl %edi
pushf1
movl   running, Sebx
mov1   # esp,4(%ebx)
FIND: call  scheduler
RESUME: movl    running,8ebx
Movl    4(%ebx),%esp
popf1
popl %edi
popl %esi
popl %ebp
popl %edx
popl %ecx
popl %ebx
popl %eax
ret
# stack contents=|retPC|eax|ebx|ecx|edx|ebp|esi|edi|eflag|
# -2   -3  -4  -5  -6  -7   -8  -9  -1

3、queue.c文件

int enqueue(PROC **queue,PROC *p)
{
PROC *q = *queue;
if(q == 0 || p->priority> q->priority){
*queue = p;
p->next = q;
}
else{
while(g->next && p->priority <= q->next->priority)
q = q->next;
p->next = q->next;
q->next = p;
}
}
PROC *dequeue (PROC **queue)
{
PROC *p = *queue;
if (p)
*queue =(*queue)->next;
return p;
}
int printList(char *name,PROC *p)
{
printf("%s = ",name);
while(p){
printf("[8d %d]->",p->pid,p->priority);
p = p->next;
}
printf("NULL\n");
} 

4、t.c文件

5、多任务处理系统代码介绍

进程同步

1、睡眠模式

当某进程需要某些当前没有的东西时, 它就会在某个事件值上进入休眠状态, 该事件值表示休眠的原因。 为实现休眠操作,我们可在 PROC 结构体中添加一个 event 字段,并实现 ksleep(int event) 函数,使进程进人休眠状态。

2、唤醒操作

多个进程可能会进入休眠状态等待同一个事件,在这种情况下,所有这些进程都将休眠等待同一个事件值。当某个等待时间发生时,另一个执行实体(可能是某个进程或中断处理程序)将会调用 kwakeup(event), 唤醒正处千休眠状态等待该事件值的所有程序。如果没有任何程序休眠等待该程序,kwakeup()就不工作,即不执行任何操作。

进程终止

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

1、kexit()的算法

2、进程家族树

3、等待子进程终止

MT系统中的进程管理

Unix/Linux中的进程

1、进程来源

2、INIT和守护进程

3、登陆进程

4、sh进程

5、进程的执行模式

进程管理的系统调用

1、fork()

2、进程执行顺序

3、进程终止

4、等待子进程终止

5、Linux中的subreaper进程

6、exec():更改进程执行映像

I/O重定向

1、文件流和文件描述符

2、文件流I/O和系统调用

3、重定向标准输入

4、重定向标准输出

管道

管道是用千进程交换数据的单向进程间通信通道。管道有一个读取端和一个写入端。 可
从管道的读取端读取写人管道写入端的数据。

1、Unix/Linux中的管道编程

2、管道命令处理

3、将管道写进程与管道读进程连接起来

4、命令管道

编程项目:sh模拟器

1、带有I/O重定向的命令行

2、带有管道的命令

3、ELF可执行文件与sh脚本文件

4、示例解决方案

学习心得

本章讨论了Unix/Linux中的进程管理;阐述了多任务处理原则;介绍了进程概念;说明了多任务处理、上下文切换和进程处理的各种原则和方法。多任务处理系统支持动态进程创建、进程终止,以及通过休眠与唤醒实现进程同步、进程关系,以及以二叉树的形式实现进程家族树,从而允许父进程等待子进程终止;阐释了进程管理函数在操作系统内核中是如何工作的;然后,解释了Unix/Linux中各进程的来源,(初始进程、INIT进程、守护进程、登录进程以及可供用户执行命令的 sh 进程);接着,对进程的执行模式进行了讲解,以及如何通过中断、异常和系统调用从用户模式转换到内核模式;再接着,描述了用于进程管理的Unix/Linux 系统调用,(fork、wait、exec 和 exit);阐明了父进程与子进程之间的关系;解释了如何通过INIT进程处理孤儿进程,包括当前Linux 中的subreaper 进程;接着,详细介绍了如何通过exec更改进程执行映像,包括 execve 系统调用、命令行参数和环境变量;解释了I/O重定向和管道的原则及方法,并通过示例展示了管道编程的方法。