前言
在深入探讨Linux内核的精妙世界中,进程调度无疑是最具挑战性也最为关键的一个环节。它作为操作系统核心功能的一部分,犹如交响乐团中的指挥家,精准而高效地协调着系统中各个进程的执行顺序和时间分配,确保整个系统的性能表现与资源利用达到最佳平衡。
Linux内核的进程调度器不仅负责决定哪个进程将在CPU上运行,何时运行,还涉及到优先级管理、实时性保证、多处理器调度策略等诸多复杂问题。其设计理念和技术实现,直接影响到操作系统的响应速度、吞吐量以及整体稳定性,尤其对于现代多核、多线程环境下的计算需求来说,更是显得至关重要。
一、进程的概念
1.概述
Linux内核中,进程(Process)是最基本的执行实体,它代表了正在执行的程序的实例。
- 进程是系统资源分配和调度的基本单位。在Linux内核中,每个进程都有一个独特的进程描述符结构体——
task_struct
,它包含了进程的身份信息、状态、优先级、虚拟内存、打开的文件描述符、信号处理等众多属性。- 进程拥有独立的地址空间,即虚拟内存空间,确保了进程间的隔离性和安全性。
在Linux内核-进程调度学习过程中,需要区分几个比较重要的概念:
轻量级进程:
- 定义: LWP是一种内核支持的用户线程实现,每一个LWP都对应着内核中的一个实体,也就是说,每个LWP都有自己的内核级线程支持,从而能够独立地被内核调度。LWP结合了用户线程和内核线程的优点,既可以享受到多线程的优势,又能避免传统用户线程的全局阻塞问题。
内核线程:
- 定义: 内核线程是直接在内核空间运行的线程,它没有独立的用户空间,主要执行内核任务,不与任何特定的用户进程关联。内核线程通常用于执行内核维护工作,如定时器中断处理、I/O调度、垃圾回收等后台服务。
- 特点: 没有自己的地址空间,所有内核线程共享内核地址空间,可以直接访问硬件资源,但不能执行用户态的代码。
用户进程和用户线程:
- 用户进程:用户进程是运行在用户空间的应用程序实例,它拥有独立的地址空间、打开的文件描述符集合以及其他系统资源。一个用户进程可以包含一个或多个线程(无论是内核线程还是用户线程/LWP)。
- 用户线程:用户线程是在用户空间创建和管理的线程,存在于进程的地址空间内部。用户线程由进程自己或用户空间的线程库(如POSIX Pthreads)创建和调度,而非由操作系统内核直接管理。 用户线程依赖于用户态的线程库实现上下文切换,速度相对较慢。早期的用户线程在没有内核支持的情况下,如果其中一个线程阻塞在系统调用上,会导致整个进程阻塞。
轻量级进程和用户线程的关系:
在Linux系统中,当你使用用户层的线程库(如POSIX Pthreads)创建用户线程时,大多数情况下(特别是使用Native POSIX Thread Library,NPTL时),操作系统会在内核层面对应地创建一个内核线程。NPTL实现了用户线程与内核线程的1:1映射关系,意味着每个用户线程都有一个与之紧密耦合的内核线程。
内核通过维护内核线程来确保线程的调度、上下文切换、系统调用响应等功能。这样一来,当用户线程执行系统调用或发生阻塞时,内核能够透明地调度另一个线程继续执行,避免了用户级线程模型可能导致的整个进程被阻塞的问题。此外,由于内核直接参与调度,还能保证线程在多处理器环境下的公平性和高效性。
注意:在Linux环境下,为了统一和简化表述,现代Linux内核并不区分内核进程和用户进程,一般所说的进程均包含了内核层面的支持,并且Linux内核支持的线程模型多数情况下是指LWP,即每个用户级线程背后都有一个对应的内核线程作为支撑。而在Linux内核视角看,所有的执行实体都被视为进程(task),无论是否执行用户代码还是内核代码,这被称为"一切皆进程"的哲学。因此,所谓的“用户线程”在Linux中表现为具有独立调度实体的LWP。而线程组的概念更多出现在高级编程接口或者性能测试工具中,而不是内核核心概念。
2.进程查看命令
①、ps (Process Status): ps
命令是Linux及类Unix系统中最基础的进程查看工具之一,它提供了当前系统中进程状态的一次性快照视图。通过不同的选项,您可以获取到不同级别的进程信息。以下是一些常用选项及其作用:
-e
或--every
:显示系统中所有的进程。-f
或--full
:提供完整的格式输出,包括进程树状关系和环境变量等额外信息。-l
或--long
:长格式输出,包含更多详细信息,如F旗表示进程正在等待文件锁。-u
或--user
:按照用户来显示进程,并显示每个进程的CPU和内存使用情况。-aux
是一个常见的组合选项,用于显示系统中所有用户的全部进程,包括后台进程(不与终端关联的进程)。
例如,ps -ef
将显示出当前系统中所有进程的详细信息,包括PID(进程ID)、PPID(父进程ID)、TTY(终端类型)、CWD(当前工作目录)、CMD(启动命令)等字段。
②、top: 相比之下,top
命令则提供了一个动态实时的视图,它可以持续不断地刷新并显示当前系统中各进程的资源使用情况。启动top
命令后,您将看到一个全屏界面,其中包括:
- 进程列表:按照默认排序(通常是CPU使用率或优先级)列出正在运行的进程及其相关信息,如PID、USER(执行进程的用户)、PR(优先级)、NI(nice值,影响优先级)、VIRT(虚拟内存大小)、RES(常驻内存大小)、%CPU和%MEM(CPU和内存使用百分比)等。
- 系统总体状态:包括系统运行时间、登录用户数、系统负载、CPU和内存的整体使用状况等统计数据。
- 交互式操作:在
top
运行过程中,用户可以通过键盘输入相应的命令(如按P
键切换到按CPU使用率排序,按M
键切换到按内存使用率排序,或使用k
键杀死指定进程等)来进行进一步的进程管理和监控。
总结起来,ps
命令更适合一次性快速查看特定进程或系统某一时刻的进程状态,而top
命令则是实时监控和管理系统性能的理想工具,尤其是在需要跟踪和调整进程资源占用时更为实用。
3.总结
进程的几个要素:
- 有一段程序待其执行
- 有进程专用的系统堆栈空间
- 在内核有task_struct结构体
- 进程有独立的存储空间,拥有专用的用户空间
如果具备前面三条而缺少第4条就可以称为线程“”,如果完全没有用户空间,就称为“内核线程 ”,如果共享用户空间就称为“用户线程” 。