Linux编程--进程
1、基本概念:
- 进程:是程序动态执行的过程,包括创建、调度、消亡
- 程序:存放在外存中一段数据的集合
- 虚拟地址:进程使用的逻辑地址,有操作系统管理,不直接对应物理内存
- 物理地址:实际内存的硬件地址
- MMU(内存映射单元):将物理地址映射到虚拟地址
2、进程空间分布
- 每个进程运行之后,操作系统会为其开辟0 ~ 4 G的虚拟内存空间
- 进程空间 = 用户空间 + 内核空间
- 用户空间:文本段(文本去)+数据段(数据区)+系统数据段(堆栈)
- 文本段:存放代码和指令
- 数据段:存放字符串常量、全局变量与静态变量
- 系统数据段:堆(malloc生擒空间),栈(函数运行与局部变量空间)
3、多个进程存储与调度
1.多个进程的存储
- 多个进程在操作系统中存储时,空间是独立的(物理地址独立)
- 多个进程在操作系统中共用一个虚拟内存空间(虚拟地址是共享的)
2.多个进程的调度
宏观并行,微观串行(CPU 在多个任务中高速切换保障多任务执行)
4、进程相关 Linux 命令
1.进程查看指令
top
功能:
根据 CPU 占用率和内存占用率查看当前内存的信息
PID:
进程 ID 号
USER:
创建者
PR NI:
优先级
VIRT RES SHR S :
资源占用
%CPU %MEM:CPU:
和内存占用率
TIME+:
运行时长
COMMAND :
进程命令
ps -ef
功能:
查看该时刻的所有进程信息(强调父子关系和完整的进程信息)
UID:
创建进程的用户
PID:
进程的ID号
PPID:
父进程的ID号
C STIME TTY:
进程依赖的终端
ps -ef | grep 进程名 查找与进程名对应的进程信息
ps -aux
查看该时刻所有的进程信息(强调资源占用和进程的状态)
2.后台执行进程任务
指令 | 功能 |
进程名 & | 将进程转入后台运行 |
jobs | 查看终端下所有后台执行任务 |
fg PID编号 | 将后台执行的任务放到前台执行 |
3.优先级调整指令
nice/renice
示例:nice -n 优先级编号 进程名
renice -n 优先级编号 进程PID
功能:
改变进程的优先级
优先级范围:
-20 - 20 数字越小优先级越高
4.进程终止指令
kill/killall
示例:kill -编号 进程PID
killall -编号 进程名
功能:杀死进程任务
例:kill -9 PID
5、进程的状态
进程状态 | 标识 | 含义 |
就绪态/运行态 | R | 进程位于CPU任务调度的队列中 |
可唤醒等待态 | S | 等待某个资源的到来,资源到来后被唤醒加入调度队列 等待过程中可以被打断 |
不可唤醒等待态 | D | 等待某个资源的到来,资源到来后被唤醒加入调度队列 等待过程中不可以被打断 |
停止态 | T | 用户人为操作让进程等待 |
僵尸态 | Z | 进程代码运行结束,空间尚未回收 |
结束态 | X | 进程代码结束,空间被回收 |
6、进程相关函数接口
1.fork(子进程创建接口)
- 子进程拷贝父进程的文本段、数据段、系统数据段
- 父进程与子进程的 PID 号不同
- 若在子进程结束前父进程结束,子进程会被 init 领养,子进程的父进程 PID 号改为1
原型:
pid_t fork(void);
功能:
创建一个新的进程,新的进程称为子进程,调用fork的进程称为父进程
返回值:
父进程中返回子进程的PID
子进程中返回0
出错返回-1
2.获取 PID 号与 父进程 PID
getpid和getppid
原型:
pid_t getpid(void); 、
功能:
获得调用函数进程的PID号
原型:
pid_t getppid(void);
功能:
获得调用函数进程的父进程的PID号