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.mzph.cn/news/666195.shtml

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

相关文章

NetSuite 权限不足用户如何查询完整数据

假设我们做了一个Saved Search&#xff0c;用于统计所有涉及库存的事务类型&#xff0c;包括出入库、库存调整、生产报工、拆解、Standalone Invoice和Bill&#xff0c;等等。通过合计这些事务类型&#xff0c;我们就可以得到一个存货报表&#xff0c;能够得到任一时间点的库存…

第十一讲_JavaScript文档对象模型DOM(二)

JavaScript文档对象模型DOM&#xff08;二&#xff09; 1. 事件是什么2. 事件类型3. 添加和移除事件处理器4. 事件对象4.1 事件对象的常用属性 5. 事件流5.1 阻止默认行为5.2 事件冒泡 1. 事件是什么 事件是发生在编程的系统中的事情&#xff0c;当事件发生时&#xff0c;系统…

【.net】缓存操作

类&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web; using System.Web.Caching;namespace RisunFactoryLibrary {public class CacheHelper{/// <summary>/// 创建缓存项的文件依赖/// </sum…

线程同步解析

一 线程同步 1 同步的意义 现实中抢票可能没票了还在抢票&#xff0c;然后线程就会一直在加锁解锁&#xff0c;就会导致其它线程抢不到锁而产生饥饿问题&#xff0c;我们前面也提过usleep就是让线程被切换&#xff0c;能让其它线程去申请锁&#xff0c;这种方式并不好&#xf…

蓝桥杯备战——13.PCF8591芯片的使用

目录 1.芯片简介2.读写时序3.控制字4.代码封装库5.原理图分析6.使用示例 1.芯片简介 截取自NXP的PCF8591芯片数据手册&#xff0c;我把重点关注部分划出来了&#xff0c;请务必自行阅读一遍数据手册&#xff01; 2.读写时序 ①器件地址&#xff1a; Bit0决定是读还是写操作&…

最新GPT4.0使用教程,AI绘画,GPT语音对话使用,DALL-E3文生图

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画&#xff0c;文档对话总结DALL-E3文生图&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和…

优质成长:新生儿补充维生素B6的关键注意事项

引言&#xff1a; 维生素B6&#xff0c;作为B族维生素的一员&#xff0c;对于新生儿的神经系统发育和代谢功能至关重要。本文将深入探讨维生素B6的作用、新生儿补充的必要性&#xff0c;以及在补充维生素B6时应该注意的事项&#xff0c;为父母提供科学、全面的育儿指南。 第一…

WebChat——一个开源的聊天应用

Web Chat 是开源的聊天系统&#xff0c;支持一键免费部署私人Chat网页的应用程序。 目录树 TOC &#x1f44b;&#x1f3fb; 开始使用 & 交流&#x1f6f3; 开箱即用 A 使用 Docker 部署B 使用 Docker-compose 部署C 使用 Jar包 本地部署 ⌨️ 本地开发&#x1f91d; 参与…

开源浏览器Firefox:使用Docker本地部署并远程访问进行测试

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 部署Firefox二. 本地访问Firefox三. Linux安装Cpolar四. 配置Firefox公网地址…

网络原理-TCP/IP(5)

TCP协议 延迟应答 它也是基于滑动窗口,提高效率的一种机制,结合滑动窗口以及流量控制,能够以延迟应答ACK的方式,把反馈的窗口,搞大.核心在于允许范围内,让窗口尽可能大. 如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小. 1.假设接收端缓冲区为1M.一次收到了5…

树状数组相关

前置细节 &#xff0c;得到转二进制后&#xff0c;从右往左数第一个1与之前所有的0构成数树状数组最终形成如上图结构维护的是的信息&#xff0c;如即到上层&#xff0c;包含当前区间的大区间&#xff0c;如即到同一层的前一个&#xff0c;与当前区间无关的另一同等大小的区间…

第十二讲_JavaScript浏览器对象模型BOM

JavaScript浏览器对象模型BOM 1. 浏览器对象模型介绍2. location2.1 常用的属性2.2 常用的方法 3. navigator3.1 常用的属性 4. history4.1 常用的方法&#xff1a; 5. 本地存储 1. 浏览器对象模型介绍 BOM(Browser Object Model) 是指浏览器对象模型&#xff0c;浏览器对象模…

Git--07--GitExtension

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、GitExtension下载GitExtension官网下载教程 二、GitExtension安装三、GitExtension配置四、GitExtension使用 一、GitExtension下载 官网下载&#xff1a; http…

Hive 主要内容一览

Hive架构 用户接口&#xff1a;Client CLI&#xff08;command-line interface&#xff09;、JDBC/ODBC(jdbc访问hive) 元数据&#xff1a;Metastore 元数据包括&#xff1a;表名、表所属的数据库&#xff08;默认是default&#xff09;、表的拥有者、列/分区字段、表的类型&am…

Unity中的GUI

GUI&#xff1a;游戏用户交互界面&#xff0c;一个代码驱动的UI系统 GUI的主要作用 1、作为程序员的调试工具 2、为脚本组件创建自定义监视面板 3、创建新的编辑器窗口和工具以拓展Unity本身(一般作为内置游戏工具) GUI工作原理 1、OnGUI是每帧执行&#xff0c;相当于专门绘…

Mybatis基础教程及使用细节

本篇主要对Mybatis基础使用进行总结&#xff0c;包括Mybatis的基础操作&#xff0c;使用注解进行增删改查的练习&#xff1b;详细介绍xml映射文件配置过程并且使用xml映射文件进行动态sql语句进行条件查询&#xff1b;为了简化java开发提高效率&#xff0c;介绍一下依赖&#x…

【chisel】 环境,资料

Chisel环境搭建教程&#xff08;Ubuntu&#xff09; 根据上边的link去安装&#xff1b; 目前scala最高版本用scala-2.13.10,太高了 没有chisel的库文件支持&#xff1b;会在sbt下载的过程中报错&#xff1b; [error] sbt.librarymanagement.ResolveException: chisel chisel目…

爬虫学习笔记-scrapy安装及第一个项目创建问题及解决措施

1.安装scrapy pycharm终端运行 pip install scrapy -i https://pypi.douban.com/simple 2.终端运行scrapy startproject scrapy_baidu,创建项目 问题1:lxml版本低导致无法找到 解决措施:更新或者重新安装lxml 3.项目创建成功 4.终端cd到项目的spiders文件夹下,cd scra…

C语言实现网络爬虫

我常使用C语言写网络爬虫&#xff0c;能够将网页爬出来&#xff0c;但是&#xff0c;图片却爬不出来&#xff0c;有没有大佬帮解决一下&#xff01;&#xff01;&#xff01; 代码&#xff1a; #include <stdio.h> #include<string.h> #include<WinSock2.h>…

【大厂AI课学习笔记】1.4 算法的进步(5)关于GPU

——关于GPU GPU&#xff0c;即图形处理器&#xff0c;最初是为了加速计算机图形处理而设计的。然而&#xff0c;随着时间的推移&#xff0c;研究人员发现GPU的并行处理能力非常适合执行深度学习中的大规模矩阵运算。这一点在吴恩达教授的论文中得到了充分体现&#xff0c;他利…