《信息安全系统设计与实现》学习笔记6
第三章 Unix/Linux进程管理
多任务处理
- 一般来说,多任务处理指的是同时进行几项独立活动的能力。
- 多任务处理是所有操作系统的基础。总体上说,它也是并行编程的基础。
进程的概念
- 进程的正式定义:进程是对映像的执行。
- 操作系统内核将一系列执行视为使用系统资源的单一实体。在操作系统内核中,每个进程用一个独特的数据结构表示,叫作进程控制块(PCB)或任务控制块(TCB)等。本书中称为PROC结构体。
- next是指向下一个PROC结构体的指针
- ksp字段是保存的堆栈指针
- pid是一个进程的进程编号
- status是当前状态
- priority是进程调度优先级
- kstack是进程执行时的堆栈
多任务处理系统
-
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]; }
-
-
ts.s文件
-
ts.s在32位GCC汇编代码中可实现进程上下文切换.
-
queue.c文件
- queue.c文件可实现队列和链表操作函数。
- enqueue() 函数按优先级将 PROC输入队列中在优先级队列中,具有相同优先级的进程按先进先出(FIFO)的顺序排序。
- dequeue()函数可返回从队列或链表中删除的第一个元素。
- printList()函数可打印链表元素。
-
-
t.c文件
- t.c文件定义MT系统数据结构、系统初始化代码和进程管理函数。
Unix/Linux中的进程
- 进程来源
- 当操作系统启动时,操作系统内核的启动代码会强行创建一个PID=0初始进程。
- INIT和守护进程
- 当进程P1开始运行时,它将其执行映像更改为INIT程序。因此,P1通常被称为INIT进程 因为它的执行映像是init程序。P1 开始复刻出许多子进程。P1的大部分子进程都是用来提供系统服务的。它们在后台运行,不与任何用户交互。
- 登录进程
- 除了守护进程之外,P1还复刻了许多LOGIN进程,每个终端上一个,用于用户登录。每个LOGIN进程打开三个与自己的终端相关联的文件流。
- sh进程
- 当用户成功登录时,LOGIN进程会获取用户的gid和uid,从而称为用户的进程。他将目录更改为用户的主目录并执行列出的程序,通常是命令解释程序sh。
- 进程的执行模式
- 在Unix/Linux中进程以两种不同的模式执行,即内核模式和用户模式,简称Kmode和Umode。在每种执行模式下,一个进程有一个执行映像。
进程管理的系统调用
-
fork()
Usage: int pid = fork();
- fork()创建子进程并返回子进程的pid,如果fork()失败则返回-1。
-
进程执行顺序
- 在folk()完成后,子进程与父进程和系统中所有其他进程竞争CPU运行时间。
-
进程终止
- 正常终止
退出值0通常表示正常终止。 - 异常终止
内核的异常处理程序将陷阱错误类型转换为一个幻数,称为信号,将信号传递给进程,使进程终止。
- 正常终止
-
等待进程终止
- 在任何时候,一个进程都可以使用
int pid = wait(int *status)
系统调用,等待僵尸子进程。
- 在任何时候,一个进程都可以使用
-
Linux中的subreaper进程
-
exec():更改进程执行映像
-
进程可以使用exec()将Umode映像更改为不同的(可执行)文件。exec()库函数有几个成员。
int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg,...); int execle(const char *path, const char *arg,..., char * const envp[]); int execv(const char *path, char *const argv[]);
-
-
环境变量
-
环境变量是为当前sh定义的变量,由子sh或进程继承。
-
一些重要的环境变量
SHELL=/bin/bash TERM=xterm USER=kcw PATH=/usr/1oca1/bin:/usr/bin:/bin:/usr/local/games:/usr/games:./ HOME= / home /kcw
-
I/O重定向
-
sh进程有三个用于终端I/O的文件流:stdin(标准输入)、stdout(标准输出)、stderr(便准错误)。
-
文件流I/O和系统调用
scanf("%s",&item);
-
重定向标准输入
-
重定向标准输出
管道
-
管道是用于进程交换数据的单向进程间通信通道。
-
Unix/Linux中的管道编程
- 在Unix/Linux中,一系列相关系统调用为管道提供支持。
int pd[2];
int r = pipe(pd);
- 在Unix/Linux中,一系列相关系统调用为管道提供支持。
-
管道命令处理
cmd1 | cmd2
包含一个管道命令符号“|”。
-
命名管道
- 在sh中,通过mknod命名创建一个命名管道:
mknod mypipe p
- 或在c语言中发出mknod()系统调用:
int r = mknod("mypipe",S_IFIFO,0);
- 在sh中,通过mknod命名创建一个命名管道:
苏格拉底挑战
关于进程的苏格拉底挑战
关于进程管理的系统调用的苏格拉底挑战
遇到的问题
问题:进程管理的系统调用中,如何处理子进程的退出状态?
解决:询问GPT
GPT的回答