虚拟内存

操作系统:虚拟内存

一个人想着一个人 提交于 2020-02-07 00:12:28
覆盖技术 目标 在较小的可用内存中运行较大的程序。常用于多道程序系统,与分区存储管理配合使用。 原理 把程序按照其自身的逻辑结构,划分为若干个功能上相对独立的程序模块,那些不会同时执行的模块共享同一块内存区域,按时间先后来运行。 必要部分(常用功能)的代码和数据常驻内存。---固定区:调入后就不再调出(除非运行结束)。 可选部分(不常用功能)存放在外存中,在需要用到时才装入内存。 ---覆盖区:需要用到时调入内存,用不到时调出内存。 缺点 由程序员声明覆盖结果,费时费力,增加了编程的难度。 覆盖模块,从外存装入内存,实际上是以时间换空间。 交换技术 目标 多道程序在内存中时,让正在运行的程序或需要运行的程序获得更多的资源。 原理 可将暂时不运行的程序送到外存,从而获得空间内存空间。 操作系统把一个进程的整个地址空间的内存保存到外存中(换出),而将外存中的某个进程的地址空间读入到内存中(换入)。换入换出的内容的大小为整个程序的地址空间。 交换时机的确定:只有当内存空间不够或有不够的危险时换出。 换出的进程存放在什么位置:文件区(离散分配方式) + 对换区(连续分配方式)---被换出的进程存放在对换区。 覆盖与交换的区别 覆盖在同一个进程或程序中,交换是在不同进程之间作业的。 交换发生在内存中程序与管理程序或操作系统之间,覆盖发生在运行程序的内部。 虚拟内存技术 目标 像覆盖技术那样

作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!

大城市里の小女人 提交于 2020-02-03 02:54:44
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊! 我现在告诉你,这些知识很有用,尤其对于作为程序员的你,这些是让你写代码的过程中让你不仅知其然,还知其所以然的知识,了解了这些,对你的编程只有大大的好处。 以上三篇文章可谓都是干货中的干货,看了一定让你功力大增😎 今天再来分享一下关于内存和磁盘的有关重要知识,如此一来, CPU,内存和磁盘 这比较重要的几个货,我们就都有所了解了。 关于磁盘,你了解多少? 可能大伙听到的比较多的是硬盘,毕竟这是我们每天使用电脑接触比较多的一个概念,再加上现在买电脑基本上从之前的机械硬盘都过渡到了现在的固态硬盘。 所以大家对硬盘这个名词不陌生,相对的,对磁盘的概念似乎就有点陌生了 啥是磁盘 首先记住,磁盘是个总的,也就是说 磁盘包括硬盘 ,那么还要知道磁盘是干嘛的, 磁盘最主要的功能就是保存电脑里面的信息 ,但是磁盘又有一些分类,不过我们首先要知道,在计算机中,保存信息的有这么两类: 第一:内部存储器

操作系统--虚拟内存学习

穿精又带淫゛_ 提交于 2020-02-02 05:49:00
内存的发展流程: 一.嵌入式实时操作系统 表现 :在早期的单片机上,程序运行在物理内存中,也就是说,程序在运行时直接访问到物理地址,在程序运行开始,将全部程序加载到内存中,所有的数据地址和程序地址就此固定。 在运行多任务系统时,比较直接的办法也是直接为每个任务分配各自需要的内存空间,比如总内存为100M,task1需要40M,task2需要50M,task3需要20M,那么最简单的办法是给task1分配40M,给task2分配50M,而task3,不好意思,内存不够了,不允许运行 弊端 : 地址空间不隔离 所有程序都可以直接访问物理内存,那么task1就可以直接访问task2的地址,这就给了一些恶意程序机会来进行一些非法操作,即使是非恶意但是有bug的程序,也可能会导致其他任务无法运行,这对于需要安全稳定的的计算机环境的用户是不能容忍的。 内存使用效率极低 由于没有有效的内存管理机制,通常在一个程序执行时,将整个程序装载进内存中运行,如果我们要运行task3,内存已经不够了,其实系统完全可以将暂时没有运行的task2先装入磁盘中,将task3装载到内存,当需要运行task2时,再将task2换回,虽然牺牲了一些执行效率,但总归是可以支持更多程序运行。 程序地址空间不确定 需要了解的是程序在编译阶段生成的可执行文件中符号地址是连续且确定的,即使实现了内存数据与磁盘的交换

如何创建一个swap文件

好久不见. 提交于 2020-02-01 13:09:00
从装系统时就接触过这个swap了,前面也说过它类似与windows的虚拟内存,分区的时候一般大小为内存的2倍,如果你的内存超过4G,那么你分8G似乎是没有必要了。分4G足够日常交换了。然而,还会有虚拟内存不够用的情况发生。如果真遇到了,莫非还要重新分一下磁盘?当然不能!那我们就增加一个虚拟的磁盘出来。 基本的思路就是:建立swapfile ,格式化为swap格式 ,启用该虚拟磁盘 #dd if=/dev/zero of=/tmp/newdisk bs=40K count=102400 利用dd 来创建一个4G的文件/tmp/newdisk出来,其中if代表从哪个文件读,/dev/zero是linux下特有的一个0生成器,of表示输出到哪个文件,bs即块大小,count则定义有多少个块。 #mkswap /tmp/newdisk mkswap 这个命令是专门格式化swap格式的分区的 #swapon /tmp/newdisk 启用该虚拟磁盘 使用free 命令查看系统内存以及虚拟内存使用情况的,-m选项是以M的形式查看。可以看到当前系统的。而swapon 是启用我们新建的swap文件,启用后再用free查看发现多了400M。 #swapoff /tmp/newdisk 我们还可以用swapoff 关闭启用的swap文件。 简单易用,神器啊 来源: https://www

Linux设置虚拟内存

怎甘沉沦 提交于 2020-01-29 11:43:00
用最低配的阿里云服务器,遇到mysqld服务老是挂掉的问题,启动也报错。查看日志/var/log/mysqld.log原来是无法分配足够的内存。没办法物理内存太小,那就弄虚拟内存吧。 Linux系统实现虚拟内存有两种方法:交换分区(swap分区)和交换文件 交换文件 查看内存: free -m , -m是显示单位为MB,-g单位GB 创建一个文件: touch /root/swapfile 使用 dd 命令,来创建大小为2G的文件swapfile: dd if=/dev/zero of=/root/swapfile bs=1M count=2048 //命令执行完需要等待一段时间 if表示input_file输入文件 of表示output_file输出文件 bs表示block_size块大小 count表示计数。 这里,我采用了数据块大小为1M,数据块数目为2048,这样分配的空间就是2G大小。 格式化交换文件: mkswap /root/swapfile 启用交换文件: swapon /root/swapfile 开机自动加载虚拟内存,在/etc/fstab文件中加入如下命令: /root/swapfile swap swap defaults 0 0 重启后生效 reboot 如果要删除交换分区和交换文件,逆着上面的顺序操作: 先删除/etc/fstab文件中添加的交换文件行

内存管理-----虚拟内存

谁说胖子不能爱 提交于 2020-01-20 19:06:56
前言 在8086/80186时还没有操作系统,把它称之为 实地址模式 。 那么怎么将地址表示出来呢? 比如:数据寄存器DS中的值是16位,要转换成20位的地址。怎么转换呢? 所以左移四位后则低四位变为0了,然后再加上IP寄存器中的偏移值,就是物理地址。 DS << 4 + IP (即偏移值) = 物理地址 没有操作系统则它的空间就称为物理空间(上图的空间) DS( 基地址 ) IP( 偏移地址、偏移量、逻辑地址 ) IP寄存器中最多存16位,则偏移量最多为2^16=64K. 因为 起始位置必须是16的倍数 ,则 整个段大小在16B-64K之间 ,则它的真实 大小就不确定 ,就可能导致 如果别人恶意修改这个IP寄存器 中的值,则 段的大小就会发生改变 ,就会导致访问无法访问的空间。 因此为了解决这样的问题,所以我们就需要 保存记录 基地址 段大小 以及 访问权限 。 所以在有了操作系统以后, 因为要向上兼容 ,所以 上述寄存器不改变 ,而添加 GDTR(全局段描述表寄存器) 和 LDTR(局部段描述符表寄存器) 。 我们这里先从GDTR分析,是在 内存存储 的 全局段描述表 (相当于数组) GDTR存储了这些,那么DS、CS、SS(ES)这些寄存器做什么呢? 存储 段描述符表的下标 段描述符表的类别 以及权限位 当操作系统启动时,默认占据12个描述符表项,而用户进程最多只能用8192

计算机操作系统-内存管理

老子叫甜甜 提交于 2020-01-20 10:27:13
虚拟内存 虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。 为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。当程序引用到不在物理内存中的页时,由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行失败的指令。 从上面的描述中可以看出,虚拟内存允许程序不用将地址空间中的每一页都映射到物理内存,也就是说一个程序不需要全部调入内存就可以运行,这使得有限的内存运行大程序成为可能。例如有一台计算机可以产生 16 位地址,那么一个程序的地址空间范围是 0~64K。该计算机只有 32KB 的物理内存,虚拟内存技术允许该计算机运行一个 64K 大小的程序。 分页系统地址映射 内存管理单元(MMU)管理着地址空间和物理内存的转换,其中的页表(Page table)存储着页(程序地址空间)和页框(物理内存空间)的映射表。 一个虚拟地址分成两个部分,一部分存储页面号,一部分存储偏移量。 下图的页表存放着 16 个页,这 16 个页需要用 4 个比特位来进行索引定位。例如对于虚拟地址(0010 000000000100),前 4 位是存储页面号 2,读取表项内容为(110 1)

吉格斯崩溃解决方案(微星电脑)

匆匆过客 提交于 2020-01-18 15:39:56
电脑出现吉格斯崩溃,就是一旦进入到游戏界面2秒钟必炸,直接闪退吉格斯崩溃,奇怪的是电脑之前都没有问题,但是后来好像是更新了一下系统,然后就出现这个状况。 上网上搜索了一下,发现所有的解决方案都是说修改虚拟内存。但是我几乎把所有盘的虚拟内存都修改了,但是还是凉了,虚拟内存这个方案大家可以试试,把每个盘的虚拟内存都设置为16840大小然后重启一下电脑就可以,如果这个不管用的话,就别折腾虚拟内存的大小了可能和这个并没有关系。 网上还有一种解决方案是说安装文件的映射有 如果你的电脑是微星电脑可以尝试如下方案,删除你电脑上的一个软件nahimic,删除这个软件,其他电脑也可以看看自己的电脑上是否有这个软件直接删除,就可以顺利进入,删除软件后不需要重启,直接重启游戏就可以完成。 来源: CSDN 作者: 蓝奕世 链接: https://blog.csdn.net/qq_42584411/article/details/104029329

频繁分配释放内存导致的性能问题的分析

和自甴很熟 提交于 2020-01-18 06:37:13
频繁分配释放内存导致的性能问题的分析 现象 1 压力测试过程中,发现被测对象性能不够理想,具体表现为: 进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70 2 用ps -o majflt,minflt -C program命令查看,发现majflt每秒增量为0,而minflt每秒增量大于10000。 初步分析 majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。 这两个数值表示一个进程自启动以来所发生的缺页中断的次数。 当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作: 检查要访问的虚拟地址是否合法 查找/分配一个物理页 填充物理页内容(读取磁盘,或者直接置0,或者啥也不干) 建立映射关系(虚拟地址到物理地址) 重新执行发生缺页中断的那条指令 如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt。 此进程minflt如此之高,一秒10000多次,不得不怀疑它跟进程内核态cpu消耗大有很大关系。 分析代码 查看代码,发现是这么写的:一个请求来,用malloc分配2M内存,请求结束后free这块内存。看日志,发现分配内存语句耗时10us,平均一条请求处理耗时1000us 。 原因已找到! 虽然分配内存语句的耗时在一条处理请求中耗时比重不大,但是这条语句严重影响了性能

Linux中阶知识总结

社会主义新天地 提交于 2020-01-17 15:39:10
文章目录 Linux目录结构 “一切皆文件”思想 目录结构及各文件目录的详情 vi编辑器 vi编辑器的三种模式及其转换 一般模式 编辑模式 指令模式 Linux运行级别runlevel Linux分区 Linux默认的三个分区: boot分区 swap分区 根分区 Linux目录结构 “一切皆文件”思想 Linux 中所有内容都是以文件的形式保存和管理的,即一切皆文件,普通文件是文件,目录(Windows 下称为文件夹)是文件,硬件设备(键盘、监视器、硬盘、打印机)是文件,就连套接字(socket)、网络通信等资源也都是文件。 和Windows系统不同,Linux系统没有 C 盘、D 盘、E 盘那么多的盘符,只有一个根目录(/),所有的文件(资源)都存储在以根目录(/)为树根的树形目录结构中。 这样做最明显的好处是,开发者仅需要使用一套 API 和开发工具即可调取 Linux 系统中绝大部分的资源。举个简单的例子,Linux 中几乎所有读(读文件,读系统状态,读 socket,读 PIPE)的操作都可以用 read 函数来进行;几乎所有更改(更改文件,更改系统参数,写 socket,写 PIPE)的操作都可以用 write 函数来进行。 不利之处在于,使用任何硬件设备都必须与根目录下某一目录执行挂载操作,否则无法使用。我们知道,本身 Linux 具有一个以根目录为树根的文件目录结构