引出: 一个在执行的程序就可以叫一个进程 -- 程序(代码写的)
- 程序员写的代码要跑起来, 需要先加载进内存中, 然后通过CPU执行(程序是指令, CPU读取指令并执行), 而内存与CPU是操作系统所管理的"资源", 程序变进程就需要被管理
- 进程 = 代码 + 资源(内存等) + 管理信息(PCB)
1.进程
进程的组成
- 程序代码:这是进程执行的指令集合
- 程序计数器:记录了下一条要执行的指令的地址。
- 寄存器集合:包括通用寄存器, 程序状态字(PSW)等,用于存储程序执行过程中的临时数据
- 进程控制块(PCB):这是操作系统用来管理进程的信息结构,包含了进程的标识信息、状态、优先级、程序计数器、CPU寄存器集合、内存管理信息、I/O状态信息等。
- 内存空间:进程的代码和数据在内存中的存储区域。
- 资源:进程运行时所需的系统资源,如文件描述符、I/O设备等。
进程与线程
2.进程的五态模型
- 就绪状态:其它资源(进程控制块、内存、栈空间、堆空间等)都准备好、只差CPU的状态。
- 执行状态:进程获得CPU,其程序正在执行。
- 阻塞状态:进程因某种原因放弃CPU的状态,阻塞进程以队列的形式放置。
- 创建状态:创建进程时拥有PCB但其它资源尚未就绪。
- 终止状态:进程结束由系统清理或者归还PCB的状态。
3.进程间通信
- 让双方看到同一份资源即可
4.同步与互斥
生产消费者模型, 生产者放东西, 消费者拿东西, 中间层为临界资源, 由于某些指令不是原子的, 并发执行的时候就会有问题
- 多生产者之间,竞争关系
- 多消费者之间,竞争关系
- 生产者与消费者, 生产者再放数据的时候消费者不能进临界资源消费(竞争)保持一致性
5.作业管理
- 指计算机通过决策决定哪个就绪进程可以获得CPU使用权。
场景
-
主动放弃:进程正常终止;运行过程中发生异常而终止;主动阻塞(如等待I/O);
-
被动放弃:分给进程的时间片用完;有更高优先级的进程进入就绪队列;有更紧急的事情需要处理(如I/O中断);
进程调度算法
死锁
操作相关
进程的创建, 回收, 替换, 终止
进程的创建
pid_t fork(void)
功能: 创建新的进程
头文件: <unistd.h>
返回值: 给父进程返回子进程的pid, 给子进程返回0, 失败返回-1
特点: 父子进程代码共享, 若子进程发生写操作(OS进行写时拷贝)
进程的终止
1.进程常见的退出方式
- 代码跑完退出
- 结果正确
- 结果不正确(可以查看退出码定位出错原因)
- 如: return退出, exit函数退出
- 代码没跑完,程序崩溃(此时退出码无意义)
- 如: 信号终止(可以查看退出信号)
2.操作
void exit(int status);
功能: 进程的退出
头文件:<unistd.h>
参数:status 定义了进程的终止状态,父进程通过wait来获取该值
进程的等待
1.功能
- 回收子进程资源(可以解决僵尸进程问题)
- 关心派发给子进程的任务完成情况(是否正常, 正确)通过退出码, 退出信号
2.操作
pid_t wait(int*status);
头文件: <sys/types.h>, <sys/wait.h>
返回值:成功返回被等待进程pid,失败返回-1。
参数:获取子进程退出状态,不关心则可以设置成为NULL(输出型参数)
pid_ t waitpid(pid_t pid, int *status, int options);
头文件: <sys/types.h>, sys/wait.h>
返回值:
正常返回收集到的子进程的id
出错返回-1, 这时errno会被设置成相应的值以指示错误所在
参数:
pid 为-1表示等待任意一个子进程, >0为等待指定的子进程
status: 状态码(次第8位):(status>>8)&0xFF. 信号(低7位):status & 0x7F
options: 默认为0:阻塞等待 WNOHANG:非阻塞等待,若没有子进程可以等就返回0
WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)
WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)
进程的替换
1.概念
程序替换:是通过特定的接口,加载磁盘上一个全新的程序(代码+数据)
2.原理
3.操作
exec系列函数
- 头文件<unistd.h>
- 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[]);
- int execvp(const char *file, char *const argv[]);
- int execve(const char *path, char *const argv[], char *const envp[]);
命名解释
- l (list) : 表示参数采用列表
- v(vector) : 参数用数组
- p(path) : 有p自动搜索环境变量PATH
- e(env) : 表示自己维护环境变量
返回值
- 成功就没有返回值(进程已被替换)
- 失败返回-1
场景
- bash的简单实现(命令解释器)
- 父进程读取数据分析, 子进程执行指令
- 创建子进程来执行exec系列函数(执行其程序的功能 + 保证自己不会被替换)
进程间通信
Linux系统: 管道与共享内存_linux 共享内存 管道-CSDN博客