计算机底层的密码读书笔记

news2024/11/24 9:17:22
  • 线程池的理解
  • 协程的理解
  • 高并发服务器的考量
  • 内存管理
  • 函数调用与栈
  • 影响多线程性能的缓存问题

线程池的理解

重复创建和销毁线程会存在开销,线程过多会消耗大量内存,较多线程之间的切换也存在开销

线程池用来复用线程,控制线程数量

线程池中线程数量的计算取决于程序的类型(cpu密集/io密集),按照以下公式计算,WT为io等待时间,CT为cpu计算时间

N × ( 1 + W T C T ) N\times \left ( 1+\frac{WT}{CT} \right ) N×(1+CTWT)

协程的理解

协程会在被按照你听运行时保存运行状态,让然后从保存的状态中回复并继续运行

os会定期产生定时器中断,对线程进行调度(暂停执行),用户不需要决定让出cpu的时机。但是用户态并不存在这种机制,因而协程需要手动控制线程,因而被称为用户态线程(os无法感知)。协程的调度权在用户手中

从这种角度来看,函数只是协程的特例(没有中断点)。协程的栈帧存储在堆区

理论上内存足够,可以启动无数协程,协程的切换,调度发生在用户态,不需要os介入,上下文环境的保存和回复更加轻量,因此效率较高。

内核按照线程分配cpu的时间片,用户决定在分配的时间片内执行哪些协程本质上就是对cpu时间片的二次分配

协程最重要的作用:以同步的方式进行异步编程

高并发服务器的考量

实现方式有

  • 多进程
  • 多线程
  • 事件驱动

前两者存在性能问题,服务器使用事件驱动的逻辑有2点

  • 事件的来源问题?Linux中的epoll轮询事件并通知

  • 处理事件的函数和事件循环本身是否需要在同一线程?取决于处理函数的复杂度

    • 不涉及IO,逻辑简单耗时少:单线程

    • 否则放在独立线程中,即reactor模式

如果事件处理函数需要调用阻塞IO,则只能使用reactor模式(避免事件循环本身被阻塞)

在微服务场景下,服务器需要请求下游来获取信息(rpc调用),因此需要考虑rpc方法本身是否是阻塞的。如果将rpc方法实现为异步回调,则可能会由于下游请求的串联导致回调地狱。

此时可以通过协程,用同步的写法实现异步

引入协程

内存管理

linux有malloc进行内存的分配,如果从头实现一个内存分配器,则需要考虑内存的管理的方式

空闲内存块的管理,使用链表(每个节点包括块大小,是否空间,实际的内存空间)

内存分配的策略(遍历链表找到合适的块)

  • first hit

  • next hit(从上一次的找到的地方开始查找)

  • best hit()

用户态使用malloc申请内存(虚拟内存),找不到空闲块则通过brk/mmap(内核态)扩大堆内存,返回后申请到内存并读写(用户态),触发缺页中断,虚拟内存和物理内存建立映射关系。

分配器包括,内核级分配器——slab 分配器和SLUB——以及用户级分配器——glibc,jemalloc和TCMalloc

glibc内存管理那些事儿

在这里插入图片描述

频繁通过malloc系统调用存在性能损耗,考虑内存池(在应用程序而非标准库中,高性能标配)

和内存相关的常见问题

  • 返回局部变量指针
  • 指针的计算(加减)
  • 读取未初始化的内存
  • 引用已经释放的内存
  • 数组越界
  • 栈溢出
  • 内存泄漏

函数调用与栈

上下文环境(context)的保存和恢复是为了以下场景,保证cpu的状态和参数能够恢复

  • 函数调用,cpu从函数A跳转到函数B
  • 系统调用,cpu从用户态切换到内核态
  • 线程切换
  • 中断处理

只要是函数就需要运行时栈,每个用户台线程都有一个内核态栈用于执行系统调用。

中断处理函数的栈有两种实现

  • 使用内核栈作为运行时栈
  • ISR,中断处理函数栈,每个cpu都有一个

定时器中断处理函数会判断线程分配的时间片是否用完,如果用完则会发生线程切换

  • 切换进程地址空间,从进程控制块(PCB)获取cpu的上下文信息
  • 切换线程

影响多线程性能的缓存问题

  • CPU 缓存一致性与 MESI 协议
  • 缓存一致性协议硬核讲解

cache乒乓问题,缓存一致性导致多线程的性能弱于单线程

  • 由于使用2核心,c1和c2之间由于需要维护缓存一致性,需要额外开销
  • 尽量避免多线程之间共享数据
// function1
atomic<int> a
void threadf(){
	for(int i = 0;i<50000000;i++)
		++a;
}
void run(){
	thread t1 = thread(threadf)
	thread t2 = thread(threadf)
	t1.join()
	t2.join()
}
// function2
atomic<int> a
void run(){
	for(int i = 0;i<100000000;i++)
		++a;
}

伪共享问题,由于缓存的局部性原理导致false sharing

  • global_data.a和global_data.a并非同一变量,因此线程之间并没有共享数据
  • 但是两者可能会由于cache line(按行加载缓存),同时读到缓存中,导致多核之间仍旧存在乒乓问题
  • 改良措施为,将两个变量分割(空白数据填充)
struct data{
	int a;
	int b;
}
struct data global_data

// function1
void add_a(){
	for(int i = 0;i<50000000;i++)
		++global_data.a;
}
void add_b(){
	for(int i = 0;i<50000000;i++)
		++global_data.b;
}
void run(){
	thread t1 = thread(add_a)
	thread t2 = thread(add_b)
	t1.join()
	t2.join()
}

// function2
atomic<int> a
void run(){
	for(int i = 0;i<50000000;i++)
		++global_data.a;
	for(int i = 0;i<50000000;i++)
		++global_data.b;
}

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

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

相关文章

(二)K8S常见集群架构搭建

1.基于KubeAdm搭建多节点K8S集群 安装docker&#xff08;主节点工作节点&#xff09; # 1.安装 Docker CE 的依赖软件包&#xff1a; yum install -y yum-utils device-mapper-persistent-data lvm2# 2.设置阿里云镜像 sudo yum-config-manager --add-repo http://mirrors.al…

【C语言】【典例详解】【刷题】猜名次猜凶手【循环练习】

目录 猜名次问题 典例题目 题目分析&#xff1a; 代码实现&#xff1a; 运行结果&#xff1a; 猜凶手问题 典例题目 题目分析 代码实现&#xff1a; 运行结果&#xff1a; 猜名次问题 典例题目 猜名次&#xff1a; 5位运动员参加了10米台跳水比赛&#xff0c;有人让…

VM虚拟机配置

1、安装环境 1&#xff09;需要安装的软件 2&#xff09;安装vm 3&#xff09;安装centos系统 2、VM虚拟机NAT模式上网设置 1&#xff09;vm虚拟机设置 启动虚拟机选择【虚拟网络编辑器】 选择NAT模式&#xff0c;更改下面的子网IP&#xff0c;改成你需要的任何一个子网…

大数据:诞生大数据,概述、大数据软件生态,Apache Hadoop概述

大数据&#xff1a; 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其sql要学&#x…

专业的 Code 128 条码标签如何创建?

Aspose.Words是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。 Aspose API支持流行文件格式处理&#xff0c;并…

Linux 系统的中断子系统基本框架(一)

中断是大家用的最多的功能&#xff0c;不管是单片机还是 Linux 系统&#xff0c;都需要用到中断&#xff0c;对它的深入理解是非常必要的。 为什么需要中断&#xff1f; 答案&#xff1a;处理器的速度比外设快很多&#xff0c;内核必须要处理其他任务&#xff0c;只有当外设准…

在centos上安装splint

lint lint是最著名的C语言工具之一&#xff0c;是由贝尔实验室SteveJohnson于1979在PCC(PortableC Compiler)基础上开发的静态代码分析&#xff0c;一般由UNIX系统提供。 工具介绍 与大多数C语言编译器相比&#xff0c;lint可以对程序进行更加广泛的错误分析&#xff0c;是一…

Day56【动态规划】583.两个字符串的删除操作、72.编辑距离

583.两个字符串的删除操作 力扣题目链接/文章讲解 视频讲解 1、确定 dp 数组下标及值含义 dp[i][j]&#xff1a;以下标 i 为结尾的字符串 word1&#xff0c;和以下标 j 为结尾的字符串 word2&#xff0c;想要达到相等&#xff0c;所需要删除元素的最少次数为 dp[i][j] 2、…

【1110. 删点成林】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给出二叉树的根节点 root&#xff0c;树上每个节点都有一个不同的值。 如果节点值在 to_delete 中出现&#xff0c;我们就把该节点从树上删去&#xff0c;最后得到一个森林&#xff08;一些不相交的…

LeetCode——可被三整除的偶数的平均值

#全国科技者工作日—为创新和未来而努力# 目录 1、题目 2、题目解读 3、代码 1、题目 2455. 可被三整除的偶数的平均值 - 力扣&#xff08;Leetcode&#xff09; 给你一个由正整数组成的整数数组 nums &#xff0c;返回其中可被 3 整除的所有偶数的平均值。 注意&#xff…

论文阅读:Directed Greybox Fuzzing

一、论文相关信息 二、现有研究的不足 现有的Greybox模糊器&#xff08;GF&#xff09;无法有效地定向到有问题的更改或补丁、关键系统调用或危险位置、或定向到我们希望重现的已报告漏洞的堆栈跟踪中的函数。 三、知识点 &#xff08;1&#xff09;introduction 定向模糊测试…

第二章(一):Django框架的模型(Model)

系列文章目录 备注&#xff1a;这里是Django系列文章的所有文章的目录 第一章(一) : Django框架如何创建项目、创建应用、创建templates&#xff1b;如何启动django项目&#xff1b; 第一章(二)&#xff1a;Django框架的模式、路由、视图&#xff1b; 第一章(三)&#xff1a;Dj…

learn C++ NO.7——C/C++内存管理

引言 现在是5月30日的正午&#xff0c;图书馆里空空的&#xff0c;也许是大家都在午休&#xff0c;也许是现在37摄氏度的气温。穿着球衣的我已经汗流浃背&#xff0c;今天热火战胜了凯尔特人&#xff0c;闯入决赛。以下克上的勇气也激励着我&#xff0c;在省内垫底的大学中&am…

JS的异或运算XOR

概念 异或&#xff08;xor&#xff09;是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”&#xff0c;计算机符号为“xor”。 两个值相同时&#xff0c;返回false&#xff0c;否则返回true。也就是说&#xff0c;XOR可以用来判断两个值是否不同。 JavaScript 语言…

企业级信息系统开发——Spring Boot加载自定义配置文件

文章目录 一、使用PropertySource加载自定义配置文件&#xff08;一&#xff09;创建Spring Boot Web项目ConfigDemo01&#xff08;二&#xff09;创建自定义配置文件&#xff08;三&#xff09;创建自定义配置类&#xff08;四&#xff09;编写测试方法&#xff08;五&#xf…

一键部署属于自己的ChatGPT-Next-Web

完整功能刚需&#xff1a; OpenAI 注册登录之后给的 api Key GitHub账号 Netlify账号 Tip&#xff1a; 注册 OepenAI账号 需要用国外手机号 这里建议去一些渠道购买账号 十块钱不到如果访问 OpenAI 的话 一定要挂欧美节点 否则禁止IP访问 概率会被封号为什么用 Netlify 托…

测试替身Test Doubles的5类型(Mockito)

测试替身Test Doubles的5类型(Mockito) 我们有一个名为 BankAccount 的类。 数据库用于存储和检索银行帐户信息。 我们想测试 BankAccount 中的逻辑&#xff0c;而不必担心它使用的底层数据库.由此类实现——它将 SQL 查询发送到数据库并返回其中包含的值。 测试替身Test Dou…

SuperMap iDesktopX扩展开发之GPA算子扩展

作者&#xff1a;dongyx SuperMap iDesktopX是超图研究院推出的一款跨平台的桌面GIS软件&#xff0c;兼容Windows和Linux&#xff0c;同时iDesktopX也采用的是插件式扩展开发框架&#xff0c;支持定制开发。 使用iDesktopX定制开发有以下优势&#xff1a; ⚫ 采用 Swing 图形界…

VM虚拟机仿真网络问题

在电子数据取证中&#xff0c;拿到一个镜像需要仿真的时候&#xff0c;经常会遇到网络问题。尤其是Linux服务器镜像&#xff0c;例如centos操作系统的镜像&#xff0c;一般镜像会有固定IP设置&#xff0c;仿真起来后&#xff0c;系统与本机不能建立连接&#xff0c;不能连接互联…

VSCode远程连接Ubuntu使用LLDB调试程序

VSCode已经具有远程开发的能力&#xff0c;可以使用SSH连接到Linux/MacOS进行远程开发&#xff0c;包括编译与调试&#xff0c;只需要安装Remote Development插件即可&#xff0c;如果想使用CMake管理项目&#xff0c;则需要将VSCode的CMake以及CMake Tools插件安装在远程机器上…