1. 进程和子进程
1.1 进程概念
进程和操作系统是计算机科学中的核心概念,无论何时使用计算机,您都会与各种程序进行交互。这些程序的执行就是通过进程来实现的。
什么是进程?
进程是操作系统对正在运行的程序的抽象。每个应用程序都包含一个或多个进程。例如:开始菜单,应用栏,命令行解释器,文本编辑器,浏览器。这些都是计算机上运行的进程。
多任务处理
典型的操作系统会报告数百甚至数千个正在运行的进程。然而,中央处理器(CPU)通常只有少数几个核心,这意味着它们只能同时运行少数几个指令。那么,数千个进程如何同时运行呢?
操作系统的多任务处理能力使得这一切成为可能:
CPU 的高速运转:CPU 是计算机的大脑,运行速度极快,通常在纳秒级。
其他组件的相对低速:例如,读取磁性硬盘的时间是典型 CPU 操作时间的数千倍。
当一个进程需要进行慢速操作(如写入硬盘或等待远程服务器响应),CPU 大部分时间会处于空闲状态。操作系统通过多任务处理保持 CPU 的繁忙。
进程管理
操作系统通过进程表(或进程控制块)来跟踪进程。在这个表中,您可以找到:
- 文件句柄
- 安全上下文
- 地址空间的引用
进程表允许操作系统随时中断某个进程,并且在稍后继续执行该进程时,可以从中断的确切位置恢复。即使进程在执行过程中被中断数千次,操作系统也能准确找到并恢复到中断点。
1.2 进程的生命周期
进程的生命周期是指从创建到终止整个过程中进程经历的各个阶段。了解进程生命周期有助于更好地理解操作系统的工作原理和多任务处理的机制。下面我们将详细探讨这一过程。
创建进程
当一个进程启动另一个进程时,启动进程称为父进程,被启动的进程称为子进程。在命令行启动 Python 应用程序的示例中,命令行进程(例如 bash 或 cmd.exe)就是父进程,而 Python 进程则是子进程。
进程的创建在不同的操作系统中有不同的机制。例如:
UNIX 系统:通常通过使用 fork() 函数复制当前进程,然后使用 exec() 函数系列之一来替换子进程。
Windows 系统:使用 CreateProcess 函数来创建进程。
进程表
操作系统通过进程表(或进程控制块,PCB)来跟踪和管理每个进程。进程表中包含的信息包括:
- 进程的标识符(PID)
- 父进程的标识符(PPID)
- 进程的状态(运行、等待、停止等)
- 进程的资源(内存、文件句柄等)
进程表帮助操作系统管理和调度进程,并在需要时暂停和恢复进程的执行。
进程树
进程和其子进程之间的关系可以表示为一棵树,称为进程树。在这棵树中,每个节点表示一个进程,节点之间的连线表示父子关系。进程树可以帮助我们了解系统中各进程的层次结构。
父子关系
父子进程之间的关系并不总是相同的:
- 资源共享:有时父进程和子进程会共享特定的资源(如输入输出流),有时则不会。
- 生命周期:子进程可能比父进程存活的时间更长。这种情况下,如果父进程终止而子进程仍在运行,则子进程可能会成为孤儿进程,继而被系统的 init 进程(在 UNIX 系统中)或其他监护进程接管。
进程的终止
进程在完成其任务后会终止。每个进程在退出时都会返回一个整数,称为退出状态码或返回码。这个返回码用来指示进程是否成功完成任务:
0:表示成功
非零值:表示失败,可以使用不同的值来指示不同的错误原因
例如,在 C 语言中,标准的 main() 函数通常返回一个整数来指示程序的退出状态:
// minimal_program.c
int main(){
return 0;
}
在上述例子中,当程序运行结束时,它返回 0,表示成功退出。
示例代码:创建进程
下面是一个简单的 Python 示例,演示如何创建一个子进程并等待其完成:
import os
import sys
def child_process():
print("Child process with PID:", os.getpid())
sys.exit(0)
def parent_process():
print("Parent process with PID:", os.getpid())
pid = os.fork()
if pid > 0:
# 这是父进程
print("Parent: Created child process with PID:", pid)
pid, status = os.wait()
print("Parent: Child process", pid, "terminated with status", status)
else:
# 这是子进程
child_process()
if __name__ == "__main__":
parent_process()
解释
os.fork():在 UNIX 系统中,fork() 函数用于创建一个子进程。父进程中 fork() 返回子进程的 PID,而子进程中 fork() 返回 0。
os.getpid():返回当前进程的 PID。
os.wait():等待子进程终止,并返回子进程的 PID 和退出状态。
小结
进程生命周期包括从创建到终止的各个阶段。操作系统通过进程表管理进程,并通过多任务处理机制使 CPU 高效运行。了解进程的创建、管理和终止机制,有助于深入理解操作系统的工作原理和计算机系统的运作方式。
2.进程管理工具
2.1 wiindows中的进程管理工具
- Process Hacker
Process Hacker 是一个功能强大的进程监控工具,可以轻松显示进程树,并提供详细的进程信息。
安装方法:您可以通过 Chocolatey 包管理工具安装 Process Hacker:
PS> choco install processhacker
如果安装时提示
C:\Users\CE>choco install processhacker
'choco' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
表明系统上没有安装 Chocolatey。Chocolatey 是一个 Windows 包管理器,可以用来安装各种软件。你可以先安装 Chocolatey,然后再使用它来安装 Process Hacker。
- 安装 Chocolatey
打开管理员权限的命令提示符:
按 Win + X,选择 命令提示符(管理员) 或 Windows PowerShell(管理员)。
运行以下命令来安装 Chocolatey:
Set-ExecutionPolicy Bypass -Scope Process -Force; `
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; `
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
安装 Process Hacker
Chocolatey 安装完成后,可以使用choco install processhacker来安装 Process Hacker了。
如果不使用 Chocolatey 安装 Process Hacker,也可以直接从 Process Hacker 的官方网站下载最新版本的安装包,按照提示完成安装。 Process Hacker 下载页面: https://processhacker.sourceforge.io/downloads.php
安装完成后,打开 Process Hacker 应用程序,您将看到系统的进程树。这个工具可以帮助您详细查看每个进程的资源使用情况、线程、模块等信息。
2. Get-Process
Get-Process 是 PowerShell 中的一个命令,用于列出当前活动的进程。
PS> Get-Process
这个命令会在命令行上列出所有活动的进程,包括进程名称、PID、CPU 使用率等信息。
输出显示如下:
3. tasklist
tasklist 是命令提示符中的一个实用程序,用于列出活动进程。
使用方法:
C:\> tasklist
这个命令会在命令提示符中列出所有活动的进程,类似于 Get-Process,但不需要 PowerShell。
- Sysinternals Suite
Sysinternals Suite 是一组由 Microsoft 提供的高级系统工具,其中包括 Process Monitor、Process Explorer 和 PsList。
安装方法:
PS> choco install sysinternals
Process Monitor:用于监控实时的文件系统、注册表和进程/线程活动。
Process Explorer:一个高级任务管理器,提供详细的进程信息和资源使用情况。
PsList:一个命令行工具,类似于 UNIX 系统上的 pstree,用于显示进程树。
-
任务管理器
Windows 自带的 任务管理器 也是一个基本但经典的工具,可以用来查看和管理系统上的进程。您可以通过按 Win + X 并选择任务管理器来访问。
-
Python psutil 库
psutil 是一个跨平台的 Python 库,用于检索系统上正在运行的进程信息和系统利用率(CPU、内存、磁盘、网络、传感器)的实用程序。
安装方法:
pip install psutil
import psutil
# 列出所有进程的 PID 和名称
for proc in psutil.process_iter(['pid', 'name']):
print(proc.info)
# 获取当前进程的 CPU 和内存使用情况
process = psutil.Process()
print(f"CPU usage: {process.cpu_percent()}%")
print(f"Memory usage: {process.memory_info().rss / (1024 * 1024)} MB")
输出结果如下:
2.2 Linux中的进程管理工具
在 Linux 系统中,有多种工具可以用来管理和监视进程。以下是一些常见的工具及其用途:
1. ps
ps 是一个基本的命令,用于显示当前运行的进程。
ps aux
a 显示所有用户的进程
u 以用户为中心的格式显示进程
x 显示没有控制终端的进程
2. top
top 是一个实时系统监控工具,可以显示系统的总体资源使用情况和各个进程的详细信息。
启动:
top
在 top 中,你可以使用以下快捷键进行操作:
q 退出
h 显示帮助
k 终止一个进程
3. htop
htop 是 top 的一个更友好的替代品,提供了更好的用户界面和更多的功能,需要安装后使用
安装:
sudo apt-get install htop # Debian/Ubuntu
sudo yum install htop # CentOS/RHEL
启动:
htop
4. kill
kill 命令用于发送信号给进程,通常用于终止进程。
示例:
kill <pid>
kill -9 <pid> # 强制终止进程
5. pkill
pkill 可以根据进程名称来终止进程,而不需要知道具体的 PID。
示例:
pkill firefox
6. pgrep
pgrep 可以根据进程名称来查找进程的 PID。
示例:
pgrep firefox
7. systemctl
systemctl 是用于管理 systemd 服务的工具,常用于启动、停止和管理服务。
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl status nginx
8. nice 和 renice
用于设置进程的优先级。
示例:
nice -n 10 command # 启动一个进程,设置优先级为10
renice 10 -p <pid> # 修改一个正在运行的进程的优先级
9. strace
strace 用于跟踪系统调用和信号,是一个强大的调试工具。
示例:
strace -p <pid>
10. lsof
lsof 显示系统中所有打开的文件和正在使用的端口。
示例:
lsof -i :80 # 显示使用端口80的进程