一、程序与进程
在计算机科学中,进程和程序是两个非常基础但容易混淆的概念。它们虽然密切相关,但在本质上有很大的区别。以下是对这两个概念的详细解释及其区别。
1. 什么是程序?
程序是指一组有序的指令,它们被设计来执行某些特定的任务。程序通常是静态的,存储在硬盘上(或其他介质上)作为一个可执行文件。
程序是静态的:它只是一个存储在存储介质上的代码文件,包含了编译后的指令,可以是
.exe
、.out
、.bin
等格式。程序不执行任何操作:它只是一个包含逻辑和计算步骤的集合,直到被加载到内存中并被操作系统执行时,才变得有用。
示例:
一个用 C 语言写的源代码文件
hello.c
。一个已经编译好的可执行文件
hello.out
。
程序本身并不代表运行状态,它只是一个没有执行的文件。
2. 什么是进程?
进程是程序在计算机上执行时的一个实例,或者说是程序的执行过程。它是操作系统资源管理的基本单位。每个进程有自己独立的内存空间、执行上下文(如程序计数器、栈、堆等),以及操作系统分配的资源(如文件描述符、系统资源等)。
进程是动态的:它是程序加载到内存后,在操作系统中被调度、执行的状态。
进程拥有自己的资源:每个进程都会有自己的内存空间(包括堆、栈、代码段等),操作系统为每个进程分配资源并进行管理。
示例:启动一个应用程序时,操作系统会为其创建一个进程。
在终端中运行一个编译后的程序
./hello.out
时,它会成为一个进程。
进程是操作系统执行程序时所生成的一个运行实例,可以通过进程的ID(PID)进行标识。每个正在执行的程序都是一个进程,且每个进程由操作系统管理。
3. 程序与进程的区别
特性 | 程序 | 进程 |
---|---|---|
定义 | 一组有序的指令,是一个静态的代码文件。 | 程序在计算机中执行时的实例。 |
生命周期 | 程序本身是静态的,直到被加载并执行才会变得有用。 | 进程是动态的,它是程序在内存中的执行状态。 |
资源 | 程序没有独立的资源,它只是代码文件。 | 进程拥有独立的资源,如内存空间、文件描述符等。 |
存在方式 | 程序通常存储在硬盘、闪存等存储设备中。 | 进程存在于内存中,它在运行时由操作系统管理。 |
操作系统管理 | 程序由用户或开发人员编写和存储。 | 进程由操作系统创建、调度和管理。 |
实例 | 例如 hello.c (源代码文件)、hello.out (可执行文件)。 |
运行中的 ./hello.out 程序实例。 |
主要区别:
程序是静态的,它只是存储在硬盘上的文件,包含指令和数据。
进程是动态的,它是操作系统加载程序并执行时的运行实例。一个程序可以有多个进程实例在运行,每个进程有独立的资源和内存空间。
4. 进程与程序的关系
一个程序可以启动多个进程:例如,在操作系统中,多个用户可以同时运行同一个程序(比如多个终端窗口都运行
vim
编辑器),每个终端窗口都会启动一个vim
进程。进程依赖于程序:进程是程序的执行实例,没有程序,进程就无法启动。程序是进程的“蓝图”。
程序与进程的生命周期:程序在磁盘上创建后,可以被多次执行,启动多个进程。每个进程都有自己的执行上下文(如内存、CPU 状态等),当程序运行结束时,相关的进程会结束并释放资源。
5. 总结
程序是静态的,是存储在磁盘上的一组指令,尚未执行。
进程是程序的执行实例,是操作系统管理的动态实体。
程序和进程的关系可以类比为“工厂(程序)和生产的产品(进程)”,一个程序可以启动多个进程,而每个进程都是程序的运行时实例。
通过理解程序与进程的区别,能够帮助你更好地理解操作系统的工作原理,特别是如何管理和调度正在运行的程序,以及多任务操作如何在操作系统中实现。
二、查看系统进程
在 Linux 系统中,有多种方法可以查看系统中正在运行的进程。常用的查看进程的命令有 ps
、top
、htop
、pgrep
等。下面是这些命令的详细介绍:
1. 使用 ps
命令查看进程
ps
命令是 Linux 系统中用于查看当前系统进程的一个基本命令。它可以列出当前用户的进程,或者显示系统中所有进程的信息。
常用命令:
查看当前用户的进程:
ps
这个命令只会列出当前终端会话的进程。
查看所有进程:
ps -e
或者
ps -A
这会列出系统中所有正在运行的进程。
查看详细信息:
ps -ef
该命令会列出所有进程,并显示更详细的信息,包括每个进程的 PID、父进程 PID(PPID)、占用的 CPU 和内存、进程状态等。
查看指定用户的进程:
ps -u username
替换 username
为你想查看的用户名,这会显示该用户启动的所有进程。
查看进程树:
ps axjf
这个命令以树状图的方式显示进程的父子关系,可以帮助你了解进程是如何启动的。
例子:
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 04:33 ? 00:00:02 /sbin/init
root 2 0 0 04:33 ? 00:00:00 [kthreadd]
...
2. 使用 top
命令查看进程
top
命令是 Linux 中一个动态的进程查看工具,它会实时显示系统中的进程,并不断刷新显示。它不仅可以显示所有进程,还会显示每个进程的 CPU 和内存使用情况。
使用方法:
top
执行后,top
会实时刷新并显示所有进程的详细信息,如 PID、CPU 使用率、内存使用率等。
常用快捷键:
按
P
:按 CPU 使用率排序。按
M
:按内存使用率排序。按
q
:退出top
命令。按
h
:查看帮助信息。
例子:
$ top
top - 10:30:35 up 1:30, 1 user, load average: 0.25, 0.30, 0.35
Tasks: 215 total, 1 running, 214 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.4 us, 1.2 sy, 0.0 ni, 94.8 id, 0.2 wa, 0.0 hi, 0.3 si, 0.0 st
MiB Mem : 8000.0 total, 2048.0 free, 4096.0 used, 1856.0 buff/cache
MiB Swap: 2048.0 total, 1024.0 free, 1024.0 used. 2048.0 avail Mem
3. 使用 pgrep
查找进程
pgrep
命令用于根据进程名称查找进程 ID(PID),非常适合用于快速定位某个程序的进程。
使用方法:
pgrep <进程名>
例如,查找所有名为 firefox
的进程:
pgrep firefox
这将返回所有与 firefox
相关的进程 ID。
4. 使用 ps aux
查看所有进程(包括其他用户的进程)
ps aux
是查看系统中所有进程的常用命令,显示每个进程的详细信息,包括用户、PID、CPU 和内存使用、启动时间等。
使用方法:
ps aux
5.结合ps和grep查找进程
使用方法:
ps aux|grep filename
使用这个命令即可筛选出当前进程中的名为filename的进程的详细信息。
总结
在 Linux 系统中,查看进程的方法有很多,常用的命令包括:
ps
:用于静态查看当前系统进程。top
:实时查看并动态更新系统进程。pgrep
:根据进程名称查找进程 ID。ps aux
:查看所有进程及其详细信息。
每个命令的用途和适用场景不同,ps
用于查看当前进程状态,top
和 htop
用于实时监控进程,pgrep
用于查找特定进程。
三、进程标识符(PID)
进程标识符(PID,Process Identifier) 是操作系统用于唯一标识一个正在运行的进程的数字。每个进程在操作系统中都有一个唯一的 PID,这个标识符是操作系统调度和管理进程的基础。
进程标识符是一个正整数,它可以帮助操作系统和用户区分不同的进程。PID 通常由操作系统在进程创建时分配,并且在进程终止后回收。
1.进程标识符的作用
唯一标识进程:每个进程都有一个唯一的 PID,操作系统可以根据 PID 来识别、调度和管理进程。
进程控制:通过 PID,用户和程序可以控制进程,如终止进程、查看进程状态等。例如,使用
kill
命令可以通过 PID 终止进程。进程间通信:在某些进程间通信(IPC)机制中,PID 作为目标进程的标识符,帮助进程之间进行数据交换和同步。
2.如何查看进程的 PID
在 Linux 系统中,可以使用多种方法查看进程的 PID。除了之前提到的使用ps、top、pgrep等命令查看进程的时候可以看到进程的PID,我们使用getpid()函数也可以得到进程的PID。
pid_t pid;
pid = getpid();
3.特殊的 PID
PID 1:在 Linux 系统中,PID 为 1 的进程通常是
init
进程或现代系统中的systemd
。这是系统启动时的第一个进程,负责启动和管理系统中的其他进程。PID 0:这个 PID 保留给内核进程,它不是普通的用户进程。
4.进程与父进程(PPID)
每个进程除了有一个唯一的 PID,还会有一个 父进程标识符(PPID,Parent Process ID)。父进程是创建当前进程的进程。例如,当一个用户在终端中启动一个程序时,终端本身是父进程,启动的程序是子进程。可以通过 ps -ef
输出中的 PPID
列查看父进程的 PID。
总结
进程标识符(PID) 是操作系统为每个正在运行的进程分配的唯一数字标识符。
PID 是进程管理和调度的基础,通过 PID,操作系统可以识别和控制进程。
用户 可以通过
ps
、top
、pgrep
等命令查看进程的 PID。PID 对进程间通信和进程控制至关重要,是管理系统中各个进程的核心。