Brains


Algorithm、Machine Learning、Search、cloud computing
on Linux, Memory, Study

内存寻址之段页存储机制分析

背景 学习操作系统这门课的时候,曾不止一次的接触到操作系统的段页式管理机制,但当是都是浅尝辄止,不知道操作系统为啥要有这个机制。如今时间过去很久,关于这个机制的背后的原理和实现机制,早已忘记很久了。。最近在看操作系统方面的知识,借此把自己的理解记录一下。 要理解段页式管理机制的发展历程,还得从早期的处理器的寻址方式说起。 内存寻址方式的发展历程 首先简单的介绍下内存寻址的概念,现代计算机是基于冯.诺依曼的体系结构,这个体系结构是以存储为中心的,也就是说所有的运算的前提都是先从内存中取得数据,所以内存寻址技术从某种程度上代表了计算机技术。 直接寻址 在处理器发展的早期阶段,Intel 公司推出了第一款8位的处理器--8080,它的内存寻址的方式简单粗暴,程序都是通过硬编码的形式绝对定位到内存地址。这种情况下的程序都有明显的缺点:可控性弱、难以重定位、难以维护等。 分段 很快在 Intel 推出的另一款处理器 8086 中,它可以寻址空间达到 1M,即地址线扩展到了 20 位,由于当时制造20位的寄存器比较困难,为了能在 16 位的寄存器的基础上寻址 20 位的地址空间,引入了一个重要的概念——段,段的地址存放在寄存器中,换句话说把
Read More
on Memory, 动态分配器的简易实现

动态内存分配器的一个简易实现

堆是进程空间里很重要的一部分,有效的使用堆可以很大程度上提高程序的性能,本文参考《深入理解计算机系统》简要的实现了一个内存分配器。 介绍 这是用C语言实现的一个简易的动态内存分配器,模拟动态内存的分配与回收,是本学期CSAPP课程的第五个实验。它是基于mmlib包所提供的一个存储器系统模型,在对此进行的扩充。实现了用于堆Heap内存管理的动态分配功能。 内存管理与动态分配 内存管理 是在系统层面对计算机内存的一种操作,它的基本要求是:在程序需要内存的时候,能够提供一种方式动态的分配给它;并且当应用程序不再使用时,要能回收。而操作系统动态分配的内存区域称作为堆(Heap)。 动态内存分配 动态内存分配器维护着一个进程的虚拟存储区域,称为堆(Heap),对于每个进程,内核维护着一个变量brk,它指向堆区域的顶部。栈是向下增长,而堆是向上增长的。而对于brk的改变需要系统调用,因为系统调用有很大的开销,如果让用户每次需要堆的时候都自己调用系统调用是很浪费时间的,所以需要对这堆Heap的分配进行封装。 一般做法是先分一大块堆空间,然后对分配的堆空间管理起来,提供接口,以后每次用户需要申请堆的时候,调用这些封装后的函数就行了,它们是用户层的函数,开销不大,这种封装也叫做动态内存分配器。 分配器有两种类型,一种是隐式分配,一种是显示分配。本次实现是基于显示分配的。 - 显示分配:要求应用程序显示的释放任何已分配的块,
Read More