Linux系统编程 第3章学习笔记
Unix/Linux进程管理
多任务处理:
在单处理器(单CPU)系统 中.一次只能执行一个任务-多任务处理是通过在不同任务之间多路复用CPU的执行时间 来实现的,即将CPU执行操作从一个任务切换到另一个任务。
多任务处理是所有操作系统的基础总体上说,它也是并行编程的基础。
进程的概念
操作系统是1个多任务处理系统。在操作系统中,任务也称为进程。
进程是对映像的执行
在操作系统内核中,每个进程用1个独特的数据结构表示,叫作进程控制块(PCB)或任务控制块(TCR)等。书中成称为PROC结构体
一个简单的PROC结构体来表示进程
多任务处理系统(简称MT)
组成:
①type.h文件
定义了系统常数和表示进程的简单PROC结构体
②ts.s文件
在32位GCC汇编代码中可实现进程上下文切换
③queue.c文件
实现队列和链表操作函数
④t.c文件
定义MT系统数据结构、系统初始化代码和进程管理函数
⑤多任务处理系统代码介绍
进程同步
睡眠模式:
当某进程需要某些当前没有的东西时,例如申请独占一个存储区域、等待用户通过标准输入来输入字符等,它就会在某个事件值上进入休眠状态
唤醒操作:
多个进程可能会进入休眠状态等待同一个事件,这是很自然的,因为这些进程可能都需要同一个资源,例如一台当前正处于繁忙状态的打印机。在这种情况下,所有这些进程都将休眠等待同一个事件值。当某个等待时间发生时,另一个执行实体(可能是某个进程或中断处理程序)将会调用kwakeup(event),唤醒正处于休眠状态等待该事件值的所有程序。如果没有任何程序休眠等待该程序,kwakeup。就不工作,即不执行任何操作。
进程终止
·正常终止:进程调用exit(value),发出_exit(value)系统调用来执行在操作系统内核中的kexit(value),这就是我们本节要讨论的情况。
·异常终止:进程因某个信号而异常终止。
Unix/Linux 中的进程
进程来源:
当操作系统启动时,操作系统内核的启动代码会强行创建一个PID=0的初始进程,即通过分配PROC结构体(通常是proc[0])进行创建,初始化PROC内容,并让运行指向 proc[0]o然后,系统执行初始进程P0。大多数操作系统都以这种方式开始运行第一个进程。 P0继续初始化系统,包括系统硬件和内核数据结构。然后,它挂载一个根文件系统,使系统可以使用文件。在初始化系统之后,P0复刻出一个子进程P1,并把进程切换为以用户模 式运行P"
INIT和守护进程:
当进程P1开始运行时,它将其执行映像更改为IN1T程序。因此,P1通常被称为INIT 进程,因为它的执行映像是init程序。P1开始复刻出许多子进程。P1的大部分子进程都是 用来提供系统服务的。它们在后台运行,不与任何用户交互。这样的进程称为守护进程。
登录进程:
除了守护进程之外,P1还复刻了许多LOGIN进程,每个终端上一个,用于用户登录。
sh进程:
当用户成功登录时,LOGIN进程会获取用户的gid和uid,从而成为用户的进程、它将 目录更改为用户的主目录并执行列出的程序,通常是命令解释程序sh:现在,用户进程执行sh,因此用户进程通常称为sh进程。它提示用户执行命令。一些特殊命令,如cd(更改目录)、退出、注销等,由sh自己直接执行。其他大多数命令是各种bin目录(如/bin、/sbin、 /usr/bin , /usr/local/bin等)中的可执行文件。对于毎个(可执行文件)命令,sh会复刻一个子进程,并等待子进程终止。子进程将其执行映像更改为命令文件并执行命令程序。子进程 在终止时会唤醒父进程sh,父进程会收集子进程终止状态、释放子进程PROC结构体并提 示执行另一个命令等。除简单的命令之外,sh还支持I/O、重定向和通过管道连接的多个命令。
进程的执行模式:
在Unix/Linux中,进程以两种不同的模式执行,即内核模式和用户模式,简称Kmode 和Umode。在每种执行模式下,一个进程有一个执行映像。
进程管理的系统调用
fork():
创建子进程并返回子进程的pid,如果fork()失败则返回-1
进程的执行顺序:
在fork()完成后,子进程与父进程和系统中所有其他进程竞争CPU运行时间。接下来运行哪个进程取决于它们的调度优先级,优先级呈动态变化。
进程终止:正常/异常终止
等待子进程终止:
在任何时候,一个进程都可以使用
int pid = wait(int *status);
系统调用,等待僵尸子进程。如果成功,则wait()会返回僵尸子进程的PID,而且status 包含僵尸子进程的exitCodeo
I/O重定向
文件流和文件描述符
文件流I/O和系统调用
重定向标准输入
重定向标准输出
管道
管道是用于进程交换数据的单向进程间通信通道。
sh模拟器