Linux:多线程 [1]概念理解

 

char *str = "hello bfr";
*str = "H";

"hello bfr"这个字符串存储在虚拟地址空间的代码区中,令str指向它之后当要修改*str时,也就是修改代码区中"hello bfr"位置的值,再将它通过页表映射成物理内存时再根据页表中的RWX权限判断出这块内存是只读的没有写权限,就会硬件报错 段错误,操作系统识别硬件报错转化成信号发送给进程,进程就会终止。

如何看待地址空间和页表:
1.地址空间是进程能看到的资源窗口
2.页表决定,进程真正拥有资源的情况
3.合理的对地址空间+页表进行资源划分,我们就可以对一个进程的所有资源进行分类。


虚拟地址如何转化成物理地址?

虚拟地址以 10 10 12位转化的;0000000000 0000000000 000000000000
页表中第一页叫做页目录(前10个比特位),有2^10个条目,直接O(1)查找匹配的页表,在拿第二个10位去所在页表中查找(2^10条目),页表中所在条目写的是指定页框的起始地址,虚拟地址的低12位作为页内偏移,再根据数据类型的大小连续向后读取字节数。没有用到的页表就不会创建,,解决内存不足问题。
物理内存被操作系统分块管理起来,用一个数组struct Page mom[ ]数组管理,每一个内存块是一个struct Page{ }的结构体。每一个块的大小是4kb。磁盘在编译时就是被划分成4kb的数据块-页帧,文件系统级别是需要将数据以4kb为单位从外设搬到物理内存。操作系统要管理内存,除了需要数据结构,还需要管理算法-伙伴系统(对某种结构做管理)。所有的算法都要匹配结构。

什么是进程?
进程 = 内核数据结构+进程对应的代码和数据。如何看待我们之前学习进程时,对应的进程概念呢?内核视角:承担分配系统资源的基本实体。一个进程内部可以有多个执行流。CPU中调度的PCB可能是进程内的一个分支(线程),凡是喂给CPU的都是轻量级进程(task_sruct),因为在CPU眼中这个PCB就是进程中创建出来的一个执行流。哪怕这个进程只有一个线程,因为在Linux中一个完整的进程包括它多个PCB和虚拟地址空间、页表、所占用的内存资源。
线程:进程内的一个执行流
如何看待虚拟内存:虚拟内存里面决定了进程能够看到的“资源”。
一个进程的资源是可以通过虚拟地址空间+页表来将自己的部分资源划分给特定线程。Linux当中创建进程的时候可以直接fork将PCB、地址空间、页表全部复制一份,还要和父进程进行解耦,因为进程具有独立性;还有一种方式通过地址空间+页表的方式对进程进行资源划分,只需要创建PCB,将新创建的pcb指向父进程的地址空间,让"子进程"能够指向父进程代码块中的一部分,资源简单划分,划分之后有多个执行流,执行力度一定比之前的进程要细。CPU调度的时候只关注task_struct,
如何实现线程
Windows:TCB线程控制块,线程在进程内部,一个PCB中还有一张链表,将这个进程内的所有线程连接起来。这样会增加线程和进程的耦合程度。
Linux:一个线程被创建的根本目的是被执行(id,状态,优先级,上下文,栈...),单纯从线程调度角度,线程和进程有很多地方是重叠的。不用给线程专门设计数据结构,直接复用PCB来表示Linux内部的“线程”。线程经常在我们的进程的地址空间内运行,只拥有该进程的一部分资源。CPU调度的基本单位。执行代码和数据。Linux使用PCB来模拟进程的,是完全属于自己的方案—可靠、高效、维护成本低。进程用来整体申请资源,线程用来伸手向进程要资源。Linux中没有真正意义的线程,无法直接提供创建线程的方法,只能提供创建轻量级进程的接口。
一个进程内要并行进行很多个任务,CPU可以高频切换执行流使多线程并行处理。

线程创建pthread_create

1.既不是语言提供的也不是操作系统提供的,用户和线程间,用户级线程库;pthread-任意Linux都要携带该库,原生线程库。g++ -o $@ $^ -lpthread

2.这些线程都属于一个进程,所以PID一致,为了区分,它们都有自己的LWD。

3.在库中输出的tid和在系统中输出的tid完全不同,与操作系统内部实现和库原理有关

4.全局变量和全局方法可以被每个线程使用;如果全局变量被一个线程改变,其它线程会立马看见

5.面试题:线程一旦被创建,几乎所有的资源都是所有线程共享的!线程也一定要有自己私有的资源,什么资源应该是线程私有的呢?
独立的PCB属性,独立的上下文结构-线程动态切换的属性,独立的栈结构-保存私有数据。ebp栈底,exb栈顶。栈区只有一个,怎么保证每个线程独立的栈结构?
6.线程间切换相较于进程间切换系统的操作要少很多
进程间切换要切换页表,页表项在寄存器中、也要进行PCB切换、要进行上下文切换、切换虚拟地址空间-PCB中的地址;线程间切换只需要切换PCB和上下文。
cache,CPU内部的硬件级缓存,和内存一样同样有数据保存功能。当前计算机的局部性原理,CPU和寄存器要访问的数据是放在CPU中的cache中每次去读取的,cache中在CPU运行时会保存很多热点数据—经常被命中,线程共享热点数据缓存,而进程切换这些数据就被清空。
补充:计算密集型(CPU:加密、解密、算法等), I/O密集型(外设:磁盘、网络、显示器,抖音)
7.多线程的缺点:
性能损失,nCPU和n核最好和进程数和线程数对应。CPU内有运算器和控制器,核指的是一个CPU内部集合了多个运算器。
健壮性降低:一个进程挂掉了不会影响另一个进程,一个线程出问题有可能会影响其他进程
缺乏访问控制:进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

electron typescript运行并设置eslint检测

目录 一、初始化package.json 二、安装依赖 1、安装electron 2、安装typescript依赖 3、安装eslint 三、项目结构 四、配置启动项 一、初始化package.json 我的:这里的"main"没太大影响,看后面的步骤。 {"name": "xlo…

国内优秀的FPGA设计公司主要分布在哪些城市?

近年来,国内FPGA行业发展迅速,随着5G通信、人工智能、大数据等新兴技术的崛起,FPGA设计企业的需求也迎来了爆发式增长。很多技术人才在求职时都会考虑城市的行业分布和发展潜力。因此,国内优秀的FPGA设计公司主要分布在哪些城市&a…

基于微信小程序的电子竞技信息交流平台设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

在亚马逊云科技上用Stable Diffusion 3.5 Large生成赛博朋克风图片(下)

背景介绍 在2024年的亚马逊云科技re:Invent大会上提前预告发布的Stable Diffusion 3.5 Large,现在已经在Amazon Bedrock上线了!各位开发者们现在可以使用该模型,根据文本提示词文生图生成高质量的图片,并且支持多种图片风格生成&…

【自学嵌入式(6)天气时钟:软硬件准备、串口模块开发】

天气时钟:软硬件准备、串口模块开发 软硬件准备接线及模块划分ESP8266开发板引脚图软件准备 串口模块编写串口介绍Serial库介绍 近期跟着网上一些教学视频,编写了一个天气时钟,本篇及往后数篇都将围绕天气时钟的制作过程展开。本文先解决硬件…

初始JavaEE篇 —— Spring Web MVC入门(上)

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 目录 RequestMappingg 注解介绍 Postman的介绍与使用 PostMapping 与 GetMapping 注解 构造并接收请求 接收简单参数 接收对象…

浅谈Unity中Canvas的三种渲染模式

Overview UGUI通过 Canvas 组件渲染和管理UI元素。Canvas 是 UI 元素的容器,它决定了 UI 元素的渲染方式以及它们在屏幕上的显示效果。Canvas 有三种主要的渲染模式,每种模式有不同的用途和特点。本文将介绍这三种渲染模式 1. Screen Space - Overlay 模…

C++17 std::variant 详解:概念、用法和实现细节

文章目录 简介基本概念定义和使用std::variant与传统联合体union的区别 多类型值存储示例初始化修改判断variant中对应类型是否有值获取std::variant中的值获取当前使用的type在variant声明中的索引 访问std::variant中的值使用std::get使用std::get_if 错误处理和访问未初始化…

NoteGen:记录、写作与AI融合的跨端笔记应用

在信息爆炸的时代,如何高效地捕捉灵感、整理知识并进行创作成为了许多人关注的问题。为此,我们开发了 NoteGen,一款专注于记录和写作的跨端 AI 笔记应用。它基于 Tauri 开发,利用其强大的跨平台能力支持 Mac、Windows 和 Linux 系统,并计划未来扩展到 iOS 和 Android 平台…

SET alter system reload

目录标题 alter system 只是 写 auto 文件SET & alter system1. **会话级别参数(Session-level parameters)**2. **系统级别参数(System-level parameters)**3. **某些特定的超级用户参数**4. **修改时生效的参数**总结&#…

Ubuntu20.04 磁盘空间扩展教程

Ubuntu20.04 磁盘空间扩展教程_ubuntu20 gpart扩容-CSDN博客文章浏览阅读2w次,点赞38次,收藏119次。执行命令查看系统容量相关的数据:df -h当前容量为20G,已用18G(96%),可用844M,可用…

无心剑七绝《除夕快乐》

七绝除夕快乐 除旧迎新瑞气扬 夕阳烂漫映红妆 快言美酒佳肴味 乐享天伦福满堂 2025年1月28日 平水韵七阳平韵 无心剑这首七绝以“除夕快乐”为题,巧妙地运用了藏头手法,将“除夕快乐”四字分别嵌入诗的每一句首字,构思精巧,富有新…

WebSocket 详解:全双工通信的实现与应用

目录 一、什么是 WebSocket?(简介) 二、为什么需要 WebSocket? 三、HTTP 与 WebSocket 的区别 WebSocket 的劣势 WebSocket 的常见应用场景 WebSocket 握手过程 WebSocket 事件处理和生命周期 一、什么是 WebSocket&#xf…

机器人抓取与操作概述(深蓝)——1

工业机器人:① “臂”的形态 ② “手”的形态 ③ 视觉,力和触觉 1 机器人的不同形态 “臂”的形态 “手”的形态 2 常见的操作任务 操作:插入、推和滑 抓取:两指(平行夹爪)抓取、灵巧手抓取 落地-产…

人物传记之新月篇

相关故事链接(及时更新):Python的那些事第四篇:编程中的智慧之光控制结构-CSDN博客 目录 1. C语言程序:增强版加密与解密工具 2. Python程序:增强版加密与解密工具 功能对比表格 详细功能解释 人物传记…

Tensor 基本操作4 理解 indexing,加减乘除和 broadcasting 运算 | PyTorch 深度学习实战

前一篇文章,Tensor 基本操作3 理解 shape, stride, storage, view,is_contiguous 和 reshape 操作 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started Tensor 基本使用 索引 indexing示例代码 加减…

2024收尾工作

目录 开场白 栈与队列 LeetCode232. 用栈实现队列 LeetCode225. 用队列实现栈 LeetCode102. 二叉树的层序遍历 LeetCode103. 二叉树的锯齿形层序遍历 堆(优先级队列) 堆排序 LeetCode215. 数组中的第 k 个最大元素 总结 开场白 今天是除夕&…

【反悔堆】【hard】力扣871. 最低加油次数

汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处。 沿途有加油站,用数组 stations 表示。其中 stations[i] [positioni, fueli] 表示第 i 个加油站位于出发位置东面 positioni 英里处,并且有 fueli 升汽油。 假设汽车油…

PWM频率测量方法

测量PWM(脉宽调制)信号的频率是嵌入式系统中的常见需求,尤其是在电机控制、LED调光、传感器信号处理等场景中。 在这里介绍两种测量PWM频率的方法:测频法与测周法。 1、测频(率)法 原理:在闸门…

银行卡三要素验证接口:方便快捷地实现银行卡核验功能

银行卡三要素验证API:防止欺诈交易的有力武器 随着互联网的发展,电子支付方式也越来越普及。在支付过程中,银行卡是最常用的支付工具之一。然而,在一些支付场景中,需要对用户的银行卡信息进行验证,以确保支…