Linux 多线程 | 线程的概念

news2024/12/23 8:47:00

线程的概念

线程是一个执行分支,执行粒度比进程更细,调度成本更低;

线程是进程内部的一个执行流;

线程是CPU调度的基本单位,进程是承担分配系统资源的基本实体。

之前我们学习过虚拟地址空间的知识,知道了进程创建PCB并将虚拟地址空间通过页表映射到物理内存中。

现在我们创建多个PCB并都指向同一个地址空间,让这几个PCB分别指向代码区中的不同位置的代码,那么当CPU调度不同的PCB的时候就可以运行同一个地址空间中的不同位置的代码,我们将在同一个进程中创建的多个PCB,其中的每一个PCB叫做一个线程。那么线程我们之前学习过的进程又是怎样的关系?在这里我们先将多个PCB看作是不同的执行流,将进程当做是承担分配系统资源的基本实体,而执行流就是在进程的资源中进行切换的。我们之前将的进程是内部只有一个task_struct的进程,也就是我们之前讲的进程是现在讲的进程的子集。然而在CPU的调度中只认PCB,不管它是线程还是进程,所以线程是CPU调度的基本单位。

不是所有的操作系统都是这样操作的。因为一个运行的操作系统中有很多的进程,那么就一定会有更多的线程,操作系统就需要对这这些线程进行管理,必须先描述,再组织。有些操作系统中就有着TCB(线程控制块) - 例如Windows内核中有真线程。Linux内核的设计复用PCB的结构体,使用PCB模拟线程的TCB,Linux没有真正意义上的线程,而是使用进程方案模拟。

今天我们学习到的执行流 <= 进程,因为Linux下没有真正的线程,那么我们就将这些称之为轻量级进程。下面我们简单的看一下,在图中这几个进程的PID都是一致的,LWP就表示轻量级进程ID,操作系统调度的时候,使用LWP来区分不同的线程,当进程中有多个线程的时候PID与LWP是相同的。

前面我们介绍了CPU、PCB、地址空间等上图中左半部分的内容,下面我们来讲一下与右侧页表、物理内存磁盘有关的内容。

页表

虚拟地址空间的基本单位是字节,所以我们虚拟地址空间上有2^32个地址 = 2^2*2^10*2^10*2^10 = 4GB。之前我们也说过要将虚拟地址映射到物理地址上,页表是一种软件,需要占据内存。极端情况下构建映射关系需要2^32*12(虚拟地址+物理地址+其余属性)*1byte = 48GB这样算下来非常的大,这显然是不可能的,说明Linux绝对不是这样构建的。

物理内存与磁盘

物理内存和磁盘之间的交互是一个高频的工作,之前在文件系统中我们说过OS在和磁盘这样的设备进行IO交互的时候,绝对不是按照字节为单位的,而是需要按照块为单位,4KB就是8个扇区。这个按照块为单位可以从两个方面来看,首先就是对于文件系统与编译器来说,这注定了文件在磁盘的时候就是以块为单位的。对于操作系统和内存来说,内存实际在进行内存管理的时候,同样需要以4KB为单位。我们把物理内存每一个4KB的块称之为页,承装这个的空间叫页框,在磁盘中每一个4KB叫做页帧。内存管理的本质就是将磁盘中的特定的4KB块(数据内容)放入到哪一个物理内存的4KB的空间(数据保存的空间)。

把物理内存分为4KB之后,还需要对其进行管理构建struct page{},在Linux内核中使用struct page mem[]数组对其进行管理,由于是按照4KB进行的分块,那么就只需要1,048,576大小的空间就可完成管理。

这时就有一个问题,假设我只需要10字节的数据,可以只IO10字节的数据为什么要IO4KB的数据?这里就有一个特性就是局部性原理 - 允许我们提前加载正在访问的数据的相邻或者附近的数据。通过预加载要访问的数据的附近数据来减少未来IO次数。虽然现在还不能够解释为什么IO是4KB,但是可以通过局部性原理解释为什么加载的数据会比我们需要的多。

虚拟到物理的转化

虚拟地址不是整体被使用的,它是按照10 + 10 + 12 比特划分的。前10个比特先映射一个页表,页表中的val存放的是页表2的起始地址,第二个10比特映射第二组页表,这些页表中储存的就是页框的起始地址,最后12个比特存储的就是页内偏移量,这个大小也就是4KB。这样就可以定位任意一个内存字节的位置:页框+偏移量。(基地址+偏移量)

 这样算下来条目大概只需要2^20 = 1MB大小的空间,页表2左边需要10个比特,右边需要20个比特,一共大概是四个字节,最终的整个页表结构就是4MB,这对比之前的空间大小就小了很多。而且一个进程不可能访问整个物理内存,那么页表就不会全部创建。我们把一级的页表称为页目录,页表2称为页表项,这个整体就被称之为页表。

我们在编写代码的时候任何一个变量或者对象,可能会存在多个字节但是取地址的时候永远只能拿到首地址,那么相类似我们想要获取变量就可以使用该变量的起始地址+类型(偏移量)的方式进行获取。

我们实际在申请malloc的时候,OS只需要在虚拟地址空间上申请就行了,只有在真正访问的时候OS才会自动给你申请或者填充页表+申请具体的物理内存,也就是当我们真正需要访问的时候,查询页表发现没有映射,但是确实申请了空间,那么MMU就会触发CPU的中断,让操作系统去申请空间,提供页表,然后继续执行代码。

页表实际上不仅仅只有对应的映射,还有着一些其他的属性,例如:RWX权限、U/K权限、是否命中等。下面这两句代码是会报错的,因为字符常量是不允许被修改,只允许被读取的。s里面保存的是指向字符的虚拟起始地址,*s寻址的时候必定会伴随着虚拟到物理的转化 --- MMU + 查页表的方式,对操作的权限进行审查 --- 虽然能够找到,但是操作是非法的,这样MMU就会发生异常,OS识别了异常,将其转换成信号发送给目标进程,那么在从内核态转换成用户态的时候就进行信号处理,终止进程。

char *s = "hello world";
*s = "s";

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

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

相关文章

大礼包 - 华为机试真题题解

考试平台&#xff1a; 时习知 分值&#xff1a; 200分&#xff08;第二题&#xff09; 考试时间&#xff1a; 2024-01-31 &#xff08;两小时&#xff09; 题目描述 某公司针对新用户推出大礼包&#xff0c;从任意一天注册开始&#xff0c;连续登陆 x 天&#xff0c;每天可以领…

C# 信号量(Semaphore)详细使用案例

文章目录 简介信号量的工作原理使用场景使用示例其他使用实例1. 数据库连接池管理2. 文件读写同步3. 生产者消费者问题4. 打印任务队列同步5. Web服务器并发请求限制 简介 在C#中&#xff0c;信号量&#xff08;Semaphore&#xff09;是.NET框架提供的一个同步类&#xff0c;位…

vue3:23—自定义hooks

正是因为有了hooks&#xff0c;组合式才发挥出了威力 其实 hooks 和 vue2 中的 mixin 有点类似&#xff0c;但是相对 mixins 而言&#xff0c; hooks 更清楚复用功能代码的来源, 更清晰易懂。 如何定义hooks 具备可复用功能&#xff0c;才需要抽离为 hooks 独立文件函数名/文…

【Linux】Ext2 文件系统

文件系统 前言一、磁盘硬件1. 磁盘的物理存储结构2. 磁盘存储的逻辑抽象结构 二、理解 Ext2 文件系统1. 初步理解文件系统2. 深入理解文件系统&#xff08;1&#xff09;inode Table&#xff08;2&#xff09;Data blocks&#xff08;3&#xff09;inode Bitmap&#xff08;4&a…

Lambda表达式(匿名函数)

C11中引入了lambda表达式&#xff0c;定义匿名的内联函数。 我们可以直接原地定义函数而不用再跑到外面去定义函数跳来跳去。 同时在stl的排序上也有作用。 [capture] (parameters) mutable ->return-type {statement}下面逐一介绍各个参数的含义. [capture] : 捕获&#…

【Spring】自定义注解 + AOP 记录用户的使用日志

目录 ​编辑 自定义注解 AOP 记录用户的使用日志 使用背景 落地实践 一&#xff1a;自定义注解 二&#xff1a;切面配置 三&#xff1a;Api层使用 使用效果 自定义注解 AOP 记录用户的使用日志 使用背景 &#xff08;1&#xff09;在学校项目中&#xff0c;安防平台…

阿里计算巢:开启数据集市场的宝库,助力AI研究和应用

阿里计算巢 阿里数据巢提供了一个丰富的数据集市场&#xff0c;官方地址&#xff1a; https://computenest.console.aliyun.com/dataset/service/cn-hangzhou 可以看到数据集内容涵盖了多个领域&#xff0c;且还在不断增加中。关键是免费&#xff01;且支持下载到本地。 以下…

oracle 根据身份证号码与指定日期计算年龄

自定义函数&#xff1a; CREATE OR REPLACE FUNCTION 获取年龄(身份证号 varchar2, 指定时间 date) RETURN varchar2 AS 年龄 varchar2(16); BEGINif length(身份证号) >18 thenSELECT TRUNC( MONTHS_BETWEEN(指定时间, TO_DATE(SUBSTR(身份证号, 7, 8), YYYYMMDD) …

Django学习记录01

1.项目结构 djangoProject02 ├── manage.py 【项目的管理&#xff0c;启动项目、创建app、数据管理】【不要动】【常常用】 └── jangoProject02 ├── __init__.py ├── settings.py 【项目配置】 【常常修改】 ├── urls.py …

Linux 查看系统信息 + 服务信息命令(简记)

概述 作用&#xff1a;Linux 运维工作中常用的命令速查 小步教程 (xiaobuteach.com) Linux 命令大全 | 菜鸟教程 (runoob.com) 文本编辑器vim 本章大纲 | 小步教程 vim 多文件编辑 | 小步教程 常用 ps 查看服务启动命令 Linux ps 命令 | 菜鸟教程 (runoob.com) # 查找…

Linux进程信号处理:深入理解与应用(2​​)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;its 6pm but I miss u already.—bbbluelee 0:01━━━━━━️&#x1f49f;──────── 3:18 &#x1f504; ◀️…

32ADC模数转换器&AD单通道&多通道

目录 一.简介 二.逐次逼近法​编辑 三.结构框图 四.小tips (1)转换模式 &#xff08;2&#xff09;触发控制 &#xff08;3&#xff09;数据对齐 &#xff08;4&#xff09;转换时间 &#xff08;5&#xff09;校准 &#xff08;6&#xff09;硬件电路 五.相关函数 …

Java语法学习IO流

Java语法学习IO流 大纲 文件IO流 具体案例 1. 文件 基本介绍 创建文件 第一种&#xff1a; public static void main(String[] args) {String filePathName "d:\\news1.txt";File file new File(filePathName);try {file.createNewFile();} catch (IOExceptio…

vulhub中Apache Druid 代码执行漏洞复现(CVE-2021-25646)

Apache Druid是一个开源的分布式数据存储。 Apache Druid包括执行嵌入在各种类型请求中的用户提供的JavaScript代码的能力。这个功能是为了在可信环境下使用&#xff0c;并且默认是禁用的。然而&#xff0c;在Druid 0.20.0及以前的版本中&#xff0c;攻击者可以通过发送一个恶…

2018 年全国职业院校技能大赛高职组“信息安全管理与评估”赛项任务书(笔记解析)

1. 网络拓扑图 2. IP 地址规划表 3. 设备初始化信息 阶段一 任务 1:网络平台搭建 1、根据网络拓扑图所示,按照 IP 地址参数表,对 WAF 的名称、各接口 IP 地址 进行配置。 2、根据网络拓扑图所示,按照 IP 地址参数表,对 DCRS 的名称、各接口 IP 地址 进行配置。 3、根据网…

C++项目 -- 高并发内存池(二)Thread Cache

C项目 – 高并发内存池&#xff08;二&#xff09;Thread Cache 文章目录 C项目 -- 高并发内存池&#xff08;二&#xff09;Thread Cache一、高并发内存池整体框架设计二、thread cache设计1.整体设计2.thread cache哈希桶映射规则3.TLS无锁访问4.thread cache代码 一、高并发…

CCF迎来新风采:揭晓2024-2026年度执行机构负责人名单!

会议之眼 快讯 中国计算机学会&#xff08;CCF&#xff09;成立于1962年&#xff0c;是一家全国性学会&#xff0c;拥有独立社团法人地位&#xff0c;同时是中国科学技术协会的会员单位。作为中国计算机及相关领域的学术团体&#xff0c;CCF的宗旨在于为该领域专业人士的学术和…

C

extern int a; //同一个项目声明 int r a > b ? a : b; 错误 scanf 不输入‘\n’,getchar()输入\n; printf()返回值 0次 system("cls"); 可以调用命令行函数 time(NULL)时间戳 srand((unsigned)time(NULL)); //随机数种子 int rev rand()%1001; //随…

Linux---yum命令详解

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.概念2.yum的配置信…

Open CASCADE学习|拓扑变换

目录 平移变换 旋转变换 组合变换 通用变换 平移变换 TopoDS_Shape out;gp_Trsf theTransformation;gp_Vec theVectorOfTranslation(0., 0.125 / 2, 0.);theTransformation.SetTranslation(theVectorOfTranslation);BRepBuilderAPI_Transform myBRepTransformation(out, th…