Linux内核设计——(一)进程管理

news2025/4/2 14:51:09

目录

一、进程及线程简介

二、进程描述符

2.1 进程描述符简介

2.2 分配进程描述符

2.3 进程标识值

2.4 进程状态

2.5 进程上下文

三、进程创建

3.1 写时拷贝

3.2 fork()和vfork()

四、线程

4.1 Linux线程实现

4.2 内核线程

五、进程终结

5.1 删除进程描述符

5.2 孤儿进程


一、进程及线程简介

进程,即处于执行期的程序,是正在执行的程序代码的实时结果。

此时,除了可执行程序代码(代码段,text section),通常还包含其他资源,如:打开的文件、挂起的信号和存放全局变量的数据段等。

线程,即在进程中活动的对象。

每个线程都有一个独立的程序计数器、进程栈和一组进程寄存器。内核调度的对象是线程而非进程。

Linux内核中,对线程的实现与进程并不特别区分,可以将线程理解为特殊的进程。


二、进程描述符

2.1 进程描述符简介

内核将存放进程的列表称——任务队列。 它是双向循环链表,链表的每项(进程)类型为tsak_struct,称——进程描述符,该数据结构定义在<linux/sched.h>,包含着一个进程的所有数据信息。

2.2 分配进程描述符

Linux通过slab分配器动态分配进程描述符结构,以达对象复用和缓存着色的目的。因此只需在进程内核栈底(于向下增长的栈而言)或栈顶(于向上增长的栈而言)创建一个新的结构struct thread_info,该结构定义在<asm/thread_info.h>。

2.3 进程标识值

内核通过唯一进程标识值(PID)以标识每个进程。

PID是一个数值,表示为pid_t隐含类型,实际即int类型。

PID的最大值默认设置为32768(short int最大值),内核把每个进程的PID放在它们各自的进程描述符中。该最大值表示着系统中允许同时存在的进程最大数目,该值越大就代表系统跑一圈越慢,但如果需要可以由系统管理员通过修改/proc/sys/kernel/pid_max以修改上限。

2.4 进程状态

进程描述符里的state域描述了进程的五种状态:

state描述
TASK_RUNNING(运行)进程正在执行,或者在运行队列中等待执行。
TASK_INTERRUPTIBLE(可中断)进程正在睡眠,或者阻塞以等待某些条件达成。若条件达成则切换为运行。
TASK_UNINTERRUPTIBLE(不可中断)睡眠,但对信号不做响应。
_TASK_TRACED(被其他进程跟踪的进程)如通过ptrace对调试程序进行跟踪。
_TASK_STOPPED(进程停止执行)如接收到SIGSTOP等信号,或者调试期间接收到任何信号,都会进入此状态。

若内核经常要调整某个进程的状态,最好使用函数:

set_task_state(task, state);
2.5 进程上下文

可执行程序代码执行时,从一个可执行文件载入到进程的地址空间执行,该地址空间一般为用户空间。当一个进程执行了系统调用或触发异常,则它陷入内核空间,此时,称内核处于进程上下文中,且current宏(指向当前进程,即指向引发对内核访问的进程)有效。

系统调用和异常处理程序是对内核明确定义的接口——对内核的所有访问都必须通过这些接口。

2.6 进程家族树

Linux中所有进程都是PID为1init进程后代。

内核于系统启动的最后阶段启动init进程。该进程读取系统的初始化脚本并执行其他相关程序,以完成系统启动的整个过程。

系统的每个进程必有一个父进程,相对应的每个进程也可以有零或多个子进程。拥有同一个父进程的所有进程互称为兄弟进程。进程的关系存放于进程描述符中,为指向tast_struct的parent指针和children的子进程链表。


三、进程创建

3.1 写时拷贝

Linux的fork()通过写时拷贝(copy_on_write)页实现。内核只为新生成的子进程创建虚拟空间结构,它们来复制于父进程的虚拟空间结构。但是系统并不为这些段分配物理内存,它们和父进程共享物理内存。即父子进程的虚拟地址空间是独立的,但是虚拟地址空间映射到同一片物理内存上当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间——资源的复制只有在需要写入时才进行,在此之前以只读方式共享。

3.2 fork()和vfork()

fork()和vfork()都由clone()系统调用实现。

描述\进程创建APIfork()vfork()
地址空间子拷贝父子与父共享
运行顺序不确定保证子先

vfork()保证子进程先执行,因此在它调用 exec()(进程替换) 或 exit()(退出进程)之后父进程才可能被调度运行,如果子进程没有调用 exec()或exit(),程序则会导致死锁。

理想情况下系统最好不调用vfork(),内核可以不实现它。


四、线程

4.1 Linux线程实现

Linux内核中,线程并没有被准备特别的调度算法或是定义特别的数据结构以表征,仅被内核视为一个与其他进程共享某些资源的进程。

每个线程都有自己的task_struct(上文称进程描述符),所以于内核而言,它像是个进程。

线程的创建和普通进程的创建类似,仅在调用clone()时需要传递一些参数标志来指明需要共享的资源(共享地址空间、文件系统资源、文件描述符和信号处理程序):

clone(CLONE VM | CLONE FS | CLONE FILES | CLONE SIGHAND,0);

对比fork()和vfork()的实现:

clone(SIGCHLD,0);    //fork()
clone(CLONE | FORKCLONE | VMSIGCHLD,0)    //vfork()

clone()的参数标志定义在<linux/sched.h>

4.2 内核线程

独立运行在内核的标准进程——内核线程,与普通进程区别于它们没有独立的地址空间,即它们指向地址空间的mm指针被设置NULL。

没有用户虚拟地址空间的进程称为内核线程共享用户虚拟地址空间的进程称为用户线程

内核线程从不切换到用户空间,其他与普通进程无二,可以被调度和抢占。

在Linux终端运行:

ps -ef

可以看到很多内核线程(带[...]即是),如flush和ksofirqd任务:


五、进程终结

5.1 删除进程描述符

当一个进程终结时,内核必须释放其所占用的资源并告知父进程。一般来说,进程的析构是由其自身调用exit()系统调用引起的。

而在exit()后,尽管进程僵死,但系统任保留其进程描述符。然后父进程获得已终结的子进程信息后,或是通知内核它并不关注子进程信息后,子进程的进程描述符才被释放。

wait()由系统调用wait4()实现,其作用为挂起调用该函数的进程,直到其中一个子进程退出,此时函数返回该子进程PID。

5.2 孤儿进程

若父进程于子进程先退出,则此时子进程称为僵尸进程,须为子进程寻找新的父进程,否则子进程在退出时永远僵死浪费内存,即孤儿进程。可以为子进程在当前线程组(共享同一个用户虚拟地址空间的所有用户线程组成一个线程组)内寻找新的父进程,若不行则让init进程作为新的父进程。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2325841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

22 安装第三方包

一、什么是第三方包 在 Python 的世界里&#xff0c;包就像是一个个功能强大的工具箱&#xff0c;它将多个 Python 模块收纳其中&#xff0c;而每个模块又蕴含着丰富多样的具体功能。可以说&#xff0c;一个包就是一系列同类功能的集合体&#xff0c;它们就像紧密协作的团队&a…

oracle 常用函数的应用

在使用开发中会经常遇到数据类型转换、显示系统时间等情况&#xff0c;需要使用函数来实现。通过函数来实现业务需求会非常的省事便捷&#xff0c;函数可以用在适当的dml语句和查询语句中。 Oracle 数据库中主要使用两种类型的函数&#xff1a; (1)单行函数&#xff1a;对每一个…

“上云入端” 浪潮云剑指组织智能化落地“最后一公里”

进入2025年&#xff0c;行业智能体正在成为数实融合的核心路径。2025年初DeepSeek开源大模型的横空出世&#xff0c;通过算法优化与架构创新&#xff0c;显著降低算力需求与部署成本&#xff0c;推动大模型向端侧和边缘侧延伸。其开源策略打破技术垄断&#xff0c;结合边缘计算…

CentOS 7 如何挂载ntfs的移动硬盘

CentOS 7 如何挂载ntfs的移动硬盘 前言一、查看硬盘并尝试挂载(提示无法挂载)二、yum安装epel-release提示yum被锁定三、强行终止yum的进程四、yum安装epel-release完成五、yum安装ntfs-3g六、此时可正常挂载NTFS硬盘 前言 CentOS 7默认情况下是不支持NTFS的文件系统&#xff…

pytorch+maskRcnn框架训练自己的模型以及模型导出ONXX格式供C++部署推理

背景 maskrcnn用作实例分割时&#xff0c;可以较为精准的定位目标物体&#xff0c;相较于yolo只能定位物体的矩形框而言&#xff0c;优势更大。虽然yolo的计算速度更快。 直接开始从0到1使用maskrCNN训练自己的模型并并导出给C部署&#xff08;亲测可用&#xff09; 数据标注…

①EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

型号 协议转换通信网关 EtherCAT 转 Modbus TCP MS-GW15 概述 MS-GW15 是 EtherCAT 和 Modbus TCP 协议转换网关&#xff0c;为用户提供一种 PLC 扩展的集成解决方案&#xff0c;可以轻松容易将 Modbus TCP 网络接入 EtherCAT 网络 中&#xff0c;方便扩展&#xff0c;不受限…

《Oracle服务进程精准管控指南:23c/11g双版本内存优化实战》 ——附自动化脚本开发全攻略

正在学习或者是使用 Oracle 数据库的小伙伴&#xff0c;是不是对于那个一直启动且及其占用内存的后台进程感到烦躁呢&#xff1f;而且即使是手动去开关也显得即为麻烦&#xff0c;所以基于我之前所学习到的方法&#xff0c;我在此重新整理&#xff0c;让大家动动手指就能完成开…

Java单列集合[Collection]

目录 1.Collection单列集合 1.1单列集合各集合特点 1.2、Collection集合 1.2.1、Collection方法 1.2.2、Collection遍历方式 1.2.2.1、迭代器遍历集合 1.2.2.2、增强for遍历集合 1.2.2.3、forEach遍历集合&#xff08;JDK8之后&#xff09; 1.2.2.4、遍历案例 1.3、Li…

如何在ONLYOFFICE插件中添加自定义AI提供商:以通义千问和Kimi为例

随着 ONLYOFFICE AI 插件的发布&#xff0c;我们极大地提升了编辑器的默认功能。在ONLYOFFICE&#xff0c;我们致力于提供强大且灵活的解决方案&#xff0c;以满足您的特定需求。其中一项便是能够在 AI 插件中添加自定义提供商。在这篇文章中&#xff0c;我们将展示如何将通义千…

Spark,配置hadoop集群1

配置运行任务的历史服务器 1.配置mapred-site.xml 在hadoop的安装目录下&#xff0c;打开mapred-site.xml&#xff0c;并在该文件里面增加如下两条配置。 eg我的是在hadoop199上 <!-- 历史服务器端地址 --> <property><name>mapreduce.jobhistory.address…

FPGA实现4K MIPI视频解码H265压缩网络推流输出,基于IMX317+VCU架构,支持4K60帧,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 MIPI 编解码方案我这里已有的视频图像编解码方案 3、详细设计方案设计框图FPGA开发板IMX317摄像头MIPI D-PHYMIPI CSI-2 RX Subsystem图像预处理Sensor …

【Linux】网络概念

目录 网络模型 OSI七层模型 TCP/IP五层(或四层)模型 网络传输 网络传输基本流程 封装与分用 以太网通信&#xff08;局域网传输&#xff09; 跨网络传输 网络模型 OSI七层模型 TCP/IP五层(或四层)模型 网络层和传输层就是操作系统的一部分 网络传输 网络传输基本流程…

【模拟CMOS集成电路设计】电荷泵(Charge bump)设计与仿真(示例:栅极开关CP+轨到轨输入运放+基于运放CP)

【模拟CMOS集成电路设计】电荷泵&#xff08;Charge bump&#xff09;设计与仿真 0前言1电荷泵1.1 PFD/CP/电容器级联1.2 PFD/CP/电容传递函数 2基本电荷泵(CP)结构2.1“漏极开关”结构2.2“源极开关”结构2.3“栅极开关”结构 3 CP的设计与仿真13.1 P/N电流源失配仿真3.2 电荷…

Kafka消息丢失全解析!原因、预防与解决方案

作为一名高并发系统开发工程师&#xff0c;在使用消息中间件的过程中&#xff0c;无法避免遇到系统中消息丢失的问题&#xff0c;而Kafka作为主流的消息队列系统&#xff0c;消息丢失问题尤为常见。 在这篇文章中&#xff0c;将深入浅出地分析Kafka消息丢失的各种情况&#xf…

VS Code 云服务器远程开发完整指南

VS Code Ubuntu 云服务器远程开发完整指南 远程开发是现代开发者的标配之一&#xff0c;特别是在使用云服务器&#xff08;如 Ubuntu&#xff09;进行部署、测试或大项目开发时&#xff0c;利用 VS Code 的 Remote-SSH 插件&#xff0c;可以像本地一样顺滑操作远程服务器。本…

【Rtklib入门指南】4. 使用RTKLIB进行载波相位差分定位(RTK)

RTK RTK&#xff08;Real-Time Kinematic&#xff0c;实时动态&#xff09;定位技术是一种高精度的卫星导航技术。相比传统的GPS定位技术&#xff0c;RTK能够在厘米级别的精度范围内提供定位结果。这使得RTK技术在无人机、自动驾驶、工程测绘、农业机械自动化等领域具有广泛应用…

【SECS】初识SECS协议

【SECS】初识SECS协议 基本知识流和功能函数数量官方文件中缩写标注正常是不是都是主机向设备端?对数据信息中第1字节第1-2位官网介绍 S1F1双向指令说明测试H发起端E发起端 参考资料 基本知识 SECS&#xff08;SEMI Equipment Communications Standard&#xff09;即半导体设…

【C++项目】从零实现RPC框架「三」:项⽬抽象层实现

🌈 个人主页:Zfox_ 🔥 系列专栏:C++从入门到精通 目录 一:🔥 常⽤的零碎功能接⼝类实现🦋 简单⽇志宏实现🦋 Json 序列化/反序列化🦋 UUID ⽣成二:🔥 项⽬消息类型字段信息定义 🦋 请求字段宏定义🦋 消息类型定义🦋 响应码类型定义🦋 RPC 请求类型定…

相机镜头景深

文章目录 定义影响因素实际应用特殊情况 参考&#xff1a;B站优致谱视觉 定义 景深是指在摄影机镜头或其他成像器前沿着能够取得清晰图像的成像器轴线所测定的物体距离范围。简单来说&#xff0c;就是在一张照片中&#xff0c;从前景到背景&#xff0c;能够保持清晰锐利的区域…

Linux基础入门:从零开始掌握Linux命令行操作

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f388;有没有觉得电影里的黑客&#x1f412;酷毙了&#xff1f;他们只用键盘⌨就能搞定一切。今天&#xff0c;毛毛张要带你们体验这种快感&#x1f600;&…