- 进程
- 正在运行的程序,其运行过程中需要消耗内存和CPU

- 程序和进程的区别
- 程序:
- 静态的数据集合,存储在硬盘空间
- 程序运行起来可以产生进程(一个程序可以产生多个进程)
- 进程:
- 是一个程序动态执行的过程,需要消耗内存和CPU
- 一个进程中可以执行多个程序
- 进程具备动态生命周期,从产生到调度再到消亡
- 进程的产生
- 进程产生时,操作系统会为其分配0-4G的虚拟内存空间
- 虚拟内存空间的3-4G为内核空间
- 栈区 (保存局部变量、保存函数的形参和返回值、保存函数的调用关系(保护现场恢复现场))
- 堆区 (由开发人员手动分配、使用完要手动释放)
- 数据区:
- 数据段 (已初始化的全局变量、已初始化的静态变量)
- bss段 (未初始化的全局变量、未初始化的静态变量(static)--->bss段初始时按位清0)、
- 字符串常量区 (保存字符串常量)
- 文本区 (存放指令代码、存放常量)
- 父进程:产生子进程的进程称为父进程
- 子进程:父进程产生出来的新进程即为该父进程的子进程
- 进程的调度
- CPU :数据处理速度快
- CPU调度算法
- 时间片轮转 :每个进程分配固定时间片,时间到就切换到下一个
- 先来先服务 :按照进程到达就绪队列的顺序分配CPU
- 最短作业优先 :选择预计执行时间最短的进程优先执行
- 优先级调度 :每个进程分配一个优先级,优先级高的先执行
- 进程的状态

- 操作系统进程的三态图

- 就绪态(ready)
- 进程已获得除CPU外的所有必要资源
- 等待被调度程序选中获得CPU执行权
- 系统中可能有多个进程处于就绪状态,形成就绪队列
- 运行态(running)
- 进程获得CPU,正在执行
- 单CPU系统中,任一时刻只有一个进程处于运行状态
- 多核系统中,可能有多个进程同时处于运行状态
- 阻塞态(blocked/waiting)
- 进程因等待某种事件(如I/O完成、信号量等)而暂停执行
- 即使CPU空闲,该进程也无法运行
- 可能有多个阻塞队列,按等待事件类型分类
- 状态转换
- 就绪--->运行
- 触发条件:被进程调度程序选中
- 动作:分配CPU,开始执行
- 运行--->就绪
- 运行--->阻塞
- 触发条件:
- 请求I/O操作
- 等待资源/事件(如等待信号量)
- 执行了阻塞式系统调用
- 动作:主动放弃CPU,进入相应等待队列
- 阻塞--->就绪
- 触发条件:等待的事件发生(如I/O完成)
- 动作:从等待队列移出,插入就绪队列
- Linux进程状态
- 进程的消亡
- 进程相关的命令
- PID :进程的ID号
- PPID :父进程的ID号
- 进程查看命令
- ps(Process Status)

- ps -aux | grep /a.out
- | 管道:前面命令的输出作为后面命令的输入
- grep :字符串查找,在输入中查找和后面字符串相关的数据
- top(动态进程监控)

- 进程树查看





- 进程相关编程
- 进程创建
- fork :pid_fork(void)
- 功能:创建当前进程的子进程,子进程拷贝父进程的代码段、数据段、堆栈段,拷贝父进程PCB(进程控制块)中的部分内容:PID不拷贝

- 注意:
- 子进程完完整整拷贝父进程0-3G虚拟内存空间
- 父子进程栈区、数据区、文本区、堆区完全独立,数据不共享
- 要想共享数据,需要使用进程间通信方式实现
- 返回值:
- 父进程中返回子进程PID
- 子进程中返回0
- 出错返回-1
- 进程调度(操作系统完成)
- 进程终止
- 正常终止方式:
- return
- void exit(int status); void _exit(int status)
- exit(0):正常退出
- exit(非0):由于进程产生了某种问题,需要主动退出程序
- 回收资源空间
- wait()、waitpid()
- 僵尸进程:进程退出后,但其资源空间未被父进程回收
- 如何避免僵尸进程产生:
- 子进程退出后,父进程及时为其回收资源空间
- 杀死父进程,让该进程成为一个孤儿进程,结束时被操作系统中的系统进程回收(init进程会自动回收)
- 孤儿进程:父进程先消亡,其对应的子进程成为一个孤儿进程,会被系统进程所收养(守护类的进程)