Linux系统编程第三章学习笔记

前言

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

1.多任务处理

多任务处理是指计算机系统同时处理多个独立任务的能力,可以通过多进程、多线程和时间片轮转等方式实现。在单处理器系统中,每次只能执行一个任务,通过上下文切换机制实现任务的快速切换。在多处理器系统中,不同CPU或处理器内核可以实时并行执行多项任务。多任务处理是所有操作系统和并行编程的基础。

2.进程的概念

操作系统是一个多任务处理系统
进程的定义:进程是对映像的执行
操作系统内核将并发执行视为使用系统资源的单个实体,包括内存空间、I/O设备和CPU时间。每个进程都由一个独特的数据结构表表示,称为进程控制块(PCB)或任务控制块(TCB),这里称为PROC结构体。PROC结构体包含了进程的所有信息,实际操作系统中可能包含许多字段。为了简单起见,我们定义了一个简单的PROC结构体来表示进程。

typedef struct proc{
    struct proc *next;
    int *ksp;
    int pid;
    int ppid;
    int status;
    int priority;
    int kstack[1024];
} PROC;
  • next是指向下一个PROC结构体的指针,用于在各种动态数据结构(如链表和队列)中维护PROC结构体。
  • ksp字段是保存的堆栈指针,当某进程放弃使用CPU时,它会执行上下文保存在堆栈中,并将堆栈指针保存在PROC.ksp中,以便以后恢复。
  • pid是识别一个进程的ID编号.
  • ppid是父进程ID编号。
  • status是进程的当前状态。
  • priority是进程调度优先级。
  • kstack是进程执行时的堆栈。
    操作系统内核通常会在其数据区中定义有限数量的PROC结构体,表示为:
PROC proc[NPROC];

用来表示系统中的进程。在一个单CPU系统中,一次只能执行一个进程。操作系统内核通常会使用一个全局变量PROC指针来指向当前正在执行的进程。在多处理器系统中,有多个CPU可以实时并行执行多个进程,因此正在运行的进程可能是一个指针数组,每个指针指向在特定CPU上运行的进程。为简便起见,我们只考虑单CPU系统。

3.Unix/Linux中的进程

1.进程的来源

操作系统启动时,内核的启动代码会强制创建一个PID为0的初始进程。这通过分配一个PROC结构体(通常是proc[0])并初始化其内容来实现,然后将运行指针指向proc[0]。然后,系统执行初始进程P0。大多数操作系统都以这种方式开始运行第一个进程。
P0继续初始化系统,包括系统硬件和内核数据结构。然后,它挂载一个根文件系统,使系统能够访问文件。在初始化系统之后,P0复制一个子进程P1,并将进程切换到用户模式下运行P1。

2.INIT和守护进程

当进程P1开始运行时,它将其执行映像更改为INIT程序。因此,P1通常被称为INIT进程,因为它的执行映像是init 程序。P1 开始复刻出许多子进程。P1 的大部分子进程都是用来提供系统服务的。它们在后台运行,不与任何用户交互。这样的进程称为守护进程。守护进程的例子有

byslogd: 1og daemon process
inetd: Internet service daemon process
httpd: HTTP server daemon process
etc.

3.登录进程

P1除了守护进程外,还会复制许多LOGIN进程,每个终端上一个,用于用户登录。每个LOGIN进程打开三个与自己的终端相关联的文件流,即stdin(标准输入),stdout(标准输出)和stderr(标准错误)。每个文件流是指向进程堆区中FILE结构体的指针,每个FILE结构体记录一个文件描述符(数字),stdin的文件描述符是0,stdout的是1,stderr 的是2。
然后,每个LOGIN进程向stdout显示"login:",等待用户登录。用户账户信息保存在/etc/passwd和/etc/shadow文件中。每个用户账户在/etc/passwd文件中都有一行对应的记录,格式为:name;x;gid:uid;description:home:program。其中,name为用户登录名,x表示登录时检查密码,gid为用户组ID,uid为用户ID,home为用户主目录,program为用户登录后执行的初始程序。其他用户信息保存在/etc/shadow文件中。shadow文件的每一行都包含加密的用户密码,后面是可选的过期限制信息,如过期日期和时间等。
当用户尝试使用登录名和密码进行登录时,Linux将检查/etc/passwd文件和/etc/shadow文件,以验证用户的身份。

4.sh进程

成功登录后,LOGIN进程获取用户的gid和uid,并成为用户进程。它将目录更改为用户的主目录并执行列出的程序,通常是命令解释程序sh。用户进程通常称为sh进程,提示用户执行命令。sh进程自己直接执行一些特殊命令,如cd(更改目录)、exit(退出)、logout(注销)等。
大多数命令是各种bin目录(如/bin、/sbin、/usr/bin、/usr/local/bin等)中的可执行文件。对于每个(可执行文件)命令,sh会复刻一个子进程,并等待子进程终止。子进程将其执行映像更改为命令文件并执行命令程序。子进程在终止时会唤醒父进程sh,父进程将收集子进程终止状态,释放子进程的PROC结构体并提示执行另一个命令等。
除了简单的命令之外,sh还支持I/O重定向和通过管道连接的多个命令。

5.进程的执行模式

在Unix/Linux中,进程以两种不同的模式执行,即内核模式(Kmode)和用户模式(Umode)。
1
Umode进程只能通过一下三种方式进入Kmode:
(1)中断:外部设备发送给CPU信号,请求CPU服务。当在Umode下执行时,CPU中断是启用的。在发生中断时,CPU进入Kmode处理中断。
(2)陷阱:陷阱是错误条件,例如无效地址、非法指令、除以0等。CPU进入Kmode来处理错误。
(3)系统调用(syscall):是一种允许Umode进程进入Kmode以执行内核函数的机制。当某进程执行完内核函数后,它将期望结果和一个返回值返回Umode,该值通常为0(成功),-1(错误)。

4.进程的系统调用

Linux与进程管理相关的系统调用有如下几个:

fork(),wait(),exec(),exit()

详情可以使用指令man fork等系列指令查看其详情
2
详情可参考Linux系统调用——进程控制(C/C++)(Linux)

5.I/O重定向

I/O重定向有三种形式:
标准输入重定向(<):使用"<"符号将一个文件或设备作为命令执行的输入,例如"command < input_file"。
标准输出重定向(>):使用">"符号将命令执行的结果输出到一个指定文件或设备,例如"command > output_file"。
标准错误重定向(2>):使用"2>"符号将命令执行的错误信息输出到一个指定文件或设备,例如"command 2> error_file"。可以使用"&>"符号将标准输出和错误信息输出到同一个文件或设备,例如"command &> output_and_error_file"。
详情可参考Linux 下强大得不得了的 IO 重定向

6.管道

管道是单向进程间通信通道,有读取端和写入端。读取端从写入端读取数据。管道有普通管道和命名管道。读写管道是同步、阻塞操作,可以支持非阻塞、异步读写操作。管道被视为一组相关进程间的有限尺寸FIFO通信通道。读写进程同步方式如下:读进程从管道上读取数据时,如果有数据,则读取并返回读取的字节数;如果没有数据但有写进程,则等待数据;如果没有数据也没有写进程,则返回0。写进程写入管道时,如果有空间,则尽可能多地写入,直到管道写满;如果没有空间但有读进程,则等待空间;如果没有空间也没有读进程,则必须将这种情况视为管道中断错误并中止写入。

管道编程实践

3
4
详情可参考Linux的管道pipe实现原理

苏格拉底挑战

Linux多任务处理知识学习

posted @ 2023-10-21 17:23  20211120  阅读(74)  评论(0编辑  收藏  举报