Linux系统编程——进程

发布于:2025-05-14 ⋅ 阅读:(12) ⋅ 点赞:(0)

一、程序与进程

在计算机科学中,进程程序是两个非常基础但容易混淆的概念。它们虽然密切相关,但在本质上有很大的区别。以下是对这两个概念的详细解释及其区别。


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 系统中,有多种方法可以查看系统中正在运行的进程。常用的查看进程的命令有 pstophtoppgrep 等。下面是这些命令的详细介绍:

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 系统中,查看进程的方法有很多,常用的命令包括:

  1. ps:用于静态查看当前系统进程。

  2. top:实时查看并动态更新系统进程。

  3. pgrep:根据进程名称查找进程 ID。

  4. ps aux:查看所有进程及其详细信息。

每个命令的用途和适用场景不同,ps 用于查看当前进程状态,tophtop 用于实时监控进程,pgrep 用于查找特定进程。

三、进程标识符(PID)

进程标识符(PID,Process Identifier) 是操作系统用于唯一标识一个正在运行的进程的数字。每个进程在操作系统中都有一个唯一的 PID,这个标识符是操作系统调度和管理进程的基础。

进程标识符是一个正整数,它可以帮助操作系统和用户区分不同的进程。PID 通常由操作系统在进程创建时分配,并且在进程终止后回收。

1.进程标识符的作用

  1. 唯一标识进程:每个进程都有一个唯一的 PID,操作系统可以根据 PID 来识别、调度和管理进程。

  2. 进程控制:通过 PID,用户和程序可以控制进程,如终止进程、查看进程状态等。例如,使用 kill 命令可以通过 PID 终止进程。

  3. 进程间通信:在某些进程间通信(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,操作系统可以识别和控制进程。

  • 用户 可以通过 pstoppgrep 等命令查看进程的 PID。

  • PID 对进程间通信和进程控制至关重要,是管理系统中各个进程的核心。


网站公告

今日签到

点亮在社区的每一天
去签到