上海中高端网站建设,黄岛做网站哪家好,网站建设_聊城,网站制作文章标签介绍 进程的状态指的是进程在执行过程中所处的状态。进程的状态随着进程的执行和外界条件的变化而转换。我们可用 kill 命令来进程控制进程的状态。 kill中的 kill -l 指令用于查看系统中定义的所有信号及其对应的编号。这些信号可以用于 kill 命令来向进程发送特定的信号控制其…介绍 进程的状态指的是进程在执行过程中所处的状态。进程的状态随着进程的执行和外界条件的变化而转换。我们可用 kill 命令来进程控制进程的状态。 kill中的 kill -l 指令用于查看系统中定义的所有信号及其对应的编号。这些信号可以用于 kill 命令来向进程发送特定的信号控制其状态。例如kill - 9 命令会向进程发送 SIGKILL 信号强制终止进程kill -19 命令会向进程发送 SIGSTOP 信号使进程进入暂停状态如同 CtrlZ 组合键的效果kill -18 命令用于向进程发送 SIGCONT 信号使进程从暂停状态恢复执行如同 CtrlC 组合键的效果。 系统下的进程主流状态 进程在系统中主流的四个主要状态运行状态、排队状态、阻塞状态、挂起状态。
运行状态 首先要说明系统内部的所有进程不是一次性执行完毕的而是在内部排队等待某种资源。 进程只要在运行队列里或正在被CUP正在执行时此进程就处于运行状态。部分教材中可能会说明有创建状态、就绪状态、阻塞状态等这几种状态其实都是跟进程放入运行队列有关。
排队状态 由于大部分计算机中只有一个CUP而一个CUP一次只能运行一个进程队列所以在Linux系统内核中所有进入状态的进程必须依次“ 排队 ”等待这里的“ 排队 ”并不是进程自己在“ 排队 ”等待而是进程的 tast_struct 结构体在进行“ 排队”等待被CUP执行。 其实不光是等待CPU执行时需要排队在进程等待某种资源时也会处于排队状态。如外设等。这里的排队等待不像一般数据结构中的排队等待而是将 task_struct 结构体嵌入到运行队列中系统通过地址偏移量来进行访问里面的属性数据。具体实现如下 总的来说进程的排队状态是指进程在等待被执行或等待获取资源时所处的一种状态。在排队状态下进程会被放入相应的队列中等待其前面的进程释放资源或完成其任务当多个进程同时请求系统资源时操作系统会根据一定的调度算法将这些进程按照一定的顺序排列以便按照一定的优先级逐个分配资源。
阻塞状态 阻塞状态是进程的执行过程中一种暂停状态此时进程放弃处理机而处于暂停状态。当进程处于阻塞状态时会排成一个队列形成这种情况通常是因为进程在等待某个事件的发生。如当我们的进程在进行等待软硬件资源的时候资源如果没有就绪我们的进程task_struct 只能将自己设置为阻塞状态并将自己的pcb连入等待的资源提供的等待队列。
挂起状态 进程的挂起状态是指一个进程由于某些原因暂时不能执行而被系统挂起来等待以后执行。在这种状态下进程不会占用内存空间也不会被调度执行进程只是被存储在磁盘上。这种状态通常发生在系统资源不足或者进程等待某些事件时发生。当条件允许时被挂起的进程就会被操作系统再次调回内存重新进入等待被执行的状态即就绪态。 前台进程与后台进程 前台进程和后台进程是操作系统中的两种进程类型它们在运行状态和行为上存在显著差异。一般情况下进程中的可执行程序直接运行是前台进程当在执行可执行程序时在后面加上“ ”符号就变成了后台进程。前台进程和后台进程在进程状态符观察出。当查看进程状态时若状态符后面有“ ”号此进程表示前台进程若状态符后面没有“ ”号此进程表示后台进程。 通常情况下前台进程可以直接使用键盘上的 CtrlC 来终止但后台进程则需要使用特定的命令如“ kill -9 [PID] ”来终止。因此当我们设为后台进程时用户必须要获取该进程的PID。 Linux内核源代码的进程状态 在了解进程状态时首先要明白系统内部定义的进程状态。在Linux内核中定义状态的源代码如下 /* * 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* const task_state_array[] { //下面的大写首字母代表状态 R (running), /* 0 */ S (sleeping), /* 1 */ D (disk sleep), /* 2 */ T (stopped), /* 4 */ t (tracing stop), /* 8 */ X (dead), /* 16 */ Z (zombie), /* 32 */ }; R运行状态表示进程正在处于系统的运行状态与上面的运行状态效果一样并不意味着进程一定在运行中它表明进程要么是在运行中要么在运行队列里。 S睡眠状态进程在等待某件事件完成而进入睡眠。这种睡眠状态如同阻塞状态有时候也叫做可中断睡眠可直接用键盘进行中断。 D磁盘休眠状态这种状态有时候也叫不可中断睡眠状态它用于资源管理。当进程的PCB指针放入磁盘结构体的队列中时如果内存紧张操作系统可能需要终止一些后台进程来缓解内存压力。但是如果正在写入磁盘的数据很重要直接终止可能会导致不良后果。此时将进程置于D状态可以确保即使在内存紧张的情况下操作系统也不会终止它直到IO操作完成。 T停止状态表示进程被暂定如同 kill -19 命令停止运行进程。此状态也可理解为阻塞状态的分支。 t停止状态表示进程处于跟踪状态而暂定通常用于调试目的。
注意状态T和状态t都是表示进程被停止其中状态T停止是常规控制停止而状态t停止是因为深入跟踪导致进程停止通常用于调试。 X死亡状态此状态表示进程已经结束并且可以被回收的状态。当一个进程完全结束执行并且系统已经回收了其资源时该进程就会进入X状态因此这个状态只是一个返回状态我们不会在任务列表里看到这个状态。 Z僵尸状态表示一个进程已经结束执行但其父进程还没有读取它的退出状态信息。在这种情况下该进程会以终止状态保持在进程表中等待父进程读取其退出状态代码。 当一个进程退出时它会将退出信息保存在task_struct中供父进程或操作系统读取。如果父进程在子进程退出后仍然存在但没有读取子进程的退出状态信息子进程就会进入Z状态。处于Z状态的进程不会占用CPU资源但会占用进程表中的一个槽位和内存直到其父进程读取了其退出状态信息并对其进行回收因此僵尸进程可能会造成内存资源的浪费有一定的危害。以下代码的子进程就为僵尸进程。 #include iostream #include unistd.h using namespace std; int main() { pid_t id fork(); if (id 0) //子进程 { int n 5; while (n) { cout PID: getpid() PPID: getppid() endl; sleep(1); n--; } exit(0); //子进程退出 } while (1) //父进程运行 { cout PID: getpid() PPID: getppid() endl; sleep(1); } return 0; } 孤儿进程 孤儿进程是指一个进程的父进程已经终止而该进程还在运行。 由于孤儿进程原有的父进程已不存在所以孤儿进程通常由init进程进程号为1收养并由init进程对它们完成状态收集工作。因此孤儿进程并不会有什么危害。以下是孤儿进程的代码 #include stdio.h #include unistd.h #include stdlib.h int main() { pid_t id fork(); if (id 0) { perror(fork); return 1; } else if (id 0) //子进程 { cout I am child, pid : getpid() endl; sleep(5); } else //父进程 { cout I am child, pid : getpid() endl; sleep(5); exit(0); } return 0; }