当前位置: 首页 > article >正文

linux-进程管理-进程状态

Linux 进程管理及进程状态

在 Linux 操作系统中,进程管理是非常重要的部分。操作系统通过进程管理控制进程的生命周期、资源的分配以及调度等操作。了解 Linux 进程管理和进程状态不仅对于系统管理员来说是至关重要的,对开发者和高级用户同样具有重要意义。

一、Linux 中的进程

进程(Process)是操作系统中正在执行的一个程序实例,它包含了程序的代码、数据、堆栈以及内核分配给它的资源,如文件描述符、内存空间等。在 Linux 中,每个进程都有一个唯一的进程 ID(PID)。Linux 操作系统通过进程管理来分配 CPU、内存等资源,并确保不同进程之间的有序调度。

1.1 进程的创建

Linux 中创建进程主要通过两种系统调用实现:

  • fork():复制当前进程,创建一个新进程,新进程称为子进程,子进程几乎完全复制父进程的内存空间。子进程和父进程除了 PID 不同,其他部分基本一致。
  • exec():在当前进程的上下文中加载并执行一个新的程序代码,通常与 fork() 结合使用,父进程通过 fork() 创建子进程后,子进程调用 exec() 来执行新的程序。
1.2 进程标识符
  • PID(Process ID):每个进程都有唯一的进程标识符(PID),由系统分配。
  • PPID(Parent Process ID):每个进程都有父进程,PPID 指的是其父进程的 PID。
  • UID(User ID):进程的用户标识符,表示进程由哪个用户启动。
二、进程的状态

Linux 进程在其生命周期中会经历多种状态,每种状态表示进程当前的运行情况。这些状态反映了进程是处于运行、等待还是终止等状态。常见的进程状态包括:

2.1 进程状态分类

Linux 中进程的状态可以用下列几个字母表示:

  • R (Running):运行状态,进程正在执行或准备执行。处于此状态的进程在就绪队列中等待 CPU 调度。
  • S (Sleeping):睡眠状态,进程正在等待某个事件(如 I/O 操作的完成)。这种状态下进程会停止执行,直到等待的事件发生。睡眠状态可以进一步分为:
    • 可中断睡眠(Interruptible Sleeping, S):进程可以被信号中断。
    • 不可中断睡眠(Uninterruptible Sleeping, D):进程不能被中断,通常是等待硬件设备响应等情况。
  • Z (Zombie):僵尸状态,进程已经终止,但其父进程尚未调用 wait() 系统调用回收其资源。僵尸进程虽然已经结束,但还保留在进程表中。
  • T (Stopped):停止状态,进程因为某种原因(如接收到 SIGSTOP 信号)被暂停执行,直到接收到继续执行的信号(如 SIGCONT)后才会恢复执行。
  • X (Dead):进程已经终止,且其所有资源都已经释放。
2.2 进程状态的转换

进程在其生命周期内会经历不同的状态,状态的转换通常由系统事件(如 I/O 完成、信号发送)触发。以下是常见的状态转换:

  • 创建 -> 运行:当一个进程被创建时,它会进入就绪队列,等待 CPU 调度来执行。
  • 运行 -> 睡眠:如果进程在执行过程中需要等待某些事件(如等待 I/O),它将进入睡眠状态。
  • 睡眠 -> 运行:一旦等待的事件发生,进程会从睡眠状态恢复到运行状态,继续执行。
  • 运行 -> 僵尸:当一个进程执行完毕并终止时,它进入僵尸状态,等待父进程收集其终止信息。
  • 僵尸 -> 终止:父进程调用 wait() 回收子进程资源后,僵尸进程被彻底清除。
三、进程调度

Linux 使用进程调度来决定哪个进程在何时运行。调度程序的主要任务是确保所有进程都能有效使用 CPU 资源。Linux 提供了多种调度算法,以满足不同类型的进程需求。

3.1 调度类别
  • 实时调度(Real-time Scheduling):实时进程具有较高的优先级,通常应用在需要高精度和低延迟的系统中。Linux 中的实时调度采用了 FIFO(先入先出)和 RR(轮转调度)两种策略。
  • 非实时调度(Non-real-time Scheduling):普通进程的调度策略,主要采用 CFS(完全公平调度器)。CFS 根据每个进程的优先级和虚拟运行时间决定调度顺序。
3.2 调度优先级

每个进程都有一个优先级,调度程序依据优先级来分配 CPU 时间。Linux 使用 nice 值来设置普通进程的优先级,nice 值范围从 -20 到 19,值越低表示优先级越高。实时进程的优先级范围通常是从 1 到 99,且不能被普通进程抢占。

四、查看和管理进程

在 Linux 中,用户可以通过多个工具和命令来查看和管理进程。

4.1 查看进程的命令
  • ps:显示系统中当前运行的进程,最常用的参数是 ps aux,它可以显示所有进程的详细信息,如 PID、状态、内存使用情况等。
  • top:动态显示系统中的进程和资源使用情况。它可以实时更新,显示进程的 CPU 使用率、内存使用率、状态等。
  • htoptop 命令的增强版,提供更友好的界面,支持鼠标操作和进程树展示。
  • pidstat:用于统计进程的 CPU、内存、I/O 使用情况,非常适合监控特定进程的资源消耗。
  • pgrep:根据进程名称查找进程的 PID,非常便捷。
4.2 管理进程的命令
  • kill:用于向进程发送信号,最常用的是 kill -9 PID,用于强制终止进程。
  • killall:根据进程名杀死所有同名进程。
  • nicerenicenice 用于设置进程的初始优先级,renice 用于调整已运行进程的优先级。
  • bgfg:将进程在后台或前台运行。可以使用 & 将进程放入后台,如 command &
五、进程间通信

在多任务操作系统中,进程之间需要通过某种机制进行数据的交换和同步。常见的进程间通信(IPC)方式包括:

  • 信号:一种用于通知进程异步事件发生的机制,信号可以强制中断进程执行、终止进程或让进程暂停。
  • 管道(Pipe):提供单向的数据传输通道,允许进程通过管道传输数据。
  • 共享内存:多个进程可以通过共享一块内存区域来通信,数据在内存中交换速度很快。
  • 消息队列:进程可以通过消息队列以队列的方式传输数据,提供了更复杂的通信方式。
  • 套接字(Socket):常用于网络通信,允许不同主机上的进程进行数据传输。
六、总结

Linux 系统中的进程管理是操作系统最核心的功能之一。通过了解进程的创建、状态以及进程调度机制,可以更好地理解系统资源的管理和分配。利用 Linux 提供的强大工具,用户可以有效地监控、管理进程,并优化系统性能。掌握进程间通信方法也为多进程应用程序的开发提供了基础。


http://www.kler.cn/a/314079.html

相关文章:

  • vue2.x elementui 固定顶部、左侧菜单与面包屑,自适应 iframe 页面布局
  • 搭建监控系统Prometheus + Grafana
  • Apache ECharts
  • 深度学习服务器租赁AutoDL
  • 力扣 LeetCode 27. 移除元素(Day1:数组)
  • UI资源分包 -- 基于Xasset框架代码实例
  • 怎么给视频加字幕?6种给视频加字幕最简单的方法,不怕你学不会!
  • 基于SpringBoot的在线教育平台的设计与实现
  • 【图虫创意-注册安全分析报告-无验证方式导致安全隐患】
  • Android状态栏StatusBar颜色修改
  • 基于云计算和大数据技术的传感器数据存储与分析系统
  • 01-Mac OS系统如何下载安装Python解释器
  • 天源迪科java实习生面经
  • 【CSS Tricks】如何做一个粒子效果的logo
  • Docker 消息队列RabbitMQ 安装延迟消息插件
  • 1. ZYNQ 2. MPSOC 3. FPGA 4. IO分配 5. 硬件设计
  • 【运维项目经历|044】云迁移与CI/CD管道优化项目
  • AUTOSAR_EXP_ARAComAPI的5章笔记(9)
  • 面试爱考 | 设计模式
  • 线程(三) 线程的互斥
  • 一些常用的 Docker 命令
  • Android外接USB扫码枪
  • android google play应用发布上架流程PDF下载
  • Spring Boot和AOP将API输入输出数据存入数据库
  • 测试工具笔记
  • MATLAB窗口操作常用命令