学习笔记6

学习笔记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中的进程

  1. 进程来源

    • 当操作系统启动时,操作系统内核的启动代码会强行创建一个PID=0的初始进程。然后系统执行它。在初始化系统后,P0复刻一个子进程P1,并把进程切换为以用户模式运行P1.
  2. INIT和守护进程

    • P1的大部分子进程都是用来提供系统服务的。它们在后台运行,不与任何用户交互。它们被称为守护进程.
  3. 登录进程

    • 除了守护进程,P1复刻了许多登录进程,每个终端上一个,用于用户登录。每个登录进程打开三个与自己的终端相关联的文件流(stdin, stdout, stderr).
  4. sh进程

    • 当用户成功登录时,LOGIN 进程会获取用户的 gid 和 uid,从而成为用户的进程。它将目录更改为用户的主目录并执行列出的程序,通常是命令解释程序 sh。现在,用户进程执行sh,因此用户进程通常称为sh进程。它提示用户执行命令。一些特殊命令,如cd(更改目录)、退出、注销等,由sh 自己直接执行。其他大多数命令是各种 bin 目录(如/bin、/sbin、/usr/bin、/usr/local/bin 等)中的可执行文件。对于每个(可执行文件)命令,sh 会复刻一个子进程,并等待子进程终止。子进程将其执行映像更改为命令文件并执行命令程序。子进程在终止时会唤醒父进程 sh,父进程会收集子进程终止状态、

苏格拉底挑战问答

image
image

posted @ 2023-10-22 21:27  卢泽  阅读(25)  评论(0)    收藏  举报