内存映射

操作系统内存管理中的分段、分页简单理解

懵懂的女人 提交于 2020-03-06 13:36:37
作者:codinghuang 链接:https://www.zhihu.com/question/50796850/answer/522734117 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 要理解分段和分页,那么得理解为什么会出现分段和分页的技术 首先,这两个技术都是 为了利用和管理好计算机的资源--内存 。 在分段这个技术还没有出现之前,程序运行是需要从内存中分配出足够多的 连续的 内存,然后把 整个 程序装载进去。举个例子,某个程序大小是10M,然后,就需要有 连续的 10M内存空间才能把这个程序装载到内存里面。如果无法找到连续的10M内存,就无法把这个程序装载进内存里面,程序也就无法得到运行。 上面这种直接把整个程序装载进内存的方式是有一定的问题的。例如: 1、地址空间不隔离 如何理解地址空间不隔离? 举个例子,假设我有两个程序,一个是程序A,一个是程序B。程序A在内存中的地址 假设 是0x00000000~0x00000099,程序B在内存中的地址 假设 是0x00000100~x00000199。那么假设你在程序A中,本来想操作地址0x00000050,不小心 手残 操作了地址0x00000150,那么,不好的事情或许会发生。你影响了程序A也就罢了,你把程序B也搞了一顿。 2、程序运行时候的地址不确定

android 游戏导引(4. 简单纹理贴图)

感情迁移 提交于 2020-03-05 08:15:55
android 游戏导引(4. 简单纹理贴图) 这一节主要讲述 opengl 的贴图技术,涉及了简单的纹理知识。临近放年假,忙啊。 源码下载: 点我吧 Table of Contents 1 纹理 Texture 1.1 纹理坐标 和 纹理映射 1.2 opengl 中启用纹理映射功能 1.3 创建纹理 1.4 指定纹理 1.5 删除纹理 1.6 绑定纹理 1.7 设置过滤器 1.8 纹理映射 2 常见的几个问题 2.1 贴图呈现白色 2.2 图像扭曲 3 代码实现 4 贴图一个机器人 1 纹理 Texture 纹理定义了物体表面的结构,如花纹,图案,皱纹等等。有了纹理,模型世界才会更加丰富多彩。如一个球形模型,我们给其映射足球的纹理,这就是一个足球,给其映射地球纹理,就是一个地球。另外,如果给一个四边形映射一个墙的纹理,这边是墙,否则,我们需要一块砖一块砖的构建在本节中,我们所指的是狭义的纹理: 图像纹理(对应的有函数纹理—用数学函数来定义的纹理)。 纹理实际上是一个二维数组,其元素是一些颜色值,每一元素称之为纹理像素 (texel)。 纹理对象是一个内部数据类型,存储着纹理数据。你不能直接访问纹理对象,但是可以通过一个整数的 ID 来作为其句柄跟踪之。通过此句柄,你可以作为当前使用的纹理(称之为纹理绑定),也可以从内存中删除这个纹理对象,还可以为一的纹理赋值

MMU内存管理单元

女生的网名这么多〃 提交于 2020-03-03 20:52:13
arm-linux学习-(MMU内存管理单元) 什么是MMU MMU(Memory Management Unit)主要用来管理虚拟存储器、物理存储器的控制线路,同时也负责 虚拟地址映射为物理地址 ,以及提供硬件机制的内存访问授权、多任务多进程操作系统。(来自百度百科, 对其几个点不熟悉,因此可以只考虑加粗部分 ) 发展历史 注意:学习一个知识点,很重要的一步是了解其 为什么而存在?它的存在是为了解决什么问题? 然后,在学习的过程中带着这些问题去理解、去思考。 在许多年以前,还是使用DOS或一些古老的操作系统时,内存很小,同时,应用程序也很小,将程序存储在内存中基本能够满足需要。随着科技的发展,图形界面及一些其他更复杂的应用出现,内存已经无法存储这些应用程序了,通常的解决办法是将程序分割成很多个 覆盖块 ,覆盖块0最先运行,运行结束之后,就调用另一个覆盖块,虽然这些操作由OS来完成,但是,需要程序员对程序进行分割,这非常不高效;因此,人们想出了一个 虚拟存储器(virtual memory) 的方法。虚拟存储器的基本思想是:程序、数据、堆栈的总大小可以超过内存空间的大小,操作系统将当前运行的部分保存在内存中,未使用的部分保存在磁盘中。比如一个16MB的程序和一个内存只有4MB的机器,操作系统通过选择可以决定哪部分4MB的程序内容保存在内存中,并在需要时,在内存与磁盘中交换程序代码

mapper.xml文件

送分小仙女□ 提交于 2020-03-03 00:40:34
1. 概述 mybatis的真正强大在于它的映射语句。由于它的异常强大,映射器的XML文件就显得相对简单,如果拿它跟具有相同功能的JDBC代码进行对比,省掉将近95%的代码。mybatis是针对SQL构建的,并且比普通方法做的更好。 SQL映射文件有几个顶级元素(按照它们被定义的顺序): select:查询 cache-ref:其他命名空间缓存配置的引用 resultMap:是最复杂也是最强大的元素,用来描述如果和数据库结果集中加载对象 parameterMap:已经废弃 sql:可被其他语句引用的可重用语句块 insert:插入 update:更新 delete:删除 cache:给定命名空间的缓存配置 2. select 查询语句是mybatis中最常用的元素之一,多数应用也都是查询比修改要频繁。 <select id="selectPerson" parameterType="int" resultType="hashmap"> SELECT * FROM PERSON WHERE ID = #{id} </select> 这个语句被称作selectPerson,接受一个int类型的参数,并返回一个HashMap类型的对象,其中的key是列名,value是结果行中的对应值。 #{id} 这个高速mybatis创建一个预处理语句参数,通过JDBC,这样一个参数在SQL中会由一个

Linux的内存共享映射(mmap和munmap)

試著忘記壹切 提交于 2020-03-02 19:14:41
Linux下的进程间通信也可以使用mmap的内存共享映射来实现, mmap的作用就是把磁盘文件的一部分直接映射到进程的内存中 ,那么进程就可以直接对该内存文件进行操作, mmap也设置了两种机制:共享和私有 ,如果是共享映射,那么在内存中对文件进行修改,磁盘中对应的文件也会被修改,相反,磁盘中的文件有了修改,内存中的文件也被修改。如果是私有映射,那么内存中的文件是独立的,二者进行修改都不会对对方造成影响。通过这样的内存共享映射就相当于是进程直接对磁盘中的文件进行读写操作一样,那么如果有两个进程来mmap同一个文件,就实现了进程间的通信。磁盘中的文件通过mmap函数来实现映射,然后通过munmap函数取消映射。先来看一下函数的原型: #include <sys/mman.h> void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); int munmap(void *addr, size_t length); 其中对于mmap来说,有6个参数,第一个参数是你要映射的起始地址,这里一般用NULL,这样系统会在0地址附近随机分配一块内存。第二个参数是所要映射的文件长度。第三个参数是所映射的文件的权限,其中包含(PROT_EXEC, PROT_READ, PROT_WRITE,

虚拟地址和物理地址及其映射

你离开我真会死。 提交于 2020-03-02 17:42:41
前一段时间在面试总监的时候,总监问了我这样的一个问题:你个我说说物理内存和虚拟内存到底是怎么一回事? 其实之前我看过这个问题,据我理解的,当时是这么回答的“进程在运行的时候,操作系统都为其分配一个4GB的地址空间,即所谓的虚拟地址空间,一般情况下,当我们的程序很大的时候,实际的物理内存根本不能满足我们的需求的时候,这个时候操作系统就会借助磁盘空间来做虚拟的内存空间,把当前进程不需要的数据放在磁盘上,等到用到的时候,在利用调度算法把所需要的数据从磁盘空间上调度到内存,虚拟内存就是为了扩大内存的容量,每当我们要运行一个程序的时候经过编译以后形成的仅仅是逻辑上的空间,根本不是可以直接运行的内存空间,所以它还存在一个地址映射的概念。”当时感觉回答的很是笼统,只见总监在最后说了一句,你下去还是把这一块的内容在好好看看,所以今天就好好的把这个概念理一理。 首先我从最基本的概念说起,什么是物理内存的概念,虚拟内存的概念? 物理内存,在应用中,自然是顾名思义,物理上,真实的插在板子上的内存是多大就是多大了。而在CPU中的概念,物理内存就是CPU的地址线可以直接进行寻址的内存空间大小。比如8086只有20根地址线,那么它的寻址空间就是1MB,我们就说8086能支持1MB的物理内存,及时我们安装了128M的内存条在板子上,我们也只能说8086拥有1MB的物理内存空间

数据库分库分表思路

怎甘沉沦 提交于 2020-03-02 15:35:22
一. 数据切分 关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。 数据库分布式核心内容无非就是数据切分(Sharding) ,以及切分后对数据的定位、整合。数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操作性能的目的。 数据切分根据其切分类型,可以分为两种方式: 垂直(纵向)切分和水平(横向)切分 1、垂直(纵向)切分 垂直切分常见有垂直分库和垂直分表两种。 垂直分库 就是根据业务耦合性,将关联度低的不同表存储在不同的数据库。做法与大系统拆分为多个小系统类似,按业务分类进行独立划分。与"微服务治理"的做法相似,每个微服务使用单独的一个数据库。如图: 垂直分表 是基于数据库中的"列"进行,某个表字段较多,可以新建一张扩展表,将不经常用或字段长度较大的字段拆分出去到扩展表中。在字段很多的情况下(例如一个大表有100多个字段),通过"大表拆小表",更便于开发与维护,也能避免跨页问题,MySQL底层是通过数据页存储的,一条记录占用空间过大会导致跨页,造成额外的性能开销

百练2974: 487-3279 之 Java 解答, 可惜超时

ぐ巨炮叔叔 提交于 2020-03-02 07:44:41
总时间限制: 1000ms 内存限制: 65536kB 描述 企业喜欢用容易被记住的电话号码。让电话号码容易被记住的一个办法是将它写成一个容易记住的单词或者短语。例如,你需要给滑铁卢大学打电话时,可以拨打TUT-GLOP。有时,只将电话号码中部分数字拼写成单词。当你晚上回到酒店,可以通过拨打310-GINO来向Gino's订一份pizza。让电话号码容易被记住的另一个办法是以一种好记的方式对号码的数字进行分组。通过拨打必胜客的“三个十”号码3-10-10-10,你可以从他们那里订pizza。 电话号码的标准格式是七位十进制数,并在第三、第四位数字之间有一个连接符。电话拨号盘提供了从字母到数字的映射,映射关系如下: A, B, 和C 映射到 2 D, E, 和F 映射到 3 G, H, 和I 映射到 4 J, K, 和L 映射到 5 M, N, 和O 映射到 6 P, R, 和S 映射到 7 T, U, 和V 映射到 8 W, X, 和Y 映射到 9 Q和Z没有映射到任何数字,连字符不需要拨号,可以任意添加和删除。 TUT-GLOP的标准格式是888-4567,310-GINO的标准格式是310-4466,3-10-10-10的标准格式是310-1010。 如果两个号码有相同的标准格式,那么他们就是等同的(相同的拨号) 你的公司正在为本地的公司编写一个电话号码薄。作为质量控制的一部分

猎豹MFC--内存映射_两个进程间共享数据

試著忘記壹切 提交于 2020-03-02 05:38:24
添加对话框 静态文本 Edit Control 按钮: 内存映射技术需要两个变量:在头文件中声明: 现要把编辑框的内容发送到内存映射中:用MFC的动态数据交换把编辑框的value属性和成员变量进行关联。然后就可以把编辑框内容发送到内存映射中: 因为变量要和控件关联 所以勾选控件变量: 在对话框demoB中: 一样对对话框B添加关联: 因为在demoA中创建了内存映射文件,所以在demo B中 要打开文件映射: 现在头文件中 声明需要的变量:’ 在demoB的初始化对话框中: 接着在初始化中添加定时器消息:50毫秒后demo B 启动定时器 接收数据 设置控件中的值 用false。获取控件中的值用true 一定记住 要先启动demoA 因为demoA创建内存映射,后启动demoB。 来自为知笔记(Wiz) 来源: https://www.cnblogs.com/hungryvampire/p/5299340.html

06.进程的虚拟内存管理.md

牧云@^-^@ 提交于 2020-03-01 22:15:45
正好遇到 华庭(庄命强)的glibc内存管理Ptmalloc2 源代码分析 一文,非常开心。真是大佬。我只是借着这篇文章稍微整理一下,为了以后自己回顾的时候能够更好的排查问题。 6.1 linux进程内存布局 x86 平台 Linux 进程内存布局   Linux 系统在装载 elf 格式的程序文件时,会调用 loader 把可执行文件中的各个段依次 载入到从某一地址开始的空间中(载入地址取决 link editor(ld)和机器地址位数,在 32 位机 器上是 0x8048000,即 128M 处)。如下图所示,以 32 位机器为例,首先被载入的是.text 段, 然后是.data 段,最后是.bss 段。这可以看作是程序的开始空间。程序所能访问的最后的地 址是 0xbfffffff,也就是到 3G 地址处,3G 以上的 1G 空间是内核使用的,应用程序不可以直 接访问。  &emsp应用程序的堆栈从最高地址处开始向下生长,.bss 段与堆栈之间的空间是空闲的, 空闲空间被分成两部分,一部分为 heap,一部分为 mmap 映射区域,mmap 映射区域一般 从 TASK_SIZE/3 的地方开始,但在不同的 Linux 内核和机器上,mmap 区域的开始位置一般是 不同的。Heap 和 mmap 区域都可以供用户自由使用,但是它在刚开始的时候并没有映射到 内存空间内,是不可访问的