zoukankan      html  css  js  c++  java
  • 趣谈Linux操作系统学习笔记:第二十讲

    一、引子

    1、计算两方面的原因

    2、内存管理机制

     

    二、独享内存空间的原理

    1、会议室和物理内存的关系

    和会议室一样,内存都被分成一块块儿的,都编号了号,例如3F-10就是三楼十号会议室、内存页有这样一个地址。这个地址是实实在在的地址,通过这个地址我们就能够定位到物理内存地址

    2、会产生什么问题呢?

    3F-10打开三个相同的程序,都执行到某一步,比方说,打开三个计算机器,用户在这三个程序的界面、上分别输入10、100、1000,如果内存中的这个位置只能保存一个数,

    那应该保存那个呢?这不就冲突了吗?

    3、谁也不能直接访问物理地址

    每个项目的物理地址对于进程不可见,谁也不能直接访问物理地址,操作系统会给进程分配一个虚拟地址。所有进程看到的这个地址都是一样的,里面的内存都是从0开始编号

    4、在程序里面,指令写入的地址是虚拟地址

    例如,位置我10M的内存区域,操作系统会提供一种机制,将不同的进程的虚拟地址和不同的物理地址映射起来

    当程序要访问虚拟地址的时候,由内核的数据结构转换,转换成不同的物理地址,这样不同的进程运行的是时候,写入的是不同的物理地址这样就不会冲突了

    三、规划地址空间

    1、操作系统的内存管理,主要分为三个方面

    于是,你看待了项目组的项目计划是这样一个程序

    #include <stdio.h>
    #include <stdlib.h>
    
    int max_length = 128;
    
    char * generate(int length){
      int i;
      char * buffer = (char*) malloc (length+1);
      if (buffer == NULL)
        return NULL;
      for (i=0; i<length; i++){
        buffer[i]=rand()%26+'a';
      }
      buffer[length]='';
      return buffer;
    }
    
    int main(int argc, char *argv[])
    {
      int num;
      char * buffer;
    
      printf ("Input the string length : ");
      scanf ("%d", &num);
    
      if(num > max_length){
        num = max_length;
      }
    
      buffer = generate(num);
    
      printf ("Random string is: %s
    ",buffer);
      free (buffer);
    
      return 0;
    }

    这个程序比较简单,就是根据用户输入的整数来生成字符串,最长是128,由于字符串的长度不固定、因而不能提前知道,

    需要动态地分配内存,是用malloc函数,当然用完了需要释放内存,这就是要使用free函数

    2、这个简单的程序使用哪些内存的几种方式

    1、那些内存的几种方式

     2、内核部分还需要分配内存

    3、上面的这些地址应该用虚拟地址访问呢?还是应该用物理地址访问呢?

    真正能够使用会议室物理地址的,只有会议室管理部门,

    所有其他部分的行为涉及访问会议室的,都需要统统使用虚拟地址、统统到会议室管理部门哪里转换一道,才能进行统一的控制

    用户态的进程的进程使用虚拟地址,这点毫无你问,内核态的页基本都是使用虚拟地址,

    3、从“虚”的角度来看,这一大片连续的内存空间都是我的了

    1、一大片连续的内存

    2、这个么大的空间都存些什么内容呀

    4、用户空间存放内容详解

    5、不同视觉

    虽然内核代码权限很大,但是能够使用的虚拟地址范围也只能在内核空间,也即内核代码访问内核数据结构,只能用30号到39号这些编程,不能用0-29号,

    因为这些事被金额呈空间占用的,而且、进程有很多个、你现在在内核,但是你不知道当前指的0号是那进程的0号

    在内核里面也会有内核的代码,同样有 Text Segment、Data Segment 和BSS Segment,别忘了咱们讲内核启动的时候,内核代码也是 ELF 格式的。

     四、总结时刻

    通过这一节,你应该知道,一个内存管理系统至少应该做三件事情:


    第一,虚拟内存空间的管理,每个进程看到的是独立的、互不干扰的虚拟地址空间;

    第二,物理内存的管理,物理内存地址只有内存管理模块能够使用;

    第三,内存映射,需要将虚拟内存和物理内存映射、关联起来

  • 相关阅读:
    声明属性Hibernate的Annotation注解
    索引查询MySQL前缀索引导致的慢查询
    定义最小POJ 1384 PigBank
    执行调用bat文件启用dos命令
    控制器框架Struts与策略模式那点事
    路径位置JDK+tomcat 环境变量配置
    目录设置PHP和Apache环境搭建小记
    驱动源码看门狗用户空间程序(可用来检测服务器死机)
    安装文件MyEclipse6.5安装与卸载SVN插件方法
    问题文件Android Studio 安装完成不能打开等问题解决记录
  • 原文地址:https://www.cnblogs.com/luoahong/p/10919317.html
Copyright © 2011-2022 走看看