虚拟地址空间布局架构
一、内存管理架构
1.Linux内核整体架构以及子系统
内存管理子系统架构分为用户空间、内核空间及硬件部分 3 个层面:
- 用户空间:应用程序使用
malloc()
申请内存资源,通过free()
释放内存资源。 - 内核空间:内核是操作系统的一部分,始终驻留内存。内核空间为内核保留,不允许应用程序读写该区域内容或直接调用内核代码定义的函数。
- 硬件:处理器包含内存管理单元(Memory Management Unit, MMU)部件,负责将虚拟地址转换为物理地址。
Linux内核只是操作系统当中的一部分,对下管理所有硬件设备;对上通过系统调用向Library Routine或者其他应用程序提供API接口。
-
用户空间
相当于应用程序使用malloc()
申请内存,通过free()
释放内存。malloc()/free()
是 glibc 库的内存分配器ptmalloc
提供的接口,ptmalloc
使用系统调用brk
或mmap
向内核以页为单位申请内存,再分成小内存块分配给对应应用程序。 -
内核空间
- 虚拟内存管理:负责从进程虚拟地址空间分配虚拟页,
sys_brk
扩大或收缩堆,sys_mmap
在内存映射区域分配虚拟页,sys_munmap
释放虚拟页。页分配器(伙伴分配器)负责分配物理页。 - 扩展功能:不连续页分配器提供
vmalloc
(分配内存)和vfree
(释放内存)接口。内存碎片化时,可申请不连续物理页并映射到连续虚拟页(虚拟地址连续,物理地址不连续)。 - 内存控制:内存控制组控制进程内存资源;内存碎片化时,通过迁移整理碎片以获取连续物理页;内存不足时,页回收负责回收物理页。
3.硬件MMU 包含页表缓存,保存最近使用的页表映射,避免虚拟地址转物理地址时频繁查询内存页表。为解决处理器与内存速度不匹配问题,增加缓存:一级缓存分数据缓存和指令缓存,二级缓存协调一级缓存与内存的工作效率。
2.系统调用视图
【代码案例】
sbrk.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>#define MAX 1024int main(int argc,char *argv[]){int *p = sbrk(0);int *old = p;printf("old: %p\n",old);p = sbrk(MAX * MAX);if(p == (void *)(-1)){perror("sbrk error.\n");}printf("old: %p\tp = %p\n",p,old);int *new = sbrk(0);printf("new: %p\n",new);printf("\npid = %d\n\n",getpid());while(1){sleep(1);}sbrk(-MAX * MAX);return 0;
}
运行结果:
二、虚拟地址空间布局架构
因为目前应用程序没有那么大的内存需求,所以 ARM64 处理器不支持完全的 64 位虚拟地址。
在 ARM64 架构的 Linux 内核中,内核虚拟地址和用户虚拟地址的宽度相同。
所有进程共享内核虚拟地址空间,每个进程有独立的用户虚拟地址空间,同一个线程组的用户线程共享用户虚拟地址空间,内核线程没有用户虚拟地址空间。
1.用户虚拟地址空间划分
进程的用户虚拟空间起始地址是 0,长度由处理器架构定义的宏TASK_SIZE
决定。以 ARM64 架构定义的TASK_SIZE
为例:
- 32 位用户空间程序:
TASK_SIZE
取值为TASK_SIZE_32
,即0x100000000
(等同于 4GB)。 - 64 位用户空间程序:
TASK_SIZE
取值为TASK_SIZE_64
,即2^VA_BITS
字节。
VA_BITS 是编译内核的时候选择的虚拟地址位数。
进程的用户虚拟地址空间包含区域:
- 代码段、数据段、未初始化数据段;
- 动态库的代码段、数据段和未初始化数据段;
- 存放动态生成的数据的堆;
- 存放局部变量和实现函数调用的栈;
- 把文件区间映射到虚拟地址空间的内存映射区域;
- 存放在栈底部的环境变量和参数字符串。
Linux内核使用内存描述符mm_struct,描述进程的用户虚拟地址空间,内核源码分析如下:
一个进程的虚拟地址空间主要由两个数据结构描述:
- mm_struct:最高层次结构,描述一个进程整个虚拟地址空间,每个进程只有一个,在进程的
task_struct
结构中有专门指针指向它,是对整个用户空间的描述。 - vm_area_struct:较高层次结构,描述虚拟地址空间的一个区间(虚拟区)。
- 进程基本组成部分对应的 vm_area_struct 节点数量
一个典型进程至少有几个 vm_area_struct 节点描述不同内存区域:
- 代码段,进程可执行代码部分通常由一个 vm_area_struct 描述,包含程序机器指令,起始地址是代码在虚拟内存的加载位置,结束地址是代码段末尾下一字节地址,且区域通常只读可执行。
- 数据段,已初始化全局变量和静态变量所在数据段由一个 vm_area_struct 描述,用于存储程序运行需使用的固定数据,属性可读写。
- BSS 段(未初始化数据段),未初始化全局变量和静态变量所在 BSS 段对应一个 vm_area_struct,程序启动时初始化为零,可读写。
- 堆,进程堆空间由一个或多个 vm_area_struct 描述,用于动态内存分配,随 malloc 和 free 操作,堆大小和位置变化,对应 vm_area_struct 也更新。
- 栈,栈区域由一个 vm_area_struct 描述,存储函数调用相关信息(如局部变量、函数参数、返回地址等),大小和位置随函数调用返回动态变化。
- 共享库和内存映射引入的额外 vm_area_struct 节点
若进程使用共享库,每个共享库在虚拟内存的映射区域有一个 vm_area_struct,共享库代码和数据部分分别对应 vm_area_struct,描述其在虚拟内存的位置、大小、权限等信息。进程通过 mmap 系统调用将文件或设备内存映射到虚拟地址空间时,每个映射区域有一个 vm_area_struct。例如,映射配置文件到进程虚拟内存,该区域由 vm_area_struct 管理。- 具体数量因程序而异
简单程序(如仅含基本代码段、数据段和栈的小程序)可能只有 3 - 5 个 vm_area_struct 节点。复杂大型程序(使用大量共享库、复杂内存映射操作,如数据库程序、大型图形处理软件等)可能有几十个甚至上百个 vm_area_struct 节点,用于精细管理程序在虚拟内存空间的各种不同区域,满足复杂内存需求和功能实
2.内核地址空间布局
ARM64处理器架构内核地址空间布局如下:
1. 线性映射区域
- 功能:直接映射物理内存,虚拟地址与物理地址存在一一对应关系(虚拟地址连续,物理地址也连续)。
- 作用:内核可通过该区域快速访问物理内存,适用于需要直接操作内存的场景,如内存分配与管理。
2. vmemmap 区域
- 功能:存储内存页的元数据(如页的使用状态、引用计数等)。
- 作用:为内核内存管理系统(如页分配器)提供数据支持,用于跟踪和管理物理内存页。
3. 2MB 间隙
- 功能:作为隔离带,分隔不同功能区域。
- 作用:避免相邻区域地址重叠,增强内核地址空间布局的稳定性,防止不同模块间的地址冲突。
4. PCI I/O 区域(16MB)
- 功能:映射 PCI 设备的寄存器和内存空间。
- 作用:内核通过该区域与 PCI 设备进行交互,实现对硬件设备的配置和数据读写。
5. 固定映射区域
- 功能:使用固定虚拟地址映射特定物理资源(如特定硬件寄存器、高端内存等)。
- 作用:确保内核以固定地址访问关键资源,提升访问效率,适用于对地址敏感的场景。
6. vmalloc 区域
- 组成:包含间隙、内核镜像、内核模块区域。
- 间隙:隔离不同子区域,保证地址空间布局的规范性。
- 内核镜像:存放内核代码和初始化数据,是内核运行的基础。
- 内核模块区域(128MB):动态加载内核模块(如驱动程序),扩展内核功能。
- 作用:
vmalloc
用于分配物理地址不连续但虚拟地址连续的内存,满足内核非连续内存的映射需求。7. KASAN 影子区域
- 功能:存储内存访问的 “影子数据”,记录内存区域的访问权限、状态等信息。
- 作用:配合内核地址消毒剂(KASAN)检测内存越界、使用已释放内存等错误,辅助调试内存相关问题。
https://github.com/0voice
相关文章:
虚拟地址空间布局架构
一、内存管理架构 1.Linux内核整体架构以及子系统 内存管理子系统架构分为用户空间、内核空间及硬件部分 3 个层面: 用户空间:应用程序使用malloc()申请内存资源,通过free()释放内存资源。内核空间:内核是操作系统的一部分&…...
在VMware下Hadoop分布式集群环境的配置--基于Yarn模式的一个Master节点、两个Slaver(Worker)节点的配置
你遇到的大部分ubuntu中配置hadoop的问题这里都有解决方法!!!(近10000字) 概要 在Docker虚拟容器环境下,进行Hadoop-3.2.2分布式集群环境的配置与安装,完成基于Yarn模式的一个Master节点、两个…...
go day 01
go day 01 配置go环境 install go on D:\huang\lang\go\D:\huang\lang\go\bin\go xxx.go # D:\huang\lang\go\bin 设置到环境变量go go version# 创建任意一个目录,创建三个文件夹 # D:\huang\lang\goProject bin、pkg、src # 创建三个系统环境变量 GOROOT GOPATH GOBIN # GOR…...
(二)RestAPI 毛子(Tags)
文章目录 项目地址一、给Habit添加Tags1.1 创建Tags1. 创建一个新的HabitTags实体2. 设置Habit和Tags的关系3. 设置HabitTag表4. 在HabitConfiguration里配置5. 将表添加到EFCore里6. 迁移数据 1.2 给Habit增加/修改标签1. 创建UpsertHabitTagsDto2. 创建查询HabitWithTagsDto3…...
Elasticsearch:使用机器学习生成筛选器和分类标签
作者:来自 Elastic Andre Luiz 探索使用机器学习模型与传统硬编码方法在搜索体验中自动创建筛选器和分类标签的优缺点 筛选器和分类标签是用来优化搜索结果的机制,帮助用户更快速地找到相关内容或产品。在传统方法中,规则是手动定义的。例如…...
Python接口自动化测试之UnitTest详解
↵ 基本概念 UnitTest单元测试框架是受到JUnit的启发,与其他语言中的主流单元测试框架有着相似的风格。其支持测试自动化,配置共享和关机代码测试。支持将测试样例聚合到测试集中,并将测试与报告框架独立。 它分为四个部分test fixture、Te…...
《概率论与数理统计》期末复习笔记_上
目录 第1章 随机事件与概率 1.1 随机事件 1.2 事件的关系与运算 1.3 概率的定义与性质 1.4 古典概型_重点 1.5 几何概型 1.6 条件概率与乘法公式 1.7 全概率公式与贝叶斯公式_重点 1.8 事件的独立性_重点 1.9 伯努利概型_重难点 第2章 随机变量及其分布 2.1 随机变…...
工程师 - Doxygen介绍
Code Documentation. Automated. Free, open source, cross-platform. Version 1.12.0 is now available! Release date: 7 August 2024 官方网址: Doxygen homepage 文档: Doxygen: Overview Github网址: https://github.com/doxygen/…...
开源且完全没有审核限制的大型语言模型的概述
开源且完全没有审核限制的大型语言模型的概述 关键要点 研究表明,存在多个开源的大型语言模型(LLM)完全没有审核限制,适合开放对话。包括基于 Llama、Mixtral、Phi-2 和 StableLM 的模型,参数范围从 2.78 亿到 4050 亿…...
Qt QTableView QAbstractTableModel实现复选框+代理实现单元格编辑
话不多说,直接看代码 一、Model 1、QTableModel_Test.h #pragma once#include <QAbstractTableModel> #include <QObject> #include <QModelIndex>class QTableModel_Test : public QAbstractTableModel {Q_OBJECT public:QTableModel_Test(Q…...
2025.3.19
1、用vim编辑/etc/hosts文件,将本机和第二个虚拟机的ip地址和主机名写入该文件,然后ping 两个主机的主机名能否ping通; (1)在第一个虚拟机编辑/etc/hosts: 首先使用hostname、hostnamectl、hostname -f指令查看主机名…...
GATT(Generic Attribute Profile)是蓝牙低功耗(Bluetooth Low Energy,简称BLE)协议栈中的一个核心协议
蓝牙的 GATT(Generic Attribute Profile) 是蓝牙低功耗(Bluetooth Low Energy,简称BLE)协议栈中的一个核心协议,用于定义设备如何通过蓝牙进行数据传输和交互。GATT 是基于 ATT(Attribute Proto…...
打造下一代智能体验:交互型 AI 的崛起与实践
在人工智能技术不断飞跃的今天,我们正迎来一个从"一问一答"向"多轮交互、智能反馈"转变的新时代——交互型 AI(Interactive AI)。 什么是交互型 AI? 交互型 AI 指的是具备多轮对话能力、状态记忆、工具调用…...
关于uint8_t、uint16_t、uint32_t、uint64_t的区别与分析
一、类型定义与字节大小 uint8_t、uint16_t、uint32_t、uint64_t 是 C/C 中定义的无符号整数类型,通过 typedef 对基础类型起别名实现。位宽(bit)和字节数严格固定: uint8_t:8 位,占用 1 字节ÿ…...
19685 握手问题
19685 握手问题 ⭐️难度:简单 🌟考点:2024、省赛、数学 📖 📚 package test ;import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);…...
react redux的学习,单个reducer
redux系列文章目录 一 什么redux? redux是一个专门用于做状态管理的JS库(不是react插件库)。它可以用在react, angular, vue等项目中, 但基本与react配合使用。集中式管理react应用中多个组件共享的状 简单来说,就是存储页面的状态值的一个库…...
CCF GESP C++编程 二级认证真题 2025年3月
C 二级 2025 年 03 月 CCF GESP C编程 二级认证真题 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 D C A A D A D A C B C D B C C 1 单选题 第 1 题 2025年春节有两件轰动全球的事件,一个是DeepSeek横空出世,另一个是贺岁片《哪吒2》票房惊人&#…...
Lua函数与表+Lua子文件加载与元表
Lua函数相关示例代码 --脚本型语言,不能先调用,再定义,因为代码是从上往下执行的 --第一种声明函数 function func1()print("这是func1") end--先定义,再调用,没有问题 func1() -------------------------…...
Linux systemd 服务全面详解
一、systemd 是什么? systemd 是 Linux 系统的现代初始化系统(init)和服务管理器,替代传统的 SysVinit 和 Upstart。它不仅是系统启动的“总指挥”,还统一管理服务、日志、设备挂载、定时任务等。 核心作用 服务管理…...
Linux系统调用编程
目录 1.Linux下进程和线程进程线程区别查看进程pid终止进程pid 2.Linux虚拟内存管理与stm32内存映射设计目标与架构差异地址空间管理机制对比内存使用与性能特性 3.Linux系统调用函数fork()wait()exec() 4.树莓派环境下练习创建账号1创建用户账号2.配置用户权限3.查看用户 登录…...
AWS Langfuse AI用Bedrock模型使用完全教程
AWS Langfuse AI使用完全教程 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 AWS Langfuse AI使用完全教程Langfuse是什么?准备工作创建Langfuse账户1.创建LLM应用程序启用Bedrock…...
【Docker项目实战】使用Docker部署MediaCMS内容管理系统
【Docker项目实战】使用Docker部署MediaCMS内容管理系统 前言一、MediaCMS介绍1.1 MediaCMS 简介1.2 主要特点1.3 使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载Med…...
OpenHarmony子系统开发 - DFX(一)
OpenHarmony子系统开发 - DFX(一) 一、DFX概述 简介 在OpenHarmony中,DFX(Design for X)是为了提升质量属性的软件设计,目前包含的内容主要有:DFR(Design for Reliability,可靠性)…...
深入解析:使用Python爬取Bilibili视频
深入解析:使用Python爬取Bilibili视频 引言 Bilibili,作为中国领先的年轻人文化社区,拥有海量的视频资源。对于想要下载Bilibili视频的用户来说,手动下载不仅费时费力,而且效率低下。本文将介绍如何使用Python编写一…...
详解数据结构线性表 c++实现
线性表 线性表是一种非常基础且重要的数据结构,它是具有相同数据类型的 n(n≥0)个数据元素的有限序列。这里的 “有限” 意味着元素的数量是确定的,“序列” 则表示元素之间存在着顺序关系。 顺序表 顺序表是线性表的一种顺序存…...
Prolog语言的网络协议栈
Prolog语言的网络协议栈 引言 网络协议栈是现代计算机网络的重要组成部分,它负责在网络中的各个节点之间以标准化的方式传输数据。在这一体系中,不同层次的协议相互协作,以实现从物理传输到应用层数据处理的功能。Prolog是一种以符号逻辑为…...
音视频基础(音频常用概念)
文章目录 **1. 比特率(Bitrate)****概念****影响****音频比特率****视频比特率** **2. 码率(Bitrate)****3. 帧(Frame)****概念****视频帧****音频帧** **4. 帧长(Frame Length)****…...
洛谷题单3-P5725 【深基4.习8】求三角形-python-流程图重构
题目描述 模仿例题,打印出不同方向的正方形,然后打印三角形矩阵。中间有个空行。 输入格式 输入矩阵的规模,不超过 9 9 9。 输出格式 输出矩形和正方形 输入输出样例 输入 4输出 01020304 05060708 09101112 13141516010203040506 …...
【数据结构】邻接表 vs 邻接矩阵:5大核心优势解析与稀疏图存储优化指南
邻接表法 导读一、邻接矩阵的不足邻接表二、存储结构三、算法评价3.1 时间复杂度3.2 空间复杂度 四、邻接表特点4.1 特点解读特点3特点4特点5 结语 导读 大家好,很高兴又和大家见面啦!!! 图作为一种复杂的数据结构,其…...
编程能力的跃迁时刻:技术革命与认知重构的交响曲
在软件开发领域,从业者常将"一万小时定律"视为能力增长的圭臬,但真正的能力跃迁往往发生在特定技术范式转换的临界点。当开发者首次理解递归算法的本质,当面向对象编程替代过程式思维,当自动化工具链重塑开发流程,这些认知地震时刻往往成为技术生涯的分水岭。 …...
PostIn V1.0.8版本发布,IDEA 插件支持一键扫描上报,让接口定义不再繁琐
PostIn是一款国产开源免费的接口管理工具,包含项目管理、接口调试、接口文档设计、接口数据MOCK等模块,支持常见的HTTP协议、websocket协议等,支持免登陆本地接口调试,同时可以对项目进行灵活的成员权限、消息通知管理等。本周Pos…...
删除Linux服务器上多余的系统启动项,并重装Ubuntu系统
问题描述 2024年6月,Centos团队终止维护Centos7系统,Ubuntu成了我的替换方案。正好有一台闲置的服务器,于是我临危受命给这台服务器重装系统。 经过我一番研究,Ubuntu系统初步安装成功了,但是存在一大堆问题ÿ…...
在亚马逊云科技上使用n8n快速构建个人AI NEWS助理
前言: N8n 是一个强大的工作流自动化工具,它允许您连接不同的应用程序、服务和系统,以创建自动化工作流程,并且采用了开源MIT协议,可以放心使用,他的官方网站也提供了很多的工作流,大家有兴趣的…...
JSON介绍及使用
1.JSON 1.JSON简介 JSON(JavaScript Object Notation)是一种轻量级的数据序列化协议,基于文本,完全独立于语言。 JSON由键值对组成,支持以下几种数据类型: 字符串:用双引号括起来的文本。 数…...
AOP 的织入过程是怎样的?
AOP(面向切面编程)的织入(Weaving)是将切面(Aspect)应用到目标对象(Target Object)并创建代理对象(Proxy Object)的过程。这个过程可以发生在不同的阶段&…...
链路聚合配置命令
技术信息 加入捆绑组,加大链路间带宽等 配置命令 华三 静态聚合 将接口加入聚合口后再进行配置 //创建静态链路聚合口1,不启用lacp[SWB]interface Bridge-Aggregation 1 [SWB-Bridge-Aggregation1]port link-type trunk [SWB-Bridge-Aggregation…...
为什么有的深度学习训练,有训练集、验证集、测试集3个划分,有的只是划分训练集和测试集?
在机器学习和深度学习中,数据集的划分方式取决于任务需求、数据量以及模型开发流程的严谨性。 1. 三者划分:训练集、验证集、测试集 目的 训练集(Training Set):用于模型参数的直接训练。验证集(Validati…...
【读书笔记·VLSI电路设计方法解密】问题61:扫描插入的目的是什么
如问题60所述,要构建可测试电路,必须确保电路中每个节点都具有可控性和可观测性。但对于包含时序元件(如触发器、锁存器等存储元件)的电路,若不采取特殊设计则难以实现这两项特性。这是因为时序元件关联节点的逻辑状态不仅取决于当前输入,还受其先前存储状态影响——它们…...
通信数据记录仪-产品概念ID
总结: 1、支持高速CAN、支持容错CAN、支持单线CAN(理解是支持不同的协议,CANFD、CAN2.0和LIN?) 2、 通过上位机设计时间...
【数据分享】2002-2023中国湖泊水位变化数据集(免费获取)
湖泊水位变化是研究水资源动态、生态系统演变和气候变化影响的重要指标。湖泊水位的升降不仅反映了降水、蒸发和入流水量的变化,还与人类活动、气候波动及地质过程密切相关。因此,高精度、长时间序列的湖泊水位数据对于水资源管理、洪水预测以及生态环境…...
SQL注入重新学习
前话 sql注入一般就是构造闭合,在查询语句中构造恶意语句,因为过滤并不严格导致信息泄露, 后台登陆语句:SELECT * FROM admin WHERE Username‘user’ and Password‘pass’ 万能密码:‘or ’1‘ ’1‘ # ; sql常用…...
修改Jupyter Notebook主目录文件夹
1、找到Jupyter Notebook配置文档 在anaconda prompt终端输入以下命令,可以显示配置文档所在位置: jupyter notebook --generate-config2、修改Jupyter Notebook主目录文件夹 用记事本打开文件夹中的jupyter_notebook_config.py文件。 在记事本中使用…...
玩转JSONObject:使用方法详解与Map对比
一、初识JSONObject 什么是JSONObject? JSONObject是Java中处理JSON数据的核心工具类,主流JSON库均提供类似实现: org.json(原生包)com.alibaba.fastjson.JSONObjectnet.sf.json.JSONObject 基础创建姿势 <JAV…...
LC416 vector<bool> 和 bool[] 的异同
LeetCode 416 1. 报错代码 // 01背包,从n个数字里面选,能否凑出和为s的方案 class Solution { public:bool canPartition(vector<int>& nums) {int m accumulate(nums.begin(), nums.end(), 0);if(m & 1) return false;m >> 1;…...
(51单片机)矩阵按键密码锁表白(C语言代码编撰)(矩阵按键教程)(LCD1602浅教程)
目录 源代码 main.c MatrixKey.c MatrixKey.h LCD1602.c LCD1602.h Delay.c Delay.h 运行效果图: 第一步: 第二步: 第三步: 第四步: 代码解析与教程: 延时函数Delay LCD1602 MatrixKey模块 源代…...
C++20新增内容
C20 是 C 语言的一次重大更新,它引入了许多新特性,使代码更现代化、简洁且高效。以下是 C20 的主要新增内容: 1. 概念(Concepts) 概念用于约束模板参数,使模板编程更加直观和安全。 #include <concept…...
思维链、思维树、思维图与思维森林在医疗AI编程中的应用蓝图
在医疗AI编程中,思维链(Chain of Thought, CoT)、思维树(Tree of Thoughts, ToT)、思维图(可能指知识图谱或逻辑图)以及思维森林(Forest-of-Thought, FoT)等技术框架通过模拟人类认知和推理过程,显著提升了AI在复杂医疗场景中的决策能力和可解释性: 1. 思维链(CoT)…...
[GN] Python3基本数据类型 -- 与C的差异
文章目录 前言Python3的基本数据类型6个标准的数据类型NumbersStringListtupleSetsDictionaries Python运算符逻辑 运算符成员运算符身份运算符 Python3 数字Python3 序列序列切片序列相加序列相乘序列相关内置函数 Python3 列表访问列表的值更新列表删除列表元素拼接列表嵌套列…...
TCP基础篇(一)
文章目录 1.TCP 是如何保证可靠性的?2. 滑动窗口机制3 超时重传4.TCP 报文格式5. 什么是 TCP 协议5.1 如何唯一确定一个 TCP 连接 6.TCP 三次握手过程6.1 可以两次握手吗? 7.TCP 的四次挥手7.1 为什么客户端要等待2MSL? 8.linux 中查看 TCP 的连接9.TCP 为什么要有…...
Spring-IOC部分
Spring-IOC部分 1.SpringBean的配置详解(Bean标签) (1)scope 默认情况下,单纯的Spring环境Bean的作用范围有两个:Singleton和Prototype singleton:单例,默认值,Spring…...