本期和大家分享的主要是进程的相关知识,linux下进程的一些基本的命令以及进程的创建、调度和消亡的过程;主要的函数接口有:fork,getpid,getppid,exit,_exit等函数接口;
1.什么是进程?
程序:在硬盘中存放的一段代码的集合
进程:程序执行的一个过程,包括创建、调度、消亡 2.进程相关的命令:
(1)top
动态查看进程任务信息
PID:唯一识别进程的ID号
PPID:父进程的PID
(2)ps -ef
查看某个时刻所有进程信息(查看父进程ID)
(3)ps -aux
查看某个时刻所有进程信息(查看进程状态)
ps -ef | grep 进程名(|管道的作用是把前一个的输出作为后一个的输入)
单独查看某个进程信息
(4)kill
kill -9 进程ID 杀死进程
killall -9 进程名 杀死所有进程名对应的进程
(5)./进程名 &
后台执行进程
(6)jobs
查看后台任务
(7)ps
查看终端下的进程任务信息
(8)fg 编号
将编号对应的后台任务放到前台执行
(9)pstree
查看进程关系
2.进程的创建
每个进程都占0 - 4G虚拟内存空间(通过mmu内存映射单元映射到物理内存中)
(1)文本段(文本区)
文本区:存放代码、指令及相关一些数据常量值、函数
(2)数据段(数据区)
数据区:存放字符串常量
已初始化全局变量、静态变量
未初始化全局变量、静态变量
(3)系统数据段
堆区:存放局部变量,程序员手动管理malloc和free;
栈区:由操作系统管理;
注意:
多个进程任务共同使用同一片0-4g虚拟内存空间(不能同时使用这片内存空间,但每个进程物理实际内存不一样)
比如有四个进程,当执行到进程1时,进程1的程序会在0-4g的虚拟空间进行展开运行,由于任务调度微观串行,所以当进程2执行时,进程1会进行保护现场操作,把进程1的数据存放在相应的物理内存地址中;之后在这个0-4g的空间上展开进程2的程序,以此类推实现任务调度;每一个进程有自己的进程控制块(pid);
进程空间是独立的,每个进程独享(我用的时候别人不能用,物理内存空间独立)0 - 4g虚拟内存空间
统一虚拟地址但是在不同进程中数据不同的原因:
对于同一个虚拟地址,不同的进程但是位于同一个虚拟地址时数据不同的原因是因为他们的在执行自己进程程序时,另一个进程程序会保护现场关闭留出空间供目前的进程进行程序展开执行;这就解释了统一虚拟地址但是在不同进程中数据不同的原因;
3.进程的调度:
操作系统让多个任务同时执行
宏观并行、微观串行
进程调度算法:
(1)先来先执行,后来后执行
(2)高优先级调度算法
(3)时间片轮转调度算法(时间片一到进行任务切换)
(4)多级队列反馈调度算法
(5)负载均衡调度算法
时间片:CPU在一个进程任务中执行一段时间
4.进程状态:
运行态:正在被CPU任务调度的进程任务状态
就绪态:等待被CPU任务调度的进程任务状态
R
可唤醒等待态:等待某个资源,使得任务被挂起的状态
S
不可唤醒等待态:等待某个事件,任务不能被唤醒
D
停止态:任务暂停
T
僵尸态:进程任务结束,空间没有被回收
Z
结束态:进程任务结束,空间也被回收
X
5.系统调用:
(1)fork
pid_t fork(void);
功能:
创建一个子进程
参数:
缺省
返回值:
失败返回-1
成功子进程返回0
父进程返回子进程的PID
PID > 0
注意:创建进程的时候尽量不要并列创建,否则进程个数会以2的指数次方增加;
一般创建两个进程可以嵌套创建;
创建进程的时候会复制文本段,数据段和系统数据段一起复制,包括缓存;
(2)getpid
pid_t getpid(void);
功能:
获得调用该函数进程的PID号
参数:
缺省
返回值:
成功返回进程PID号
(3)getppid
pid_t getppid(void);
功能:
获得调用该函数进程的PPID号
参数:
缺省
返回值:
成功返回进程PPID
子进程和父进程空间不同的数据:
1.父子进程PID不同
2.fork返回值不同
(4)exit
void exit(int status);
功能:让当前进程结束
参数:status:进程退出的状态
返回值: 缺省
exit(1)表示异常退出.这个1是返回给操作系统的;
exit(x)(x不为0)都表示异常退出;
exit(0)表示正常退出;
printf是有缓存的;
(5)_exit
void _exit(int status);
功能: 让当前进程结束
参数: status:进程退出的状态
返回值:缺省
exit:先执行退出注册函数,再刷新缓存区,让进程结束
_exit:直接让进程结束
(6)atexit
int atexit(void (*function)(void));
功能: 注册一个退出进程时要执行的函数
参数:function:函数指针
返回值:
成功返回0
失败返回非0
注意:先注册的函数后执行;