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

Linux部分底层机制

POSIX

  • POSIX 是一系列由 IEEE 制定的标准,旨在定义操作系统(尤其是类 Unix 系统)应该提供的应用程序接口(API)、命令行接口和工具环境。

  • 它的核心目标是 可移植性。如果一个程序遵循 POSIX 标准编写,那么它应该能够在任何实现了该 POSIX 标准的操作系统(如 Linux, BSD, macOS, Solaris 等)上编译和运行,而无需进行重大修改。

与线程的关系

  • POSIX 线程标准(通常称为 Pthreads)是 POSIX 标准的一部分(具体在 IEEE Std 1003.1c)。

  • 它定义了一套 统一的、跨平台的 C 语言 API 用于创建、同步和管理线程。这套 API 是开发者编写多线程程序的主要接口。

  • 关键 API 示例

    • pthread_create():创建新线程。

    • pthread_join():等待线程终止并回收资源。

    • pthread_exit():终止当前线程。

    • pthread_mutex_init() / pthread_mutex_lock() / pthread_mutex_unlock():互斥锁操作。

    • pthread_cond_init() / pthread_cond_wait() / pthread_cond_signal():条件变量操作。

    • pthread_key_create() / pthread_setspecific() / pthread_getspecific():线程特定数据(TLS)管理(旧接口)。

  • 核心作用: 为开发者提供标准、可移植的多线程编程接口。开发者只需要学习 Pthreads API,就可以在多种支持 POSIX 的系统上编写多线程程序,无需深入了解底层操作系统(如 Linux)的具体实现机制(如 clone, futex)。

总结

  • POSIX (Pthreads): 定义标准接口。开发者用这些函数 (pthread_create, pthread_mutex_lock 等) 编写跨平台多线程程序。
  • 你用 POSIX 函数写多线程代码。

clone()

  • clone() 是 Linux 特有的一个底层系统调用。它是 Linux 内核创建新的执行流(无论是传统意义上的进程,还是线程)的基础机制。

  • 它非常灵活,通过传递一组标志位 (flags) 来控制新创建的“任务”(内核用 task_struct 表示)与其父任务共享哪些资源。

与线程的关系?

  • 线程的本质: 在 Linux 内核看来,线程就是一组共享了大量资源(特别是虚拟内存空间 CLONE_VM)的轻量级进程(LWP)。

  • 线程的创建: 当你在用户空间调用 pthread_create() (POSIX API) 时,底层的线程库(如 NPTL)最终会调用 clone() 系统调用来请求内核创建新线程。

  • 关键标志位 (flags) 用于线程

    • CLONE_VM: 共享虚拟内存空间(代码段、数据段、堆等)。这是线程区别于进程的核心标志。

    • CLONE_FS: 共享文件系统信息(根目录、当前工作目录等)。

    • CLONE_FILES: 共享打开的文件描述符表

    • CLONE_SIGHAND: 共享信号处理程序。

    • CLONE_SYSVSEM: 共享 System V 信号量撤销值。

    • CLONE_THREAD: 将新任务放在同一个线程组内(同一个 TGID/PID 下)。这是 NPTL 要求的关键标志。

    • CLONE_SETTLS: 设置新任务的 TLS (Thread Local Storage) 段。

    • CLONE_PARENT_SETTID / CLONE_CHILD_CLEARTID: 用于用户空间线程库高效管理线程 ID 和通知线程退出。

  • 对比进程创建 (fork()): fork() 在 Linux 上最终也是通过 clone() 实现的,但它传递的标志位不包含 CLONE_VM, CLONE_FS, CLONE_FILES 等。这导致子进程获得父进程资源的独立副本(通常通过写时复制)。

  • 核心作用: 提供 Linux 内核创建线程或进程的底层机制。它定义了新执行流与父执行流之间资源共享的粒度pthread_create() 是对 clone() 用于创建线程场景的高层封装。

简单来说

  • clone(): Linux 内核创建线程的底层机制。pthread_create() 最终调用 clone() 并设置特定的资源共享标志 (CLONE_VM, CLONE_FILES 等) 来创建内核线程(LWP)。
  • 创建线程时,POSIX 库用 clone() 告诉内核怎么建新线程(共享哪些资源)。

NPTL

了解NPTL是现代 Linux 发行版默认使用的 Pthreads 实现。

优势:

  • 1:1 模型: 严格的一个用户线程对应一个内核调度实体(LWP / task_struct)。这使得调度高效且符合 POSIX 语义。

  • 高效同步: 利用内核提供的 futex (Fast Userspace muTEX) 机制实现高效的互斥锁、条件变量等同步原语。futex 结合了用户空间的快速路径(无竞争时)和内核空间的慢速路径(需要阻塞时),极大地减少了系统调用的开销。

  • 健壮的信号处理: 正确实现了 POSIX 信号语义。

  • 线程组管理: 内核支持线程组 (TGID),所有线程共享同一个 PID。

  • /proc 文件系统支持: /proc/[pid]/task 目录列出了进程中的所有线程(LWP),每个线程有自己的子目录(以其 TID 命名)。

  • 更好的性能和可伸缩性: 能够高效支持大量并发线程。

理解TLS变量

  • TLS 是一种存储类(Storage Class)。

  • 它允许你定义全局或静态变量,但每个线程都拥有该变量的独立副本

  • 一个线程对自身 TLS 变量的读写操作不会影响其他线程中同名的 TLS 变量。

  • 允许每个线程拥有一个变量的独立副本。一个线程修改其 TLS 变量不会影响其他线程的同名变量。

为什么需要?

  • 线程私有状态: 在多线程环境中,有些数据是线程特定的,而不是所有线程共享的全局状态。例如:

    • errno:每个线程需要有自己独立的错误码副本。

    • 用户身份或会话信息(在 Web 服务器中)。

    • 数据库连接句柄(每个线程管理自己的连接)。

    • 复杂的函数调用链中避免传递大量上下文参数。

    • 需要线程安全的伪随机数生成器种子。

  • 避免锁竞争: 如果使用全局变量加锁来模拟线程私有数据,会带来不必要的锁竞争开销。TLS 天然避免了这种竞争。

与线程的关系?

  • 线程创建与销毁: 当一个线程被创建时,系统会为它分配一块私有的 TLS 内存区域,用于存储其所有 TLS 变量的初始值或零初始化值。当线程终止时,这块内存(包括其中 TLS 变量的值)会被自动回收。

  • 访问机制: 编译器/链接器会为 TLS 变量分配在特殊的段(.tdata 用于初始化的 TLS,.tbss 用于未初始化的 TLS)。运行时,操作系统和线程库协作,使得每个线程能通过特定的段寄存器(如 FSGS 寄存器)加上该变量在 TLS 块中的偏移量来访问自己的 TLS 变量副本。这个过程对开发者是透明的,像访问普通变量一样使用即可。

  • 核心作用: 提供一种高效、安全、易用的机制来存储和管理线程私有的全局数据,是编写清晰、高效、线程安全代码的重要工具。

简单来说

  • TLS 变量: 提供线程私有存储的语言/编译器级机制。用于存储线程特有的状态(如 errno, 会话数据),避免使用全局变量+锁带来的开销和复杂性。
  • 你想让每个线程有自己的“全局”变量?用 TLS (__thread / thread_local) 就行。

在这里插入图片描述

http://www.dtcms.com/a/355569.html

相关文章:

  • 【每天一个知识点】云存储(Cloud Storage)
  • 从混沌到有序:工作流设计的创作迷思与破局之道
  • AI智能农业监测系统深度解读:从大田作物管理到病虫害预警,破解传统农业增产难题
  • 大模型私有化部署
  • RAG概念被误用:AI应用落地需回归上下文工程本质
  • leetcode算法day22
  • kotlin中关于协程的使用
  • 陕西风味马卡龙:家常自制,特色甜趣共享
  • 传输层协议介绍
  • 结构化提示词革命:JSON Prompting如何让AI输出精准如激光
  • 数字化生产管理系统 (MES)
  • 服务器核心组件:CPU 与 GPU 的核心区别、应用场景、协同工作
  • 揭开.NET Core 中 ToList () 与 ToArray () 的面纱:从原理到抉择
  • ansible常用命令的简单练习
  • Linux系统 -- 多线程的控制(互斥与同步)
  • 数学思维好题(冯哈伯公式)-平方根下取整求和
  • 个人博客运行3个月记录
  • 了解ADS中信号和电源完整性的S参数因果关系
  • Typora 教程:从零开始掌握 Markdown 高效写作
  • MySQL事务ACID特性
  • JavaScript中的BOM,DOM和事件
  • 英语单词:ad-hoc
  • BugKu Web渗透之成绩查询
  • 白杨SEO:网站优化怎么做?应用举例和适合哪些企业做?参考
  • 速成Javascript(二)
  • 新书速览|SQL Server运维之道
  • 【第三方网站运行环境测试:服务器配置(如Nginx/Apache)的WEB安全测试重点】
  • 激活函数篇(3):Softmax
  • maven scope 详解
  • 通信原理实验之线性均衡器-迫零算法