zoukankan      html  css  js  c++  java
  • 操作系统之内存管理

    1 基础知识

    运行一个C++程序,要经历两个步骤:编辑代码 + run。

    #include <iostream>
    using namespace std;
    
    int main()
    {
        cout << "hello world!
    ";
        return 0;            
    }

    但这个run又可以分为如下几个步骤:

    1)预编译:将头文件加载进来。

    2)正式编译:生成汇编文件。

    3)汇编:生成目标文件。

    4)链接:将多个目标文件进行链接,生成可执行文件。

    5)执行:在没执行程序前,程序还是存放在外存中;当执行后,程序被加载至内存中,形成一个运行中的程序,也就是进程。

    2 程序在内存中的存储方式

    一个程序在内存中是分区存放的,内存中主要有四个区:代码区、全局区、堆区、栈区。

    全局区:放置全局变量。

    栈区:存放局部变量,另外在发生函数调用或中断时,也会把一些现场信息压入栈中,执行完后,又会将栈中的现场信息弹出来,称为恢复现场。

    堆区:当使用malloc或new动态分配内存时,就会在堆区动态开辟空间,该空间由程序员通过free或delete来释放。

    代码区:用来放置代码指令。

    我的疑问:

    如下代码所示,'+'指令放在代码区,变量a、b放在栈区是这样的吗?

    一条语句可能会被拆分放在不同的内存区域吗?

    那将来执行代码时,光凭一个‘+’如何找到a与b呢?

    而这就要引出不同的寻址方式吗?

    int a = 2, b = 3;
    int c = a + b;

    3 段与页的概念

    段存储:以程序为单位,往内存里存储。

    段存储的话,不用考虑物理地址的变化,只用考虑虚拟地址即可;但缺点是效率低下,有时需要将整个程序进行内存与外存之间的搬移。

    页存储:将内存划分为页,以页作为存储的最小单位,常见页的大小为4KB。

    4疑问

    1)Windows 7 操作系统有20多个G,为什么能在2G或4G内存里运行?

    是因为操作系统内核并没有这么大?

    还是用什么加载什么?

    参考

    Linux进程的五个段(数据段、代码段、bss、堆栈段)

    https://blog.csdn.net/koozxcv/article/details/49533731

    内存的分段和分页

    https://blog.csdn.net/guanghui92luo/article/details/79044378

  • 相关阅读:
    Unable to save settings: Failed to save settings. Please restart IntelliJ IDEA
    mysql使用instr
    swagger错误:Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body
    java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result异常的解决方法
    平行四边形
    transition
    transform
    box-shadow
    text-shadow文字阴影
    linear-gradient线性渐变
  • 原文地址:https://www.cnblogs.com/QQ2962269558/p/13367350.html
Copyright © 2011-2022 走看看