进程
1、正在运行的程序称为进程
程序:静态的;
进程:动态的,正在运行的程序叫做进程,每个进程都会有独立的空间,进程是程序执行和资源分配的最小单元,它是程序执行的过程,包括创建、调度和消亡
通过结构体struct task_struct管理进程
1.1进程资源的两大空间
内核空间的资源:内核空间资源即PCB(进程控制块),这些资源在必须通过系统调用才能访问。这些资源在当前进程退出,只能通过另一个进程(父进程)来回收,若不回收,会导致僵尸进程。
1.2用户空间资源
mm_struct
实质上进程的代码段(text),数据段,堆,栈,这些资源在进程退出时主动释放。
2.如何查看进程
2.1windows下查看进程:Ctrl+Alt+Del--->任务管理器
2.2Linux下查看进程:
ps :显示当前系统由该用户运行的进程列表
ps -ef:查看所有进程及其PID(进程ID号),系统时间、命令详细目录、执行者;
ps aux:a显示所有用户的进程;u显示用户;x显示无控制终端的进度
top:动态显示系统中运行的程序(每隔3秒刷新一次);
pstree:以树型结构显示进程;
kill:输出特定的信号给指定的PID(进程号)的进程;
kill -l:列出所有可用的信号名称;
3.进程的分类:
3.1交互进程:该类进程是由shell控制和
jobs:查看后台进程,只能查看同一终端下的进程
fg 作业号:切换至前台运行
3.2批处理进程:
3.3守护进程:
4.进程状态 :
D:不可中断的阻塞
R:运行态;(进程正在运行,或者正在队列中等待调度)
S:可中断的阻塞状态----->sleep;
D:不可中断的阻塞状态;
T:暂停状态
Z:僵尸状态
X:消亡状态
+:前台进程;
<:高优先级;
N:低优先级;
s:会话组组长;
l:多线程
优先级范围:-20到19,值越大优先级越低
普通用户优先级只能修改到0,要想修改到负值,只能通过root设置;
例如:sudo nice/renice -n -优先级 PID;
nice:按用户指定的优先级运行的进程;
renice:改变正在运行进程的优先级;
消亡状态是看不到的!
会话:Linux是以会话(session),进程组方式的管理 进程;
会话是以一个或者多个 进程组的集合,通常用户打开一个终端,系统创建一个会话,所有通过该终端运行的进程都属于这个会话,会话组的首进程(shell进程bash)-----会话组的组长;
当控制终端关闭时,所有相关进程会被结束。
1.创建进程
1.1fork()和vfork()的区别:
1.1.1数据段不同
fork():子进程拷贝父进程的数码段、代码段;
vfork:子进程与父进程共享数据段。
1.1.2执行次数
fork():父子进程的执行次数不确定;
vfork():保证子进程先运行,在调用exec或exit之前与父进程数据是 共享的,在它调用exec或exit之后父进程才能被调度运行。
2.父子进程:
2.1创建子进程,子进程几乎复制父进程所有的资源,如数据段,代码段,打开的 文件描述符;
2.2运行顺序:运行顺序不确定。
2.3父进程先退出 ,子进程未退出,子进程会成为孤儿进程。
2.4子进程先退出,父进程未退出,且父进程为回收子进程的资源,子进程会成为僵尸进程。
3.进程的退出
exit和_exit
所需头文件:exit:#include <stdlib.h>
_exit:#include <unistd.h>
函数原型:exit:void exit(int status);
_exit:void _exit(int status);
4.回收子进程资源,避免僵尸进程的产生
4.1wait()阻塞回收子进程资源
调用该函数使进程阻塞,直到任意一个子进程结束或者是该进程接收到了一个信号为止。如果该进程没有子进程或者子进程已经结束,wait()函数会立即返回。
4.1.2所需头文件:#include <sys/types.h>
#include <sys/wait.h>
4.1.3函数原型:pid_t wait(int *status)
4.2waitpid() 既可以阻塞回收也可以非阻塞回收。
5.exec函数族
1.作用:
1.1fork()子进程是为了执行新的程序;
1.2可以直接在子进程if中写入新程序的代码,但是不够灵活,因为只能将子进程程序的源代码贴过来执行(必须知道源码,而且源码太长不好控制)比如要执行 ls -la命令就不行;
1.3使用exec运行新的可执行程序(可以把一个编译好的的可执行程序直接加载运行);
1.4项目是一个多进程项目,主程序叫父进程,fork创建了一个子进程后在进程中exec来执行hello,达到父子进程分别作不同的程序(宏观上)同时运行。
2.如何使用exec函数
exec函数族提供了一种在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段。在执行完之后,原调用进程的内容除了进程号外,其他全部都被替换了。
如果某个进程想同时执行另一个程序,它就可以调用fork函数创建子进程,然后在子进程中调用任何一个exec函数。这样看起来就好像通过执行应用程序而产生了一个新进程一样
l----list 链表
p----path 不加路径
v----vector 向量
6.守护进程
6.1守护进程的特点
①也就是Daemon进程,是Linux中的后台进程;
②它是一个生存期较长的进程,通常独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件,常常在系统启动时开始运行,在系统关闭时终止。
6.2创建守护进程
①创建子进程,父进程退出
if(fork()>0) {exit(0);}
②子进程创建新的会话session
会话:
Linux是一个以会话(session),进程组方式的管理进程;
会话是一个或多个进程组大的集合,通常用户打开一个终端,系统创建一个会话,所有通过该终端运行。
会话组的首地址(shell进程bash)-----会话组的组长
当控制终端关闭时,所有相关进程会被结束。
③更改当前工作目录
守护进程一直运行在后台,其工作目录不能被卸载。
④重设文件掩码
⑤关闭子进程从父进程继承下来的文件描述符