Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态。
Linux进程状态解析之R、S、D
Linux进程状态:R (TASK_RUNNING),可执行状态。
只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对
应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该
CPU上运行。
很多操作系统教科书将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态,这两种状态在linux下统一为 TASK_RUNNING状态。
Linux进程状态:S (TASK_INTERRUPTIBLE),可中断的睡眠状态。
处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。
通过ps命令我们会看到,一般情况下,进程列表中的绝大多数进程都处于TASK_INTERRUPTIBLE状态(除非机器的负载很高)。毕竟CPU就这么一两个,进程动辄几十上百个,如果不是绝大多数进程都在睡眠,CPU又怎么响应得过来。
Linux进程状态:D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态。
与TASK_INTERRUPTIBLE状态类似,进程处于睡眠状态,但是此刻进程是不可中断的。不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。
绝
大多数情况下,进程处在睡眠状态时,总是应该能够响应异步信号的。否则你将惊奇的发现,kill
-9竟然杀不死一个正在睡眠的进程了!于是我们也很好理解,为什么ps命令看到的进程几乎不会出现TASK_UNINTERRUPTIBLE状态,而总是
TASK_INTERRUPTIBLE状态。
而TASK_UNINTERRUPTIBLE状态存在的意义就在于,内核的某些处理流程是不能被打断的。如果响应异步信号,程序的执行流程中就会被
插入一段用于处理异步信号的流程(这个插入的流程可能只存在于内核态,也可能延伸到用户态),于是原有的流程就被中断了。
Linux进程状态解析之T、Z、X
Linux进程状态:T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态。
向进程发送一个SIGSTOP信号,它就会因响应该信号而进入TASK_STOPPED状态(除非该进程本身处于
TASK_UNINTERRUPTIBLE状态而不响应信号)。(SIGSTOP与SIGKILL信号一样,是非常强制的。不允许用户进程通过
signal系列的系统调用重新设置对应的信号处理函数。)
向进程发送一个SIGCONT信号,可以让其从TASK_STOPPED状态恢复到TASK_RUNNING状态。
Linux进程状态:Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程。
进程在退出的过程中,处于TASK_DEAD状态。
在这个退出过程中,进程占有的所有资源将被回收,除了task_struct结构(以及少数资源)以外。于是进程就只剩下task_struct这么个空壳,故称为僵尸。
Linux进程状态:X (TASK_DEAD - EXIT_DEAD),退出状态,进程即将被销毁。
而进程在退出过程中也可能不会保留它的task_struct。
分享到:
相关推荐
ps命令是Linux系统中监控进程状态的重要工具。通过掌握其多种选项和用法,用户可以更有效地管理和分析系统中的进程。 本文通过深入分析ps命令的多种用法和应用场景,为读者提供了一个全面的指南,帮助他们熟练地...
### LINUX进程管理实验知识点解析 #### 一、进程与程序的区别 在进行LINUX进程管理实验之前,首先需要理解进程与程序之间的区别。程序是指令的集合,是静态的,而进程则是程序的一次动态执行过程,具有生命周期,...
Linux进程是操作系统的核心概念,理解和掌握其工作原理对于深入学习Linux系统至关重要。本资料集合将探讨Linux进程的生成、使用和创建过程,以及相关的源码分析。 首先,我们来了解一下进程的生成。在Linux中,新...
Linux进程调度时机Schedule函数解析 Linux进程调度时机Schedule函数解析是Linux操作系统中一个核心组件,负责决定何时执行进程切换。Schedule函数是Linux调度程序的核心组件,决定了进程的调度时机。 调度时机是指...
Linux进程从创建到终止经历了一系列状态,主要包括: - **创建(New)**:当一个新进程通过`fork()`或`clone()`系统调用创建时,它处于创建状态。 - **就绪(Runnable)**:进程已经准备好运行,等待CPU时间片。 ...
Linux中的信号分为标准信号和实时信号,可以用来中断进程、改变进程状态或者传递简单信息。 3. **System V IPC** - **System V消息队列**:允许进程异步发送和接收结构化的数据块,确保消息的有序性和避免丢失。 ...
`ps`命令用于报告当前系统的进程状态。你可以通过`ps -u 用户名`来查看指定用户的所有进程的CPU使用情况,或者使用`ps -aux`列出系统中所有的进程信息。其中`%CPU`列表示进程的CPU占用率。 3. **使用`htop`命令** ...
这包括进程状态的管理、上下文切换、进程间通信(IPC)机制,以及内核如何处理不同优先级的任务。 3. 内存管理:这部分涉及内核如何分配和管理物理内存,包括页表、分页机制、交换(swap)空间的使用,以及虚拟内存...
不再只是枯燥的理论,我们结合实例,为你呈现了一个生动、形象的Linux进程世界。无论你是初学者还是资深技术专家,都能从中获得宝贵的启示和灵感。 立即点击,开启你的Linux进程管理学习之旅。让我们一起探索这个...
在内核中,信号处理函数可以在进程上下文或内核上下文中执行,这取决于信号的类型和当前进程的状态。处理信号时,内核必须确保信号处理的安全性,防止因信号处理导致的数据损坏。 总结来说,Linux信号机制是操作...
除了查看进程状态,Linux还提供了丰富的工具和命令来控制进程,包括但不限于: - **kill**:用于发送信号到进程,以终止、暂停或继续进程执行。 - **nice**:调整进程的优先级,影响进程的执行顺序。 - **renice**...
此外,书中还可能涉及Linux的设备树、内核模块的编译与加载、内核配置选项,以及如何通过sysfs和procfs接口获取系统状态等。对于嵌入式Linux开发者,这些知识有助于理解和定制针对特定硬件平台的Linux系统。 通过...
"Multipath用户进程代码解析" Multipath用户进程代码解析是指对Multipath用户进程的代码进行详细的分析和解释。Multipath用户进程是指multipath和multipathd两个程序,旨在实现多路径存储系统的管理和维护。 ...
- 当执行 `fork` 函数时,会产生一个与父进程状态相同的子进程。 - 父进程继续执行 `fork` 后的代码,而子进程从 `fork` 函数处开始执行。 2. **关键点:** - 父进程执行了所有代码,子进程仅执行 `fork` 后的...
- **进程状态**:运行、就绪、等待等状态及其转换机制。 - **进程间通信(IPC)**:包括信号、管道、消息队列、共享内存等多种方式,用于进程间的同步和数据交换。 - **线程**:现代Linux内核支持线程,每个线程...
通过以上分析可以看出,这个实验代码主要是为了演示Linux环境下进程管理的基本概念和技术,包括进程状态转换、调度策略、消息传递等核心知识点。通过对代码的解析,我们不仅了解了进程管理的具体实现细节,还学习了...
从给定的文件信息中,我们可以提取到关于Linux进程管理和监控的重要知识点,下面将详细解析这些内容。 ### Linux进程管理概述 在Linux系统中,进程是操作系统资源分配的基本单位,每个运行中的程序都是一个进程。...
这个守护进程监测系统的电源状态,例如笔记本电脑的电池电量,并根据预设策略进行操作,如发出警告、调整性能或在电量过低时自动关机。 3. **Arpwatch**:记录日志并构建以太网地址和IP地址对数据库。Arpwatch监视...
本文将深入解析Linux命令,帮助你快速入门。 1. **基础命令** - `ls`:列出目录内容,常用参数有 `-l`(详细信息)、`-a`(显示隐藏文件)。 - `cd`:改变工作目录,如`cd /home/user`进入用户家目录。 - `pwd`...