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

相关推荐
Dr.kangder2 小时前
嵌入式面试总结(二十一)——C语言关键字
c语言·开发语言·面试·职场和发展·架构·虚拟化
syker2 小时前
SuperNova Compiler v4.2.9 完整开发手册
c++
happyprince2 小时前
02-具体观 — Cordis 算法与实现剖析
算法
W_326002 小时前
Python-OpenCV:库、环境搭建、图片与摄像头解析
开发语言·图像处理·python·opencv·机器学习
zhy295632 小时前
在 QAIRT Genie SDK 上部署 Llama 3.2 1B 模型:从环境准备到 C++ 推理
开发语言·c++·llama
烬羽2 小时前
求第 K 大,为什么反而要用最小堆?
javascript·数据结构·算法
爱跳舞的烤冷面2 小时前
自学嵌入式第N天(Linux篇——文件编程)
java·开发语言·前端
richard_yuu2 小时前
JSON vs XML vs 二进制:3种序列化终极选型
xml·c++·qt·学习·json
☆凡尘清心☆2 小时前
CentOS Stream 9 源码编译搭建 Zabbix7.0.29 完整部署方案(部署成功)
linux·运维·centos
Escalating_xu3 小时前
【Linux】进程间通信:从匿名管道、FIFO 到共享内存、消息队列与信号量
java·linux·面试