趣谈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]='\0';
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\n",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 格式的。
四、总结时刻
通过这一节,你应该知道,一个内存管理系统至少应该做三件事情:
第一,虚拟内存空间的管理,每个进程看到的是独立的、互不干扰的虚拟地址空间;
第二,物理内存的管理,物理内存地址只有内存管理模块能够使用;
第三,内存映射,需要将虚拟内存和物理内存映射、关联起来
趣谈Linux操作系统学习笔记:第二十讲的更多相关文章
- 深挖计算机基础:趣谈Linux操作系统学习笔记
		参考极客时间专栏<趣谈Linux操作系统>学习笔记 核心原理篇:内存管理 趣谈Linux操作系统学习笔记:第二十讲 趣谈Linux操作系统学习笔记:第二十一讲 趣谈Linux操作系统学习笔 ... 
- 趣谈Linux操作系统学习笔记:第二十四讲
		一.小内存的分配基础 1.kmem_cache_alloc_node的作用 通过这段代码可以看出,它调用了kmem_cache_alloc_node函数,在task_struct的缓存区域task_s ... 
- 趣谈Linux操作系统学习笔记:第二十五讲
		一.mmap原理 在虚拟内存空间那一节,我们知道,每一个进程都有一个列表vm_area_struct,指向虚拟地址空间的不同内存块,这个变量名字叫mmap struct mm_struct { str ... 
- 趣谈Linux操作系统学习笔记:第二十六讲
		一.内核页表 和用户态页表不同,在系统初始化的时候,我们就要创建内核页表了 我们从内核页表的根swapper_pg_dir开始找线索,在linux-5.1.3/arch/x86/include/asm ... 
- 趣谈Linux操作系统学习笔记:第二十八讲
		一.引子 磁盘→盘片→磁道→扇区(每个 512 字节) ext* 定义文件系统的格式 二.inode 与块的存储 1.块 2.不用给他分配一块连续的空间 我们可以分散成一个个小块进行存放 1.优点 2 ... 
- 趣谈Linux操作系统学习笔记:第二十九讲
		一.引子 在这之前,有一点你需要注意.解析系统调用是了解内核架构最有力力的一把钥匙,这里我们只要重点关注这几个最重要的系统调用就可以了 1.mount 系统调用用于挂载文件系统:2.open 系统调用 ... 
- 趣谈Linux操作系统学习笔记:第二十七讲
		一.文件系统的功能规划 1.引子 咱们花了这么长的时间,规划了会议室管理系统,这样多个项目执行的时候,隔离性可以得到保证. 但是,会议室里面被回收,会议室里面的资料就丢失了.有一些资料我们希望项目结束 ... 
- 趣谈Linux操作系统学习笔记:第二十一讲
		一.分段机制 1.分段机制的原理图 2.段选择子 3.段偏移量 例如,我们将上面的虚拟空间分成以下 4 个段,用 0-3 来编号.每个段在段表中有一个项,在物理空间中,段的排列如下图的右边所示. 4. ... 
- 《趣谈 Linux 操作系统》学习笔记(一):为什么要学 Linux 及学习路径
		前言:学习的课程来自极客时间的专栏<趣谈 Linux 操作系统>,作者用形象化的比喻和丰富的图片让课程变得比较易懂,为了避免知识看过就忘,打算通过写学习笔记的形式记录自己的学习过程. Li ... 
随机推荐
- ABP入门教程0 - 目录
			ABP入门教程 本教程主要讲解如何基于ABP实现CURD(增删改查)示例. 源码已分享: GitHub Gitee ABP入门教程0 - 目录 ABP入门教程1 - 开篇 ABP入门教程2 - ... 
- 《移动WEB前端高级开发实践@www.java1234.com》——3
			React Flux: Flux将一个应用分成四个部分. View: 视图层 Action(动作):视图层发出的消息(比如mouseClick) Dispatcher(派发器):用来接收Actions ... 
- swoole为什么不能代替nginx
			Swoole不能代替Apache和Nginx这些通用的HTTP服务器. 但基于Swoole开发的PHP应用不依赖Apache和Nginx也能提供生产级别的HTTP服务. 有需要学习交流的友人请加入交流 ... 
- 以太坊智能合约开发 Solidity学习
			1. pragma solidity >=0.4.22 <0.6.0;//版本号,头文件 contract BooleanTest { bool _a;//默认返回false int nu ... 
- Unix 开发中的 Make 三连
			Unix 开发过程中,经常性的操作是从源码编译安装相应库文件,所以下面三个命令便是家常便饭,俗称三连: ./configure make make install 下面来看看这三步分别做了什么. co ... 
- DataTable实现分组
			有时候我们从数据库中查询出来数据之后,需要按照DataTable的某列进行分组,可以使用下面的方法实现,代码如下: using System; using System.Collections.Gen ... 
- C#_.NetFramework_Web项目_NPOI_EXCEL数据导入
			[推荐阅读我的最新的Core版文章,是最全的介绍:C#_.NetCore_Web项目_EXCEL数据导出] 项目需要引用NPOI的Nuget包: B-2--EXCEL数据导入--NPOI--C#获取数 ... 
- CreateWindowW()函数
			函数原型为: 该函数利用已经注册的窗口类 创建一个窗口,并返回该窗口的句柄 HWND CreateWindow( LPCTSTR lpClassName, //窗口类名称,也可以是控件名称 LPCTS ... 
- Spring Boot + Redis实战-利用自定义注解+分布式锁实现接口幂等性
			场景 不管是传统行业还是互联网行业,我们都需要保证大部分操作是幂等性的,简单点说,就是无论用户点击多少次,操作多少遍,产生的结果都是一样的,是唯一的.而今次公司的项目里,又被我遇到了这么一个幂等性的问 ... 
- vue之虚拟DOM、diff算法
			一.真实DOM和其解析流程? 浏览器渲染引擎工作流程都差不多,大致分为5步,创建DOM树——创建StyleRules——创建Render树——布局Layout——绘制Painting 第一步,用HTM ... 
