欢迎大家点击上方文字「Golang梦工厂」关注公众号,设为星标,第一时间接收推送文章。
前言
哈喽,大家好,我是
asong
。好久不见,上周停更了一周,因为工作有点忙,好在这周末闲了下来,就赶紧来肝文喽。今天我们来聊一聊一道常见的面试八股文——内存对齐,我们平常在业务开发中根本不care
内存对齐,但是在面试中,这就是一个高频考点,今天我们就一起来看一看到底什么是内存对齐。
前情概要
在了解内存对齐之前,先来明确几个关于操作系统的概念,更加方面我们对内存对齐的理解。
-
内存管理:我们都知道内存是计算中重要的组成之一,内存是与
CPU
进行沟通的桥梁,用于暂存CPU
中的运算数据、以及与硬盘等外部存储器交换的数据。早期,程序是直接运行在物理内存上的,直接操作物理内存,但是会存在一些问题,比如使用效率低、地址空间不隔离等问题,所以就出现了虚拟内存,虚拟内存就是在程序和物理内存之间引入了一个中间层,这个中间层就是虚拟内存,这样就达到了对进程地址和物理地址的隔离。在linux
系统中,将虚拟内存划分为用户空间
和内核空间
,用户进程只能访问用户空间的虚拟地址,只有通过系统调用、外设中断或异常才能访问内核空间,我们主要来看一下用户空间,用户空间被分为5
个不同内存区域:内存的知识先介绍个大概,对于本文的理解应该够了,我们接着介绍操作系统几个其他概念。
-
-
代码段:存放可执行文件的操作指令,只读
-
数据段:用来存放可执行文件中已初始化全局变量,存放静态变量和全局变量
-
BSS段:用来存未初始化的全局变量
-
栈区:用来存临时创建的局部变量
-
堆区:用来存动态分配的内存段
-
-
CPU
:中央处理单元(Cntral Pocessing Unit)的缩写,也叫处理器;CPU
是计算机的运算核心和控制核心,我们人类靠着大脑思考,电脑就是靠着CPU
来运算、控制,起到协调和控制作用,从功能来看,CPU 的内部由寄存器、控制器、运算器和时钟四部分组成,各部分之间通过电信号连通。 -
CPU
和内存的工作关系:当我们执行一个程序时,首先由输入设备向CPU
发出操作指令,CPU
接收到操作指令后,硬盘中对应的程序就会被直接加载到内存中,此后,CPU 再对内存进行寻址操作,将加载到内存中的指令翻译出来,而后发送操作信号给操作控制器,实现程序的运行或数据的处理。存在于内存中的目的就是为了CPU
能够过总线进行寻址,取指令、译码、执行取数据,内存与寄存器交互,然后CPU
运算,再输出数据至内存。
-
os
:os
全称为Operating System
,也就是操作操作系统,是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务组织用户交互的相互关联的系统软件,同时也是计算机系统的内核与基石。 -
编译器:编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器(preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序(executables)。
写在最后的一个知识点:
计算机中,最小的存储单元为字节,理论上任意地址都可以通过总线进行访问,每次寻址能传输的数据大小就跟
CPU
位数有关。常见的CPU
位数有8位,16位,32位,64位。位数越高,单次操作执行的数据量越大,性能也就越强。os
的位数一般与CPU
的位数相匹配,32
位CPU
可以寻址4
GB内存空间,也可以运行32
位的os
,同样道理,64
位的CPU
可以运行32
位的os
,也可以运行64位的os
。