一.内存
物理内存也称为主存,大多数计算机用的主存都是动态随机访问内存(DRAM)。只有内核才可以直接访问物理内存。
Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。这样,进程就可以很方便地访问内存,更确切地说是访问虚拟内存。
通过这里可以看出,32位系统的内核空间占用 1G,位于最高处,剩下的3G是用户空间。而 64 位系统的内核空间和用户空间都是 128T,分别占据整个内存空间的最高和最低处,剩下的中间部分是未定义的。
进程在用户态时,只能访问用户空间内存;只有进入内核态后,才可以访问内核空间内存。虽然每个进程的地址空间都包含了内核空间,但这些内核空间,其实关联的都是相同的物理内存。这样,进程切换到内核态后,就可以很方便地访问内核空间内存。
每个进程都有整个虚拟空间可用,但只有实际应用了才分配物理内存。分配后的物理内存,是通过内存映射来管理的。那加起来所有进程的虚拟内存加起来,要比实际的物理内存大得多。
内存映射,其实就是将虚拟内存地址映射到物理内存地址。为了完成内存映射,内核为每个进程都维护了一张页表,记录虚拟地址与物理地址的映射关系,如下图所示:
页表实际上存储在 CPU 的内存管理单元 MMU中,这样,正常情况下,处理器就可以直接通过硬件,找出要访问的内存。
而当进程访问的虚拟地址在页表中查不到时,系统会产生一个缺页异常,进入内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程的运行。
二.内存占用
虚拟存储器的基本思想是:程序、数据和堆栈的总大小可能超过可用的物理内存的大小。由操作系统把程序当前使用的那些部分保留在主存中,而把其他部分保存在磁盘上。例如,对于一个16MB的程序,通过仔细地选择在每个时刻将哪4MB内容保留在内存中,并在需要时在内存和磁盘间交换程序的片段,这样这个程序就可以在一个4MB的机器上运行。
内存的最小单位是字节 1M=1024byte(字节)
1字节=8bit(比特) 所以一个字节最大存储值为255,就是8个1
具体占用几个字节,和解释器版本,系统版本有关。数字4字节
变量=100 1字节直接可以存储100
变量=100(字符串) 一个字符占用一个字节 汉子占用2个字节表示
这里的变量,就会占用内存,但是不大,一个int类型的变量占4个字节,一个字节是8个bit,每个bit里只能存放0或1
所以int类型的4个字节一共是4*8=32 bit
最大表示 1111111111.....(32个1)
转换为10进程,,就是int类型的在实际计算中的2的32次幂
如果程序很复杂,定义的变量很多,占用的内存空间就很大
从内存模型上,最简单的堆和栈
某些变量在栈中,某些变量在堆中。计算完成后(程序结束),变量销毁,内存空间回收,所以你能看到你的内存又降下来了。