进程概念:用户角度:正在运行的程序
操作系统角度:进程就是操作系统对运行中程序的描述信息——进程描述符——pcb
cpu处理多个进程时:运用cpu分时技术在多个进程间轮流进行
时间片:cpu在每个进程上运行的时间段
在LinuX中,pcb实则为一个描述结构体
struct task_struct
描述信息:标识符PID、进程状态、优先级、程序计数器、内存指针、上下文数据、文件的IO状态信息、记账信息
(1)标示符PID : 描述本进程的唯一标识符,用来区别其他进程。
(2)状态 :任务状态,退出代码,退出信号等。
(3)优先级 :相对于其他进程的优先级。
(4)程序计数器:程序中即将被执行的下一条指令的地址。
(5)内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
(6)上下文数据:进程执行时处理器的寄存器中的数据。
(7) I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
(8) 记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
创建进程:创建进程就是创建pcb(结构体),程序运行时被加载到内存,若此时将程序删除,则进程中该程序仍在运行。
虚拟寻址:cpu通过生成一个虚拟地址来访问主存,这个虚拟地址在被送到内存之前先转换成适当的物理地址(地址翻译),地址翻译需要cpu和操作系统的合作,cpu上叫做内存管理单元的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容由操作系统管理。
pcb并非程序本身,是一种内存指针,代表该被控程序
查看进程:
1.ps:查看进程信息 -ef|grep pid
ps -l只能查看当前bash的进程
ps aux可以查看所有系统运行的进程
2.getpid:返回调用进程pid(获取进程ID)
e.g: pid_t pid=getpid();
printf("pid:%d\n",pid);
3.根目录/proc文件中存在进程PID名的文件夹(文件夹中包含.exe->路径(快捷方式),wd:运行的路径)
创建进程(创建pcb)
fork:通过复制调用进程,创建一个新的进程(子进程)
接口:pid_t fork(void);//创建子进程
如何判断父/子进程:
通过进程返回值判断;只有子进程返回0;父进程返回子进程的PID(大于0)
e.g: pid_t pid=fork();
if(pid<0){ //创建子进程失败};return -1;
if(pid==0){//为子进程};
else{父进程};
进程状态:运行、就绪、阻塞(挂起)
LinuX下:运行态(R):程序申请到cpu即运行
可中断睡眠态(S)
不可中断睡眠态(D)
停止态(T)
追踪态(t)
死亡态(X)
僵死态(Z)
top:查看资源管理状态,若某进程cpu报占用100%可能:1.死循环(一般为纯粹的数据运算);2.占用多个cpu
运行状态:“+”代表在前端运行;
ctrl+z,暂停;kill pid,杀死pid进程;kill -18 -pid可杀死T状态的进程;kill -9强杀(除个别情况)
僵尸进程:处于僵死状态的进程
产生原因:子进程先于父进程退出,父进程接受的信号默认为忽略,所以无法取得子进程退出返回值,操作系统不能随意释放子进程资源,因此次是子进程处于退出但资源没有完全释放的状态。
危害:资源泄露,僵尸进程过多导致新进程无法创建 ulimite -a:可查看一个用户最多创建的进程数
解决方案:干掉父进程(子进程的返回值即退出原因已经毫无意义) 这里kill -9杀不掉
查找僵尸进程: ps -ef | grep defunct_process_pid
孤儿进程:父进程先于子进程退出(子进程不是前台进程,此时变为后台进程),被init进程收养
也称守护进程/精英进程:可由循环代码实现
避免僵尸方案:
进程等待:等待子进程退出
两种等待函数,一般推荐用第二种
1.pid_t wait(int* status);
防止子进程先退出,父进程一直等待子进程终止后再运行(阻塞函数),任意一个子进程退出则返回
阻塞与非阻塞概念:
阻塞:为了完成功能发起调用,如果当前不具备条件则等待,直到完成才返回
非阻塞:不具备条件是,立即报错返回不等待
2.pid_t waitpid(pid_t pid,int* status,int options);
可以等待任意一个或指定的子进程退出
pid: pid=0, 等待任何和调用waitpid()在同一个进程组(线程)的进程;
pid=-1,等待任一个子进程(此时与wait等价)
pid>0, 等待指定pid的进程(pid<0时取绝对值)
status(不用时置NULL,不关心子进程退出返回值):
宏定义: 1.WIFEXITED:若为正常终止子进程返回,则为真
2.WEXITSTATUS:若WIFEXITED非零则为真,获取子进程退出码
options(可设为0,此时为阻塞):
WNOHANG:若pid指定的子进程没有结束,则waitpid()返回0,非阻塞,若正常结束,则返回该子进程的进程号
注意:waitpid的返回值表示的是是否有子进程退出,status才是子进程的返回值
优先级:决定进程能够具有cpu资源优先分配权的一个层级划分(让操作系统运行的更加合理)
查看进程优先级:ps -l PRI NI修改优先级 PRI=PRI+NI
PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小 进程的优先级别越高
UID : 代表执行者的身份
PID : 代表这个进程的代号
PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
PRI :代表这个进程可被执行的优先级,其值越小越早被执行
NI :代表这个进程的nice值
nice值范围(进程可被执行的优先级的修正数值):-20~19,调整优先级就是调整进程nice值
设置方法:1.renice -n ni_val -p pid
2.进入top后按“r”–>输入进程PID–>输入nice值进行修改
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
环境变量: