Linux 进程基础(二)

本小结主要总结,Linux下进程的几种状态及其间的相互转换。

一、Linux进程的几种状态

1、Linux进程状态:R (TASK_RUNNING),可执行状态

Linux下处于运行状态和就绪状态的进程,统称为R状态,一个进程只有处于该状态才有可能被CPU执行。同一时刻可以有多个进程处于该状态,处于这些状态的进程都将会被装入一个可执行的队列中,系统中进程调度器的作用就是从这个可执行的队列中选择一个进程进行执行。

2、Linux进程状态:S (TASK_INTERRUPTIBLE),可中断的睡眠状态

     Linux中绝大多数的进程都是处于这个状态,处于这个状态的进程是可中断的,比如使用kill发信号让进程退出。一个进程处于该状态往往是由于进程需要等待某些资源进而被挂起,这些资源可能是信号量、socket、io等,所有被挂起的进程也会被放入相应的队列中,当其所要等待的资源到达时,这些进程将会被唤醒。

3、Linux进程状态:D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态

     显而易见,处于该状态的进程是不能被中断的,这种型的进程是不接受异步通信产生的信号的,在Linux中这是系统对重要的“事件”的进程提供的一种保护,以避免中断对系统造成不可挽回的操作。

4、Linux进程状态:T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态

     在实际应用中,有可能需要给正在运行的进程发送信号,让其处在暂停状态,以便完成调试、跟踪的需求。

5、Linux进程状态:Z (TASK_DEAD – EXIT_ZOMBIE),退出状态,进程成为僵尸进程

    父进程创建的子进程后,父子进程将会各自完成自身的任务,子进程在运行完成后将清除本身的资源,并由父进程完成回收,但在子进程还没运行完成,父进程便已处于退出,那么这些还在运行的进程将变成退出状态,即变成僵尸进程,由于系统中还存在一个Init进程(整个Linux的鼻祖进程),系统存在的所有僵尸进程都过继给鼻祖进程,由其来完成回收过程。

6、Linux进程状态:X (TASK_DEAD – EXIT_DEAD),退出状态,进程即将被销毁。

而进程在退出过程中也可能不会保留它的task_struct。比如这个进程是多线程程序中被detach过的进程,或者父进程通过设置SIGCHLD信号的handler为SIG_IGN,显式的忽略了SIGCHLD信号。(这是posix的规定,尽管子进程的退出信号可以被设置为SIGCHLD以外的其他信号。)此时,进程将被置于EXIT_DEAD退出状态,这意味着接下来的代码立即就会将该进程彻底释放。所以EXIT_DEAD状态是非常短暂的,几乎不可能通过ps命令捕捉到。

在Linux系统中,使用ps aux 命令,我们很容易查看到系统进程的状态,如:

[[email protected] ~]$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1   2900  1440 ?        Ss   22:28   0:01 /sbin/init
root         2  0.0  0.0      0     0 ?        S    22:28   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    22:28   0:00 [migration/0]
root         4  0.0  0.0      0     0 ?        S    22:28   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S    22:28   0:00 [migration/0]
root         6  0.0  0.0      0     0 ?        S    22:28   0:00 [watchdog/0]
root         7  0.0  0.0      0     0 ?        S    22:28   0:00 [events/0]
root         8  0.0  0.0      0     0 ?        S    22:28   0:00 [cgroup]
root         9  0.0  0.0      0     0 ?        S    22:28   0:00 [khelper]
root        10  0.0  0.0      0     0 ?        S    22:28   0:00 [netns]
root        11  0.0  0.0      0     0 ?        S    22:28   0:00 [async/mgr]
root        12  0.0  0.0      0     0 ?        S    22:28   0:00 [pm]
root        13  0.0  0.0      0     0 ?        S    22:28   0:00 [sync_supers]

其中的User表示运行系统的用户标识,Pid是当前进程的进程号,%Cpu表示该进程所占用的Cpu资源,%Mem表示该进程所使用的内存资源,VSZ表示进程的虚拟大小,RSS进程驻留集的大小,可以理解为内存中页的数量,TTY表示控制终端的ID,STRAT–这个很简单,就是该进程启动的时间,TIME–进程已经消耗的CPU时间,注意是消耗CPU的时间;COMMOND–命令的名称和参数;STAT–也就是当前进程的状态,其中S-睡眠,s-表示该进程是会话的先导进程,N-表示进程拥有比普通优先级更低的优先级,R-正在运行,D-短期等待,Z-僵死进程,T-被跟踪或者被停止等等。

二、Linux进程状态间的相互转换

      进程自创建以后,状态可能发生一系列的变化,直到进程退出。而尽管进程状态有好几种,但是进程状态的变迁却只有两个方向——从TASK_RUNNING状态变为非TASK_RUNNING状态、或者从非TASK_RUNNING状态变为TASK_RUNNING状态。也就是说,如果给一个TASK_INTERRUPTIBLE状态的进程发送SIGKILL信号,这个进程将先被唤醒(进入TASK_RUNNING状态),然后再响应SIGKILL信号而退出(变为TASK_DEAD状态)。并不会从TASK_INTERRUPTIBLE状态直接退出。进程从非TASK_RUNNING状态变为TASK_RUNNING状态,是由别的进程(也可能是中断处理程序)执行唤醒操作来实现的。执行唤醒的进程设置被唤醒进程的状态为TASK_RUNNING,然后将其task_struct结构加入到某个CPU的可执行队列中。于是被唤醒的进程将有机会被调度执行。而进程从TASK_RUNNING状态变为TASK_RUNNING状态,则有两种途径:
    1、响应信号而进入TASK_STOPED状态、或TASK_DEAD状态;
    2、执行系统调用主动进入TASK_INTERRUPTIBLE状态(如nanosleep系统调用)、或TASK_DEAD状态(如exit系统调用);或由于执行系统调用需要的资源得不到满足,而进入TASK_INTERRUPTIBLE状态或TASK_UNINTERRUPTIBLE状态(如select系统调用)。

时间: 2024-12-11 10:43:19

Linux 进程基础(二)的相关文章

Linux进程基础

Linux进程基础 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 计算机实际上可以做的事情实质上非常简单,比如计算两个数的和,再比如在内存中寻找到某个地址等等.这些最基础的计算机动作被称为指令 (instruction).所谓的程序(program),就是这样一系列指令的所构成的集合.通过程序,我们可以让计算机完成复杂的操作.程序大多数时候被存储为可执行的文件.这样一个可执行文件就像是一个菜谱,计算机可以按照菜谱作出可口的饭

linux 进程基础(四)

本小结主要对linux进程的调度部分进行学习总结. linux是个支持多任务的操作系统,因此才会涉及到进程的调度,调度的目的是为了让多个进程并 存.在当前CPU是多核(单核的CPU系统中面对多任务时也涉及到进程的调度)的情况下,CPU可以高效的 对处于可执行状态的进行调度处理.以提高系统的业务处理能力. 进程的调度其实质就是CPU对处于可执行状态的进程进行处理的过程,这要求linux进程调度器在设 计上可以处理几个甚至是相互矛盾的目标: A.高效性:高效意味着在相同的时间下要完成更多的任务: B

linux学习之八---Linux进程基础知识

一.linux进程 linux是一个多用户多任务的操作系统. 多用户是指多个用户可以在同一时间使用计算机: 多任务是指linux可以同时执行几个任务. 进程简单来说就是运行中的程序,Linux系统的一个重要特点是可以同时启动多个进程.根据操作系统的定义:进程是操作系统资源管理的最小单位. 1.Linux进程的概念 进程是一个动态的实体,是程序一次执行过程,并且进程是操作系统资源分配的基本单位. 进程与程序的区别:进程是动态的,程序是静态的:进程是运行中的程序,而程序还是保存在硬盘上的可执行代码.

[linux]进程(二)--进程地址空间

7,linux进程命名空间的概念 关于命名空间具体可以参考深入linux内核架构2.3.2章节 linux的命名空间属于操作系统级虚拟化,各个命名空间互相隔离,互相不可见,不同命名空间的进程PID可以相同,因此从操作系统层面看可能有相同的uid和pid,父命名空间同时还可以包含子命名空间,子命名空间不知道父命名空间的存在,但是父命名空间知道子命名空间的存在. 命名空间的实现:为了task_struct的精简,内核引入了struct nsproxy来统一管理进程所属的命名空间,在task_stru

(转载)Linux进程基础

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 计算机实际上可以做的事情实质上非常简单,比如计算两个数的和,再比如在内存中寻找到某个地址等等.这些最基础的计算机动作被称为指令(instruction).所谓的程序(program),就是这样一系列指令的所构成的集合.通过程序,我们可以让计算机完成复杂的操作.程序大多数时候被存储为可执行的文件.这样一个可执行文件就像是一个菜谱,计算机可以按照菜谱作出可口的饭菜. 那么,程序和进程

linux 进程基础(一)

计算机实际上所做的事情很简单,即通过对程序的调度执行,完成用户指定的一系列操作.这个过程我们可以这样在比喻,计算机是一个厨房,程序是一份菜谱.点菜的窗口就是一个输入,中间程序运行的过程就是计算机进行炒菜,而程序运行完成将结果呈现给用户的时候,就是程序运行的输出,即服务员将炒好的菜送到顾客面前. 那么进程和程序的区别又是什么呢?显然程序是存储在硬盘上的代码的集合,类似于上面比喻中的菜单,而进程就是运行的程序,其主要是运活动空间是内存.同一个程序可以被多次执行,进而形成多个进程,不同的进程可以拥有各

Linux进程基础知识总结

                                    进程 进程表示一个正在运行的程序实例,它是分配资源的最小单位,这种说法特别官方. 进程是一个非常重要的东西,我们运行的系统中同时跑着N个进程,这些进程都在默默的工作着,我们编写的代码,经过编译.运行,也会生成一个进程.这个进程由程序代码.数据.变量(占用着系统内存).打开的文件(文件描述符)和环境组成.一般来说,对于Linux系统,系统会在进程之间共享程序代码和系统函数库,所以在任何时刻,内存中都只存在代码的一份副本. 由于

Linux 进程创建二(execve)

三:execve系统调用 int execve(const char *filename, char *const argv[],char *const envp[]); fork创建了一个新的进程,产生一个新的PID execve用被执行的程序完全替换了调用进程的映像. execve启动一个新程序,替换原有进程,所以被执行进程的PID不会改变. execve函数接受三个参数 --path 要执行的文件完整路径 --argv 传递给程序完成参数列表,包括argv[0],它一般是执行程序的名字,最

Linux 进程(二):进程关系及其守护进程

进程关系 进程组 进程组是一个或多个进程的集合.通常,它们是在同一作业中结合起来的,同一进程组中的各进程接收来自同一终端的各种信号,每个进程组有一个唯一的进程组ID.每个进程组有一个组长进程,该组长进程的ID等于进程组ID.从进程组创建开始到最后一个进程离开为止的时间称为进程组的生命周期. #include <unistd.h> pid_t getpgrp(void); 返回值:调用进程的进程组ID int setpgid(pid_t pid, pid_t pgid); 返回值:成功,返回0: