今天进入了下一个阶段的学习——进程与线程的学习
今天主要了解了进程的相关知识以及linux系统中对进程进行控制的一些函数接口
一、概念
程序:存放在外存中的一段数据组成的文件
进程:是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡
二、进程的相关命令
1、top 动态查看当前系统中的所有进程信息(根据cpu占用率排序)
其中有以下几种进程信息需要注意:
pid:唯一识别一个进程的id号(都大于0)
优先级:linux系统中数据高,优先级高,优先级主要是(-20到19)。
进程的状态有以下几种:R 运行态、就绪态S 睡眠态、可唤醒等待态D 不可唤醒等待态T 暂停态Z 僵尸态X 结束态
2.nice 以指定优先级运行某个进程:eg:nice -n 优先级 要执行的某个进程renice 重新设定一个正在运行的程序
3.kill
杀死指定的进程killall 杀死进程名所对应的所有进程任务4.ps -f 查看当前时刻所有进程的信息5.pstree 查看进程树关系6.ps -aux 查看当前时刻的进程信息7. ./a.out & 表示将a.out任务放在后台执行8. jobs 查看一个终端下后台执行的所有任务9. fg 将后台任务放在前台执行
三、进程的创建
3.1概念
一个进程在运行时,操作系统会为该进程分配0-4g的虚拟内存空间,这个空间主要包括文本段,数据段,系统数据段
文本段:也称为文本区,存放代码和指令数据段:也称为数据区,可以细分为:1.字符串常量区2.未初始化全局变量/静态变量3.已初始化全局变量/静态变量 系统数据段:包含堆区和栈区
四、进程中的虚拟地址和实际物理地址的对应关系
1. 0 - 4G虚拟内存空间只有一个
2. 实际物理地址中每个进程空间独立
3. 通过MMU内存映射单元,单一个进程执行时,将物理地址中的数据加载到虚拟地址中运行
五、进程的调度
5.1进程的调度:
常见的调度算法:
1.先来先执行,后来后执行
2.高优先级调度算法
3.时间片轮转调度算法
4.多级队列反馈调度算法
5.负载均衡调度算法
常用的就是时间片轮转调度算法。进程在运行时,宏观并行,微观串行
六、进程相关的函数接口
1.创建一个进程:fork
原型:pid_t fork(void);
功能:创建一个子进程,新创建的进程称为原来进程的子进程,原来的进程是父进程。
返回值:成功子进程返回0,父进程返回子进程的pid,失败返回-1
注意:父进程调用fork创建子进程,子进程拷贝父进程文本段,数据段,系统数据段。并且子进程从父进程创建子进程那一句代码之后开始运行。
getpidpid_t getpid(void);功能:获得调用进程的PID号getppidpid_t getppid(void);功能:获得调用进程的PPID
使用:使用fork()创建一个父进程的两个子进程:
#include "head.h"int main(void)
{pid_t pid1;pid_t pid2;pid1 = fork();if (-1 == pid1){perror("fail to fork");return -1;}if (0 == pid1){printf("子进程1 PID:%d PPID:%d\n", getpid(), getppid());}else if (pid1 > 0){pid2 = fork();if (-1 == pid2){perror("fail to fork");return -1;}if (0 == pid2){printf("子进程2 PID:%d PPID:%d\n", getpid(), getppid());}else if (pid2 > 0){printf("父进程 PID:%d child1PID:%d child2PID:%d\n", getpid(), pid1, pid2);}}while (1){}return 0;
}
2.exit()
让进程结束,会刷新缓存区
_exit()让进程结束,不会刷新缓存区
七、进程的消亡
僵尸进程:进程代码执行结束,但其空间没有回收
避免僵尸进程:让父进程先结束,让父进程回收子进程空间
wait()
功能:回收子进程空间
wait具有阻塞和同步功能。