linux内核原理--进程,线程

1.进程与线程
linux中调度与执行代码流的基础单位是线程.
我们通过父进程产生新的子进程,其实是产生一个新的线程.不过这个线程属于一个新的线程组,且是线程组的组长.
我们通过兄弟线程p产生新的线程q.也是获得新线程的方法.不过这个新线程q和兄弟线程p在同一个线程组.

每个线程拥有一个task_struct对象实例来记录信息和管理自身.每个线程拥有一个独立的线程id
每个线程必然属于一个线程组,每个线程组拥有一个组长.

2.线程的状态
(1). TASK_RUNNING
要么线程正在cpu中执行,要么线程位于cpu运行队列,可供调度执行.
(2). TASK_INTERRUPTIBLE
线程由于需要阻塞等待某些条件的满足而位于相应的等待队列,无法被调度执行.但若系统或其他线程给线程发了信号,且希望线程立即处理信号时,线程可被唤醒以便执行信号处理.唤醒并执行信号处理后,线程会从阻塞处继续运行,应用代码应负责进一步判断是否应该继续.
(3). TASK_UNINTERRUPTIBLE
线程由于需要阻塞等待某些条件的满足而位于相应的等待队列,无法被调度执行.系统或其他线程给线程发了信号时,线程也无法被唤醒.
(4). TASK_TRACE
调试追踪用途.
(5). TASK_STOPPED
调试追踪用途.
(6). EXIT_ZOMBIE
一般表示线程已经退出,但其task_struct依然未被回收的阶段.

3.线程id
每个线程拥有独立的id,称为线程id
通过父进程产生子进程时,linux内核实际产生一个新线程,但这个新线程属于一个新的线程组,且自己是线程组的组长.其线程id就是这个线程组组长的id

linux内核采用哈希表方式来通过id快速定位到task_struct结构.
为了实现通过线程id,快速定位到线程的task_struct结构,linux内核准备了一个全局哈希表p1.每个线程需将其<id,task_struct对象指针>注册到此哈希表.
为了实现通过线程组组长id,快速定位到线程组组长的task_struct结构,linux内核准备了一个全局哈希表p2.每个线程组组长需将其<id,task_struct对象指针>注册到此哈希表.

为了快速获得一个线程组下的所有成员,p2哈希表的链式结构的节点额外包含一个链表结构.通过此链表结构可以将此节点代表的线程组的每个成员链接起来.

当基于父进程产生子进程时,产生的新线程.除了形成一个新的线程组外.还将隶属于父进程所在的进程组,隶属于父进程所在的会话,隶属于父进程所在的终端对象.这部分主要服务于信号处理,不太常用,不做深入分析.

4.线程关系
(1). 父子关系
基于父进程创建子进程时,产生的新线程的task_struct结构中real_parent指向执行fork调用的task_struct实例(父进程).
基于兄弟线程创建新线程时,产生的线程的task_struct结构中real_parent和执行fork调用的task_structreal_parent一致(和兄弟的父相同).
新线程产生时,其task_structreal_parentparent是一致的.

(2). 兄弟关系
基于兄弟线程创建新线程时,新线程和创建其的线程是兄弟关系.

对代表某个线程的task_struct而言,其children字段指向一个双向链表,链表中包含线程的所有孩子线程.
对代表某个线程的task_struct而言,其sibling字段是一个双向链表的节点,该双向链表中的所有其他成员均是线程的兄弟线程.

5.基于兄弟线程产生新线程
新线程共享兄弟线程的信号处理,用户态虚拟内存空间,打开文件结构.共享的意思是共享的资源仅需递增引用数即可.

6.基于父进程产生子进程
父子进程的用户态虚拟地址空间是独立的,独立的意思是父子进程拥有各自独立的页表结构,拥有各自独立的用户态线性区管理结构.新进程页表的内容设置参考父进程的页表来.
但针对父进程页表中属于私有映射的页表项,在处理时,会分别取消父子进程中对应页表项的可写权限下.这样,后续父子进程需对相应线性地址执行写访问时,将在缺页异常处理中通过写时拷贝来解决异常.

7.线程退出
线程退出时,会重新为其孩子线程选择父亲.
在线程所在线程组尚有存活的线程时,选择其中一个作为其孩子线程的父亲.
在线程所在线程组无存活的线程时,选择init全局线程作为其孩子线程的父亲,init会对已经释放的线程执行回收调用,来释放其task_struct实例.

一般而言linux中非detach线程退出时,其task_struct结构依然存在,直到执行回收调用时,才释放.
detach线程,一般退出时,直接释放其task_struct,无需执行回收调用.

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

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

相关文章

SpringBoot总结-配置管理和日志管理

原创作者&#xff1a;田超凡&#xff08;程序员田宝宝&#xff09; 版权所有&#xff0c;引用请注明原作者&#xff0c;严禁复制转载 整合配置文件 1.在springboot整合配置文件&#xff0c;分成两大类&#xff1a; application.properties application.yml 或者是 Boots…

模板模式-C#实现

在模板模式&#xff08;Template Pattern&#xff09;中&#xff0c;一个抽象类公开定义了执行它的方法的方式/模板。 意图&#xff1a;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。 主要解决&#xff1a;一些方法通用&#xff0c;却在每一个子类都重新…

javaEE13(网站第8章两个课后题)

1、对“jspservletjavabean实现分页查询”功能做如下补充&#xff1a; &#xff08;1&#xff09;记录批量删除&#xff1a;每个记录前添加复选框&#xff0c;点击批量删除&#xff0c;删除选中记录。 增加跳转到任意页功能。用户可改变每页记录条数。 页面&am…

JAVA学习-IO.ZIP压缩输入输出流

ZIP压缩输入输出流是Java中用于处理ZIP格式文件的API&#xff0c;它们提供了对ZIP文件进行压缩和解压缩操作的功能。 一、Java中常用的ZIP压缩输入输出流有以下几种&#xff1a; 1. ZipOutputStream&#xff1a; 这是用于将数据写入ZIP文件的输出流&#xff0c;可以将多个文件…

phpqrcode生成二维码

public function getImg(){ $uid1000; //自定义用户id require_once /sdk/phpqrcode/phpqrcode.php; //注意替换sdk路径 $object new \QRcode(); $value \App\get_upload_path(/appapi/Agent/share?code.$code); $errorCorrectionLevel L;//容错级别 $mat…

[vscode]使用cmake时将命令行参数传递给调试目标

一、简介 本文介绍了在vscode中使用cmake工具时&#xff0c;如何传递参数给编译目标的方法。 前提&#xff1a;使用vscodecmake编译C/C程序。 二、方法 在.vscode/目录下新建settings.json文件&#xff0c;并将待传底的参数写在 cmake.debugConfig里。 下面介绍了一个示例&a…

基于单片机+物联网控制的校园空气净化计划系统设计

摘要: 近年来,包含现代物联网技术概念的新型空气质量净化器技术原型在国内市场上已经具有一定雏形,主要还是存在以下几个不足:室内空气中的流动量和速度基本是固定的,不管室内空气系统中的任何污染物和室内空气质量如何,空气质量净化器按照所设定的作业负荷进行运转,这种…

selenium元素定位问题

一、按钮点击 具体网页信息如下&#xff1a; 定位的时候driver.find_element(By.CLASS_NAME, 方法搞不定。 定位方法&#xff1a; 方法一&#xff1a;通过文本定位 driver.find_element(By.XPATH, "//*[text()高分一号]").click() time.sleep(3) 如果是部分文字…

html5cssjs代码 005 小学数学四则运算练习

html5&css&js代码 005 小学数学四则运算练习 一、代码二、解释 这段代码定义了一个页面&#xff0c;用于小学数学四则运算的练习。这可能有点难&#xff0c;实际如果需要可以通过更改代码来达到要求。 一、代码 <!DOCTYPE html> <html lang"zh">…

抗生素净化提纯大孔吸附树脂

一、介绍 ADS-800级吸附树脂 ADS-800是一款功能强大的&#xff0c;大孔&#xff0c;湿润的球形交联聚合物吸附型树脂。 ADS-800 具有优良的物理特性&#xff0c;化学和热稳定性。它的特定的多孔性和其表面积使的本产品适合于分离技术的应用。 ADS-800 是为了流程工业中的专业…

2024第八届通信与未来互联网国际会议(ICCFI 2024)即将召开!

2024年第8届通信与未来互联网国际会议&#xff08;ICCFI 2024&#xff09; 日本鹿儿岛 | 2024年7月19-21日 ICCFI 2024 | Communications and Future Internet | Kagoshima-shi, Japanhttps://www.iccfi.org/ 主办单位&#xff1a; ◆ 出版 ▪ 会议论文集 投稿论文将经过严…

honle电源维修UV电源控制器维修EVG EPS60

好乐UV电源控制器维修&#xff1b;honle控制器维修&#xff1b;UV电源维修MUC-Steuermodul 2 LΛmpen D-82166 主要维修型号&#xff1a; EVG EPS 60/120、EVG EPS 100、EVG EPS200、EVG EPS 220、EVG EPS 340、EVG EPS40C-HMI、EVG EPS60 HONLE好乐uv电源维修故障包括&#…

DARTS: DIFFERENTIABLE ARCHITECTURE SEARCH

DARTS&#xff1a;可微架构搜索 论文链接&#xff1a;https://arxiv.org/abs/1806.09055 项目链接&#xff1a;https://github.com/quark0/darts ABSTRACT 本文通过以可微分的方式表述任务&#xff0c;解决了架构搜索的可扩展性挑战。与在离散和不可微搜索空间上应用进化或强…

Linux fork函数详解

文章目录 1 基本介绍2 fork实例2.1 多个fork返回值2.2 C语言 fork与输出2.3 fork &#x1f4a3; 1 基本介绍 #include <sys/types.h> #include <unistd.h>pid_t fork(void)描述 fork用于创建一个子进程&#xff0c;它与父进程的唯一区别在于其PID和PPID&#xff0…

频繁Full GC如何排查

频繁的Full GC可能会影响应用程序的性能和稳定性&#xff0c;因此需要进行排查和解决。下面是一些可能的排查方法&#xff1a; GC日志分析&#xff1a; 启用GC日志&#xff0c;并分析GC日志以了解Full GC的触发情况和频率。GC日志会提供有关GC事件的详细信息&#xff0c;包括GC…

2024年PHP伪协议详解

【2024年PHP伪协议详解】 嘿&#xff0c;亲爱的编程新手们&#xff01;今天我们要一起探索PHP伪协议的奇妙世界。想象一下&#xff0c;PHP伪协议就像是一个神秘的传送门&#xff0c;能让我们在PHP的海洋中畅游无阻。准备好了吗&#xff1f;让我们开始这段冒险之旅吧&#xff01…

C语言--sprintf()函数的用法

一.sprintf()语法 sprintf&#xff08;&#xff09; 是一个 C 语言中的函数&#xff0c;用于将格式化的数据写入一个字符串中。它的用法与 printf() 函数相似&#xff0c;printf&#xff08;&#xff09;函数是将内容输出到屏幕上&#xff0c;而sprintf()函数是将格式化的内容输…

蓝桥杯java组 测试次数

题目描述 x星球的居民脾气不太好&#xff0c;但好在他们生气的时候唯一的异常举动是&#xff1a;摔手机。 各大厂商也就纷纷推出各种耐摔型手机。x星球的质监局规定了手机必须经过耐摔测试&#xff0c;并且评定出一个耐摔指数来&#xff0c;之后才允许上市流通。 x星球有很多…

设计模式一 ---单例设计模式(动力节点,JavaSE基础)

设计模式 1.什么是设计模式&#xff1f; 2.设计模式的分类 单例设计模式就是GoF模式中的一种。 3.GoF设计模式的分类&#xff1a; 单例设计模式&#xff1a; 顾名思义&#xff1a;单个实例的设计模式&#xff01;

Arco 部署项目后部分样式未生效

文章目录 问题分析 问题 在更改 arco 的原始样式后&#xff0c;发现部分样式并未被更改 分析 如下所示&#xff0c;通过元素查看器可以看到原生的绑定的 class 类名和样式 而我将整个的设置了的样式做了替换 :deep(.arco-menu-light.arco-menu-horizontal .arco-menu-ite…