可以兼职做设计的网站/北京网络营销公司哪家好
空间配置器
一级空间配置器 || 二级空间配置器
默认先走二级然后判断
二级空间配置器
一个指针指向start_free然后start_free向后移动,相当于哈希桶的头删和头插
8byte:切大补小
C++的二级空间配置器按照8字节(或者更大的倍数)切分内存的原因有以下几点:
-
内存对齐:许多计算机体系结构要求数据在内存中的地址是对齐的,即数据的起始地址必须是某个特定值的倍数。按照8字节切分内存可以确保分配的内存块的起始地址满足对齐要求,从而提高内存访问的效率。
-
减少内存碎片:内存碎片是指分配的内存块之间存在的未使用的小块内存。通过按照8字节切分内存,可以减少内存碎片的产生。如果按照较小的单位(如1字节)切分内存,会导致更多的内存碎片,降低内存的利用率。
-
提高内存分配的效率:按照8字节切分内存可以提高内存分配的效率。二级空间配置器使用了一些数据结构(如自由链表)来管理内存池,按照固定大小的块进行切分可以简化数据结构的设计和操作,从而提高内存分配的速度。
需要注意的是,按照8字节切分内存并不是绝对的规定,具体的实现可能会根据不同的编译器、操作系统和硬件平台进行调整。但按照8字节切分内存是比较常见的做法,可以在大多数情况下获得较好的性能和内存利用率。
好的,我来具体解释一下被还回来的小空间是如何被申请的大空间利用的过程。以下是一个简化的示意图:
+-----------------------+
| 大空间 |
+-----------------------+
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
+-----------------------+
- 初始状态:大空间被划分为多个小空间,每个小空间的状态为已分配或未分配。
+-----------------------+
| 大空间 |
+-----------------------+
| | | | | | |
| | A | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
+-----------------------+
- 释放小空间:当程序不再需要某个小空间时,将其释放回内存池。
+-----------------------+
| 大空间 |
+-----------------------+
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
+-----------------------+
- 标记小空间为可用:二级空间配置器会将被释放的小空间标记为可用。
+-----------------------+
| 大空间 |
+-----------------------+
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
+-----------------------+可用 可用 可用
- 分配大空间:当程序需要申请大空间时,二级空间配置器会查找可用的连续小空间。
+-----------------------+
| 大空间 |
+-----------------------+
| | | | | | |
| | A | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
+-----------------------+
- 标记小空间为已分配:二级空间配置器会将被分配的小空间标记为已分配,并从内存池中移除。
+-----------------------+
| 大空间 |
+-----------------------+
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
+-----------------------+
通过这个过程,被还回来的小空间可以被申请的大空间利用,从而实现内存的高效利用。
需要注意的是,实际的内存管理过程可能更加复杂,涉及到内存碎片的合并、内存池的扩展等操作。上述示意图仅用于说明基本的内存分配和释放过程。
不是所有进程都公用一个空间配置器。在操作系统中,每个进程都有自己独立的虚拟地址空间,这意味着每个进程都有自己的内存管理单元。
每个进程的内存管理单元负责管理该进程的内存分配和释放。这包括将进程所需的内存从操作系统中分配出来,并在进程不再需要时将其释放回操作系统。
因此,每个进程都有自己的空间配置器,用于管理其内存分配和释放。这样可以确保每个进程的内存操作互不干扰,提高了系统的安全性和稳定性。
需要注意的是,不同进程之间可以通过进程间通信的机制共享内存,但共享的内存通常是通过特殊的方式进行管理,而不是直接使用一个公用的空间配置器。
碎片(一部分一部分还)
空间配置器的碎片指的是内存中的小块未被使用的空间,这些空间可能散落在已分配的内存块之间,无法被有效利用。为了解决内存碎片的问题,空间配置器通常会采取合并碎片的策略。
具体来说,当一个内存块被释放回空间配置器时,空间配置器会尝试将其与相邻的空闲内存块进行合并,以形成更大的连续空闲内存块。这个过程称为内存碎片的合并。
合并碎片的策略可以有多种实现方式,以下是一种常见的策略:
-
首次适应(First Fit):空间配置器会从内存池中的第一个空闲内存块开始遍历,找到第一个足够大的空闲内存块来满足分配请求。如果找到了合适的内存块,就将其分割成两部分,一部分用于分配,另一部分保留为新的空闲内存块。
-
循环首次适应(Next Fit):类似于首次适应,但是从上一次分配的位置开始遍历内存池,直到找到合适的内存块。这样可以减少遍历的次数。
-
最佳适应(Best Fit):空间配置器会遍历整个内存池,找到能够满足分配请求并且大小最接近的空闲内存块。这样可以最大程度地减少内存碎片。
-
最坏适应(Worst Fit):空间配置器会遍历整个内存池,找到能够满足分配请求并且大小最大的空闲内存块。这样可以保留更多的小空闲块,但是可能会导致更多的内存碎片。
无论采用哪种策略,合并碎片的目的都是尽可能地利用内存,减少内存碎片的影响。通过合并碎片,空间配置器可以提供更大的连续内存块,从而满足大内存分配的需求。
解决外碎片问题的方法之一是使用内存池(Memory Pool)或内存池分配器(Memory Pool Allocator)。
内存池是一种预先分配一大块连续内存的数据结构,然后根据需要从该内存池中分配小块内存。内存池可以避免频繁向系统申请小块内存的开销,并且可以减少外碎片的产生。
以下是解决外碎片问题的一种基本思路:
-
在程序初始化阶段,分配一大块连续的内存作为内存池。
-
将内存池划分为固定大小的小块内存,可以使用链表或位图等数据结构来管理这些小块内存的分配情况。
-
当需要申请小块内存时,从内存池中找到一个空闲的小块内存进行分配。
-
当小块内存不再使用时,将其标记为空闲,并将其归还到内存池中。
通过使用内存池,可以避免频繁向系统申请小块内存,从而减少了内存碎片的产生。此外,内存池还可以提供连续的内存块,使得可以更容易地申请大块内存。
需要注意的是,使用内存池也会带来一些额外的开销,比如内存池的初始化和管理。因此,在选择是否使用内存池时,需要根据具体的应用场景和需求进行权衡。
STL六大组件
-
容器(Containers):STL提供了多种容器类,如vector、list、deque、set、map等。容器类提供了不同的数据结构,用于存储和管理数据。每种容器类都有自己的特点和适用场景,可以根据需要选择合适的容器类。
-
算法(Algorithms):STL提供了一组常用的算法,如排序、查找、合并、删除等。这些算法可以应用于各种容器类,提供了高效的实现和使用方式。使用STL算法可以简化编程过程,提高代码的可读性和可维护性。
-
迭代器(Iterators):STL提供了迭代器作为容器和算法之间的桥梁。迭代器提供了一种统一的访问容器元素的方式,可以通过迭代器遍历容器中的元素,实现对容器的操作。STL还提供了不同种类的迭代器,如输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器,每种迭代器都有不同的功能和限制。
-
仿函数(Functors):STL中的仿函数是一种可调用对象,类似于函数指针,可以在算法中使用。仿函数可以作为算法的参数,用于定义算法的行为。STL提供了一些内置的仿函数,如比较仿函数、数值仿函数等,同时也可以自定义仿函数。
-
适配器(Adapters):STL提供了适配器用于修改容器或者算法的接口。适配器可以将一种容器或算法的接口转换为另一种接口,使得它们可以互相兼容。STL中常见的适配器有迭代器适配器、函数适配器等。
-
分配器(Allocators):STL提供了分配器用于管理内存的分配和释放。分配器可以为容器提供自定义的内存管理策略,如内存池分配器、堆分配器等。通过分配器,可以控制容器的内存使用方式,提高内存的分配效率和性能。
复习
vector:基于动态数组
list:双向链表
set:平衡二叉搜索树(元素唯一)
map:红黑树
unordered_map:基于哈希表(Hash Table)
std::unordered_set:基于哈希表实现,它存储一组无序的唯一元素。std::unordered_set提供了快速的插入、删除和查找操作,平均情况下的时间复杂度为O(1)。
map和unorder_map,set和unorder_set的本质区别
std::map
和std::unordered_map
,std::set
和std::unordered_set
的本质区别在于它们使用的底层数据结构和提供的操作效率。
std::map
和std::unordered_map
的本质区别:
std::map
基于红黑树实现,它保持了元素的有序性。红黑树是一种自平衡的二叉搜索树,提供了对键的快速查找、插入和删除操作,时间复杂度为O(log n)。std::map
中的元素按照键的顺序进行排序,因此可以用作有序的查找表。std::unordered_map
基于哈希表实现,它使用键的哈希值来确定元素的存储位置。哈希表提供了快速的插入、删除和查找操作,平均情况下的时间复杂度为O(1)。std::unordered_map
中的元素没有固定的顺序,因此不能用作有序的查找表,但它在大多数情况下提供了更快的操作。
std::set
和std::unordered_set
的本质区别:
std::set
基于红黑树实现,它存储一组有序的唯一元素。std::set
提供了高效的插入、删除和查找操作,时间复杂度为O(log n)。std::unordered_set
基于哈希表实现,它存储一组无序的唯一元素。std::unordered_set
提供了快速的插入、删除和查找操作,平均情况下的时间复杂度为O(1)。
因此,std::map
和std::set
适用于需要有序元素或按照键进行排序的场景,而std::unordered_map
和std::unordered_set
适用于对元素顺序没有要求,但需要更快的操作速度的场景。
multi版本:允许键值冗余
相关文章:

c++(空间配置器)[32]
空间配置器 一级空间配置器 || 二级空间配置器 默认先走二级然后判断 二级空间配置器 一个指针指向start_free然后start_free向后移动,相当于哈希桶的头删和头插 8byte:切大补小 C的二级空间配置器按照8字节(或者更大的倍数)切分…...

Linux系列之解压文件
一.欢迎来到我的酒馆 使用命令解压Linux文件。 目录 一.欢迎来到我的酒馆二.使用命令解压文件 二.使用命令解压文件 2.1解压 .tar.gz文件: tar -zxvf 文件名.tar.gz.tar,gz这种文件是tar文件的压缩文件,因此可以使用tar命令进行解压 -zxvf命令参数&…...

为什么重写equals方法时必须重写hashcode方法
与 equals的区别 如果两个引用类型变量使用运算符,那么比较的是地址,它们分别指向的是否是同一地址的对象,结果一定是false,因为两个对象地址必然不同。 不能实现比较对象的值是否相同。 所有对象都有equals方法,默认…...

java导入excel图片处理
直接看代码吧,主要逻辑吧excel的图片拿到 压缩上传获取url // 将文件转成XSSFWorkbook工作簿XSSFWorkbook wb new XSSFWorkbook(uploadFile);// 获取工作薄中第一个excel表格XSSFSheet sheet wb.getSheetAt(0);// 核心:::获取ex…...

【Rust】Rust学习 第四章认识所有权
第四章认识所有权 所有权(系统)是 Rust 最为与众不同的特性,它让 Rust 无需垃圾回收(garbage collector)即可保障内存安全。因此,理解 Rust 中所有权如何工作是十分重要的。 4.1 所有权 所有运行的程序都…...

学习C语言第三天 :关系操作符、逻辑操作符
1.关系操作符 C语言用于比较的表达式,称为“关系表达式”里面使用的运算符就称(relationalexpression),为“关系运算符” (relationaloperator) ,主要有下面6个。 > 大于运算符 < 小于运算符 > 大于等于运算符 < 小于等…...

Jenkins自动化打包脚本
一、背景 jenkins可以设置定时任务打包,也已手动点按钮打包,还可以通过执行http请求打包,今天我们就通过shell脚本,通过curl命令进行jenkins打包。 二、步骤 2.1 在jenkins上构建项目 设置触发器 2.2 通过shell脚本触发远程构…...

一百五十、Kettle——Kettle官网下载地址
一、官网地址 Home - Hitachi VantaraThe site home pagehttps://community.hitachivantara.com/docs/DOC-1009855 二、下载地址 Pentaho from Hitachi Vantara download | SourceForge.netDownload Pentaho from Hitachi Vantara for free. End to end data integration and…...
使用 Visual Studio Code 调试 CMake 脚本
之前被引入到 Visual Studio 中的 CMake 调试器,现已在 Visual Studio Code 中可用。 也就是说,现在你可以通过在 VS Code 中安装 CMake 工具扩展,来调试你的 CMakeLists.txt 脚本了。是不是很棒? 背景知识 Visual C 开发团队和 CMake 的维…...

【云原生】Docker 详解(二):Docker 架构及工作原理
Docker 详解(二):Docker 架构及工作原理 Docker 在运行时分为 Docker 引擎(服务端守护进程) 和 客户端工具,我们日常使用各种 docker 命令,其实就是在使用 客户端工具 与 Docker 引擎 进行交互。…...

微服务 云原生:基于 Gogs + Drone 实现 CI/CD 自动化
一般构建部署 以一个简单的前后端项目来说,分别编写前后端的 Dockerfile 文件并构建镜像,然后编写 docker-compose.yml 构建部署,启动运行。每次代码变更后都需重新手动打包、构建、推送。 一个简单的例子: 前端: 项…...

ADO.NET之SQL Server
ADO.NET是.NET平台上的一组用于访问和操作关系型数据库的API。它提供了一种以统一的方式连接到各种数据库系统并执行数据库操作的方法。现在有很多的ORM框架都是基于ADO.NET进行数据访问(比如:Entity Framework (EF)、Dapper、NHibernate 、FluentNHiber…...

Nginx负载均衡(重点)
正向代理 部署正向代理 server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; proxy_pass http://20.0.0.60:80…...

第一章 SpringBoot入门
1.SpringBoot简介 1.1.简介 Spring Boot来简化spring应用开发,约定大于配置去繁从简,just run就能创建一个独立的,产品级别的应用。 背景:J2EE笨重开发,繁多的配置、低下开发效率、复杂的部署流程、第三方技…...

JavaScript Es6_2笔记 (深入对象 + 内置构造函数 + 包装类型)+包含实例方法
JavaScript 进阶 文章目录 JavaScript 进阶深入对象构造函数实例成员静态成员 内置构造函数ObjectArray包装类型StringNumber 了解面向对象编程的基础概念及构造函数的作用,体会 JavaScript 一切皆对象的语言特征,掌握常见的对象属性和方法的使用。 了解…...
尼科彻斯定理
目录 1.题目概述 2.题解 思路分析 具体实现 1.题目概述 验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。 例如: 1^31 2^335 3^37911 4^313151719 输入一个正整数m(m≤100),将…...

主数据管理案例-中国外运
1、 背景介绍及难点分析 作为世界领先的物流行业整合商、端到端的全程供应链解决方案和一站式物流服务提供商,中国外运非常重视信息化建设,先后投资建设了 300多个信息系统,为中国外运的内部管理和业务运作提供 IT 支持和保障。 由于缺乏统一…...

改进DevSecOps框架的 5 大关键技术
Markets and Markets的一项研究显示,全球DevOps的市场规模从2017年的29亿美元增加到2023年的103.1亿美元,预测期的年复合增长率(CAGR)为24.7%。人们对DevOps越来越感兴趣,因为DevOps不仅能够压缩软件的交付周期,还能提高交付的速度…...

uni-app之app上传pdf类型文件
通过阅读官方文档发现,uni.chooseFile在app端不支持非媒体文件上传; 可以使用这个插件,验证过可以上传pdf;具体使用可以去看文档 插件地址 就是还是会出现相机,这个可能需要自己解决下 实现功能:上传只能上…...

bash: sudo: command not found的解决方法 | 安装sudo
-bash: sudo: command not found的解决方法 https://www.cnblogs.com/pengpengboshi/p/16159443.html 报错 安装apt-get update报错由于没有公钥,无法验证下列签名: NO_PUBKEY A4B469963BF863CC解决办法是手动加入 (sudo可去掉)…...

电脑合上盖子无线网络不会断开
控制面板\硬件和声音\电源选项\系统设置 最终选择不会采取任何操作 选择不会采取任何操作...

【从零开始学习JAVA | 第四十篇】了解线程池
目录 前言: 线程池: 线程池的工作流程: 代码实现线程池: 任务拒绝策略: 线程池多大才算合适? 总结: 前言: 在Java编程中,线程池是一个强大的工具,它能…...

axios如何取消请求,其原理是什么?
axios 可以通过创建一个 CancelToken 来取消一个请求,基本原理是: 创建一个 CancelToken 的实例,它有一个 executor 函数,可以通过调用 executor 参数中的 cancel 函数来取消请求。在 axios 请求配置中指定 cancelToken 属性,将 CancelToken 实例传递进去。当我们需要取消请求…...

消息中间件 Asio (C++)
折腾了一上午,看到这个结果的时候泪目了兄弟闷,讲真。我的asio客户端成功收到服务端发来的消息了。虽然这确实是极其智障又简单的入门哈哈 下载独立版本 asio网络通信库新建cmake工程,CMakeLists.txt加载asioasio最简单的服务端和客户端代码…...

3.4 网络安全管理设备
数据参考:CISP官方 目录 IDS (入侵检测系统)网络安全审计漏洞扫描系统VPN(虚拟专网)堡垒主机安全管理平台 一、IDS (入侵检测系统) 入侵检测系统(IDS)是一种网络安全设备,用于监测和检测网络中的入侵行…...

前端高级面试题-JS
1. 原型 / 构造函数 / 实例 原型( prototype ): ⼀个简单的对象,⽤于实现对象的 属性继承。可以简单的理解成对象的爹。在 Firefox 和 Chrome 中,每个 JavaScript 对象中都包含⼀个__proto__ (⾮标准)的属性指向它爹(该对象的原型),可 obj.p…...

AcWing 1564:哈希 ← 只具有正增量的二次探测法
【题目来源】https://www.acwing.com/problem/content/1566/【题目描述】 将一个由若干个不同正整数构成的整数序列插入到一个哈希表中,然后输出输入数字的位置。 哈希函数定义为 H(key)key%TSize,其中 TSize 是哈希表的最大大小。 利用只具有正增量的二…...
什么是媒体代发布?媒体代发布注意事项
传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体代发布是指将新闻稿或其他宣传内容委托给专业的媒体代理机构或公司进行发布和推广的活动。这些机构通常拥有丰富的媒体资源、人脉和经验,能够更好地将信息传递给目标受众…...

docker版jxTMS使用指南:使用jxTMS采集数据之二
本文是如何用jxTMS进行数据采集的第二部分,整个系列的文章请查看:docker版jxTMS使用指南:4.4版升级内容 docker版本的使用,请查看:docker版jxTMS使用指南 4.0版jxTMS的说明,请查看:4.0版升级内…...

系列六、Springboot操作RocketMQ
一、同步消息 1.1、发送&接收简单消息 1.1.1、发送简单消息 /*** 测试发送简单消息*/ Test public void sendSimpleMessage() {SendResult result rocketMQTemplate.syncSend("BOOT_TOPIC_SIMPLE", "我是一个简单消息");// 往[BOOT_TOPIC_SIMPLE]主…...