一文了解 OS-内存管理
内存对齐
为了程序可以在所有处理器下运行,以此提升性能
很多处理器每次只能从内存中取出特定字节的数据,如 1 次访存只能取出 4 个字节数据,那么该处理器访问的地址必须是 4 的倍数,如 0x0, 0x4 等
对于 amd64 与 x86 处理器是不需要考虑内存对其的事情,他们的处理器经过特殊处理,可以读取任意小的变量
如果不进行内存对齐
一个变量的值可能要跨两个内存块,需要两次访存才能获取,损耗 cpu 性能
如上图,该处理器一次访存能取 4 字节数据。当其需要取 int 变量 y 时,需要两次读取 0x0,0x4.将不需要的数据舍弃,将 0x1-0x4 拼接得到变量 y。降低运行性能
空闲链表
空闲块结构:头部 + 有效载荷 + 填充 + 脚部
其中,头部、填充、脚部三部分的内存,是在分配内存的同时就分配给内存块了,并不是独立出来
空闲链表概念:将空闲内存块串成一个链表方便管理
由于空闲内存块大小不一,如果串成一个链表,分配时需要遍历整个链表,效率较低。因此操作系统会按照空闲内存块大小区分出多个空闲链表
将每个空闲链表的表头存放在数组中
当出现内 ...
一文了解 OS-内存映射
何为内存映射
Linux 通过将一个虚拟内存区域与一个文件对象关联,以初始化这个虚拟内存区域的内容,这个过程就被称为内存映射。
那么什么是文件对象呢?众所周知,Linux 继承了 Unix 中“一切皆文件”的思想,文件对象就包括 Linux 系统中的普通文件以及匿名文件 - 一块全部包含二进制零的物理内存。
我们假设读者已经了解了内存布局的相关概念。虚拟内存的内存映射区域就是用于内存映射的。
我们先来看看如何内存映射一个普通文件
走近内存映射 - 普通文件映射
程序如果想读写磁盘中的一个文件,我们可以在这个程序的虚拟地址空间中分配一段区域,使用这一段区域去映射磁盘中的文件。那么什么是映射呢?就是程序的每一个虚拟地址都对应文件中每一个字节的数据。
此时我们假设这个文件大小是 3 个页,即 12KB,那么对应的映射区域也需要有 3 个页。
如果程序要访问这个文件,一般来说是将这个文件从磁盘加载到内存中,CPU 去内存中访问数据。当程序访问映射区地址时,发现这个虚拟页在页表中对应的物理页不存在,会触发缺页异常,通过缺页异常处理程序在物理内存中分配物理页帧,将磁盘文件加载到物理内存中,并修改页 ...
一文了解容器技术
容器的实质是隔离了外界,限制了资源的特殊的进程
进程的静态表现是程序,存储在磁盘中。进程的动态表现是程序执行起来后,计算机内存中的数据、寄存器中的值、堆栈中的指令、被打开的文件,以及各种设备的状态信息的一个集合。
借用 Docker Getting Started 的一句话:简单来说,容器就是机器上的另一个进程,它与主机上所有其他进程隔离开来,这种隔离利用了 kernel namespaces 和 cgroups,这些 features 在 Linux 中已经存在很长时间了,但是 Docker 的出现使得这些功能变得平易近人且易于使用。
容器技术的核心功能就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”,容器就是一个单进程模型。
12345678910$ docker run -it busybox /bin/sh# -it参数告诉了Docker在启动容器后需要分配一个文本输入输出环境TTY,与容器的标准输入输出相关联# 其中 /bin/sh 是我们要在Docker容器里运行的程序# 容器中执行ps指令# 从命令的输出中可以看到,容器中只有两个进程在运行,而新执行的/bin ...
单例模式
单例模式
面试常问的单例模式
单例模式是什么
单例模式的含义是让程序中某个类运行时只存在一个对象,例如数据库连接池不会重复的创建,spring 中同一容器一个单例 bean 的生成和应用
有什么用
单例模式主要解决的问题是一个全局使用的类,不会被频繁创建和销毁,从而提升代码的整体性能。
单例模式都有哪些
饿汉式
定义
式如其名,就是人饿了,然后迫不及待地想吃东西。
饿汉式的思想就是在类加载的过程中就创建好目标对象,运行时调用目标方法去获取实例时直接返回已经实例化好的对象。
12345678910111213public class HungrySingleton { private static final HungrySingleton SINGLETON = new HungrySingleton(); /** * 单例模式有一个特点,不允许外部直接创建对象,私有构造不让外部实例化 */ private HungrySingleton() {} public static HungrySingle ...