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时释放进程

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

相关推荐
Ruiery17 分钟前
Linux 6.6内核 PCIe 深度解析(九):复位机制 — 从 FLR 到 Secondary Bus Reset 的降级链
linux·运维·服务器
学烹饪的小胡桃30 分钟前
WGCLOUD支持哪些告警方式
linux·运维·服务器·网络·安全
墨有6661 小时前
#Linux系统命令行操作指南
linux
做运维的阿瑞1 小时前
Linux ELF 文件
linux·运维·服务器
Escalating_xu1 小时前
【Makefile 进阶】从自动发现源文件、模式规则到目录分离与多模块递归构建
linux·开发语言
星辰徐哥1 小时前
鸿蒙PC平台 Gnote 笔记应用适配实战:从 Linux 到 鸿蒙PC 的 Electron 迁移
linux·笔记·electron·harmonyos·gnote
一直C1 小时前
Linux应用软件编程|嵌入式轻量级数据库SQLite3完整学习笔记(命令行+C语言API)
linux·sqlite
神威难绷泪1 小时前
TCP并发服务器:多进程 多线程 IO多路复用(select poll epoll)
linux·ipc·tcp并发服务器
kruptos2 小时前
嵌入式 Linux 驱动开发:第一个内核模块怎么写?
linux·运维·驱动开发·嵌入式硬件
wangqiaowq2 小时前
langfuse linux下的安装部署
linux·运维·服务器