多任务处理
在单处理器(单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重定向和管道的原则及方法,并通过示例展示了管道编程的方法。