进程基础
一、什么是程序:
为了执行某一特定任务的一系列指令的有序集合。
程序 = 代码段 + 数据段
二、什么是进程:
从用户角度看:
进程是程序的一次执行过程`
从操作系统角度看:
>
1. 进程是分配CPU,内存、时间片等资源的基本单位
2. 进程是操作系统分配资源的最小单位
3. 进程有自己的执行状态
进程 = 程序 + 堆栈 + PCB(进程控制块)
三、进程和程序的区别:
- 进程是短暂的,而相对程序时永久的
- 进程有PCB
- 进程是动态的,程序时静态的
- 一个进程只能对应一个程序,一个程序可以对应多个进程
四、进程标识:
Linux操作系统中,每个进程都是通过唯一的进程ID标识的。进程ID是一个非负数。
标识进程的ID包括:
- 实际用户ID(uid): 标识运行该进程的用户
- 有效用户ID(euid): 标识以什么身份来运行进程。例如,某个普通用户A,运行了一个程序,而这个程序是以root身份来运行的,这程序运行时就具有root权限。此时实际用户ID是A用户的ID,而有效用户ID是root用户的ID。
- 实际组ID(gid): 它是实际用户所属的组的组ID
- 有效组ID(egid): 有效组ID是有效用户所属的组的组ID
五、进程的内存映像:
解释(由低到高):
- 代码段:即二进制机器代码,代码段是只读的,可被多个进程共享。如果一个进程创建了一个子进程,父子进程共享代码段。
- 已被初始化的全局变量和静态局部变量:存储已被初始化的全局变量和静态局部变量。
- 未被初始化的全局变量和静态局部变量:存储未被初始化的的全局变量和静态局部变量。
- 堆:用于存放程序运行中动态分配的变量。
- 栈:用于函数调用,保存函数的返回地址、函数的参数、函数内部定义的局部变量。
- 命令行参数和环境变量:存储命令行参数和环境变量
六、进程的三态:
三态包括:运行态、阻塞态和就绪态。
七、Linux进程七态:
- 运行状态(与就绪态合并):进程正在运行或在运行队列中等待运行
- 可中断睡眠状态:进程正在等待某个事件完成(如等待数据到达)。等待过程中可以被信号或定时器唤醒。
- 不可中断睡眠状态:进程也在等待某个事件完成,在等待中不可以被信号或定时器唤醒,必须等待直到等待的事件发生。
- 僵尸状态:进程已终止,但进程描述符依然存在,直到父进程调用wait()函数获取到它的退出状态后释放。
- 停止状态:进程因为收到SIGSTOP、SIGTSTP、SIGTIN、SIGTTOU信号后停止运行或者该进程正在被跟踪(调试程序时,进程处于被跟踪状态)。
使用ps命令可以查看进程的当前状态:
ps -efl
截图:
其中运行状态为R(runnable),可中断睡眠状态为S(sleeping),不可中断睡眠状态为D(uninterruptible sleep), 僵尸状态为Z(zombile),停止状态为T(traced or stopped)。
八、进程转化为进程通常要经过以下步骤:
- 内核为进程其分配pid,分配PCB
- 内核为进程分配地址空间,将程序读入内存
- 内核将进程置为就绪状态
- 将进程放到就绪队列中等待操作系统调度程序调度。