【Linux】线程的内核级理解详谈页表以及虚拟地址到物理地址之间的转化

server/2024/11/14 12:27:08/

一、线程的概念

        对于进程来说,进程创建时间和空间成本较高,因为进程是承担分配系统资源的基本实体所以线程的出现就成为了必然。Linux线程与进程非常相似,Linux设计者在设计之初觉得如果再为线程设计数据结构和调度算法就会使整个系统变得十分复杂。地址空间和地址空间上的虚拟地址,本质就是一种资源,所以线程就在进程的基础上让不同的线程看到进程地址空间上的代码区中的不同代码,并让不同线程去执行不同的代码,这样同样也实现了线程的功能不同的线程在同一个进程地址空间中运行,共享相同的内存和其他资源。所以说线程是进程内部的一个执行分支,线程也是CPU调度的基本单位

        每个线程都有一个与之关联的task_struct结构体,该结构体包含了线程的状态信息、调度信息、资源使用情况等。CPU在执行调度的时候,根本就不用区分进程和线程,反正你们都有task_struct结构体,都是执行流。Linux中所有的可调度执行流都叫做轻量级进程

二、详谈页表以及虚拟地址到物理地址之间的转化

        磁盘中的数据块和内存中的数据块都是4kb大小。为了管理内存中每一块4kb大小的内存块,操作系统内核中会有描述该内存块的结构体,4GB的内存大小中就有1048576个内存块,再利用数组就能将整个内存管理起来,对于内存的管理就变成了对于数组的增删查改。所以,操作系统进行内存管理的基本单位就是4kb

        再谈页表,其实页表并不是只有一块数据结构,而是分为了页目录,页表。一个虚拟地址有32位,32位中的前10位用来表示处于页目录中的哪一个位置,页目录中最多可以存放2^{^{10}}个页表的首地址,第11到20位用来表示处于页表的哪一个页表项,一个页表中最多也有2^{^{10}}个页表项,一个页表项就对应内存中的一个4kb大小的数据块。最后12位用来确定数据块中的字节,2^{^{12}}刚好就是4kb,正好可以确定是哪一个字节,所以后12位也叫做页内偏移

        如果再在页表项中加入访问权限审查,有没有被使用过等等标志位,就能对用户操作进行一些审查以及拦截,来保证内存访问的安全性。

        针对页表的这一种分页存储的模式,我们所写的函数编译完就是一块一块的虚拟地址,根据函数名就可以找到函数入口地址,各个函数就分配得到了不同的虚拟地址,也就是得到了不同的页表区域。同样的,我们只要给不同的线程分配不同的页表区域,就可以让不同的线程能够访问到页表的不同子集,进一步的,就可以让不同的线程访问到不同的代码,从而实现多线程技术。   

三、创建线程的小例子

thread:这是一个指向pthread_t类型的指针,用于获取新创建线程的线程ID。在调用pthread_create后,这个指针会被设置为新线程的ID。

attr:这是一个指向pthread_attr_t类型的指针,用于设置线程的属性,如栈大小、优先级等。如果这个参数为NULL,那么线程将使用默认的属性。通常情况下,如果你不需要设置特殊的线程属性,可以传递NULL。

 

start_routine:这是一个函数指针,指向线程开始执行时要调用的函数。这个函数通常被称为线程的“入口点”或“启动例程”。

arg:用于向线程的启动例程传递参数。你可以通过这个参数向线程传递任何类型的数据。如果你的启动例程不需要任何参数,可以传递NULL。

3.1、主函数

#include <iostream>
#include <unistd.h>
#include <pthread.h>
using namespace std;void* newthread(void*)
{while (true){cout << 22222222 << endl;sleep(1);}}int main()
{pthread_t pthread;pthread_create(&pthread, nullptr, newthread, nullptr);while(true){cout << 11111111 << endl;sleep(1);}return 0;
}

3.2、makefile

myThread:testThread.ccg++ -o $@ $^ -std=c++11 -lpthread
.PHONY:clean
clean:rm -f myThread

可以看到两个线程就同时跑起来了: 


http://www.ppmy.cn/server/38512.html

相关文章

Python实现Chiikawa

写在前面 哈&#xff1f;呀哈&#xff01;本期小编给大家素描版Chiikawa&#xff01; 主人公当然是我们可爱的吉伊、小八以及乌萨奇啦~ Chiikawa小小可爱 《Chiikawa》是一部来自日本的超萌治愈系漫画与动画作品&#xff0c;由作者秋田祯信创作。"Chiikawa"这个名字…

负载或反向代理服务器如何配置XFF以获取终端真实IP

文章目录 XFF介绍工作原理注意事项 配置方式1. Nginx2. HAProxy3. F5 BIG-IP4. Radware注意事项 本文介绍如何在反向代理或负载中配置XFF&#xff0c;方便后端服务获取请求来源的真实IP XFF介绍 X-Forwarded-For&#xff08;简称XFF&#xff09;是一个非标准的HTTP头部字段&a…

HCIP-Datacom-ARST必选题库_OSPF【道题】

某工程师利用2台路由器进行IPv6测试&#xff0c;他想要通过运行OSPFv3实现IPv6网络的互联互通。关于R1需要进行的OSPPv3相关配置&#xff0c;正确的有? [R1] router id 10.1.1.1A [R1-Giqabi tEthernet0/0/1] ospfv3 1 area 0 [R1-ospfv3-11 router-id 10.1.1.1 [R1-ospfv3…

图数据库 之 Neo4j 与 AI 大模型的结合绘制知识图谱

引言 随着信息时代的到来&#xff0c;海量的文本数据成为了我们获取知识的重要来源。然而&#xff0c;如何从这些文本数据中提取出有用的信息&#xff0c;并将其以可视化的方式展示出来&#xff0c;一直是一个具有挑战性的问题。近年来&#xff0c;随着人工智能技术的发展&…

C语言 | Leetcode C语言题解之第77题组合

题目&#xff1a; 题解&#xff1a; int** combine(int n, int k, int* returnSize, int** returnColumnSizes) {int* temp malloc(sizeof(int) * (k 1));int tempSize 0;int** ans malloc(sizeof(int*) * 200001);int ansSize 0;// 初始化// 将 temp 中 [0, k - 1] 每个…

【vue+el-upload】当action=“#“,代表不使用默认上传,使用自定义上传,http-request获取文件流

el-upload有多种上传行为&#xff1a; 1、立即上传&#xff1a; 当 action 属性被赋予一个有效的 URL 时&#xff0c;一旦用户选择了文件&#xff0c;el-upload 组件会立即自动将文件上传到指定的服务器地址。 2、不立即上传&#xff08;自定义触发&#xff09;&#xff1a; 如…

git:分支删除

删除本地分支&#xff1a; git branch -d branch_name其中&#xff0c;branch_name 是你要删除的本地分支的名称。如果分支上有未合并的更改&#xff0c;使用 -d 选项会提示你确认删除。 如果要强制删除未合并的分支&#xff0c;可以使用 -D 选项&#xff1a; git branch -D…

第1个数据库:编号,文本,时间,

写一个数据库 编号 文本 时间1 第一个文本 有100万条数据 -- 创建一个名为texts的表格来存储数据 CREATE TABLE texts ( id INTEGER PRIMARY KEY, text TEXT, time TIMESTAMP DEFAULT CURRENT_TIMESTAMP);-- 插入数据INSERT INTO texts (text) VALUES (第一个文…