200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > CPU和CPU寄存器和CPU缓存和CPU内存管理器 RAM hard disk。以及堆栈 内存映射。

CPU和CPU寄存器和CPU缓存和CPU内存管理器 RAM hard disk。以及堆栈 内存映射。

时间:2020-06-26 17:57:55

相关推荐

CPU和CPU寄存器和CPU缓存和CPU内存管理器 RAM hard disk。以及堆栈 内存映射。

CPU registers cpu寄存器 包含通用寄存器,状态寄存器Cache cpu缓存RAM内存hard disk硬盘我们常常看到 32位 CPU、64位 CPU 这样的名称,其实指的就是寄存器的大小。32 位 CPU 的寄存器大小就是4个字节。

程序运行的时候,操作系统会给它分配一段内存,用来储存程序和运行产生的数据。这段内存有起始地址和结束地址,比如从0x1000到0x8000,起始地址是较小的那个地址,结束地址是较大的那个地址。

程序运行过程中,对于动态的内存占用请求(比如新建对象,或者使用malloc命令),系统就会从预先分配好的那段内存之中,划出一部分给用户,具体规则是从起始地址开始划分(实际上,起始地址会有一段静态数据,这里忽略)。举例来说,用户要求得到10个字节内存,那么从起始地址0x1000开始给他分配,一直分配到地址0x100A,如果再要求得到22个字节,那么就分配到0x1020

这种因为用户主动请求而划分出来的内存区域,叫做 Heap(堆)。它由起始地址开始,从低位(地址)向高位(地址)增长。Heap 的一个重要特点就是不会自动消失,必须手动释放,或者由垃圾回收机制来回收。

除了 Heap 以外,其他的内存占用叫做 Stack(栈)。简单说,Stack 是由于函数运行而临时占用的内存区域。由系统自动分配,由编译器管理。即代码在编译阶段,编译器只是指定了栈的生成规则,它告诉操作系统,栈应该怎么分配,在哪里分配,分配多大,编译器并不会生成栈,生成“栈”的这个动作,是程序在被安装所在的机器设备上在运行的时候,由系统完成的。

简单一句话:编译器确定生成栈的规则,由操作系统分配和管理。

题外话: 从静态存储区分配:内存在程序编译的时候已经确定好规则,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

比如:

int main() {

int a = 2;

int b = 3;

}

上面代码中,系统开始执行main函数时,会为它在内存里面建立一个帧(frame),所有main的内部变量(比如a和b)都保存在这个帧里面。main函数执行结束后,该帧就会被回收,释放所有的内部变量,不再占用空间。

如果函数内部调用了其他函数,会发生什么情况?

int main() {

int a = 2;

int b = 3;

return add_a_and_b(a, b);

}

上面代码中,main函数内部调用了add_a_and_b函数。执行到这一行的时候,系统也会为add_a_and_b新建一个帧,用来储存它的内部变量。也就是说,此时同时存在两个帧:main和add_a_and_b。一般来说,调用栈有多少层,就有多少帧。

虚拟内存和物理内存之间的映射通过MMU进行内存页的分配

因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。

分页虚拟内存机制。

一个技术的引入,最后的应用和当初的目的可能完全不一样。当然了,现在我们看到分页技术,可以解决地址空间隔离的问题,可以解决物理内存不足的问题,可以控制内存访问权限等等。所以如果是教科书式的回答,那么可能就是前面说的地址空间隔离之类的选项;如果是从计算机硬件发展的角度上看,最早只是为了解决段交换的性能。

在标准C库中,提供了malloc/free函数分配释放内存,这两个函数底层是由brk,mmap,munmap这些系统调用实现的。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。