第三章关于进程管理的读书笔记

第三章
Linux进程管理
主要内容:讨论Linux进程管理;阐述多任务处理原则;介绍进程概念;并以一个编程示例来说明多任务处理。
*** 多任务处理**

同时进行几项独立活动的能力。

*** 进程概念**
操作系统是一个多任务处理系统。操作系统中任务也称为进程。正式定义:对映象的执行。
PROC(包括两个进程控制模块PCB和任务控制模块TCP)一般结构

往后的讨论中提及的仅仅为单CPU系统。

*** 多任务处理系统(MT)**

  1. Type.h文件
    定义了系统常数和进程表示的简单PROC1.

拓展MT系统时,应该向PROC结构体中增加更多的字段

  1. ts.s文件
    在32位GCC汇编代码中可以实现进程上下文切换

  2. queue.c文件
    实现对列和链表的操作函数。Enqueue()函数按照优先级将PROC输入队列之中;优先级高的进程FIFO。Dequeue()函数返回从队列或链表中删除的第一个元素。printList()打印链表元素。

  3. t.c文件
    定义MT系统数据结构、系统初始化代码和进程管理函数。

main函数

*** 进程同步**

  1. 睡眠模式
    改编后的PROC

实现算法

  1. 唤醒操作
    Kwakeup()函数算法:

  2. 进程终止
    终止方式:正常终止(进程调用exit(value),发出_exit(value)系统调用执行系统内核中的kexit(value));异常终止(进程因为某个信号而异常终止)

  3. Kexit()算法

P1进程(INIT进程)某个进程死亡之后,他的所有子进程都由P1来管理。也就是说只要有其他程序存在,P1就不会消失。

  1. 家族进程树

sibling同级子进程

子进程进入ZOMBIE状态,唤醒父进程,空间由父进程释放。

  1. 等待子进程终止

Kwait()函数算法
唤醒父进程

P1的重要作用

  1. MT系统中的进程管理
    编程实现目标:

*** Unix/Linux中的进程**

  1. 进程来源
    操作系统启动时,操作系统内核的启动代码会强行创建一个PID=0的初始进程,即通过PROC结构体进行创建,初始化PROC内容,并让运行指向proc[0].系统初始化 之后,P0妇科了一个子进程P1,并将进程切换为以用户模式运行P1。

  2. INIT和进程守护
    当进程P1开始运行时,他将其执行映象更改为INIT程序;P1成为INIt程序,其映象成为init程序。P1开始复刻许多子进程,子进程的大部分都给系统提供服务。他们在后台运行,不予任何用户交互。这些进程被称为守护进程。如下

  3. 登录进程
    P1进程除了守护进程外还复刻了许多LOGIN进程每个终端一个,用于用户登录。每一个登录进程都会打开三个与自己终端相关的文件流。包括标准输入stdio、标准输出stdout和用于标准错误消息的stderr。Stdin(文件描述符=0),stdout(1),stderr(2)
    Sh进程
    登陆成功后,登录进程会获得用户的gid和uid从而成为进程用户他将目录更改为用户的主目录并执行列出程序,通常是命令解释程序sh。

  4. 进程的执行模式
    U/L中进程有两张不同的模式执行,即内核模式和用户模式(Kmode和Umode)

在Kmode下,通过cpu的转态寄存器从K状态装换到U状态。Umode只能通过以下三种方式进入Kmode

*** 进程管理的系统调用**

  1. Fork()函数

创建子进程并返回子进程的PID,如果失败则返回-1.

  1. 进程执行顺序
    子进程与父进程和系统中的其他所有进城竞争CPU执行时间。谁先运行,鉴于它的优先级,优先级是动态的(当然还有时间)

  2. 进程终止
    正常终止:父进程通过系统调用找到僵尸子进程,获得pid和退出状态

异常终止:程序陷入异常时,他会被陷入内核,内核将异常程序陷阱错误类型转换为一个幻数(信号),将信号转递给进程,使进程终止。

  1. 等待进程终止
    任何一个时候,一个进程都可以使用

Kwait()算法

  1. Linux中的subreaper
    内核3.4以后,Linux处理孤儿进程的方式略有不同。进程可以用系统调用将自己定义为subreaper:

这样一来,init进程P1不再是孤儿进程的父进程。标记为subreaper的最近活跃祖先进程将成为新的父进程。如果没有这样一个进程,孤儿进程依然会进入新的父进程。

  1. exec():更改程序进程执行映像
    进程可以使用exec()将其Umode映象更改为不同的(可执行)文件

  2. 环境变量
    环境变量是为当前sh定义的变量,由子sh或进程继承。

使用env或printenv查看环境变量

实例

*** I/O重定向**

  1. 文件流和文件描述符
    标准文件流(每一个文件流对应Linux内核中的一个打开文件

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

  3. 重定向标准输入
    用新的文件来代替文件描述符0。方法如下

  1. 重定向标准输出

重定向操作如下

*** 管道**
用于进程交换数据的单项进程间通信通道。(单向性决定只能一端写、一端读)
普通管道用于相关进程。命名管道是不相关进程之间的FIFO通信通道。读取和写入通道通常是同步、阻塞操作。

  1. 管道编程
    U/L为管道提供系统调用支持

Pd中保存了两个文件描述符,pd[0]用于向管道读取,1则向管道写入。

管道操作实现

  1. 管道命令处理

  2. 命名管道(FIFO)
    使用rm或unlink删除

Sh命令与C语言中创建的进程都可以使用管道。

posted @ 2022-10-09 20:57  岳华  阅读(19)  评论(0编辑  收藏  举报