【Linux线程篇】探索Linux多线程:并行编程的入门指南

news2024/9/25 15:26:17

W...Y的主页 😊

代码仓库分享💕 

 Linux线程概念

什么是线程

在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行,本质是在进程地址空间内运行
在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。

在Linux系统下,线程与进程的最终目的都是一样的,都是想要让程序并发执行,所以我们可以将代码进行分块执行,所以就要创建自己的tcb结构体来维护自己的上下文、优先级等等。但是Linux设计者认为pcb与tcb具有极度的相似性没必要设计单独设计数据结构和算法,直接复用既可,所以Linux中的线程也被称为“轻量化进程”!!!

所以进程是一个或多个执行流加页表加地址空间加代码和数据。进程在内核角度为承担分配系统资源的实体!!!

那多个执行流是怎么划分代码呢?
我们经常说申请内存和释放内存,所以我们应该对内存做管理,其实物理内存也会被划分为4kb(大部分划分规则)的数据块,而磁盘中的数据块也是4kb的,他们被我们称为页框或页帧。当我们内存与数据块的交互时就是以数据块为单位的交互。操作系统要管理内存,肯定要先描述再组织,所以内存有属于自己的结构体struct page,其结构体的内容也应该是记录一个数据块的状态,使用者是谁,是否被使用,是否可以交换等等。假如我们物理内存为4GB,其就有1048576个4kb数据块,我们就可以创建一个是结构体数组进行存储结构体内容。

其源码一部分:

所以我们的页表也不可能是所谓的kv关系,因为kv分别代表一个指针,再加上其对应权限可能有10个字节,但是如果是一一对应的关系其页表可能会有40GB大小,所以页表是怎么映射的呢?虚拟地址是32位二进制,划分为三个部分10位10位12位,其第一个10位被称为页目录,需要创建2^10个格子,第二个10位被称为页表,页目录保存的是二级页表的地址,所以页表应该有1024个,每个页表中有1024个页表项,每一个页表项中存放的是4kb内存块的起始地址(也就是页框的物理地址)。而我们的后12位的大小为4kb,所以我们又知道其对应的起始地址,所以我们对应的起始物理地址+后12位偏移量就是最终所访问的数据。所以我们的后12位被称为页内偏移。

我们也可以再页表中加上标志位,让CPU与页表中的标志位进行比对,如果相同就可以访问物理内存的内容。 

所以给不同的线程分配不同的区域,本质就是让不同的线程各自看到全部页表的子集。

那是怎么才能看到不同的页表呢?这里我们得转到应用层面来看,所以让我们先了解一些系统调用函数:

第一个参数线程id,第二个参数线程属性,第三个参数是返回值void*参数也是void*的函数指针,第四个参数是我们给第三个函数指针所指向的函数所传递的参数。

一般情况下我们的第二个参数可以写nullptr。

注意:在我们使用pthread库中函数时,在编译时必须链接上pthread库!!!

这样我们就可以简短写一个代码:

#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>

void *newthreadrun(void *args)
{
    while (true)
    {
        std::cout << "I am new thread, pid: " << getpid() << std::endl;
        sleep(1);
    }
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, newthreadrun, nullptr);

    while (true)
    {
        std::cout << "I am main thread, pid: " << getpid() << std::endl;
        sleep(1);
    }
}

这时我们的代码就有两个执行流,我们从main函数开始运行,当走到pthread_create函数时新线程创建成功会进入newthreadrun函数中去,主线程继续往下执行即可。

 在这里我们只能看到一个进程,我们可以使用ps -aL查看轻量级进程就可以看到两个进程了。

主线程的PID==LWP,但是其线程所有的PID都是相同的。所以我们在回归到上述问题上每一句代码都有其对应的虚拟地址,主线程拥有的是主函数的虚拟地址其余线程得到的是其他函数的虚拟地址,对应其页表就可以访问到不同的数据。 

所谓的Linux就根本没有线程这个说法,只有轻量化进程,所以对应的Linux内核就没有对线程的系统调用只有对轻量化进程的系统调用。而用户只知道线程不知道轻量化进程,所以设计者在用户和内核之间设计一个软件层pthread库——原生线程库。这个库的作用就是将Linux的轻量级进程系统调用进行封装,转化成线程相关接口提供给用户。

轻量级进程也有直接的系统调用,但是太复杂一般没有人想用!!! 


以上就是本次全部内容,感谢大家观看! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1909996.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLO-World实时开集检测论文阅读

论文&#xff1a;《YOLO-World: Real-Time Open-Vocabulary Object Detection》 代码&#xff1a;https://github.com/AILab-CVC/YOLO-World 1.Abstract 我们介绍了YOLO World&#xff0c;这是一种创新的方法&#xff0c;通过在大规模数据集上进行视觉语言建模和预训练&#…

Alpha 3D扫描仪

3D视觉。就这么简单。 用于机器视觉任务的工业3D扫仪 规格表

k8s离线部署芋道源码前端

目录 概述 编译Dockerfile 构建Dockerfilenginx.conf构建 k8s部署前端镜像部署ingress 概述 本篇将对 k8s离线部署芋道源码前端 进行详细的说明&#xff0c;对如何构建 Dockerfile&#xff0c;如何整合 Nginx&#xff0c;如何整合 ingress 进行实践。 相关文章&#xff1a;naco…

热烈祝贺!全视通多家客户上榜全球自然指数TOP100!

2024年6月18日&#xff0c;全球医疗机构自然指数TOP100榜单发布&#xff0c;中国医疗机构在其中的表现尤为引人注目。 根据《自然》杂志网站发布的数据&#xff0c;此次公布的排名是基于&#xff08;2023年3月1日至2024年2月29日&#xff09;的统计数据&#xff0c;全球医疗机构…

【购物车案例】for循环为什么使用key

要做出一个简单的购物车界面。首先&#xff0c;有一个复选框&#xff0c;可以选择商品&#xff0c;后面紧跟的是商品名称&#xff0c;然后&#xff0c;是删除按钮&#xff0c;根据这个需求&#xff0c;先写出一个简单的界面&#xff0c;代码如下&#xff1a; <template>…

elasticSearch的索引库文档的增删改查

我们都知道&#xff0c;elasticsearch在进行搜索引擎的工作时&#xff0c;是会先把数据库中的信息存储一份到elasticsearch中&#xff0c;再去分词查询等之后的工作的。 elasticsearch中的文档数据会被序列化为json格式后存储在elasticsearch中。elasticsearch会对存储的数据进…

诺基亚老年机突然翻红,为了情怀你会入手吗?

在智能手机功能日益丰富的今天&#xff0c;诺基亚3210的回归&#xff0c;似乎为人们提供了一种逃离现代科技束缚的选项。这款曾经的经典手机&#xff0c;以其复古的外观和简单的功能&#xff0c;吸引了一批怀旧用户的追捧。然而&#xff0c;它真的能够满足现代人的需求吗&#…

探讨大数据在视频汇聚平台LntonCVS国标GB28181协议中的应用

随着摄像头和视频监控系统的普及和数字化程度的提高&#xff0c;视频监控系统产生的数据量急剧增加。大数据技术因其优秀的数据管理、分析和利用能力&#xff0c;成为提升视频监控系统效能和价值的重要工具。 大数据技术可以将视频监控数据与其他数据源进行融合分析&#xff0c…

【Golang】slice切片

slice Go语言的切片是对数组的抽象。 数组的使用 package mainimport ("fmt" )// 传递固定长度的数组还是值传递的方式 func printArray(myArray [5]int) {for index, value : range myArray {fmt.Println("index:", index, "value:", value)…

【深度学习】图形模型基础(5):线性回归模型第五部分:多变量线性回归模型

1.引言 当我们从基础的线性模型 y a b x error y a bx \text{error} yabxerror 转向更复杂的模型 y β 0 β 1 x 1 β 2 x 2 … error y \beta_0 \beta_1 x_1 \beta_2 x_2 \ldots \text{error} yβ0​β1​x1​β2​x2​…error 时&#xff0c;我们面临了诸多…

DNS知识点

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 ​ 目录 一、DNS概念 二hosts 文件 DNS优缺点 三客户端域名解析顺序(优先级) 四原…

JVM:类的生命周期

文章目录 一、介绍二、加载阶段三、连接阶段四、初始化阶段 一、介绍 类的生命周期描述了一个类加载、连接&#xff08;验证、准备和解析&#xff09;、初始化、使用、卸载的整个过程。 加载&#xff08;Loading&#xff09;阶段第一步是类加载器根据类的权限定名通过不同的渠…

函数调用的堆栈过程

初始栈空间如下(可以拿来训练)&#xff1a; 代码执行之后&#xff1a; 代码&#xff1a; #include <iostream> int sum(int a, int b) { /* 00601800 push ebp 00601801 mov ebp,esp 006018A7 sub esp,4Ch 006018A7 reo stos */int temp …

CentOS7二进制安装和YUM安装mongodb,服务器无法安装5.0以上的 mongodb 数据库报错 Illegal instruction

文章目录 MongoDB 安装二进制安装YUM 安装 Tips:1、MongoDB安装问题2、MongoDB登录3、MongoDB排序时内存大小限制和创建索引4、创建用户5、Java yaml使用密码连接mongodb6、MongoDB增删改查 MongoDB 安装 二进制安装 [rootmysql5-7 mongodb-6.0.4]# cat start.sh #!/bin/bash…

【ASSEHR出版】第四届现代教育技术与社会科学国际学术会议(ICMETSS 2024)

第四届现代教育技术与社会科学国际学术会议&#xff08;ICMETSS 2024&#xff09;将于2024年8月23-25日在马来西亚 吉隆坡举行。 会议旨在为从事教育相关领域的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技术&#xff0c;了解学术发展趋势&#xff0c;拓…

JNPF-V5.x重磅来袭!

背景概述 行业背景 低代码⾏业经过⼏年的发展、沉淀&#xff0c;其产品的能⼒定位已逐渐清晰&#xff0c;低代码的核⼼价值是提升专业开发 ⼈员的效率&#xff0c;更便捷的调⽤多种能⼒的接⼝&#xff0c;适合IT能⼒强、IT背景复杂的企业使⽤。同时在客户认知层 ⾯上也以⽇…

2023.2版IDEA复制配置修改端口增加一个当前运行服务的操作流程

文章目录 前言操作流程截图 前言 在微服务技术学习中很多学习场景会使用到运行多个服务节点进行调试&#xff0c;想要去模拟集群部署&#xff0c;就需要去复制配置&#xff0c;本文讲解一下如何复制&#xff0c;以及修改端口号。 操作流程截图

【吊打面试官系列-MyBatis面试题】使用 MyBatis 的 mapper 接口调用时有哪些要求?

大家好&#xff0c;我是锋哥。今天分享关于 【使用 MyBatis 的 mapper 接口调用时有哪些要求&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 使用 MyBatis 的 mapper 接口调用时有哪些要求&#xff1f; 1、Mapper 接口方法名和 mapper.xml 中定义的每个 sql 的…

【Swiper】轮播图 笔记

文章目录 场景代码 场景 官网&#xff1a;Swiper - 最现代的移动触控滑块 - Swiper 中文 最近用svelte写轮播图&#xff0c;用了Swiper组件。需求是&#xff1a;一共三张图&#xff0c;来回切&#xff0c;保持循环&#xff08;1&#xff0c;2&#xff0c;3->2&#xff0c;…

2024年06月CCF-GESP编程能力等级认证Python编程四级真题解析

本文收录于专栏《Python等级认证CCF-GESP真题解析》&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 一、单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证…