页表与线程学习

news2024/9/22 15:43:11

线程

线程(TCB)是进程(PCB)的基本单位。
linux认为没有进程,没有线程在概念上的区分,只有一个叫做执行流。这句话指明了都是PCB。
Linux的线程是用进程(PCB)模拟的.
这样做的好处

  1. 不用在单独设计TCB。
  2. 不用维护TCB和PCB之间的关系。
  3. 不用单独编写任何调度算法。
    CPU看到的所以task_struct都是一个进程
    CPU看到的所以task_struct都是一个执行流(线程)

进程 = 内核数据结构 + 进程对应的代码和数据
进程 = 内核视角 :承担分配系统资源的基本实体(进程的基座属性)
进程向系统申请资源的基本单位。
内部只有一个执行流的进程 — 单执行流进程。
内部有多个执行流的进程 — 多执行流进程。

使用第三方库得加上
l库名才能进行编译

ps axj//查进程用的
查线程 ps -al //a表示all ,l表示轻量级进程。

页表

页表结构:页表跟书一样有页目录,页目录下有页表。而每个页目录又分配有几个字节的地址。每块地址对应的页表又有的32次方个字节。
页表在物理内存中一块单位是KB。4KB里面的数据我们叫页框(Page为单位)。这4KB是虚拟地址编译划分好的。
把磁盘划分的区域叫页帧。

IO的基本单位是块 – 4KB
通过页表查找对应的page在通过虚拟地址的后12位的4KB查找到页内偏移量找到2的12次方覆盖页内的所以地址。

这样设置页表有啥好处:
1.进程训地址管理和内存管理,通过页表+page进行解耦
2.分页机制+按序创建页表 = 节省空间。

如何使用线程

原生线程库 pthread
syscall
pthread_self获取 进程id
pthread_exit终止进程还有个就是pthread_cancel(线程被取消)也和exit一样都是退出。
在这里插入图片描述> 等待退出的线程使用pthread_join函数 > retval为线程退出时的退出码。 在这里插入图片描述

线程异常了,进程也会异常 。

1️⃣ 线程知识点总结:

各个线程都要各自的栈区,但是它们的堆区是共用的。
进程是资源分配的基本单位,线程是调度的基本单位。
用户态线程的切换在用户态实现,不需要内核支持。
使用多线程可以更加充分利用cpu资源,使任务处理效率更高,进而提高程序响应。
对于多核心cpu来说,每个核心都有一套独立的寄存器用于进行程序处理,因此可以同时将多个执行流的信息加载到不同核心上并行运行,充分利用cpu资源提高处理效率。线程包含cpu现场,但是线程只是进程中的一个执行流,执行的是程序中的一个片段代码,多个线程完整整体程序的运行
每个线程在进程虚拟地址空间中会分配拥有相对独立的栈空间,而并不是共享栈空间,这样会导致运行时栈混乱。
进程比线程安全的原因是每个进程有独立的虚拟地址空间,有自己独有的数据,具有独立性,不会数据共享这个太过宽泛与片面。
进程有独立的地址空间,但是同一个进程的线程之间共享同一个地址空间。
线程并没有独立的虚拟地址空间,只是在进程虚拟地址空间中拥有相对独立的一块空间。
其实不仅仅是内存隔离的问题,还有就是异常针对的是整个进程,因此单个线程的崩溃会导致异常针对进程触发,最终退出整个进程。
大量的计算使用多进程和多线程都可以实现并行/并发处理,而线程的资源消耗小于多进程,而稳定向较多进程有所不如,因此还要看具体更加细致的需求场景。
因为线程之间共享了进程中的大部分资源,因此共享的数据不需要重新创建或销毁,因此消耗上低于进程,反之也就是速度快于进程。
因为线程之间共享地址空间,因此通信更加方便,全局数据以及函数传参都可以实现,而进程间则需要系统调用来完成。
程序是静态的,不涉及进程,进程是程序运行时的实体,是一次程序的运行。
进程是资源的分配单位,所以线程并不拥有系统资源,而是共享使用进程的资源,进程的资源由系统进行分配。
任何一个线程都可以创建或撤销另一个线程。
进程因为每个都有独立的虚拟地址空间,因此通信麻烦,需要调用内核接口实现。而线程间共用同一个虚拟地址空间,通过全局变量以及传参就可实现通信,因此更加灵活方便。
线程拥有自己的栈空间且共享数据没错,但是资源消耗更小,且便于进程内线程间的资源管理和保护,否则会造成栈混乱。

线程独立的栈结构:


在os中没有所谓的线程只有轻量级进程,但用户所需要的是线程。所以操作系统出了个libthread.so的库。让用户通过该库来调用轻量级进程,给用户使用被OS包装过的轻量级进程。

如何将共享变量变成线程局部存储。
在这里插入图片描述
在前面加上__thread就变成了线程私有的全局变量。__thread会将变量拷贝给每个线程。
通过syscall来获取线程的tid。
在这里插入图片描述

线程分离(pthread_detach)

pthread_join
1、线程退出释放资源用。
2、获取线程对应的退出码。
我们如果不关心线程的返回值(2),对于join就不是最好的选择。pthread_detach就是比较好的选择。它只有上面第1点,一个线程不能即join又分离。

exit与pthread_exit的区别

exit是进程退出,pthread_exit是线程退出。
任何一个线程调用exit,都表示整个进程退出。

线程的互斥

三个概念:
1、临界资源 ----------多个执行流都能看到并访问的资源。
2、临界区 ---------多个执行流,代码中,有不同的代码,但是访问临界资源的代码,我们称之为临界区。

关于线程互斥我们举个例子我们进行购票的时候,比方有100张票,tickets=100;在内存里面是100,我们买了一张后cpu获取内存的tickets进程通过寄存器进行–计算变成了99,在返回给内存并把内存的tickets改成99;但我们多个线程同时进行的时候寄存器。

mutex简单理解就是一个0/1的计数器,用于标记资源访问状态:0表示已经有执行流加锁成功,资源处于不可访问,1表示未加锁,资源可访问。
主线程调用pthread_cancel(pthread_self())函数来退出自己, 则主线程对应的轻量级进程状态变更成为Z, 其他线程不受影响,这是正确的(正常情况下我们也不会这么做…)
主线程调用pthread_exit只是退出主线程,并不会导致进程的退出
pthread_self() 用于获取用户态线程的tid,而并非轻量级进程ID

有趣带锁跑路。

线程加锁和解锁具有原子性

线程加锁本质:是将数据从内存读入寄存器,将数据从共享变成线程私有。
该过程我们举个例子,比方线程A先使用寄存器进行数据运算,但此时线程B过来了让它走,线程A就带着上下文和锁走了,mutex的值也在上下文此时mutex为空。线程B上去了,进行运算与mutex的值交换后发现mutex为空就退出CPU 。此时线程A带着上下文内容回来继续运算,算法与mutex的值交互后返回。

实现:

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

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

相关文章

Day888.MySQL是怎么保证主备一致的 -MySQL实战

MySQL是怎么保证主备一致的 Hi,我是阿昌,今天学习记录的是关于MySQL是怎么保证主备一致的内容。 MySQL 能够成为现下最流行的开源数据库,binlog 功不可没。 在最开始,MySQL 是以容易学习和方便的高可用架构,被开发人…

从0到1一步一步玩转openEuler--13 openEuler用户组管理

文章目录13.1 创建用户组13.1.1 groupadd命令13.1.2 用户组信息文件13.1.3 创建用户组实例13.2 修改用户组13.2.1 修改GID13.2.2 修改用户组名13.3 删除用户组13.4 将用户加入用户组或从用户组中移除13.5 切换用户组在Linux中,每个普通用户都有一个账户,…

集群使用——资源管理和租户创建

概述 OceanBase 数据库是多租户的分布式数据库,租户使用的资源建立在资源池上。资源池包含了资源单元,而资源单元则规定了具体资源的量化(如 CPU、Memory、Disk_Size 和 IOPS 等)。 创建租户前,必须规定租户使用的资源…

Java 面向对象基础

文章目录一、类和对象1. 类的定义2. 对象的使用二、对象内存图三、成员变量和局部变量四、封装1. private 关键字2. this 关键字五、构造方法六、标准类制作一、类和对象 在此之前,我们先了解两个概念,对象和类。 万物皆对象,客观存在的事物…

C语言基础应用(一)数据类型

一、数据类型 1、数据类型的分类 2、常量 常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。 2.1 常量举例 // 整型常量 举例 /*718 十进制0213 八进制0x4b 十六进制30u 无符号整数30l 长整型30ul 无符号长整型*/ // 浮点常量…

LoadRunner安装教程

备注:电脑最好安装有IE浏览器或者360极速版浏览器 一、下载安装包 提前下载安装文件,必须下载。 链接: https://pan.baidu.com/s/1blFiMIJcoE8s3uVhAxdzdA?pwdqhpt 提取码: qhpt 包含的文件有: 二、安装loadrunner 注意,以…

虚拟机CPU占用100%问题记录

项目场景 kswapd0占用CPU过高,严重影响服务器及虚拟机的使用。 原因分析 kswapd0 是 Linux 系统虚拟内存管理中负责换页的进程。 系统物理内存不足时,kswapd0 会频繁的进行换页操作(使用swap分区与内存换页操作交换数据)&…

java手机短信验证,并存入redis中,验证码时效5分钟

目录 1、注册发送短信账号一个账号 2、打开虚拟机,将redis服务端打开 3、创建springboot工程,导入相关依赖 4、写yml配置 5、创建controller层,并创建controller类 6、创建service层,并创建service类 7、创建工具类&#x…

STL——priority_queue

一、priority_queue介绍及使用 1.priority_queue文档介绍 (1)优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。 (2)此上下文类似与堆,在堆中可以…

树与图中的dfs和bfs—— AcWing 846. 树的重心 AcWing 847. 图中点的层次

一、AcWing 846. 树的重心1.1题目1.2思路分析题意:什么是树的重心?树的重心是指,删除某个结点后剩下的最大连通子树的结点数目最小,如下图是根据样列生成的树,若删除结点1,则剩下三个子树最大的是中间那颗结…

C++的 new 和 delete

文章目录一、new 和 delete 的使用二、operator new 和 operator delete 函数三、new 和 delete 的实现原理四、申请空间和释放空间应配套使用五、定位 new 表达式六、malloc/free 和 new/delete 的区别C语言的动态内存管理函数(malloc、calloc、realloc、free) 虽然可以继续在…

Python for 循环语句

Python for 循环语句Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串。语法:for循环的语法格式如下:for iterating_var in sequence:statements(s)流程图:实例:实例#!/usr/bin/python# -*- coding: UT…

Hudi-简介和编译安装

简介 简介 Apache Hudi(Hadoop Upserts Delete and Incremental)是下一代流数据湖平台。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的upserts/delete、高级索引、流摄取服务、数据集群/压缩优化和并发,同…

【yolov5】首次尝试目标检测利用prompt(完整操作流程)

1、打开prompt 2、切换到pytorch所在环境 conda activate freezing我的环境名是freezing,这里根据自己环境名去激活切换 3、进入到yolov5项目所在路径 激活完环境后立即执行指令当然是无效的,首先要进入到你的项目目录 首先看一下自己的项目在那个位…

https协议

文章目录对称加密方案非对称加密方案对称加密方案非对称加密方案对称加密方案非对称加密方案数字证书因为HTTP是明文传输,所以会很有可能产生中间人攻击(获取并篡改传输在客户端及服务端的信息并不被人发觉),HTTPS加密应运而生。 …

【Java|golang】1234. 替换子串得到平衡字符串---双指针

有一个只含有 ‘Q’, ‘W’, ‘E’, ‘R’ 四种字符,且长度为 n 的字符串。 假如在该字符串中,这四个字符都恰好出现 n/4 次,那么它就是一个「平衡字符串」。 给你一个这样的字符串 s,请通过「替换一个子串」的方式,…

SpringBoot2知识点记录

SpringBoot2知识点记录1.SpringBoot2基础入门1.1 环境要求1.1.1 maven设置1.2 第一个程序 HelloWorld1.2.1 创建maven工程1.2.2 引入依赖1.2.3 创建主程序1.2.4 编写业务1.2.5 测试1.2.6 简化配置1.2.7 简化部署1.3 自动装配1.3.1 SpringBoot特点1.3.1.1 依赖管理1.3.1.2 自动装…

上班在群里摸鱼,逮到一个字节8年测试开发,聊过之后羞愧难当...

老话说的好,这人呐,一旦在某个领域鲜有敌手了,就会闲得某疼。前几天我在上班摸鱼刷群的时候认识了一位字节测试开发大佬,在字节工作了8年,因为本人天赋比较高,平时工作也兢兢业业,现在企业内有一…

【论文阅读】基于意图的网络(Intent-Based Networking,IBN)研究综述

IBN研究综述一、IBN体系结构1.1 体系结构:1.2 闭环流程:1.3 IBN的自动化程度(逐步向前演进):二、IBN 的实现方式2.1 意图获取:2.1.1 YANG、NEMO2.1.2 Frenetic、NetKAT、LAI2.2 意图转译:2.2.1 iNDIRA系统2.2.2 基于模…

GIT命令操作大全

文章目录一、前言二、工作模块2.1 Workspace:工作区2.2 Index / Stage:暂存区2.3 Repository:本地仓库2.4Remote:远程仓库三、GIT基本配置四、GIT项目代码管理4.1 初始化git仓库4.2 提交到暂存区(stage)4.3 将暂存区的文件恢复到工…