Linux系统编程之进程基础知识
ahcoder 2025-05-28 14:39 5 浏览
概述
在Linux系统中,进程是指一个正在运行的程序实例。每个进程都有一个唯一的进程标识符,即PID,操作系统通过这个PID来唯一识别和管理各个进程。进程不仅仅是程序代码的运行实例,它还包含了程序运行时所需的各种资源,包括:内存空间、文件描述符、输入输出设备等。
进程的组成
一个Linux进程主要由以下几个部分组成。
程序段:进程执行的机器指令,通常是从磁盘或Flash上的可执行文件加载到内存中的。
数据段:包含全局变量和静态变量,通常也被加载到内存中。
堆:动态分配的内存区域,用于存储动态分配的数据结构,比如:通过malloc或new分配的内存。
栈:用于存储函数调用时的局部变量和函数参数,每次函数调用都会在栈上分配一个新的栈帧。
文件描述符表:用于记录进程打开的文件和网络连接等,每个进程都有一个文件描述符表。
进程控制块:英文全称为Process Control Block,通常简写为PCB。操作系统为每个进程维护的一个数据结构,记录了进程的所有相关信息,包括PID、状态、内存分配情况等。
进程的状态
Linux进程的生命周期是指从进程被创建开始,到进程终止并释放所有资源为止的整个过程。在这个过程中,进程会经历不同的状态,并随着系统环境和任务需求的变化而在这些状态之间转换。
一个典型的Linux进程,其生命周期通常包括以下几个阶段。
创建:通过fork系统调用,创建一个新的进程。
执行:进程在CPU上执行,可能经历多次状态转换。
阻塞:进程因等待I/O操作或其他事件,暂停执行。
终止:进程正常结束,或因错误而终止。
回收:父进程通过wait或waitpid系统调用,回收子进程的资源。
在Linux系统中,进程可以处于以下几种状态之一。
就绪状态:进程已经准备好运行,等待CPU时间片。
运行状态:进程正在CPU上执行。
阻塞状态:进程因为等待某些事件的发生而暂停运行,如等待I/O操作完成。
终止状态:进程已经完成或者因错误而终止。
僵尸状态:进程已经结束,但其父进程尚未调用 wait 或 waitpid 函数回收其资源。
停止状态:进程被暂停执行,通常是因为接收到 SIGSTOP 或 SIGTSTP 信号。
进程的上述状态之间可以互相转换,常见的状态转换如下。
就绪 -> 运行:当进程被调度程序选中,并分配到CPU上执行时,从就绪状态转换为运行状态。
运行 -> 就绪:当进程的时间片用尽,或被更高优先级的进程抢占时,从运行状态转换为就绪状态。
运行 -> 阻塞:当进程等待I/O操作完成,或其他事件发生时,从运行状态转换为阻塞状态。
阻塞 -> 就绪:当进程等待的事件发生后,从阻塞状态转换为就绪状态。
运行 -> 终止:当进程正常结束,或因错误终止时,从运行状态转换为终止状态。
终止 -> 僵尸:当进程结束,但父进程尚未回收其资源时,从终止状态转换为僵尸状态。
运行 -> 停止:当进程接收到SIGSTOP或SIGTSTP信号时,从运行状态转换为停止状态。
停止 -> 运行:当进程接收到SIGCONT信号时,从停止状态转换为运行状态。
为了更清晰地查看进程状态之间的转换过程,可参考下面的状态转换图。
如果想查看进程的当前状态,可以使用ps、top等命令。比如:使用ps aux命令可以查看系统中所有进程的详细信息,包括:状态、PID、CPU使用率、内存使用率等。
进程控制块
进程控制块,即PCB,是操作系统为每个进程维护的一个数据结构,记录了进程的所有相关信息。PCB是系统感知进程存在的唯一标志,系统通过PCB来管理和控制进程。PCB可以被操作系统中的多个模块读取或修改,比如:调度程序、资源分配程序、中断处理程序等。这些模块通过访问或修改PCB,来管理和控制进程的执行状态和资源分配情况。
PCB中包含的主要信息如下。
进程标识符:即PID,唯一标识进程的整数。PID在任何时刻都是唯一的,但可以重用。当进程终止并被系统回收后,其PID可以被其他新创建的进程使用。
进程状态:记录进程当前所处的状态。
程序计数器:指向进程下一条要执行的指令。
寄存器状态:保存进程的寄存器值,用于进程切换时恢复现场。
内存管理信息:包括进程的虚拟地址空间、页表等。
文件描述符表:记录进程打开的文件和网络连接等。
优先级:用于调度程序确定进程的优先级。
父进程ID:记录创建该进程的父进程的PID。
子进程列表:记录该进程创建的所有子进程的PID。
资源限制:包括进程可以使用的最大内存、文件描述符数量等。
// 进程控制块PCB
struct task_struct
{
pid_t pid; // 进程ID
char comm[16]; // 进程名
mm_struct *mm; // 内存描述符
files_struct *files; // 文件描述符表
fs_struct *fs; // 文件系统信息
signal_struct *signal; // 信号处理信息
thread_info *thread_info; // 线程信息
struct list_head tasks; // 进程链表节点
struct task_struct *parent; // 父进程指针
struct task_struct *children; // 子进程链表头
struct task_struct *sibling; // 兄弟进程链表
unsigned long state; // 进程状态
int priority; // 进程优先级
int nice; // 进程的nice值
int static_prio; // 静态优先级
int policy; // 调度策略
struct sched_param sched_param; // 调度参数
unsigned long flags; // 进程标志
unsigned long timeout; // 超时时间
unsigned long rt_priority; // 实时优先级
unsigned long deadline; // 截止时间
unsigned long runtime; // 运行时间
unsigned long vruntime; // 虚拟运行时间
unsigned long utime; // 用户模式下的运行时间
unsigned long stime; // 内核模式下的运行时间
unsigned long nvcsw; // 自愿上下文切换次数
unsigned long nivcsw; // 非自愿上下文切换次数
unsigned long start_time; // 进程启动时间
unsigned long exit_time; // 进程退出时间
// ...
};
进程调度
Linux系统中的所有进程形成一个树状结构,称为进程树。进程树的根节点是进程ID为1的init进程,它是系统启动后的第一个进程,负责启动其他系统进程和服务。每个进程都可以创建子进程,子进程又可以创建自己的子进程,从而形成一个多级的进程树。
Linux内核负责决定哪个进程何时获得CPU时间,调度算法决定了进程的优先级和执行顺序,常见的调度策略如下。
先来先服务:英文全称为“First-Come, First-Served”,缩写为FCFS。FCFS是一种简单的调度算法,按照进程到达的顺序进行调度。第一个到达的进程最先执行,然后是第二个到达的进程,依此类推。FCFS算法逻辑简单,容易理解和实现。但不够公平,缺乏优先级。比如:如果一个长作业首先到达,它会占用CPU较长时间,导致后续到达的短作业等待时间过长。
短作业优先:英文全称为“Shortest Job First”,缩写为SJF。SJF是一种基于进程预计执行时间的调度算法,优先调度执行时间较短的进程。SJF可以减少平均等待时间,提高系统的整体吞吐量。但必须预先知道或估计每个进程的执行时间,这在实际应用中可能难以实现。
时间片轮转:英文全称为“Round Robin”,缩写为RR。RR是一种基于时间片的调度算法,每个进程轮流分配固定的时间片,时间片用尽后切换到下一个进程。这样,每个进程都能获得平等的CPU时间,避免了某些进程长时间占用CPU。RR适用于交互式系统,可以快速响应用户的输入,但频繁的上下文切换可能会增加系统开销。
优先级调度:英文全称为“Priority Scheduling”,缩写为PS。PS根据进程的优先级进行调度,高优先级的进程优先获得CPU时间。它的特点是比较灵活,可以根据进程的重要性和紧急程度动态调整优先级。缺点是低优先级的进程可能会因为高优先级进程的存在,而长期得不到CPU时间。
完全公平调度:英文全称为“Completely Fair Scheduler”,缩写为CFS。CFS是Linux内核从版本2.6.23开始采用的默认调度算法,其设计目标是:在所有可运行的任务之间公平地分配CPU时间,确保没有任务长期得不到处理。CFS的主要特点有以下几点。
(1)公平性。CFS使用一个称为虚拟运行时间的概念来衡量任务的执行时间,虚拟运行时间反映了任务相对于其他任务的执行情况。另外,CFS使用红黑树来维护等待执行的任务列表。任务根据其虚拟运行时间进行排序,确保运行时间最少的任务优先得到CPU时间。
(2)可预测性。CFS提供了确定性的响应时间,实时任务优先于普通任务执行,这对于需要及时响应的应用程序非常重要。
(3)适应性。CFS能够动态调整其行为,以适应不同的工作负载,包括:交互式应用和批处理任务。在多核系统中,CFS尝试将任务分配到不同的核心上,以减少CPU的空闲时间。
(4)调度延迟。CFS会设定一个目标调度周期(通常为100毫秒),并试图让所有任务在这个周期内至少执行一次。CFS还会动态调整每个任务的时间片,确保运行时间较少的任务获得更多的机会。
(5)优先级支持。CFS根据nice值调整任务的权重,从而影响其虚拟运行时间。
相关推荐
- Linux抓包工具tcpdump安装和使用,监视网络接口小工具大用途
-
Tcpdump工具是一个抓包工具也是一个协议分析软件。强大的功能和灵活的截取策略,使它成为Linux统下网络分析和问题排查的首选工具。tcpdump可以将网络中传送的数据包的头截获下来做分析。它支持...
- linux安装lnmp一键安装包
-
一般企业正式服环境用的lnmp.org一键安装包,下面做下简单介绍:官网:https://lnmp.org1.安装(官网上有详细的安装步骤)screen-Slnmp是为了在安装的过程中,断线的后台...
- Linux 安装Oracle11.2.0.4 (静默安装法)
-
一、环境准备1下载安装包已上传至对象存储,一共两个包#oracle11.2.0.4_1of7.zipwgethttps://oss-cn-north-1.unicloudsrv.com/sc-...
- Ubuntu入门使用之 24.04 如何安装命令工具(或软件包)
-
如果你是初学者,在Ubuntu24.04上运行命令时遇到错误,这意味着运行该特定命令所需的软件包在你的系统中不可用。无论你是刚开始探索Linux世界,还是从旧版本升级而来,你可能会想知道如何...
- Linux 安装代理 实现Windows Proxifier 功能
-
场景:linux上的应用---------->代理服务器(socket5)--------------------目标服务实现方案通过ProxyChains+Socat这2个工具来实现,具体...
- Python保姆级安装教程(CPU+GPU)
-
以下是为您整理的2024年Python保姆级安装教程(CPU+GPU详细版),涵盖Windows、macOS和Linux系统,并详细说明GPU环境的配置(如CUDA、cuDNN等...
- linux安装oracle
-
需要安装oracledataguard,所以先要安装单台oracle11g,下面是单台oracle11g的详细安装过程。1,安装环境硬件环境:2台linux虚拟机,Centos6.4,4G,4核...
- Linux安装Nginx详细教程
-
Nginx是一款高性能的开源Web服务器软件,它被广泛应用于构建高性能的网站和应用程序。本文将向您介绍如何在Linux操作系统上安装和配置Nginx服务器。一、下载nginx1.1、手动下载进入ngi...
- 选择LINUX安装平台
-
您已经选择了Linux发行版,并准备开始安装过程,但您需要确定您的硬件选项。以下是从哪里开始。译自Linux:ChooseanInstallationPlatform,作者Damon...
- 用Linux“还原”Win11,AnduinOS创始人公布1.4/1.5版本更新计划
-
IT之家5月24日消息,据外媒Neowin今日报道,AnduinOS的唯一开发者AnduinXue近日公布了“类Windows风格”Linux系统未来的版本规划。他表示,A...
- Linux lsof命令使用小结
-
推荐理由lsof(listopenfiles)是一个列出当前系统打开文件的工具。在Linux环境下,任何事物都是以文件的形式存在,通过文件不仅可以访问常规数据,还可以访问网络连接和硬件。所以,如传...
- Linux进程管理—信号、定时器使用详解
-
信号:1.信号的作用:背景:进程之间通信比较麻烦。但进程之间又必须通信,比如父子进程之间。作用:通知其他进程响应。进程之间的一种通信机制。信号:接受信号的进程马上停止,调用信号处理函数...
- Nexus 3 本地搭建与使用实战指南(适用于 Linux 与 Win11)
-
一、背景与介绍在DevOps流程中,本地镜像仓库能显著提升镜像下载速度、增强安全性并保障离线可用性。本文将手把手教你在Linux和Win11上分别部署并使用Nexus3搭建Dock...
- 字节跳动介绍使用AI优化Linux内核成果,可减少30%内存用量
-
IT之家11月23日消息,据外媒zdnet报道,字节跳动日前在LinuxPlumbersConference上介绍了通过使用AI优化Linux内核的成果,号称可以取得“显著...
- 一文带你了解 Linux 文件权限,从基础到高级
-
在Linux中,每个文件和目录都关联了一组权限,定义了不同用户对其的访问能力。权限分为三类:读取(read,r)、写入(write,w)和执行(execute,x),分别用字母r、w、x...
- 一周热门
- 最近发表
- 标签列表
-
- linux 远程 (37)
- u盘 linux (32)
- linux 登录 (34)
- linux 路径 (33)
- linux 文件命令 (35)
- linux 是什么 (35)
- linux 界面 (34)
- 查看文件 linux (35)
- linux 语言 (33)
- linux代码 (32)
- linux 查看命令 (33)
- 关闭linux (34)
- root linux (33)
- 删除文件 linux (35)
- linux 主机 (34)
- linux与 (33)
- linux 函数 (35)
- linux .ssh (35)
- cpu linux (35)
- 查看linux 系统 (32)
- linux 防火墙 (33)
- linux 手机 (32)
- linux 镜像 (34)
- linux ip地址 (34)
- linux 用户查看 (33)