Linux内存管理架构(1)
0.内存空间架构
1.用户空间
在 Linux 系统中,应用程序通过 malloc() 申请内存,并通过 free() 释放内存时,底层的内存管理是由 glibc(GNU C Library)中的内存分配器实现的。glibc 的内存分配器负责与操作系统的内核交互,以高效地管理堆内存的分配和释放。
以下是 malloc() 和 free() 在 glibc 中的工作原理及其实现细节:
1.1 glibc 内存分配器概述
glibc 使用了一种高效的用户态内存管理机制,称为 ptmalloc(Pthreads malloc)。ptmalloc 是基于早期的 dlmalloc(Doug Lea's malloc)改进而来,主要目标是支持多线程环境下的高效内存分配。
(1) 主要特点
- 多线程支持: ptmalloc 为每个线程维护独立的堆(arena),减少多线程间的锁争用。
- 内存池化: 小块内存会被分配到内存池中,避免频繁调用系统调用。
- 内存复用: 释放的内存不会立即归还给操作系统,而是保留在内存池中供后续重用。
- 大块内存优化: 大块内存直接使用 mmap() 分配,避免对堆的影响。
其它内存分配器:还由谷歌公司的tcmalloc分配器与freeBSD 的jemalloc
1.2 malloc() 的工作原理
malloc() 是 glibc 提供的用户态函数,用于动态分配内存。其底层实现会根据请求的内存大小选择不同的策略。
(1) 小块内存分配(< 128KB 或其他阈值)
堆扩展:
- 如果堆中有足够的空闲内存,则直接从堆中分配。
- 如果堆中没有足够的空闲内存,则调用 brk() 系统调用来扩展堆。
内存池管理:
- glibc 使用一种称为 bins 的数据结构来管理小块内存。
- 不同大小的内存块会被存储在不同的 bins 中,便于快速查找和分配。
(2) 大块内存分配(>= 128KB 或其他阈值)
匿名映射:
对于大块内存,malloc() 会直接调用 mmap() 系统调用创建一个独立的匿名映射区域。
这样可以避免对堆的影响,并且释放时可以直接调用 munmap() 归还给操作系统。
(3) 底层实现
malloc() 的核心实现位于 glibc 源码中的 malloc.c 文件。
它依赖于内部的数据结构(如 malloc_chunk)来管理内存块。
1.3 free() 的工作原理
free() 是 glibc 提供的用户态函数,用于释放由 malloc() 分配的内存。它的实现会根据内存块的大小和分配方式采取不同的策略。
(1) 小块内存释放
内存回收:
- 释放的小块内存不会立即归还给操作系统,而是被放回到 glibc 的内存池中。
- glibc 会将释放的内存块插入到对应的 bin 中,以便后续重用。
合并空闲块:
- 如果相邻的内存块也是空闲的,glibc 会尝试将它们合并为更大的空闲块,以减少碎片化。
(2) 大块内存释放
解除映射:
- 对于通过 mmap() 分配的大块内存,free() 会直接调用 munmap() 系统调用将其归还给操作系统。
立即释放:
- 大块内存不会保留在内存池中,而是立即释放。
(3) 堆收缩
如果堆中有大量连续的空闲内存,glibc 可能会调用 brk() 系统调用来收缩堆,将未使用的内存归还给操作系统。
不过,这种行为通常受到一定的限制,因为频繁调整堆顶可能会影响性能。
1.4 glibc 内存分配器的核心数据结构
glibc 的内存分配器依赖于一些核心数据结构来管理内存块和空闲列表。
(1) malloc_chunk
- 每个分配的内存块都由一个 malloc_chunk 结构体描述。
- 它包含以下信息:
- 内存块的大小。
- 是否已使用。
- 指向前一个和后一个内存块的指针(用于链表管理)。
struct malloc_chunk {size_t prev_size; // 前一个块的大小(如果前一个块是空闲的)size_t size; // 当前块的大小(包括元数据)struct malloc_chunk *fd; // 指向下一个空闲块struct malloc_chunk *bk; // 指向前一个空闲块
};
(2) bins
glibc 使用多个 bins 来管理不同大小的空闲内存块。
Fast bins:
- 用于管理非常小的内存块(如 16 字节、32 字节等)。
- Fast bins 不会合并相邻的空闲块,以提高分配速度。
Unsorted bin:
- 用于暂存刚刚释放的内存块,稍后再分类到合适的 bin 中。
Small bins 和 Large bins:
- Small bins 用于管理固定大小的内存块。
- Large bins 用于管理较大范围的内存块。
以下是一个简单的示例,展示 malloc() 和 free() 的使用:
#include <stdio.h>
#include <stdlib.h>int main() {// 分配小块内存int *small_mem = (int *)malloc(1024); // 1 KBif (small_mem == NULL) {perror("malloc failed");return -1;}printf("Small memory allocated at: %p\n", small_mem);// 分配大块内存void *large_mem = malloc(1024 * 1024); // 1 MBif (large_mem == NULL) {perror("malloc failed");return -1;}printf("Large memory allocated at: %p\n", large_mem);// 释放内存free(small_mem);free(large_mem);return 0;
}
2.内核空间
2.1 内核空间的基本功能
虚拟内存管理
- 虚拟内存管理负责从进程的虚拟地址空间分配虚拟页。
- sys_brk 用来扩大或收缩堆。
- sys_mmap 用来在内存映射区域分配虚拟页。
- sys_munmap 用来释放虚拟页。
内核使用延迟分配物理内存的策略:
- 当进程请求分配内存时(如通过 brk() 或 mmap()),内核仅分配虚拟页,而不立即分配物理页。
- 只有当进程实际访问这些虚拟页时,才会触发缺页异常(Page Fault),内核才会分配物理页并更新页表。
- 进程第一次访问虚拟页的时候,触发页错误异常。
- 页错误异常处理程序从页分配器申请物理页,在进程的页表中把虚拟页映射到物理页。
页分配器
- 页分配器负责分配物理页,目前使用的页分配器是伙伴分配器。
- 内核空间提供把页划分成小内存块分配的块分配器,提供分配内存的接口 kmalloc() 和释放内存的函数 kfree()。
支持三种分配器:slab 分配器、slub 分配器和 slob 分配器。
在内核初始化的过程中,页分配器还没有准备好,需要使用临时的引导内存分配器分配内存。
2.2内核空间的扩展功能
不连续页分配器
- 提供分配内存的接口 vmalloc 和释放内存的接口 vfree。
- 在Linux内核中,vmalloc函数用于分配不连续的物理内存页面,并将它们映射到虚拟地址空间中的一个连续区域。这与直接使用kmalloc或__get_free_pages等接口不同,后者要求分配的物理页面必须是连续的。
- 在内存碎片化的时候,申请连续物理页的成功率很低。
- 可以申请不连续的物理页,映射到连续的虚拟页,即虚拟地址连续但物理地址不连续。
- 每个处理器内存分配器用来为每个处理器变量分配内存。
连续内存分配器
- 用来给驱动程序预留一段连续的内存。
- 当驱动程序不用的时候,可以给进程使用。
- 当驱动程序需要使用的时候,把进程占用的内存通过回收或迁移的方式让出来,给驱动程序使用。
内存控制组
- 用来控制进程占用的内存资源。
3.硬件层面
内存管理单元 (MMU, Memory Management Unit)
- 处理器包含一个称为内存管理单元 (MMU) 的部件。
- MMU 负责将虚拟地址转换成物理地址。这种转换对于操作系统来说非常重要,因为它允许每个进程拥有自己的独立地址空间,增强了系统的安全性和稳定性。
- 保护机制:通过地址转换过程,MMU 可以实现对内存访问的权限控制。例如,它能够阻止一个进程直接访问另一个进程的内存区域,或者限制对特定内存页的读写权限。
页表缓存 (TLB, Translation Lookaside Buffer)
- 内存管理单元包含一个页表缓存 (TLB) 部件。
- TLB 保存最近使用过的页表映射,避免每次把虚拟地址转换为物理地址时都需要查询内存中的页表。
- 加速地址转换:每次进行虚拟地址到物理地址的转换都需要查询内存中的页表,这会消耗一定的时间。为了提高效率,MMU 使用 TLB 来缓存最近使用过的地址映射。当需要再次访问相同的虚拟地址时,可以直接从 TLB 中获取对应的物理地址,而无需再访问主存中的页表。
- 性能提升:由于 TLB 的存在,大多数情况下地址转换可以非常快速地完成,从而显著提升了系统性能。然而,如果所需的地址映射不在 TLB 中(称为 TLB Miss),则仍然需要访问页表来完成地址转换,并且该映射会被添加到 TLB 中以便将来使用
缓存
- 为了解决处理器的执行速度和内存访问速度不匹配的问题,在处理器和内存之间增加缓存。
- 缓存通常分为一级缓存 (L1 Cache) 和二级缓存 (L2 Cache)。
- 为了支持并行地取指令和取数据,一级缓存分为数据缓存 (Data Cache) 和指令缓存 (Instruction Cache)。
相关文章:
Linux内存管理架构(1)
0.内存空间架构 1.用户空间 在 Linux 系统中,应用程序通过 malloc() 申请内存,并通过 free() 释放内存时,底层的内存管理是由 glibc(GNU C Library)中的内存分配器实现的。glibc 的内存分配器负责与操作系统的内核交互…...
Ubuntu 各个常见长期支持历史版本与代号
文章目录 1. Ubuntu 历史版本与代号2. 查看当前系统版本 在 Ubuntu 操作系统里,每个版本都有一个别具特色的名字。该名字由一个形容词与一个动物名称构成,且形容词和动物名称的首字母是一样的。例如 “Warty Warthog(长疣的疣猪)”…...
信息安全管理与评估2021年国赛正式卷答案截图以及十套国赛卷
2021年全国职业院校技能大赛高职组 “信息安全管理与评估”赛项 任务书1 赛项时间 共计X小时。 赛项信息 赛项内容 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 平台搭建与安全设备配置防护 任务1 网络平台搭建 任务2 网络安全设备配置与防护 第二…...
在线上定位1G日志文件中的异常信息时,我这样做合适吗
1G级线上日志文件 的异常定位系统性方案 一、快速定位流程 import datetime import randomdef generate_springboot_log(file_name, file_size_gb):# 模拟Spring Boot日志内容log_levels ["INFO", "DEBUG", "WARNING", "ERROR"]cla…...
Transformer模型中的两种掩码
模型训练通常使用 批处理batch来提升训练效率。而实际中Transformer的输入序列(如句子、文本片段)长度往往不一致。为了让这些样本可以组成一个统一的形状 [B, T] 的张量给GPU进行并行计算提高效率,需要将较短的序列填充(pad&…...
FastAPI-MPC正式发布,新的AI敏捷开发利器
FastAPI-MCP发布:零配置构建微服务控制平台的革命性实践 引言 在微服务架构日益复杂的今天,如何快速实现API接口的标准化管理与可视化控制成为开发者面临的核心挑战。近日,FastAPI-MCP工具的发布引发了技术社区广泛关注,其宣称能…...
Spring Boot 项目基于责任链模式实现复杂接口的解耦和动态编排!
全文目录: 开篇语前言一、责任链模式概述责任链模式的组成部分: 二、责任链模式的核心优势三、使用责任链模式解耦复杂接口1. 定义 Handler 接口2. 实现具体的 Handler3. 创建订单对象4. 在 Spring Boot 中使用责任链模式5. 配置责任链6. 客户端调用 四、…...
学习笔记八——内存管理相关
📘 目录 内存结构基础:栈、堆、数据段Rust 的内存管理机制(对比 C/C、Java)Drop:Rust 的自动清理机制Deref:为什么 *x 能访问结构体内部值Rc:多个变量“共享一个资源”怎么办?Weak&…...
Deepseek Bart模型相比Bert的优势
BART(Bidirectional and Auto-Regressive Transformers)与BERT(Bidirectional Encoder Representations from Transformers)虽然均基于Transformer架构,但在模型设计、任务适配性和应用场景上存在显著差异。以下是BART…...
Python在糖尿病分类问题上寻找具有最佳 ROC AUC 分数和 PR AUC 分数(决策树、逻辑回归、KNN、SVM)
Python在糖尿病分类问题上寻找具有最佳 ROC AUC 分数和 PR AUC 分数(决策树、逻辑回归、KNN、SVM) 问题模板解题思路1. 导入必要的库2. 加载数据3. 划分训练集和测试集4. 数据预处理5. 定义算法及其参数6. 存储算法和对应指标7. 训练模型并计算指标8. 找…...
达梦数据库-学习-20-慢SQL优化之CTE等价改写
目录 一、环境信息 二、介绍 三、优化过程 1、原始SQL 2、源SQL执行时间 3、原始SQL执行计划 4、拆分问题 5、过滤性 6、统计信息收集 7、改写思路一 8、改写SQL一 9、改写SQL一的执行计划 10、改写思路二 11、改写SQL二 12、改写SQL二的执行计划 一、环境信息…...
软件生命周期模型:瀑布模型、螺旋模型、迭代模型、敏捷开发、增量模型、快速原型模型
目录 1.软件生命周期 2.软件生命周期模型 2.1瀑布模型 缺点【存在的问题】: 优点: 2.2 螺旋模型 特点: 2.3 迭代模型 优点: 2.4 敏捷开发 2.5 增量模型 增量模型一般和迭代模型一起使用: 2.6 快速原型模型…...
AI agents系列之全面介绍
随着大型语言模型(LLMs)的出现,人工智能(AI)取得了巨大的飞跃。这些强大的系统彻底改变了自然语言处理,但当它们与代理能力结合时,才真正释放出潜力——能够自主地推理、规划和行动。这就是LLM代理大显身手的地方,它们代表了我们与AI交互以及利用AI的方式的范式转变。 …...
Ubuntu 下通过 Docker 部署 WordPress 服务器
最近想恢复写私人博客的习惯,准备搭建一个wordpress。 在这篇博客中,我将记录如何在 Ubuntu 环境下通过 Docker 部署一个 WordPress 服务器。WordPress 是一个流行的内容管理系统(CMS),它让用户能够轻松地创建和管理网…...
Elasticsearch生态
目录 Elasticsearch核心概念 Elasticsearch实现全文检索的原理 Elasticsearch打分规则 常用的查询语法 ES数据同步方案 Elasticsearch生态非常丰富,包含了一系列工具和功能,帮助用户处理、分析和可视化数据,Elastic Stack是其核心部分&a…...
idea配置spring MVC项目启动(maven配置完后)
springmvc项目在idea中配置启动总结,下面的内容是在maven配置好后进行的。 配置 Tomcat 服务器 添加 Tomcat 到 IDEA: File → Settings → Build, Execution, Deployment → Application Servers → 点击 → 选择 Tomcat Server。 指定 Tomcat 安装目…...
大模型微调数据集怎么搞?基于easydataset实现文档转换问答对json数据集!
微调的难点之一在与数据集。本文介绍一种将文档转换为问答数据集的方法,超级快! 上图左侧是我的原文档,右侧是我基于文档生成的数据集。 原理是通过将文档片段发送给ollama本地模型,然后本地模型生成有关问题,并基于文…...
【排序算法】快速排序
目录 一、递归版本 1.1 hoare版本 问题1:为什么left 和 right指定的数据和key值相等时不能交换? 问题2:为什么跳出循环后right位置的值⼀定不⼤于key? 1.2 挖坑法 1.3 lomuto前后指针版本 二、快排优化 2.1 时间复杂度的计算 2.1.…...
爬虫:IP代理
什么是代理 代理服务器 代理服务器的作用 就是用来转发请求和响应 在爬虫中为何需要使用代理? 有些时候,需要对网站服务器发起高频的请求,网站的服务器会检测到这样的异常现象,则会讲请求对应机器的ip地址加入黑名单ÿ…...
JUC.atomic原子操作类原理分析
摘要 多线程场景下共享变量原子性操作除了可以使用Java自带的synchronized关键字以及AQS锁实现线程同步外,java.util.concurrent.atomic 包下提供了对基本类型封装类(AtomicBoolean|AtomicLong|AtomicReference|AtomicBoolean) 以及对应的数组封装。对于已有的包含…...
【XCP实战】AUTOSAR架构下XCP从0到1开发配置实践
目录 前言 正文 1.CAN功能开发 1.1 DBC的制作及导入 1.2 CanTrcv模块配置 1.3 Can Controller模块配置 1.4 CanIf模块配置 2.XCP模块集成配置配置 2.1.XCP模块配置 2.2.XCP模块的Task Mapping 2.3.XCP模块的初始化 3.在链接文件中定义标定段 4.编写标定相关的测试…...
【STM32】STemWin库,使用template API
目录 CubeMX配置 工程文件配置 Keil配置 STemwin配置 GUIConf.c LCDConf.c 打点函数 修改屏幕分辨率 GUI_X.c 主函数 添加区域填充函数 移植过程中需要一些参考手册,如下 STemwin使用指南 emWin User Guide & Reference Manual CubeMX配置 参考驱…...
Web开发-JavaEE应用动态接口代理原生反序列化危险Invoke重写方法利用链
知识点: 1、安全开发-JavaEE-动态代理&序列化&反序列化 2、安全开发-JavaEE-readObject&toString方法 一、演示案例-WEB开发-JavaEE-动态代理 动态代理 代理模式Java当中最常用的设计模式之一。其特征是代理类与委托类有同样的接口,代理类…...
C语言中while的相关题目
一、题目引入 以下程序中,while循环的循环次数是多少次? 二、代码分析 首先要明确的一点 while循环是当循环条件为真 就会一直循环 不会停止 while中i是小于10的 说明i可以取到0 1 2 3 4 5 6 7 8 9 进入第一个if判断i小于1为真时执行continue i0是为真的 执行continue 后…...
在Ubuntu下交叉编译 Qt 应用程序(完整步骤)
1、下载交叉编译器下: st-example-image-qt wayland-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1-snapshot.sh 通过网盘分享的文件:STM32项目 链接: https://pan.baidu.com/s/1hTvJT2r6czWCrKSuNEZCuw?pwdth7t 提取码: th7t --来自百度网盘超级…...
深入剖析 Axios 的 POST 请求:何时使用 qs 处理数据
在前端开发中,Axios 是一个广泛使用的用于发送 HTTP 请求的库,特别是在处理 POST 请求时,数据的处理方式会直接影响到请求能否正确被后端接收和处理。其中,使用 qs 库对数据进行处理是一个常见的操作点,本文将深入探讨…...
Python中NumPy的随机操作
在数据科学、机器学习和科学计算中,随机数的生成和操作是不可或缺的一部分。NumPy作为Python中强大的数值计算库,提供了丰富的随机数生成工具,能够满足从简单随机数生成到复杂概率分布模拟的多种需求。本文将深入探讨NumPy的随机操作功能&…...
从代码学习深度学习 - 多头注意力 PyTorch 版
文章目录 前言一、多头注意力机制介绍1.1 工作原理1.2 优势1.3 代码实现概述二、代码解析2.1 导入依赖序列掩码函数2.2 掩码 Softmax 函数2.3 缩放点积注意力2.4 张量转换函数2.5 多头注意力模块2.6 测试代码总结前言 在深度学习领域,注意力机制(Attention Mechanism)是自然…...
通过扣子平台工作流将数据写入飞书多维表格
1. 进入扣子平台,并创建工作流扣子 扣子是新一代 AI 大模型智能体开发平台。整合了插件、长短期记忆、工作流、卡片等丰富能力,扣子能帮你低门槛、快速搭建个性化或具备商业价值的智能体,并发布到豆包、飞书等各个平台。https://www.coze.cn…...
python专题2-----用python生成多位,值均是数字的随机数
有很多方法可以用 Python 生成 多位随机数。我将向您介绍几个常用的方法,并解释它们的优缺点(此处以4位随机数为例): 1. 使用 random.randint() 这是最简单直接的方法: import randomrandom_number random.randint…...
Mybatis的简单介绍
文章目录 MyBatis 简介 1. MyBatis 核心特点2. MyBatis 核心组件3. MyBatis 基本使用示例(1) 依赖引入(Maven)(2) 定义 Mapper 接口(3) 定义实体类(4) 在 Service 层调用 4. MyBatis 与 JPA/Hibernate 对比 MyBatis 简介 MyBatis 是一款优秀的 持久层框…...
山东大学软件学院创新项目实训(11)之springboot+vue项目接入deepseekAPI
因为该阶段是前后端搭建阶段,所以没有进大模型的专项训练,所以先用老师给的deepseek接口进行代替 且因为前端设计部分非本人负责且还没有提交到github上,所以目前只能先编写一个简易的界面进行功能的测试 首先进行创建model类 然后创建Cha…...
Qt绘图事件
目录 1.绘图事件 1.1绘图事件 1.2声明一个画家对象 2.画线、画圆、画矩形、画文字 2.1画线 编辑 2.2画圆 2.3画矩形 2.4画文字 3.设置画笔 3.1设置画笔颜色 3.2设置画笔宽度 3.3设置画笔风格 4.设置画刷 4.1填色 4.2设置画刷风格 5.绘图高级设置 5.1设置抗锯…...
Linux 内核 BUG: Android 手机 USB 网络共享 故障
众所周知, 窝日常使用 ArchLinux 操作系统, 而 ArchLinux 是一个滚动发行版本, 也就是各个软件包更新很快. 然而, 突然发现, Android 手机的 USB 网络共享功能 BUG 了. 经过一通排查, 发现是 Linux 内核造成的 BUG. 哎, 没办法, 只能自己动手修改内核代码, 修复 BUG 了. 本文…...
程序化广告行业(82/89):解锁行业术语,开启专业交流之门
程序化广告行业(82/89):解锁行业术语,开启专业交流之门 在程序化广告这个充满活力与挑战的行业里,持续学习是我们不断进步的动力源泉。一直以来,我都期望能和大家一起深入探索这个领域,共同成长…...
Linux的网络配置的资料
目前有两种方式,network和NetworkManager。 network方式是在CentOS 6及更早版本中引入的配置方法,支持使用配置文件的方式管理网卡的配置。 NetworkManager是在CentOS 7及后续的版本中使用的配置方法,支持使用命令行和图形化界面的方式来管理…...
linux: 文件描述符fd
目录 1.C语言文件操作复习 2.底层的系统调用接口 3.文件描述符的分配规则 4.重定向 1.C语言文件操作复习 文件 内容 属性。所有对文件的操作有两部分:a.对内容的操作;b.对属性的操作。内容是数据,属性其实也是数据-存储文件,…...
每天学一个 Linux 命令(16):mkdir
每天学一个 Linux 命令(16):mkdir 命令简介 mkdir(Make Directory)是 Linux 和类 Unix 系统中用于创建新目录的基础命令。它允许用户快速创建单个目录、多级嵌套目录,并能灵活设置目录权限。 主要用途 创建单个目录:快速生成新的空目录。递归创建多级目录:自动生成缺…...
Java微服务注册中心深度解析:环境隔离、分级模型与Eureka/Nacos对比
在微服务架构体系中,注册中心如同神经系统般承担着服务发现与健康管理的核心职能。本文将从生产环境实践出发,系统剖析注册中心的环境隔离策略、分级部署模型,并通过Eureka与Nacos两大主流组件的全方位对比,帮助开发者构建高可用服…...
c++:new关键字
目录 基本语法 使用举例 应用场景 使用 new 时的注意事项 基本语法 Type* ptr new Type;Type 是你要创建的类型(可以是基本类型、结构体、类等) new Type 表示在堆上创建一个 Type 类型的对象 ptr 是一个指针,指向这个对象 使用举例 …...
理解 MCP 协议的数据传递:HTTP 之上的一层“壳子
以下是以 CSDN 博客的风格记录你对 MCP 协议数据传递的理解和发现,内容涵盖了 MCP 协议基于 HTTP 的本质、JSON-RPC 的“壳子”作用,以及为什么熟悉 HTTP 协议就足以理解 MCP 的数据传递。文章面向技术社区,结构清晰,适合分享。 理…...
word中的mathtype公式编辑时,大(中)括号会存在很大的空白
如下所示,公式编辑的时候发现总会多一个空白,怎么删也删不掉 这主要是公式的分隔符问题,选择:“格式”-“分隔符对齐”,选择第三个可以消除下面的空白 点击“确认”,效果如下所示:...
【Java】查看当前 Java 使用的垃圾回收器
一、查询 Code import java.lang.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; import java.util.Arrays; import java.util.List;public class GCTypeDetector {public static void main(String[] args) {List<GarbageCollectorMX…...
Linux编程c/c++程序
前言 我们Windows系统下的idea可以说是非常智能了,集成了各种开发工具,包括并不限于编辑器/编译器/调试器/自动化构建工具/版本控制工具……而在Linux系统中,每个组件之间是相互独立的,每个组件各司其职,共同协作完成…...
【前端网络请求入门】XMLHttpRequest与Fetch保姆级教程
新手学前端时,经常会被「如何让网页和服务器说话」难住。今天我们用最通俗的语言,把浏览器最常用的两种网络请求方式——XMLHttpRequest和Fetch讲清楚,还会带完整的代码示例,跟着敲一遍就能上手! 一、先搞懂「网络请求…...
redis单机安装
redis单机安装 下载地址 官网:https://redis.io/下载列表页面:https://download.redis.io/releases/ 说明 版本选择:redis-7.0.0.tar.gz下载地址:https://download.redis.io/releases/redis-7.0.0.tar.gz 安装前准备 在linu…...
从零手写RPC-version0
参考文档 https://github.com/he2121/MyRPCFromZero Version-0 0、写项目第一步,先添加远程仓库 先在 github 上新建仓库,然后将本地新建的项目推送到远程仓库中 由于网上很多教程,所以本节不再赘述(可以让 chatGPT给出一个完…...
MOM成功实施分享(八)汽车活塞生产制造MOM建设方案(第二部分)
在制造业数字化转型的浪潮中,方案对活塞积极探索,通过实施一系列数字化举措,在生产管理、供应链协同、质量控制等多个方面取得显著成效,为行业提供了优秀范例。 1.转型背景与目标:活塞在数字化转型前面临诸多挑战&…...
二、Android Studio环境安装
一、下载安装 下载 Android Studio 和应用工具 - Android 开发者 | Android DevelopersAndroid Studio 提供了一些应用构建器以及一个已针对 Android 应用进行优化的集成式开发环境 (IDE)。立即下载 Android Studio。https://developer.android.google.cn/studio?hlzh-c…...
构件与中间件技术:概念、复用、分类及标准全解析
以下是对构件与中间件技术相关内容更详细的介绍: 一、构件与中间件技术的概念 1.构件技术 定义:构件是具有特定功能、可独立部署和替换的软件模块,它遵循一定的规范和接口标准,能够在不同的软件系统中被复用。构件技术就是以构…...