LINUX系统编程:线程的概念

目录

1.线程的概念

2.线程的理解

3.怎么做到划分代码的


本文主要介绍,在LIUNX下的线程。

1.线程的概念

在很多的书上的你可能见过这样的。

线程是进程内部的一个执行分支,线程是cpu调度的基本单位。

加载到内存的程序叫做进程。修正:进程 = 内核数据结构+进程代码和数据。

话虽然是这么说,但是真正想要理解线程,其实需要理解很多很多的知识点。

例如:进程的加载, 进程虚拟地址空间,页表的映射,编址。。。。。

2.线程的理解

main函数原本只有一个执行流依次,执行abcd四个方法,现在呢有两个执行流,一个执行a,b一个执行c,d。

这时候就有一个问题了,这种事情,创建一个子进程,不也能做到吗?,何必再使用线程呢?

看下面这张图,这是一个进程中包含3个线程,创建一个线程,就是创建一个task_struct,指向同一个进程虚拟地址空间,然后将正文代码分为几个部分,让不同线程看到不同的部分 ,因为调度算法是调度task_struct,线程就可执行代码的一部分,之前的进程呢就可以看成只有一个线程的进程,下图就是有多个线程的进程,如果创建一个进程就要创建task_struct,地址空间,页表,很明显进程的创建成本是远远大于线程的。

从上图也可以看出LINUX设计者,没有去特地的去设计线程,而是对进程设计的复用,因为进程和线程有很大相似之处,他们都是一个执行流

执行流介于进程和线程之间,他可能是一个进程,也可能是一个进程内部的线程

在LINUX中是不存在线程的概念的,所有调度的执行流都叫做轻量级进程

3.怎么做到划分代码的

划分代码通过页表来实现的,想要线程看到哪段代码,我就构建线程到该代码的映射,其余代码一律不管,线程自然也看不见。

在x86环境下地址空间的大小是0-2^32。

前10位是页目录的索引,通过索引能找到对应的页表,最多有[0,1023] 1024个页表。

中间10位是页表项的索引,通过索引能找到对应的页表项,其中存的是对应页框的起始物理地址。

后12位是页内偏移量,找到页框的物理地址加上对应的偏移量,就可以找到对应的代码,。

x86环境下页框的大小为4kb。

所以划分代码区域,就是让轻量级进程看到全部页表的对应子集。

操作系统的对内存管理的基本单位是4kb。

必然要去管理每一块页框,先描述每一个页框,就像权限还有其他的属性。

就像这个页框是用户的,或者内核的,是只读还是只写的。

将其组织起来。

算出有多少个页框 用4gb/4kb = 1048579个页框

struct page mem[1048579];用一个数组就将所有的页框给组织起来,对页框的管理,就变成对数组的增删查改。

相关推荐
梦想很大很大6 小时前
拒绝“盲猜式”调优:在 Go Gin 项目中落地 OpenTelemetry 链路追踪
运维·后端·go
Sinclair7 小时前
内网服务器离线安装 Nginx+PHP+MySQL 的方法
运维
叶落阁主8 小时前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
CoovallyAIHub9 小时前
Moonshine:比 Whisper 快 100 倍的端侧语音识别神器,Star 6.6K!
深度学习·算法·计算机视觉
CoovallyAIHub10 小时前
速度暴涨10倍、成本暴降6倍!Mercury 2用扩散取代自回归,重新定义LLM推理速度
深度学习·算法·计算机视觉
CoovallyAIHub10 小时前
实时视觉AI智能体框架来了!Vision Agents 狂揽7K Star,延迟低至30ms,YOLO+Gemini实时联动!
算法·架构·github
CoovallyAIHub11 小时前
开源:YOLO最强对手?D-FINE目标检测与实例分割框架深度解析
人工智能·算法·github
CoovallyAIHub11 小时前
OpenClaw:从“19万星标”到“行业封杀”,这只“赛博龙虾”究竟触动了谁的神经?
算法·架构·github
刀法如飞11 小时前
程序员必须知道的核心算法思想
算法·编程开发·算法思想