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];用一个数组就将所有的页框给组织起来,对页框的管理,就变成对数组的增删查改。

相关推荐
天呐草莓几秒前
支持向量机(SVM)
人工智能·python·算法·机器学习·支持向量机·数据挖掘·数据分析
保持低旋律节奏几秒前
linux——进程
linux·运维·服务器
YFLICKERH几秒前
【Linux系统】ubuntu - python 虚拟环境搭建|使用|与系统环境的区别
linux·python·ubuntu·虚拟环境
Ha_To2 分钟前
2025.12.19 OSPF
运维·服务器·网络
proware3 分钟前
3588 cma heap应用示例之图像采集
linux·cma·dma buf
斯文by累3 分钟前
浅析:Scheme开发语言
开发语言
IT艺术家-rookie4 分钟前
golang-- sync.WaitGroup 和 errgroup.Group 详解
开发语言·后端·golang
羊村懒哥5 分钟前
告别命令行查日志!CentOS 安装 ELK 实现可视化监控
linux·elk·centos
树下水月6 分钟前
Go语言编码规范
开发语言·后端·golang
无限大.7 分钟前
为什么“云计算“能改变世界?——从本地计算到云端服务
开发语言·云计算·perl