Linux 多线程 | 线程的概念

线程的概念

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

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

线程是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.hqwc.cn/news/451165.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

倾斜摄影轻量化,这样才规范!

自然资源部发布了《倾斜数字摄影测量技术规程》等17项行业标准报批稿公示&#xff0c;其中高频出现的倾斜摄影技术&#xff0c;重回大众视野。 倾斜摄影技术是国际测绘领域近些年发展起来的一项高新技术&#xff0c;它颠覆了以往正射影像只能从垂直角度拍摄的局限&#xff0c;通…

69.请描述Spring MVC的工作流程?描述一下 DispatcherServlet 的工作流程?

69.请描述Spring MVC的工作流程&#xff1f;描述一下 DispatcherServlet 的工作流程&#xff1f; 核心架构的具体流程步骤如下&#xff1a; 首先用户发送请求——>DispatcherServlet&#xff0c;前端控制器收到请求后自己不进行处理&#xff0c;而是委托给其他的解析器进行…

Windows内存管理 - 虚拟内存地址概念(Virtual Memory Address)

虽然可以寻址4GB的内存&#xff0c;而在PC里往往没有如此多的真实物理内存。操作系统和硬件&#xff08;这里指的是CPU中的内存管理单元MMU&#xff09;为使用者提供了虚拟内存的概念。Windows的所有程序&#xff08;包括Ring0层和Ring3层的程序&#xff09;可以操作的都是虚拟…

React实例之完善布局菜单(一)

今天我们来用所学的知识来做一个布局菜单的组件, 针对这个组件我之前写过一个教程 React之布局菜单-CSDN博客&#xff0c;那个呢比较基础&#xff0c;这节课算是对那个教程的一个扩展和补充。这个实例讲完&#xff0c;这个系列就算告一段落了。先看效果 这个教程要求对React知识…

Java中动态修改注解的值

1. 描述 部分场景需要动态修改注解的值。例如&#xff0c;我们使用自定义注解控制接口流量&#xff0c;如果需要动态修改流量值&#xff0c;可以使用反射的方法实现。 2. 步骤 获取注解从注解中获取memberValues属性(map)使用put方法更新对象的值 3. 代码实现 该部分代码主…

YOLO部署实战(3):Darknet训练模型权重

1 一些概念和问题 YOLO中的darknet到底指的是什么&#xff1f; darknet到底是一个类似于TensorFlow、PyTorch的框架&#xff0c;还是一个类似于AlexNet、VGG的模型&#xff1f; 其实都是。YOLO作者自己写的一个深度学习框架叫darknet&#xff08;见YOLO原文2.2部分&#xff…

Hexo设置少量固定的动态背景图

文章目录 前言先准备素材问题分析代码实现逻辑写在哪先搭建基本框架然后添加图片链接动画效果 前言先准备素材问题分析代码实现逻辑写在哪先搭建基本框架然后添加图片链接动画效果 前言 在以前的这篇文章中&#xff0c;我们设置了一些动态背景。 这次我们加一丁点优化&#x…

MySQL 用户管理

重点&#xff1a; 视图&#xff0c;函数&#xff0c;存储过程&#xff0c;触发器&#xff0c;事件&#xff08; 了解 &#xff09; 用户管理&#xff0c;密码管理 grant revoke 权限管理 MySQL 架构&#xff08; 了解 &#xff09; 存储引擎&#xff1a;MyISAM 和 InnoDB …

展馆设计的必备要素有哪些

1、空间的设计 展馆要想配得上优秀这两个字眼&#xff0c;那么比较基本的表现就是要具有美感&#xff0c;要规划&#xff0c;合理美观的造型&#xff0c;并在此基础上重视互动融合&#xff0c;既要拥有特色具有创意的风格&#xff0c;又要能够和整个空间和谐又统一。布展内容结…

Python入门:生成器迭代器

一、列表生成式 现在有个需求&#xff0c;列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]&#xff0c;要求你把列表里的每个值加1&#xff0c;怎么实现&#xff1f;你可能会想到2种方式 二逼青年版 1 2 3 4 a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] b [] for i in a:b.append(i1) print(b) …

ele-h5项目使用vue3+vite+vant4开发:第四节、业务组件-SearchView组件开发

需求分析 展示切换动画搜索框输入文字&#xff0c;自动发送请求搜索结果展示搜索状态维护历史搜索展示&#xff0c;点击历史搜索后发送请求历史搜索更多切换动画效果 <script setup lang"ts"> import OpSearch from /components/OpSearch.vue import { ref } f…

Sequine - Sequencing Animation and Visual Scripting

Sequine是Unity的通用序列工具和可视化脚本。您还可以按需播放动画片段,而不受 Animator 控制器的限制! 以下是可以使用工具进行的工作: 直接序列动画剪辑,不受animator控制器的限制 用可堆叠行为序列文本动画 序列脚本功能/命令执行 序列可以存在于任何类型的Unity对象中,…