Linux 内核:线程的实现

news/2024/7/24 8:04:37 标签: linux

linux中的线程是轻量级线程(Light-Weight-process,LWP)

文章目录

  • 线程概念
  • 线程实现
  • 线程拓展

线程概念

线程分类

  • 用户级线程
  • 内核级线程,没有用户空间,完全工作在内核中(下图中没有[]的就是用户级线程)

在这里插入图片描述

Linux线程特点

  • Linux内核不区分进程和线程,PCB和TCB本质都是task_struct实例
  • task_struct包含pid和tgid,无论进程还是线程它们的pid都是独一无二的
  • 一个进程包含一个线程组,线程组号=进程的pid=所有线程的tgid(包括主线程)
  • 我们使用ps和getpid方法获取的pid其实就是tgid

对下图用户看到的PID其实就是pgid,而LWP其实是pid
在这里插入图片描述
pid用于调度,pgid用于资源管理

线程实现

创建进程我们使用fork,创建线程的时候可以使用new thread,逻辑层的变化大概如下
在这里插入图片描述
下面分析物理层的变化
看下函数的调用关系,kernel_thread是创建内核级线程的函数,它们的底层都是通过调用clone函数来实现功能的,区别是flag参数传的不太,下面看下clone函数的函数签名
int clone(int (*fn)(void *), void *stack, int flags, void *arg, ... /* pid_t *parent_tid, void *tls, pid_t *child_tid */ );

在这里插入图片描述
我挑了几个flag介绍一下,别的你可以执行:man clone自个看

  • CLONE_VM:标志在进程间共享地址空间,虚拟内存
  • CLONE_FS:标志进程间共享文件系统信息
  • CLONE_FILES:标志在进程间共享打开的文件
  • CLONE_SIGHAND:标志在进程间共享信号处理程序

创建进程时上述几个都不设置,创建线程时上述都设置,所以说创建线程的时候流程其实和进程是一样的,只不过共享的资源不同,所以说本质上来说内核不区分什么进程/线程,都会当作进程处理。
说到这里了不知道你有没有意识到,进程和线程就好像文件系统中的硬链接文件一样,其实相同的逻辑也可以带到C++中的shared_ptr智能指针,这些逻辑都是类似的,线程对进程资源维持一个计数,当计数为0时释放进程

注意:这些资源都是借助指针指向的如果需要共享的话只需要浅拷贝,主线程和其它线程的区别只有运行开始的时候起始位置不同

线程拓展

线程是作为栈帧存在于进程的栈中的,对一块内存它的栈指针和代码区运行位置的指针是唯一的,线程上下文切换的过程中会保存/恢复这两个指针的位置从而让线程觉得自己可以像进程一样工作,

线程模型

  • 多对一模型(用户级线程),现在不用了,就是在用户态维持线程的TCB,因此在内核态他会认为这是多线程是一个进程,简单间理解的话就是用户模拟多线程自己调度,这个东西有点像协程,好处是调度灵活,上下文切换小。
    问题:
    • 一个线程阻塞,所有线程阻塞
    • 在多核系统中,多线程无法并行
    • 只有一个内核线程在内核中
  • 一对一模型(内核级线程),TCB由内核去管理,真正将线程暴露在内核中,使得并发性更好可以充分的利用多核CPU的资源(windows/linux/…主流操作系统采用这种模型)
    问题:
    • 系统开销大,调度压力增大,调度自由度低
    • 上下文切换变大

注意:内核级线程和内核线程是两个东西,内核级强调这种模式下的每一个线程由内核直接调度/控制,内核线程是内核为了满足操作系统并发性而独立维护的线程

参考:
【Linux系列】深入理解task_struct结构体


http://www.niftyadmin.cn/n/5477871.html

相关文章

华为 2024 届校园招聘-硬件通⽤/单板开发——第一套(部分题目分享,完整版带答案,共十套)

华为 2024 届校园招聘-硬件通⽤/单板开发——第一套 部分题目分享,完整版带答案(共十套)获取(WX:didadidadidida313,加我备注:CSDN huawei硬件单板题目,谢绝白嫖哈) 1、对于 RC 定…

【吊打面试官系列】Java高并发篇 - 在 Java 中 Executor 和 Executors 的区别?

大家好,我是锋哥。今天分享关于 【在 Java 中 Executor 和 Executors 的区别?】面试题,希望对大家有帮助; 在 Java 中 Executor 和 Executors 的区别? Executors 工具类的不同方法按照我们的需求创建了不同的线程池&am…

Vue数据修改异步渲染原理分析

Vue异步渲染DOM原理分析 1. 什么是异步更新DOM? 将多次数据变化合并到一个批处理中,从而减少了不必要的DOM操作。 例如在一个方法内重新更新一个值,Vue会在本轮数据更新后,再去异步更新视图, 而不是每次对响应式数据改动都去更新…

智慧公厕:智慧、整洁、便捷、协同

智慧公厕正是以智能化为核心,通过监测公厕内部环境和设备状态,实现了智能引导、环境监测、资源监测、安全管理、卫生保洁、多媒体信息交互等功能应用,为大众提供了一个舒适、便利的使用环境。本文以智慧公厕源头实力厂家广州中期科技有限公司…

【数据结构】栈与队列部分习题

栈与队列部分习题(持续更新中) 目录 1. 单选题2. 简答题 栈与队列的知识点参考文章:链接 【数据结构】栈和队列的概念与基本操作代码实现 1. 单选题 一个栈的输入序列为 1 2 3 4 5,则下列序列中不可能是栈的输出序列的是( )。 A. 2 3 4 1 …

护眼台灯怎么选看哪些指标?不踩雷护眼台灯十大排名

平常经常面对电子屏幕的上班族、学业负担重的学生族用眼时间都比较长,再加上不健康的用眼习惯,近视人数不断增多。而在这当中,健康的光线也十分重要,良好的光线能够让眼睛更加舒服,用眼负担也会减轻不少,因…

【蓝桥杯】赛前一周模板

小蜜蜂代码风格的,模块都在,希望能够帮助你吧。 目录 AT24C02存储芯片 DS18B20温度传感器 DS1302 时钟 NE555频率测量 PCF8591 AD PWM波 超声波测距 串口UART 4X4矩阵按键 AT24C02存储芯片 void Write_AT24C02(unsigned char addr,unsigned …

深入浅出dhcpcd:Linux环境下的动态主机配置协议客户端

在现代网络环境中,自动获取IP地址和网络配置已成为基本需求。动态主机配置协议(DHCP)在简化网络配置方面发挥了关键作用,它允许设备自动从网络服务器获取IP地址和其他网络配置信息。Linux系统中的dhcpcd(Dynamic Host …