儿童玩具商城网站建设,黔西县住房和城乡建设局网站,网站维护怎么做,网络广告销售文章目录 查看进程通过系统目录查看通过ps命令查看 通过系统调用获取进程标识符通过系统调用创建进程初识fork函数fork函数的返回值 进程状态阻塞与运行状态Linux内核源码中的进程状态运行状态-R浅度睡眠状态-S深度睡眠状态-D暂停状态-T僵尸状态-Z死亡状态-X 查看进程 
通过系统… 文章目录 查看进程通过系统目录查看通过ps命令查看 通过系统调用获取进程标识符通过系统调用创建进程初识fork函数fork函数的返回值 进程状态阻塞与运行状态Linux内核源码中的进程状态运行状态-R浅度睡眠状态-S深度睡眠状态-D暂停状态-T僵尸状态-Z死亡状态-X  查看进程 
通过系统目录查看 
在根目录下有一个名为proc的系统文件夹查看结果如下图这个proc文件夹当中包含大量进程信息其中有些目录名为数字这些数字其实是某一进程的PID对应文件夹当中记录着对应进程的各种信息。我们若想查看PID为1的进程的进程信息则查看名字为1的文件夹即可/proc/1。  
通过ps命令查看 
1.单独使用ps命令会显示所有进程信息。 
[nanVM-8-10-centos test_23_4_23]$ ps axj2.ps命令与grep命令搭配使用即可只显示某一进程的信息。 
ps axj | head -1  ps axj | grep myproc | grep -v grep
//head -1  这个指令可以带上进程的小标题。
//grep -v grep 由于grep本身也是一个进程加上这句话可以过滤掉grep这个进程的显示3.中止进程 
法一Ctrlc
法二kill -9 [进程PID]通过系统调用获取进程标识符 
进程idPID父进程idPPID 
通过使用系统调用函数getpid和getppid即可分别获取进程的PID和PPID。 需要包含的头文件#includeunistd.h #includesys/types.h 我们通过一段代码来观察以下情况 
#includestdio.h
#includeunistd.h
#includesys/types.h
int main()
{while(1){printf(你好我已经是一个进程了我的PID是%d,我的父进程是%d\n,getpid(),getppid());sleep(1);}return 0;                                                                                                                                                                    } 
当运行该代码生成的可执行程序后可循环打印该进程的PID和PPID。我们可以通过ps命令查看该进程的信息可发现通过ps命令得到的进程的PID和PPID与使用系统调用函数getpid和getppid所获取的值相同。  还有一个现象就是如果我们在命令行重复运行该程序每次进程的PID都输不一样的但是进程的PPID都是相同的我们通过ps命令查看以下这个父进程的属性信息可以发现这个进程的父进程就是bash。 
结论命令行启动所有程序最终都会变成进程而该进程对应的父进程都是bash所以bash命令行解释器本质上也是一个进程。bash通过派生子进程的方式执行程序如果程序有bug退出了那只是子进程出问题对bash没有影响。如果我们用kill命令终止bash这个进程那么命令行就失效了有兴趣的同学可以试一试之后重启就会恢复的  
通过系统调用创建进程 
初识fork函数 
fork是一个系统调用级别的函数其功能是创建一个子进程运行man fork可以查看fork系统调用函数的使用手册fork有两个返回值父子进程代码共享数据各自开辟空间私有一份采用写时拷贝 
我们先来看一段测试代码 
#includestdio.h
#includeunistd.h
#includesys/types.h
int main()
{printf(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:PID:%d,PPID:%d\n,getpid(),getppid());                                                                                               fork();printf(BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB:PID:%d,PPID:%d\n,getpid(),getppid());sleep(1);return 0;
}运行结果  看到这个运行结果有人肯定会纳闷怎么打印了两行B的信息 解释并且我们从运行结果可以看到第一次打印的BPID是22063进程PID第二次打印的BPPID父进程ID也是22063这个结果说明了当代码执行到fork函数之后我们自己创建了一个子进程。而这个子进程的父进程就是我们运行起来myproc进程myproc进程的父进程20166是base。打印结果有两行B是因为我们当前进程在fork创建子进程之后进行了分流如图一条是当前的myproc进程另一条是子进程。  
父子进程代码共享数据各自开辟空间私有一份采用写时拷贝 
fork之前父进程有它的PCB以及代码和数据fork创建子进程之后并没有把父进程的代码和数据再拷贝一份而是在内核当中再创建一份进程所对应的PCB子进程的进程属性大部分会以父进程为模板还有小部分的属性是子进程私有的比如子进程的PIDPPID。也就是说fork之后父进程和子进程共享一份代码和数据父进程的。 
fork函数的返回值 
如果子进程创建成功在父进程中返回子进程的PID在子进程中返回0.如果子进程创建失败则在父进程中返回-1. 
上面打印A和B的测试代码fork函数创建出来的子进程与父进程共享代码但是如果让父子进程做相同的事是没有意义的所以实际上在fork之后一般使用if-else语句进行分流父子进程相互独立可以执行不同的任务。 
测试代码如下 
#includestdio.h
#includeunistd.h
#includesys/types.h
int main()
{printf(I am running...\n);//接收fork函数的返回值pid_t idfork();if(id0){//子进程while(1){printf(我是子进程...\n);sleep(1);}}else if(id0){//父进程while(1){printf(我是父进程...\n);sleep(1);}}else{//fork error}return 0;                                                                                                                                                                    
}运行结果父子进程循环打印   
从上述代码可以很清楚的了解到fork创建子进程后,if-else语句居然都被分别执行了。有两个myproc进程在跑诶~ 
结论 a.fork之后会由一个执行流变成两个执行流。 b.fork之后两个进程被OS调度的顺序是不确定的取决于操作系统调度算法的具体实现。 c.fork之后fork之后的代码共享通过我们使用if和else进行执行流分流。 注意父子进程之间相互独立 进程在运行的时候是具有独立性的父子进程在运行的时候也是具有独立性的。kill -9 子进程PID可以看到父进程正常运行。他们代码共享数据以写时拷贝的方式各自私有一份。 fork如何看待代码和数据 代码代码是只读的 数据当有一个执行流尝试修改数据的时候操作系统会自动给我们当前进程触发写时拷贝。父子进程之间的数据不会相互影响。 
进程状态 
阻塞与运行状态 
想要弄明白进程的各种状态我们需要先弄明白什么是阻塞什么是运行。 问当我们打开一个软件它就一直处于运行状态吗 答案是NoCPU不是处理完一个进程再处理下一个进程的。而是轮流着处理只是因为处理速度非常快我们没有感受到那个时间差。 
阻塞状态进程等待某种资源就绪的过程。 
进程要通过等待的方式等具体的资源被别人使用完成后再被自己使用。task_struct结构体需要在某种被OS管理的资源下排队。所以因为等待某种条件就绪而导致的一种不推进的状态即进程卡住了就被称为阻塞。比如你去银行柜台办理业务结果业务员叫你先到一旁去填表那么你就处于阻塞状态。 
进程不仅仅会占用CPU资源也会占用硬件资源。对于CPU它可以很快的处理进程的请求但是对于硬件速度很慢例如网卡可能同时有迅雷、百度网盘、QQ等进程需要获取网卡的资源所以每一个描述硬件的结构体中也有一个task_struct* queue运行队列指针指向排队中的PCB对象的头结点。 
那么CPU和硬件的速度差异巨大系统该怎么平衡这种速度当CPU发现运行状态的进程需要访问硬件资源时会让该进程去所需访问的硬件的运行队列中排队CPU继续执行下一个进程。 
那么这个被CPU剥离至硬件运行队列中的进程状态被称为阻塞状态。当进程对硬件的访问结束后进程的状态将会被修改为运行状态即该进程重新回到CPU的运行队列。 
总结PCB可以被维护在不同的队列中。 
阻塞挂起状态硬件的速度较慢但是大量的进程需要访问硬件势必会产生较多的阻塞进程这些阻塞进程的代码和数据在短期内不会被执行如果全部存在于内存中将会导致内存占用。 
对于这个问题如果内存中有过多的阻塞状态的进程导致内存不足操作系统会将其的代码和数据先挪动至磁盘仅留PCB结构体以节省内存空间这种进程状态被称为挂起状态。将进程相关数据加载或保存至磁盘的过程称为内存数据的换入和换出。 
进程的阻塞状态不一定是挂起状态部分操作系统可能会存在新建状态挂起或运行状态挂起等。 
Linux内核源码中的进程状态 
为了弄明白正在运行的进程是什么意思我们需要知道进程的不同状态。一个进程可以有几个状态在Linux内核里进程有时候也叫做任务。 下面的状态在kernel源代码里定义 
/*
* The task state array is a strange bitmap of
* reasons to sleep. Thus running is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char *task_state_array[]  {R (running),       /*  0*/S (sleeping),      /*  1*/D (disk sleep),    /*  2*/T (stopped),       /*  4*/T (tracing stop),  /*  8*/Z (zombie),        /* 16*/X (dead)           /* 32*/
}; 
ps:进程的当前状态是保存到自己的进程控制块PCB当中的在Linux操作系统当中也就是保存在task_struct当中的。 
task_struct进程控制块的内容分类 
接下来开始详细解析每种状态的定义。  进程状态查看命令 
ps axj | head -1  ps axj | grep 进程PID | grep -v grep运行状态-R 
测试代码 
#includestdio.h
int main
{while(1){}return 0;
}查询进程状态  R运行状态running一个进程处于运行状态并不意味着进程一定在运行中这个进程有可能是在运行也有可能是在运行队列里排队中。所有处于运行状态的进程都被放到运行队列中当操作系统切换进程进行运行时就从运行队列中选取进程运行。 
浅度睡眠状态-S 
睡眠状态的本质就是阻塞状态。 
测试代码 
#include stdio.h    
int main()    
{    int a0;    while(1)    {    printf(%d\n,a);               }                                  return 0;                          
} 查看进程状态  
浅度睡眠状态S一个进程处于浅度睡眠状态sleeping表面该进程正在等待某件事情完成处于浅度睡眠状态的进程随时可以被唤醒也可以被杀掉浅度睡眠也可叫做可中断睡眠。 
有人可能会疑问明明代码是在运行的呀为什么是处于阻塞状态呢 那是因为这段测试代码相比上段测试运行状态的代码多了一个打印函数printf既然是打印函数当然就需要访问到外设显示屏所以啊这个时候我们维护mytest进程的PCB就到外设的运行队列去等待外设了阻塞状态由于CPU的处理速度远大于外设的速度所以我们只有小小小概率可能可以看到进程状态是R大部分查询到的进程状态还是S。 
ps状态后面有号表示前台进程没有号表示后台进程。 前台进程通过Ctrlc可以终止进程后台进程不受终端控制Ctrlc无法终止进程运行。 
深度睡眠状态-D 
深度睡眠状态-D也叫作不可中断睡眠状态表示该进程不会被杀掉即便是操作系统也不行不然你的系统可能就会宕机了只有该进程自动唤醒才可以恢复在这个状态下进程通常会等待IO的结束。 
暂停状态-T 
暂停状态的本质也是一个阻塞状态。 
暂停状态-Tstopped在Linux中我们可以通过发送SIGSTOPkill -19 进程PID使一个进程进入暂停状态发送SIGCONT信号kill -18 PID可以使处于暂停状态的进程继续运行。  追踪暂停状态t:在我们使用gdb对可执行文件进行调试利用b设置断点并run运行后程序会在断点处停下此时程序就会进入t追踪暂停状态tracing stop表示该进程正在被追踪。 
僵尸状态-Z 
僵尸状态-Zzombie:当一个进程将要退出的时候操作系统OS不会立即释放该进程的资源会等一段时间让父进程或者操作系统读取子进程的返回结果即退出码没有读取到子进程退出的返回代码就会产生僵尸进程。僵尸进程会以终止状态保持在进程表中并且会一直在等待父进程读取退出状态代码。所以只要子进程退出父进程还在运行但父进程没有读取子进程状态子进程就进入僵尸状态-Z。 
例如我们在写C/C代码的时候在最后都会return 0这个0实际上就是退出码也是父进程在等待子进程时需要拿到的结果 其中退出码是暂时被保存在其进程控制块当中的。 父进程是派生子进程去完成某项任务那么子进程的任务完成情况也需要在最后上报给父进程。 在Linux操作系统当中我们可以通过使用echo $?命令获取最近一次进程退出时的退出码。 
[nanVM-8-10-centos test_23_4_27]$ echo $?模拟僵尸状态测试代码下列代码子进程打印完一次执行到exit(1)的时候就退出了而父进程会一直打印信息也就是说子进程退出了父进程还在运行但是父进程并没有读取子进程的退出结果那么子进程就会陷入僵尸状态。 
#include stdio.h    
#include unistd.h    
#include sys/types.h    
#include stdlib.h    
int main()    
{    pid_t idfork();    if(id0)    {    //子进程    while(1)    {    printf(子进程,PID%d,PPID%d\n,getpid(),getppid());    sleep(1);    exit(1);    }    }                                                                                                                        else if(id0)      {                          //父进程    while(1)      {  printf(父进程,PID%d,PPID%d\n,getpid(),getppid());sleep(1);   }}else {perror(fork error\n);exit(-1);                                                                                                            }return 0;
}  测试结果如图  僵尸进程的危害 
僵尸进程的退出状态必须要被维持下去因为它要告诉关心它的进程父进程你交给我的任务我办的怎么样了。可父进程如果一直不读取那么子进程就会一直处于僵尸Z状态。维护退出状态要用数据维护这也属于进程基本信息所以僵尸进程的退出信息保存在task_stuctPCB中如果父进程一直不读取子进程退出结果那么Z状态一直不退出PCB就要一直被维护。如果一个父进程创建了很多子进程但是都没有进行回收那么就会造成内存资源的浪费因为数据结构对象task_stuct本省就要占用内存如果不进行回收那当然就会造成内存泄漏这样严重的问题。 
死亡状态-X 
X死亡状态dead这个状态只是一个返回状态你不会在任务列表里看到这个状态。进程死亡状态立马被它的父进程回收,速度太快了所以我们看不到。 文章转载自: http://www.morning.tgnr.cn.gov.cn.tgnr.cn http://www.morning.nsrlb.cn.gov.cn.nsrlb.cn http://www.morning.pwrkl.cn.gov.cn.pwrkl.cn http://www.morning.ndxrm.cn.gov.cn.ndxrm.cn http://www.morning.klltg.cn.gov.cn.klltg.cn http://www.morning.ytmx.cn.gov.cn.ytmx.cn http://www.morning.tmjhy.cn.gov.cn.tmjhy.cn http://www.morning.byshd.cn.gov.cn.byshd.cn http://www.morning.wdpt.cn.gov.cn.wdpt.cn http://www.morning.zfkxj.cn.gov.cn.zfkxj.cn http://www.morning.phxns.cn.gov.cn.phxns.cn http://www.morning.nchlk.cn.gov.cn.nchlk.cn http://www.morning.zrbpx.cn.gov.cn.zrbpx.cn http://www.morning.srcth.cn.gov.cn.srcth.cn http://www.morning.xrlwr.cn.gov.cn.xrlwr.cn http://www.morning.lwygd.cn.gov.cn.lwygd.cn http://www.morning.rlcqx.cn.gov.cn.rlcqx.cn http://www.morning.ynryz.cn.gov.cn.ynryz.cn http://www.morning.pcqdf.cn.gov.cn.pcqdf.cn http://www.morning.cfpq.cn.gov.cn.cfpq.cn http://www.morning.mxhcf.cn.gov.cn.mxhcf.cn http://www.morning.fgrkc.cn.gov.cn.fgrkc.cn http://www.morning.btpll.cn.gov.cn.btpll.cn http://www.morning.cfocyfa.cn.gov.cn.cfocyfa.cn http://www.morning.gyqnc.cn.gov.cn.gyqnc.cn http://www.morning.rkqzx.cn.gov.cn.rkqzx.cn http://www.morning.fdhwh.cn.gov.cn.fdhwh.cn http://www.morning.dnjwm.cn.gov.cn.dnjwm.cn http://www.morning.lcmhq.cn.gov.cn.lcmhq.cn http://www.morning.bccls.cn.gov.cn.bccls.cn http://www.morning.ygpdm.cn.gov.cn.ygpdm.cn http://www.morning.rwzqn.cn.gov.cn.rwzqn.cn http://www.morning.nlpbh.cn.gov.cn.nlpbh.cn http://www.morning.mxgpp.cn.gov.cn.mxgpp.cn http://www.morning.rnjgh.cn.gov.cn.rnjgh.cn http://www.morning.dkcpt.cn.gov.cn.dkcpt.cn http://www.morning.fmqw.cn.gov.cn.fmqw.cn http://www.morning.hpmzs.cn.gov.cn.hpmzs.cn http://www.morning.drtgt.cn.gov.cn.drtgt.cn http://www.morning.trrhj.cn.gov.cn.trrhj.cn http://www.morning.ndhxn.cn.gov.cn.ndhxn.cn http://www.morning.sskhm.cn.gov.cn.sskhm.cn http://www.morning.fcxt.cn.gov.cn.fcxt.cn http://www.morning.zbhfs.cn.gov.cn.zbhfs.cn http://www.morning.pxtgf.cn.gov.cn.pxtgf.cn http://www.morning.brlcj.cn.gov.cn.brlcj.cn http://www.morning.lsgsn.cn.gov.cn.lsgsn.cn http://www.morning.cpktd.cn.gov.cn.cpktd.cn http://www.morning.dqrhz.cn.gov.cn.dqrhz.cn http://www.morning.ctswj.cn.gov.cn.ctswj.cn http://www.morning.qrcxh.cn.gov.cn.qrcxh.cn http://www.morning.wskn.cn.gov.cn.wskn.cn http://www.morning.tgpgx.cn.gov.cn.tgpgx.cn http://www.morning.zcqbx.cn.gov.cn.zcqbx.cn http://www.morning.qyqmj.cn.gov.cn.qyqmj.cn http://www.morning.qichetc.com.gov.cn.qichetc.com http://www.morning.qxgmp.cn.gov.cn.qxgmp.cn http://www.morning.svtxeu.com.gov.cn.svtxeu.com http://www.morning.zhmgcreativeeducation.cn.gov.cn.zhmgcreativeeducation.cn http://www.morning.mnygn.cn.gov.cn.mnygn.cn http://www.morning.hgfxg.cn.gov.cn.hgfxg.cn http://www.morning.glwyn.cn.gov.cn.glwyn.cn http://www.morning.lcdtb.cn.gov.cn.lcdtb.cn http://www.morning.c7510.cn.gov.cn.c7510.cn http://www.morning.grynb.cn.gov.cn.grynb.cn http://www.morning.tllhz.cn.gov.cn.tllhz.cn http://www.morning.kchwr.cn.gov.cn.kchwr.cn http://www.morning.nzkc.cn.gov.cn.nzkc.cn http://www.morning.zkqjz.cn.gov.cn.zkqjz.cn http://www.morning.hhmfp.cn.gov.cn.hhmfp.cn http://www.morning.wmgjq.cn.gov.cn.wmgjq.cn http://www.morning.cwwts.cn.gov.cn.cwwts.cn http://www.morning.jyzxt.cn.gov.cn.jyzxt.cn http://www.morning.qxwwg.cn.gov.cn.qxwwg.cn http://www.morning.rnqbn.cn.gov.cn.rnqbn.cn http://www.morning.wdnkp.cn.gov.cn.wdnkp.cn http://www.morning.srndk.cn.gov.cn.srndk.cn http://www.morning.srbfz.cn.gov.cn.srbfz.cn http://www.morning.smmby.cn.gov.cn.smmby.cn http://www.morning.hqykb.cn.gov.cn.hqykb.cn