Linux进程
gudong366 2025-06-04 16:53 7 浏览
Linux 操作系统中的进程是其核心概念之一,理解进程对于系统管理、程序开发和故障排查都至关重要。下面我们将详细解析 Linux 进程的相关知识点。
1. 什么是进程?
在 Linux(及其他类 Unix 系统)中,进程是程序执行的一个实例。当你在终端输入一个命令或双击一个应用程序图标时,操作系统就会创建一个或多个进程来执行相应的程序。
一个进程通常包括:
* 程序代码: 正在执行的指令。
* 数据: 进程使用的变量、堆栈等。
* 资源: 进程正在使用的文件、内存、网络连接等。
* 执行上下文: 包含了进程的当前状态,例如寄存器值、程序计数器等,以便在进程切换时能够恢复执行。
2. 进程的状态
进程在其生命周期中会经历多种状态,这些状态反映了它是否在运行、等待资源或已被终止。常见的进程状态包括:
* 运行 (Running / R): 进程正在 CPU 上执行,或者已经准备好在 CPU 上执行(等待调度器分配 CPU 时间片)。
* 可中断睡眠 (Interruptible Sleep / S): 进程正在等待某个事件发生(如 I/O 操作完成、某个信号的到来),在此期间它可以被信号唤醒。大多数在等待 I/O 的进程都处于此状态。
* 不可中断睡眠 (Uninterruptible Sleep / D): 进程正在等待一个非常重要的事件发生(通常是硬件 I/O),在此期间它不能被信号唤醒。处于 D 状态的进程很难被杀死,除非它等待的事件发生或者系统重启。
* 停止 (Stopped / T): 进程被暂停执行,通常是由于接收到 SIGSTOP、SIGTSTP、SIGTTIN 或 SIGTTOU 信号。进程可以通过 SIGCONT 信号继续执行。
* 僵尸 (Zombie / Z): 进程已经终止,但其父进程尚未读取其退出状态。僵尸进程本身不占用内存和 CPU 资源,只占用进程表中的一个条目。如果父进程没有处理,它们会一直存在直到父进程终止。
* 死亡 (Dead / X): 进程已终止且其父进程已读取其退出状态。此状态非常短暂,通常在 ps 命令中不常见。
可以使用 ps aux 或 top 命令查看进程状态。
3. 进程的属性
每个进程都有一些关键属性,用于标识和管理:
* PID (Process ID): 进程的唯一标识符。
* PPID (Parent Process ID): 创建当前进程的父进程的 ID。每个进程(除了 PID 为 1 的 init 或 systemd 进程)都有一个父进程。
* UID (User ID): 运行该进程的用户 ID。
* EUID (Effective User ID): 进程实际执行时所具有的权限的用户 ID。
* GID (Group ID): 运行该进程的组 ID。
* EGID (Effective Group ID): 进程实际执行时所具有的权限的组 ID。
* TTY: 进程控制终端的名称(如果有)。
* CPU 使用率 (%CPU): 进程占用 CPU 的百分比。
* 内存使用量 (%MEM, VSZ, RSS): 进程占用的虚拟内存、常驻内存等。
* 优先级 (PRI, NI):
* PRI (Priority): 进程的调度优先级,值越小优先级越高。
* NI (Nice Value): 用户可以调整的优先级,范围从 -20(最高优先级)到 19(最低优先级)。默认是 0。nice 命令用于启动时设置,renice 用于运行时修改。
4. 进程的生命周期
* 创建 (Creation):
* fork() 系统调用: 创建一个子进程,它是父进程的精确副本(除了 PID 和 PPID)。子进程继承父进程的大部分资源,但拥有独立的内存空间。
* exec() 系统调用: 在现有进程的上下文中加载并执行一个新的程序。exec 系列函数会替换当前进程的代码、数据和堆栈,但 PID 不变。通常,一个新进程的创建流程是 fork() 后立即 exec()。
* 执行 (Execution): 进程在 CPU 上执行指令,根据其代码逻辑进行操作。
* 终止 (Termination): 进程完成任务或发生错误时会终止。
* 正常终止: 进程执行完毕,或者调用 exit() 系统调用。
* 异常终止: 进程收到终止信号(如 SIGTERM、SIGKILL)或发生未处理的错误(如段错误)。
* 僵尸进程: 当子进程终止后,如果父进程没有及时调用 wait() 或 waitpid() 系统调用来回收其资源和获取其退出状态,子进程就会成为僵尸进程。
5. 进程的类型
* 前台进程 (Foreground Process): 与终端交互的进程,可以直接接收用户输入,并将输出显示在终端上。当终端关闭时,前台进程通常也会终止。
* 后台进程 (Background Process): 在后台运行的进程,不与终端交互。可以使用 & 符号在命令末尾启动后台进程。
./my_script.sh &
可以使用 jobs 命令查看当前终端的后台作业。
* fg [job_id]: 将后台进程切换到前台。
* bg [job_id]: 将停止的前台进程切换到后台。
* 守护进程 (Daemon Process): 一种特殊的后台进程,它在后台运行,不与任何终端关联。通常在系统启动时启动,并在系统关闭时终止。它们执行系统级任务,如 web 服务器 (httpd)、数据库服务器 (mysqld) 等。守护进程的父进程通常是 init (PID 1)。
6. 进程间通信 (IPC - Inter-Process Communication)
进程之间需要共享数据或进行协作时,就需要 IPC 机制。常见的 IPC 方式包括:
* 管道 (Pipes):
* 匿名管道 (|): 只能在具有亲缘关系的进程(父子进程)之间使用,通常用于命令行中的命令连接。
* 命名管道 (FIFOs): 可以在不相关进程之间使用,通过文件系统中的特殊文件进行通信。
* 信号 (Signals): 软件中断,用于通知进程发生了特定事件(如终止、挂起、继续等)。
* 消息队列 (Message Queues): 进程可以将消息放入队列,其他进程可以从队列中读取消息。
* 共享内存 (Shared Memory): 多个进程映射同一块物理内存区域,从而实现高速数据共享。需要同步机制(如信号量)来避免数据冲突。
* 信号量 (Semaphores): 用于同步进程对共享资源的访问,防止竞态条件。
* 套接字 (Sockets): 最通用的 IPC 机制,可以在同一台机器上的进程间通信,也可以在网络上的不同机器间通信。
7. 进程管理命令
* ps: 显示当前正在运行的进程。
* ps aux: 显示所有用户的所有进程,包含详细信息。
* ps -ef: 以完整格式显示所有进程。
* ps -eLf: 显示所有线程。
* top: 实时显示进程信息,按 CPU 或内存使用率排序。
* 在 top 界面中,可以按 M (内存), P (CPU) 进行排序。
* 按 k 杀死进程。
* htop: 交互式进程查看器,比 top 更用户友好。
* pgrep: 根据名称或其他属性查找进程 ID。
* pgrep firefox: 查找 firefox 进程的 PID。
* pkill: 根据名称或其他属性发送信号给进程。
* pkill firefox: 杀死所有 firefox 进程。
* kill: 向指定 PID 的进程发送信号。
* kill <PID>: 默认发送 SIGTERM (终止信号)。
* kill -9 <PID>: 发送 SIGKILL (强制终止信号,不可被捕获或忽略)。
* killall: 根据进程名称发送信号给所有匹配的进程。
* killall nginx: 杀死所有 nginx 进程。
* nice: 以指定的优先级启动命令。
* nice -n 10 my_command: 以较低优先级启动 my_command。
* renice: 改变已运行进程的优先级。
* renice -n 5 <PID>: 提高进程优先级。
* nohup: 即使终端关闭,也让命令在后台继续运行。
* nohup my_command &: 运行 my_command,并将其输出重定向到 nohup.out。
* jobs: 列出当前 shell 中的后台作业。
* fg: 将后台作业切换到前台。
* bg: 将停止的前台作业切换到后台。
* pstree: 以树状结构显示进程关系。
* /proc 文件系统: 这是一个虚拟文件系统,提供了对内核数据结构的接口。每个进程在 /proc 目录下都有一个以其 PID 命名的子目录,其中包含该进程的详细信息(如 /proc/<PID>/status、/proc/<PID>/cmdline、/proc/<PID>/fd 等)。
8. 线程 (Threads)
* 进程 vs. 线程:
* 进程是操作系统资源分配的最小单位,拥有独立的地址空间、文件描述符等资源。
* 线程是 CPU 调度的最小单位,是进程内的一个执行流。同一个进程中的所有线程共享该进程的地址空间和大部分资源,但每个线程有独立的程序计数器、栈和寄存器。
* 优点: 线程比进程更轻量级,创建和销毁的开销更小,线程间通信更高效。
* 管理: 在 Linux 中,线程通常被称为“轻量级进程”(LWP - Light-Weight Process)。ps -eLf 命令可以查看线程信息。
9. 进程调度
Linux 内核的调度器负责在多个进程之间分配 CPU 时间。其目标是:
* 公平性: 确保所有进程都能获得 CPU 时间。
* 响应性: 确保交互式进程能够及时响应用户输入。
* 吞吐量: 最大化 CPU 利用率,完成更多工作。
调度器会根据进程的优先级、历史行为(如是否是 I/O 密集型或 CPU 密集型)来决定哪个进程在何时运行。
10. 系统启动中的进程
* init (System V init) 或 systemd (现代 Linux): PID 为 1 的进程是所有其他用户空间进程的祖先。它负责初始化系统、启动服务(守护进程),并回收孤儿进程(父进程先于子进程终止的子进程会被 init/systemd 收养)。
理解这些进程相关的知识点,能够帮助你更好地诊断系统问题、优化程序性能,并编写更健壮的 Shell 脚本。
相关推荐
- linux sed系列 第四篇:sed工业实战——日志处理与数据清洗
-
“掌握了sed的编程能力后,我们如同装备精良的工匠,终于可以踏入真实的工业战场。本篇将聚焦sed在日志分析、数据合规化、多文件批处理等场景中的应用,看它如何在海量数据中游刃有余,展现文本处理的...
- Linux下sed的简单使用(linux中sed是什么意思)
-
1、sed简介stremeditor流编辑器,它是一项Linux指令,功能同awk类似,差别在于,sed简单,对列处理的功能要差一些,awk的功能复杂,对列处理的功能比较强大,sed编辑器是一行一...
- linux基础命令之date命令(linux中的date)
-
date命令主要用于显示或者设置系统时间语法格式:date参数对象使用date命令时,最好先使用date--help命令查看支持哪些参数,有些小型Linux系统下的date命令,只支持一些基本参...
- Ubuntu linux 常用命令(ubuntu常用的50个命令)
-
使用dpkg命令来安装.deb包。sudodpkg-i~/example.deb如果在安装过程中遇到依赖问题,可以使用以下命令来修复:sudoapt-getinstall-f将flut...
- Linux基础命令-sed命令(linux教程:sed命令的用法)
-
Sed全名streameditor流编辑器,它是一个强大的文本处理工具,它可以从文件中接受输入,也可以接受来自标准输入流的输入,它擅长取行。Sed的用途非常广泛,包括:1)文本替换2)选择性的输...
- linux sed系列 第二篇:sed进阶技巧——地址定位与正则表达式
-
“上一篇我们掌握了sed的基础替换,如同获得了第一把钥匙。现在,让我们更进一步,学习如何精准锁定目标行,如同拥有了导航地图,让每一次操作都直击要害!”地址定位的四种维度sed的强大,很大程度上源...
- 火狐Firefox浏览器140发布:手动Unload标签页、优化翻译体验等
-
IT之家6月24日消息,Mozilla在发布版本139不到一个月后,推出了最新的开源网页浏览器Firefox140。新版本增加了手动Unload标签页的功能,优化了垂直标签页的调...
- Linux 基本正则表达式及扩展正则表达式功能举例
-
在Linux中,正则表达式(RegularExpression)是一种强大的模式匹配工具,用于在文本中查找、匹配和处理特定模式的字符串。Linux支持两种类型的正则表达式:基本正则表达式(Basic...
- linux下find命令的经典26个使用示例
-
简介find命令是基于unix的操作系统中常用的工具之一。顾名思义,它在目录层次结构中查找文件和目录。用户可以传递不同的参数,并根据文件的名称、扩展名、类型、大小、权限、修改时间、所有者、组等搜索文件...
- linux运维中特殊符号的应用与实践
-
路径位置类的特殊符号(1)、波浪线(~)在linux系统的命令行中,~表示用户的家目录,超级用户为/root,普通用户为/home。假设我当前目录在usr/local下[root@xrylocal]...
- 开源框架log4cpp实战(开源gui框架)
-
1.Log4cpp使用Log4cpp中主要包含Category(种类),Appender(附加器),Layout(布局),Priorty(优先级),NDC(嵌套的诊断上下文)。Category、App...
- Linux find命令详解(linux find -l)
-
一、命令介绍Linuxfind命令是类unix操作系统中最重要和最常用的命令行实用程序之一。find命令用于根据指定的条件搜索和定位与参数匹配的文件和目录列表。find命令提供了广泛的选项,允许用户...
- Linux运维:单引号与双引号的使用(linux 单引号和双引号)
-
1、单引号的使用单引号可以将它中间的所有任意字符还原为字面意义,实现屏蔽Shell元字符的功能。注意不可以在两个单引号中间单独插入一个单引号,单引号必须成对出现。示例1:定义一个变量,并输出变量的...
- Linux技巧:find 命令用法详细说明,看完会有收获
-
在Linux命令中,find是比较复杂难用的命令。使用该命令搜索文件时,常常发现自己找了一些例子能用,但稍微改一下条件,就搜不到想要的结果。下面会以一些实例来说明使用find命令的关键要点和...
- Linux Shell中单引号、双引号、反引号的解释
-
1、单引号('')单引号所见即所得,直接显示单引号里的内容。即单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的。比如下面的例子,单引号所见即所得。2、双引号("...
- 一周热门
- 最近发表
-
- linux sed系列 第四篇:sed工业实战——日志处理与数据清洗
- Linux下sed的简单使用(linux中sed是什么意思)
- linux基础命令之date命令(linux中的date)
- Ubuntu linux 常用命令(ubuntu常用的50个命令)
- Linux基础命令-sed命令(linux教程:sed命令的用法)
- linux sed系列 第二篇:sed进阶技巧——地址定位与正则表达式
- 火狐Firefox浏览器140发布:手动Unload标签页、优化翻译体验等
- Linux 基本正则表达式及扩展正则表达式功能举例
- linux下find命令的经典26个使用示例
- linux运维中特殊符号的应用与实践
- 标签列表
-
- linux一键安装 (31)
- linux运行java (33)
- ln linux (27)
- linux 磁盘管理 (31)
- linux 内核升级 (30)
- linux 运行python (28)
- linux 备份文件 (30)
- linux 网络测试 (30)
- linux 网关配置 (31)
- linux jre (32)
- linux 杀毒软件 (32)
- linux语法 (33)
- linux博客 (33)
- linux 压缩目录 (37)
- linux 查看任务 (32)
- 制作linux启动u盘 (35)
- linux 查看存储 (29)
- linux乌班图 (31)
- linux挂载镜像 (31)
- linux 软件源 (28)
- linux题目 (30)
- linux 定时脚本 (30)
- linux 网站搭建 (28)
- linux 远程控制 (34)
- linux bind (31)