一、课程内容第十一章学习
1、多任务处理
指的是同时进行几项独立活动的能力
逻辑并行性称为“并发”
2、进程
操作系统是一个多任务处系统在操作系统中,任务也称为进程。
在第2章中,我们把执行映像定义为包含执行代码、数据和堆栈的存储区。
定义一个PROC结构体:
next:指向下一个PROC结构体的指针
ksp:保存的堆栈指针
pid:一个进程的进程编号
status:是当前状态
priority:进程调度优先级
kstack:进程执行时的堆栈
3、多任务处理系统
1、type.h文件
文件定义了系统常熟和表示进程的简单PROC结构体
#define FREE 0
#define READY 1
#define SLEEP 2
#define ZOMBIE 3
typedef struct proc
{
struct proc *next;
int *ksp;
int pid;
int ppid;
int status;
int priority;
int kstack[SSIZE];
}
2 ts.s文件
在32位GCC汇编代码中可实现进程上下文切换
3 queue.c文件
可实现队列和链表操作
4、进程同步
一个操作系统包含许多并发进程,这些进程可以彼此交互。
进程同步是指控制和协调进程交互以确保其正确执行所需的各项规则和机制。最简单的进程同步工具是休眠和唤醒操作。
1 休眠状态
当某进程需要某些当前没有的东西时,例如申请独占一个存储区域、等待用户通过标准输入来输人字符等,它就会在某个事件值上进入休眠状态
为实现休眠操作,我们可在PROC结构体中添加一个event字段,并实现 ksleep(intevent)函数使进程进入休眠状态。
2 唤醒
唤醒正处于休眠状态等待该事件值的所有程序。如果没有任何程序休眠等待该程序,kwakeup0就不工作,即不执行任何操作。
kwakeup0的算法是:
进程终止
在操作系统中,进程可能终止或死亡,这是进程终止的通俗说法。
进程能以两种方式终止:
·正常终止:进程调用exit(value),发出 ext(value)系统调用来执行在操作系统内核中的 kexit(value)
·异常终止:进程因某个信号而异常终止。信号和信号处理将在后面第6章讨论在这两种情况下,当进程终止时,最终都会在操作系统内核中调用kexit()。
kexit0)的一般算法见下文。
5、进程家族树
通常,进程家族树通过个PROC结构中的一对子进程和兄弟进程指针以二叉树的形式实现,如:
PROC *child, wsibling, *parent;
其中,child 指向进程的第一个子进程,sibling指向同一个父进程的其他子进程。
二、代码实践
编译项目:
1、利用man和ls指令进行查询
2、等待和退出系统调用代码实践
代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
int main(void) {
pid_t pid;
// 创建子进程
if ((pid = fork()) < 0) {
// 出错处理
perror("fork error");
} else if (pid == 0) {
// 子进程
printf("Child process, pid %d\n", getpid());
// 子进程退出
exit(0);
} else {
// 父进程
printf("Parent process, pid %d\n", getpid());
// 等待子进程退出
wait(NULL);
// 结束当前进程
printf("Parent process, pid %d, exit\n", getpid());
exit(0);
}
return 0;
}
分析代码:
这里采用 fork() 函数创建了个子进程,再用 exit(0) 函数退出进程。
父进程中,等待子进程完成(wait(NULL))后调用了 exit(0) 结束进程。
三、苏格拉底问答