【Linux】第八章 监控和管理Linux进程
目录
1.什么是进程?
进程的基本组成:
2. 如何理解systemd进程?
3. ps和top有什么区别?
4. 解释 ps aux 和 ps -ef 这两个命令和参数的作用。
5. 进程状态有哪些?
6. 怎么理解作业(Job)和作业控制?
7. 说明 kill 命令中使用 9 和 15 信号量的区别。
8.什么是负载平均值(load average)?
1.什么是进程?
进程(process)是操作系统中正在运行的程序,它不仅仅是程序的代码,还包括了程序执行时所需的所有资源、上下文和状态信息。进程是操作系统资源管理的基本单位,也是执行的基本单位。
进程的基本组成:
(1)分配的内存地址空间:每个进程在操作系统中都有一块独立的内存空间。这个内存空间分为不同的区域,用于存储:
- 栈:用于存储函数的局部变量、函数调用的返回地址等信息。
- 堆:动态分配的内存区域,用于存放程序运行时申请的内存。
- 数据段:存放程序的全局变量和静态变量。
- 代码段:存放程序的代码。
这些内存空间保证了不同进程之间的内存隔离,防止进程间互相干扰。也就是说,一个进程不能直接访问另一个进程的内存,保护了进程的数据安全。
(2)安全属性(所有权和特权):
每个进程都由操作系统分配所有者,即一个进程有其所属的用户或用户组(通常是启动该进程的用户)。操作系统通过用户和用户组来控制进程的权限。
特权指的是进程是否拥有某些系统资源的访问权限。例如,普通用户的进程不能访问或修改系统文件,而内核进程或有特权的进程可以访问系统的所有资源。
通过这种方式,操作系统确保了不同进程的权限隔离,避免了未经授权的访问。
(3)一个或多个线程:
- 进程可以包含多个线程,这些线程共同工作,共享进程的资源(如内存、文件描述符等)。
- 每个进程至少有一个主线程,并且每个线程都有自己的执行上下文。线程是操作系统调度的最小单位,负责实际的程序执行。
- 线程共享进程的内存空间和一些系统资源,但每个线程有自己的栈、程序计数器(PC)等执行上下文。
- 多个线程可以在同一个进程内并发执行,提高了进程的执行效率。进程内的多个线程共享数据,并通过线程间的同步机制来进行协调。
(4)进程状态:
进程在运行过程中会经历不同的状态,每个状态对应着不同的行为:
- 就绪(Ready):进程已准备好,等待操作系统将其分配到CPU进行执行。
- 运行(Running):进程正在CPU上运行。
- 等待(Blocked):进程正在等待某些事件的发生,比如等待I/O操作的完成。
- 终止(Terminated):进程完成执行或被强制终止。
操作系统管理进程的状态,通过调度算法决定哪个进程在什么时候执行。
进程的环境
进程环境指的是进程在执行时的所有上下文信息和资源配置,保证进程能够正确运行并与系统和其他进程进行交互。
进程环境的组成:
(1)本地和全局变量:
- 本地变量:指在进程内部、线程内部定义的变量。它们仅在进程或线程的执行上下文中有效。
- 全局变量:指在进程内部共享的变量,进程中的所有线程都能访问。全局变量在多线程程序中是共享的,需要进行同步处理。
(2)当前调度上下文:
调度上下文是指操作系统记录的当前进程执行状态。这包括:
- 寄存器的值:进程当前执行的指令、程序计数器(PC)等。
- 内存状态:进程使用的栈、堆、代码段等信息。
- 调度信息:如进程的优先级、调度策略等。
每当操作系统切换进程时,它会保存当前进程的调度上下文,并加载新进程的调度上下文。这样可以保证进程能够在切换后从中断的地方继续执行。
(3)分配的系统资源:
操作系统为每个进程分配了一些资源,确保进程能够正常运行并与外部环境进行交互。例如:
- 文件描述符:每个进程可以打开一定数量的文件,每个文件有一个唯一的文件描述符来标识。
- 网络端口:进程需要通过网络与其他系统通信时,操作系统为其分配网络端口。
- 共享库和外部资源:进程在执行时可能依赖于外部的库文件或硬件资源,操作系统负责管理这些资源。
这些资源的分配和管理保证了进程在执行时不发生资源冲突。
2. 如何理解systemd进程?
当前进程(parent) 通过 fork() 复制自己的地址空间来创建一个新的(子) 进程,新进程是父进程的一个副本,会继承父进程的很多特征(如代码、数据、文件描述符等),但会有独立的进程ID和某些资源。
systemd 是第一个启动的进程,进程ID为 1,是所有其他进程的父进程。systemd 在系统启动时初始化操作系统,启动和管理用户空间进程,服务和其他重要资源。
systemd 作为 PID 1 进程,不仅负责系统的初始化过程,还负责进程的管理、日志记录、设备管理等任务。
3. ps和top有什么区别?
ps
(Process Status):是一个静态命令,用于显示当前系统中进程的快照(即当前时刻的进程状态)。它显示的进程信息是静态的,即运行命令时显示的进程列表并不会自动更新。
top
:是一个动态命令,用于显示当前系统进程的实时信息。它不断更新进程信息,可以动态显示系统资源使用情况,包括 CPU 使用率、内存使用率、进程信息等。
4. 解释 ps aux 和 ps -ef 这两个命令和参数的作用。
ps aux 用于显示当前系统中所有用户的所有进程信息。
-
a
:显示所有用户的进程。 u
:以用户为中心的格式显示进程信息,输出中包含进程的所有者(用户)、进程的 CPU 和内存使用情况等。x
:显示没有控制终端的进程(如后台进程)。默认情况下,ps
只显示属于当前终端的进程,通过添加x
参数,可以查看没有终端的进程。
ps -ef 用于显示当前系统中所有进程的详细信息。
-e
:显示所有正在运行的进程,相当于a
选项。显示系统中的所有进程,不仅仅是当前终端或当前用户的进程。-f
:以完整格式显示进程信息,输出包含进程的父进程 ID (PPID)、启动时间、占用的终端等详细信息。
5. 进程状态有哪些?
-
R(Running or Runnable)正在运行,或者准备好运行(在可运行队列中等待 CPU 时间片)。
- S(Sleeping):正在睡眠(等待某些事件的发生,比如 I/O 操作完成,或者某个信号到达等)。
- D(Uninterruptible Sleep):进程在“不可中断睡眠”状态中,通常是因为等待某些硬件操作(如硬盘或网络)完成。
- T(Stopped):进程被停止,通常是通过接收
SIGSTOP
信号或Ctrl+Z
(在终端下暂停进程)暂停的。 - Z(Zombie):僵尸进程,进程已经完成执行并终止,但它的父进程尚未读取它的退出状态,因此该进程仍然在进程表中。
- I(Idle):进程处于空闲状态,通常是 CPU 核心在空闲时的状态。
- W(Paging):进程在进行虚拟内存到物理内存的页面交换操作,通常是由于内存压力很大时发生。进程正在等待页面交换完成,这可能会导致性能问题。
- X(Dead):这表示进程已经结束并且已经完全清理,不再保留任何状态信息。
6. 怎么理解作业(Job)和作业控制?
作业 是在一个终端会话中启动的一个或多个相关进程的集合。每个作业都有一个唯一的作业编号。作业可以包含一个或多个进程,这些进程可以同时执行或相互依赖。
作业控制 是shell提供的一种功能,允许用户在一个shell实例中运行和管理多个命令。它使得用户能够将作业在 前台(一个终端同一时间只能有一个前台作业)和 后台(&)之间切换,以及暂停和恢复执行。可以通过 bg 命令将一个暂停的作业转到后台,也可以使用 fg 命令将后台作业恢复到前台。你可以使用 ctrl+z 将一个正在前台运行的作业暂停,并放到后台(即发送 sigstop 信号)。
7. 说明 kill 命令中使用 9 和 15 信号量的区别。
kill 命令需要提供进程ID,发送信号。kill -signal PID。
SIGTERM (信号量 15) :优雅终止,通知进程"请自行退出",允许进程执行清理操作(如保存数据、关闭文件、释放资源等)。建议选该操作。
SIGTERM (信号量 9) :强制终止,直接由操作系统内核终止进程,不给予清理机会,不可被捕获、阻塞或忽略,可能导致资源泄漏(如临时文件未删除、共享内存未释放)。
pkill 可以根据进程名或其他属性来查找并终止进程。
SIGKILL 常被滥用,无法挽救,太致命,而且容易不释放资源,所以建议还是先 SIGTERM(15),然后尝试SIGINT (2) ,实在关不掉再用 SIGKILL(9)。
8.什么是负载平均值(load average)?
系统的 负载平均值 是衡量系统工作负荷的一个重要指标。内核每隔5秒收集负载数, 汇总到1分钟、5分钟和15分钟移动平均值,负载数由 CPU 上准备运行的进程数(进程状态为 R)和等待磁盘或网络 I/O 完成的进程数(进程状态为 D)决定。如果系统负载很高,但是 CPU 压力不高,则要考虑磁盘和网络负载过大。
uptime 命令显示当前 load average,lscpu 显示cpu数量。如果 load average 除以cpu数量,接近1,表示cpu负载非常高。