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

相关推荐
zhanghaofaowhrql13 小时前
Cursor+GitOps:自动化运维新姿势
运维·自动化
2501_9475758014 小时前
计算机毕业设计之jsp开山车行二手车交易系统
java·开发语言·hadoop·python·信息可视化·django·课程设计
骑士雄师14 小时前
java面试题 4:鉴权
java·开发语言
古城小栈15 小时前
为啥说:训练用BF16,推理用FP16
人工智能·算法·机器学习
KaMeidebaby15 小时前
卡梅德生物技术快报|蛋白 N 端测序在重组贻贝融合蛋白表征中的应用,解决原核表达序列偏移工艺难题
前端·人工智能·物联网·算法·百度
weixin_4713830315 小时前
Docker - 05 - 构建流程
运维·docker·容器
时间的拾荒人15 小时前
C语言字符函数与字符串函数完全指南
c语言·开发语言
浆果020715 小时前
NanoTrack C++ — RK3588 实时目标跟踪
c++·目标跟踪·rk3588
Turbo正则16 小时前
群论在AI中的应用概述
人工智能·算法·抽象代数
ysa05103016 小时前
【并查集】判环
c++·笔记·算法