【Linux】多线程概念再理解

这篇具有很好参考价值的文章主要介绍了【Linux】多线程概念再理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 物理内存与磁盘的关系

如何理解物理内存?

物理内存的宽度为1字节
如使用c语言,可以定义出char类型(1字节),在虚拟地址空间上可以把1字节的单位映射到内存中

如果认为内存是按照字节为单位去划分的,实际上是不正确的


【Linux】多线程概念再理解
  • 把数据从磁盘换入物理内存,把数据从物理内存换入磁盘,是一个高频的工作,物理磁盘是一个机械设备,作为外设
    整体会很常慢,使整机的效率低下,若过多进行IO,就导致过多的寻址操作,即 效率低下
  • 当有100MB的空间写到磁盘中,1次写入到磁盘中,还是分100次写入,每次写入1MB的数据 那个效率高?
  • 1次写入到磁盘中肯定是更高,因为只需要一次寻址操作
  • 说明OS和磁盘进行IO交互时,绝对不是按照字节为单位的,而是要按照 块(4KB) 为单位
  • 若只想修改一个比特位,也必须IO4KB,因为 4KB 作为一个块 是一个整体

若要把文件加载到内存,以4KB为单位,需要在两个方面下考虑

1.文件系统 +编译器
若要从外设磁盘中读取4KB,前提是文件系统认4KB,文件本身按照4KB进行存储
所以文件在磁盘时,就以块为单位的4KB
文件也包括可执行程序和动态库,也是需要存到磁盘上的,都要按照4KB为单位储存到磁盘上


2.操作系统+内存
当磁盘按照4KB的方式把数据存好, 物理内存也要提供保存4KB的数据空间

【Linux】多线程概念再理解

把物理内存中存放数据的空间称之为 页框
磁盘中数据块称之为 页帧
内存在实际进行内存管理的时候,也要是4KB为单位的


内存管理的本质:将磁盘中特定的4KB块(数据内容)放入到哪一个物理内存的4KB空间(数据保存的空间)

凭什么物理内存要分为一个个4KB大小?

操作系统要管理这些配置
而管理的本质是先描述,在组织
先描述
内核中,有对应的配置数据结构struct page 来管理对应的配置
struct page 是一个结构体,包含这个配置的状态
再组织
通过数组的方式来进行管理


【Linux】多线程概念再理解

数组有下标存在,物理内存中分别对块进行编号0-n ,
若想要在查询物理内存中那些位置被占用,通过找到对应数组下标,即可看到对应的结构体里面对应的状态
若没有分配,则将状态置为1


若以块方式存储,则多出的空间是否浪费?

假设访问一段代码只有10个字节,load时以4KB为块进入磁盘中,则会多出来2KB的空间

局部性原理的特性, 允许提前加载正在访问数据的相邻或者附近的数据

通过预先加载要访问数据的附近的数据来减少未来的IO次数
多加载进来的数据,本质就是 数据的预加载

如果还不懂,则点击查看:局部性原理详细解释


2. 虚拟地址到物理地址的转换

一个虚拟地址对应32个比特位
虚拟地址不是被整体使用的,被划分 10 +10 +12


【Linux】多线程概念再理解

当前页表需要2^10行
根据前10个比特位的二进制序列,找到页表1所对应的位置


【Linux】多线程概念再理解
页表1的左侧代表 前10个比特位,右侧代表另一个页表的起始地址
根据 第二个 10个比特位,找到页表2对应的位置
页表2的左侧代表 第二个 10个比特位 , 右侧代表物理地址(页框的起始地址)
对应页框的起始地址+ 虚拟地址的低12个比特位对应的地址数据 本质为 页内偏移

定位到页框内的任意地址

3. 缺页中断

申请物理内存后,不一定立马用,若立马申请物理内存,不用就导致内存一直被占着,处于闲置的状态,不是高效的表现


实际申请malloc内存时,操作系统只要给你在虚拟地址空间上申请就行了,当真正访问时,操作系统会自动申请或者填充页表以及申请具体物理内存


【Linux】多线程概念再理解
MMU查询页表找不到,但确实空间已经申请了,就会触发缺页中断,
OS会执行对用的处理方法 即申请物理内存用于填充页表,再返回继续执行代码

4. 为什么字符常量区是不允许被修改的?

【Linux】多线程概念再理解

hello world在常量区,只能被读取,不能被修改,所以*s=‘w’,是错误的


s里面保存的是指向的字符的虚拟起始地址
*s寻址时,会伴随虚拟地址到物理地址的转换


通过查页表的方式,对操作进行权限查询,发现只有读的权限,但没有修改的权限,所以MMU(内存管理单元)异常,
OS识别到异常,给目标进程发送信号 即 在内核态转换为用户态时,进行信号处理—终止进程

5. 线程缺点

1. 性能损失
创建过多的线程,只有少数在运行,大多数的线程来回被调度 造成性能损失 即多线程创建不合理


2.健壮性降低
如果一个线程出现问题,可能会对整个进程造成影响


3.缺乏访问控制
每个执行流通过同一个地址空间看到的资源是相同的

对于健壮性降低的验证

【Linux】多线程概念再理解

共有三个死循环,若只有一个执行流,三个死循环不可能执行
若都执行了一定有三个执行流


【Linux】多线程概念再理解

说明有三个执行流


【Linux】多线程概念再理解
LWP称为轻量级进程 即线程
每个线程的PID相同,说明属于同一个进程
PID与LWP相同,说明是主线程


【Linux】多线程概念再理解

在线程2中设置非法操作,使线程崩溃


【Linux】多线程概念再理解

运行时会发生段错误, 刚开始线程是可以运行的,但是发生段错误后,进程崩溃了

在多线程程序中,任何一个线程崩溃了,最终都会导致进程崩溃

缺乏访问控制的验证

【Linux】多线程概念再理解
定义一个全局变量,线程1和主线程把全局变量的地址和全局变量的数据打印出来
线程2把全局变量的地址和数据的同时,把数据++


【Linux】多线程概念再理解

当有一个线程中的数据修改后,所有的线程中的数据都跟着修改

以全局变量为例,在多线程场景中,多个线程看到的是同一个全局变量文章来源地址https://www.toymoban.com/news/detail-448612.html

到了这里,关于【Linux】多线程概念再理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux学习】多线程——页表详解 | 线程概念 | 线程理解

    🐱作者:一只大喵咪1201 🐱专栏:《Linux学习》 🔥格言: 你只管努力,剩下的交给时间! 我们在之前一直都提到页表,知道它的作用是将虚拟地址映射到物理地址,但是它具体怎么映射的,它的结构是什么样的,并没有提及过。 上诉代码,会在运行时报错,原因是str指向

    2024年02月05日
    浏览(41)
  • 内存|内存的概念、内存的作用、内存的物理结构及内存使用

    内存是硬件 ,是用于存放数据的硬件。 程序执行前需要先放到内存中才能被 CPU 处理。 内存是与 CPU 沟通的桥梁,计算机中所有程序的运行都要依靠内存,内存对计算机的影响非常大。 内存又被称为主存,用于存放 CPU 中的运算数据以及硬盘等外部存储设备交换的数据。 C

    2023年04月16日
    浏览(44)
  • 2.3.1操作系统-存储管理:页式存储、逻辑地址、物理地址、物理地址逻辑地址之间的地址关系、页面大小与页内地址长度的关系、缺页中断、内存淘汰规则

    在存储管理当中,操作系统会负责将外存的一些文件调入到内存当中,以便给CPU调用,如果调用的内容不在内存当中,那么会产生一种中断,叫做缺页中断。然后从外存调数据,调完数据再返回,接着访问之前的断点部分。 在调用的过程当中,如果是一个几十G的文件,调入

    2024年02月03日
    浏览(47)
  • java八股文面试[多线程]——主内存和工作内存的关系

    JAVA内存模型(JMM) 共享变量 :如果一个变量在多个线程的工作内存中 都存在副本 ,那么这个变量就是这几个线程的共享变量。 上面的工作内存其实是java内存模型 抽象出来的概念 ,下面简要介绍一下java内存模型(JMM)。 java内存模型( java memory model ): 描述了java程序中各

    2024年02月10日
    浏览(47)
  • CPU相关概念:物理cpu数、核数、逻辑cpu数,12核20线程实例分析

    学习多线程的时候,需要了解CPU和线程的相关概念,但是网上给出的概念让我实际操作时产生了混淆。 本文与其他文章不一样的点在于,解释为什么逻辑CPU数不是核数的2倍(比较新的处理器会有这种情况),能够解答非计算机专业人士的问题。 CPU信息的查询方法参见本文第

    2024年02月13日
    浏览(39)
  • 【多线程系列-01】深入理解进程、线程和CPU之间的关系

    多线程系列整体栏目 内容 链接地址 【一】深入理解进程、线程和CPU之间的关系 https://blog.csdn.net/zhenghuishengq/article/details/131714191 【二】java创建线程的方式到底有几种?(详解) https://blog.csdn.net/zhenghuishengq/article/details/127968166 【三】深入理解java中线程的生命周期,任务调度 ht

    2024年02月16日
    浏览(70)
  • SpringBoot自主监控,获取服务信息、JVM、CPU、内存、磁盘、堆、线程、GC等

    1. 简介   在日常开发中一些关键的业务服务,期望在高并发状态下可以正常工作,或在异常情况时可以记录当时的性能信息,所以就需要进行监控。常见的监控例如: Prometheus 可以实现这个需求,如果需要更加简单方便的自主监控能力,可以引入本博客中的方案。 2. 相关博

    2024年02月15日
    浏览(48)
  • Linux 内核学习 3 - 虚拟内存和物理内存

    虚拟内存其实是 CPU 和操作系统使用的一个障眼法,联手给进程编织了一个假象,让进程误以为自己独占了全部的内存空间 : 在 32 位系统中,进程以为自己独占了 3G 的内存空间。 在 64 位系统中,进程以为自己独占了 128T 的内存空间。 这么做的好处是,操作系统为每个进程

    2024年01月21日
    浏览(51)
  • 【Linux驱动开发】004 物理内存与虚拟内存的转换

    MMU 全称叫做 Memory Manage Unit,也就是 内存管理单元。 在老版本的 Linux 中要求处理器必须有 MMU,但是现在Linux 内核已经支持无 MMU 的处理器了。MMU主要功能: ①、完成虚拟空间到物理空间的映射。  ②、内存保护,设置存储器的访问权限,设置虚拟存储空间的缓冲特性。 

    2024年02月05日
    浏览(45)
  • 【Linux系统化学习】进程地址空间 | 虚拟地址和物理地址的关系

    ========================================================================= 个人主页点击直达: 小白不是程序媛 Linux专栏: Linux系统化学习 代码仓库: Gitee ========================================================================= 目录 虚拟地址和物理地址 页表 进程地址空间 进程地址空间存在的意义 我们在学

    2024年02月05日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包