【Linux】多线程概念再理解

news2024/11/18 22:54:01

文章目录

  • 1. 物理内存与磁盘的关系
    • 如何理解物理内存?
    • 凭什么物理内存要分为一个个4KB大小?
    • 若以块方式存储,则多出的空间是否浪费?
  • 2. 虚拟地址到物理地址的转换
  • 3. 缺页中断
  • 4. 为什么字符常量区是不允许被修改的?
  • 5. 线程缺点
    • 对于健壮性降低的验证
    • 缺乏访问控制的验证

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

如何理解物理内存?

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

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


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

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

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


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

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


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

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

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


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


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

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

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

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

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


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

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


在这里插入图片描述

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


在这里插入图片描述
页表1的左侧代表 前10个比特位,右侧代表另一个页表的起始地址
根据 第二个 10个比特位,找到页表2对应的位置
页表2的左侧代表 第二个 10个比特位 , 右侧代表物理地址(页框的起始地址)
对应页框的起始地址+ 虚拟地址的低12个比特位对应的地址数据 本质为 页内偏移

定位到页框内的任意地址

3. 缺页中断

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


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


在这里插入图片描述
MMU查询页表找不到,但确实空间已经申请了,就会触发缺页中断,
OS会执行对用的处理方法 即申请物理内存用于填充页表,再返回继续执行代码

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

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


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


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

5. 线程缺点

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


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


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

对于健壮性降低的验证

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


说明有三个执行流


在这里插入图片描述
LWP称为轻量级进程 即线程
每个线程的PID相同,说明属于同一个进程
PID与LWP相同,说明是主线程


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


在这里插入图片描述

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

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

缺乏访问控制的验证

在这里插入图片描述
定义一个全局变量,线程1和主线程把全局变量的地址和全局变量的数据打印出来
线程2把全局变量的地址和数据的同时,把数据++


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

以全局变量为例,在多线程场景中,多个线程看到的是同一个全局变量

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

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

相关文章

七大软件架构设计原则详解

目录 1、概述 2、七大设计原则 2.1、开闭原则 2.2、里氏替换原则 2.3、依赖倒置原则 2.4、单一职责原则 2.5、接口隔离原则 2.6、迪米特法则 2.7、合成复用原则 3、最后 VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...&…

22 KVM管理虚拟机-查询虚拟机信息

文章目录 22 KVM管理虚拟机-查询虚拟机信息22.1 概述22.2 前提条件22.3 查询主机上的虚拟机信息22.4 查询虚拟机基本信息22.5 查询虚拟机基本信息示例 22 KVM管理虚拟机-查询虚拟机信息 22.1 概述 管理员在管理虚拟机的过程中经常需要知道一些虚拟机信息,libvirt提…

机器学习强基计划10-1:为什么需要集成学习?核心原理是什么?

目录 0 写在前面1 集成学习概念与优势2 结合策略梳理2.1 加权平均法2.2 投票法2.3 学习法 3 误差-分歧分解 0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器…

工业能效提升行动计划-安科瑞EMS能效管理平台解决方案

摘要 2022年6月29日工信部、发改委、财政部、生态环境部、国资委、市场监管总局六部门联合下发《关于印发工业能效提升行动计划的通知》(工信部联节〔2022〕76号,以下简称《行动计划》),主要目的是为了提高工业领域能源利用效率&…

读《Spring Boot 3核心技术与最佳实践》有感

我是谁? 👨‍🎓作者:bug菌 ✏️博客:CSDN、掘金、infoQ、51CTO等 🎉简介:CSDN/阿里云/华为云/51CTO博客专家,C站历届博客之星Top50,掘金/InfoQ/51CTO等社区优质创作者&am…

硬件系统工程师宝典(23)-----磁珠选型,你做对了吗?

各位同学大家好,欢迎继续做客电子工程学习圈,今天我们继续来讲这本书,硬件系统工程师宝典。上篇我们说到常用的电容种类有铝电解电容、钽电容、陶瓷电容、OSCON固态电容和薄膜电容,应用时都有各自的特点;电感可分为电源…

最新版Cesium使用天地图三维地形、地名服务

目录 1、项目地址2、实现效果3、实现方法 1、项目地址 可直接运行。 https://github.com/zhengjie9510/cesium-tdt 2、实现效果 3、实现方法 参考博客修改cesiumTdt.js。

2-单片机GPIO相关知识点及流水灯和按键采集小实验

目录 小问题 :单片机上电后第一个执行的程序是? 【1】GPIO 1.定义 2.应用 I - Input 输入采集 O - Output 输出控制 3.GPIO结构框图 4.功能描述 输入功能 5.相关寄存器 【2】输出控制实验 实验:点亮一盏LED灯 1.实验…

Jenkins使用k8s部署应用

1、jenkins在k8s内部署(请参考其他人的文章) 2、jenkins安装kubenents相关插件 3、配置k8s云 非常重要,目的是实现jenkins可以远程调用k8s进行部署,并可实现安装jenkins-slave进行构建。使得不再依赖jenkins单机能力进行构建,比较…

Vue电商项目--search模块面包屑的制作

监听路由的变化再次发请求获取数据 复习: 这里要复习的一点就是:我们这个Search组件里面还有一个子组件,SearchSelector。 还有上面画圈的部分:在发请求之前,把接口需要传递参数,进行整理(在给…

北京超算云中心pytorch/mmcv环境配置

北京超算云中心pytorch/mmcv环境配置 which python查看python路径source deactivate mmseg-dev退出当前环境sbatch --gpus2 ./run.sh提交训练任务作业parajobs查看已提交作业sacncel ID取消作业 先放上常用的基本命令。 下面开始配置pytorch pytorch环境配置 1、输入modul…

Highcharts Core Crack

Highcharts Core Crack 添加了新的“x轴交叉”和“y轴交叉”选项,使创建数学绘图的轴布局变得更容易。 添加了新的“series.legendSymbol”选项。 Highcharts是业界领先的JavaScript图表库。Highcharts被数以万计的开发人员和全球100家最大公司中超过80%的公司使用。…

docker创建ubuntu容器,且在该容器内启动jar包

一、创建并运行ubuntu容器 docker run --name docker_ubuntu(容器名称) -it -v /home/docker_ubuntu:/share // 将本地路径挂载到share目录下--restartalways --privilegedtrue // 设置容器退出时重启容器-p 20000:20000 // 映射内外端口,这里可以多个端口&…

Kubeadm方式搭建K8S集群

Kubeadm方式搭建K8S集群 环境准备 在虚拟机里安装三台centos 7.x操作系统 配置系统名称和ip地址(同一网段)如: 角色IPmaster192.168.66.100node1192.168.66.101node2192.168.66.102 三台机器都要执行的命令:(使用xshell执行命令更方便) …

Cloudcanal数据同步神器

一.背景与需求 最近有个OLAP的需求,我们需要将MySQL的一些数据(这种数据有一种特性就是一旦产生记录,以后不会再进行修改、删除操作,例如登录日志、操作日志等诸如此类)。这种数据特性正好符合Clickhouse的用武之地,我们经过调研最…

【冲刺蓝桥杯】牛客竞赛补题 + 算法模板总结

🍎 博客主页:🌙披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 C/C专栏 🌙请不要相信胜利就像山坡上的蒲公英一样唾…

Songtell.CN:用AI解锁您最喜欢的歌曲背后的含义!

🎧听歌不止是享受,还有深度的情感寓意! 🎧探索音乐真谛,Songtell.CN带你用 AI 解锁歌曲深度含义! 🎶音乐是人类的共同语言,它能够温暖我们的心灵,带给我们力量和勇气。…

参与辅助服务的用户侧储能优化配置及经济分析(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Web APIs之DOM-获取元素

一.Web API基本认知 二.获取DOM对象 三.操作元素内容 四. 操作元素属性 五.定时器-间歇函数 一、Web API基本认知 *作用和分类 *什么是DOM *DOM树 *DOM对象 1.作用和分类 (1)作用:使用JS去操作html和浏览器 (2&#xff09…

【经验分享】一种高内聚低耦合的消息分发模块的设计与实现

【经验分享】一种高内聚低耦合的消息分发模块的设计与实现 又到了每天的open话题:【代码面对面】时刻,让我们一起在摸鱼中学习技术吧。今天的话题是嵌入式的消息分发模块,你会怎么设计和实现? 1 写在前面 老套路,我先…