Linux 系统中的进程与线程
进程
进程是计算机中正在运行的程序的实例。每个进程都有自己独立的地址空间、内存、资源和执行状态。进程是操作系统进行资源管理和任务调度的基本单位。
进程的主要特征:
- 地址空间:每个进程有自己独立的虚拟地址空间。
- 资源:进程拥有自己的文件描述符、信号处理器等资源。
- 执行状态:进程的执行状态包括运行、等待、挂起等。
线程
线程是进程中的一个执行单元。线程共享进程的地址空间和资源,但有自己独立的栈、寄存器等。线程之间的切换比进程之间的切换开销更小,因此可以实现更高效的并发执行。
线程的主要特征:
- 共享资源:线程共享进程的内存和资源。
- 独立执行:每个线程有自己的执行路径。
- 轻量级:创建和管理线程的开销比进程小。
常用命令
`pstree -sp`
`pstree` 命令以树状图的形式显示进程及其子进程关系。`-s` 选项显示进程树的 PID 和 PPID,`-p` 选项显示 PID。
```bash
pstree -sp
输出示例:
init(1)─┬─bash(1234)───a.out(5678)
└─bash(2345)
- `init(1)` 是系统的初始进程。
- `bash(1234)` 和 `bash(2345)` 是 `init` 进程的子进程。
- `a.out(5678)` 是 `bash(1234)` 启动的程序 `a.out`。
`ps aux | grep a.out`
`ps` 命令显示当前系统的进程状态。`aux` 选项表示显示所有用户的进程,`grep` 用于过滤包含 `a.out` 的进程。
```bash
ps aux | grep a.out
输出示例:
user 5678 0.0 0.1 12345 6789 ? S 10:00 0:00 ./a.out
user 6789 0.0 0.0 2345 678 ? S 10:01 0:00 grep --color=auto a.out
- 显示所有包含 `a.out` 的进程及其信息。
- 第一行是 `a.out` 程序的进程信息,第二行是 `grep` 命令本身的进程信息。
`ps -elf | grep a.out`
`ps -elf` 命令以长格式显示所有进程的详细信息。`grep` 用于过滤包含 `a.out` 的进程。
```bash
ps -elf | grep a.out
输出示例:
0 S 1234 5678 5678 0 80 0 0 0 0 ? 00:00:00 a.out
- `ps -elf` 显示的字段包括状态、PID、PPID、优先级、内存使用等信息。
进程状态
进程的状态通过 `ps` 命令中的 `STAT` 字段显示,常见的状态包括:
- R:Running(运行中)。进程正在运行或在等待 CPU 时间。
- S:Sleeping(睡眠中)。进程正在等待某个事件(例如 I/O 完成)。
- D:Uninterruptible Sleep(不可中断的睡眠)。进程在等待 I/O 操作,无法被中断。
- T:Stopped(停止)。进程已被停止,通常是由于接收到信号(例如 `SIGSTOP`)。
- Z:Zombie(僵尸)。进程已终止,但其父进程尚未读取其退出状态,因此仍然存在于系统中。
`getpid()` 函数
`getpid()` 是一个系统调用,用于获取当前进程的进程ID(PID)。它在 `<unistd.h>` 头文件中定义,返回当前进程的 PID,用于进程管理和调试。
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid = getpid();
printf("Current PID: %d\n", pid);
return 0;
}
总结
- 进程 和 线程 是系统管理和执行任务的基本单位。
- 使用 `pstree -sp`、`ps aux` 和 `ps -elf` 可以获取系统中进程的详细信息。
- 进程状态包括 `R`(运行)、`S`(睡眠)、`D`(不可中断的睡眠)、`T`(停止)和 `Z`(僵尸)。
- `getpid()` 用于获取当前进程的 PID。