虚拟内存

Linux操作系统 内存管理、用户操作和文件操作

﹥>﹥吖頭↗ 提交于 2019-12-08 05:16:21
内存管理、用户操作和文件操作 预备知识: 1、Linux系统的内存分为物理内存和虚拟内存。 物理内存 是指安装在计算机当中的主存储器; 虚拟内存 是 一段 虚拟的逻辑上连续的储存空间, 虚拟内存是由多个内存碎片组成,只有 正在使用的 虚拟内存被存放在 内存 上,对于暂时不使用的虚拟内存空间其实是储存在 外存 中。虚拟内存空间地址和实际的物理内存空间地址存在某种逻辑上的关系,如果虚拟内存空间地址的内容将被使用,通过逻辑关系可以计算出此部分内容对应的实际物理内存空间,然后将内容加载到内存中。虚拟内存在 一定程度上 独立于物理内存。 2、计算机的物理 内存空间有限(虚拟内存只要运行部分占用物理内存空间) 而且不同PC的 物理内存是不一样(通过虚拟内存空间,进程中代码的访存操作的地址全部是这个内存空间的地址) ,所以进程使用的是 虚拟内存空间 。 3、内存的最小粒度是页,进程虚拟地址空间和内存的映射也是以页为单位。页(面)的大小称为页面的大小,大小应该为2的幂。页号P=A/L;A表示逻辑地址空间中的地址(虚拟内存空间地址),L表示页面大小。 4、物理块:将内存的物理地址空间划分为若干块,称为物理块,物理块与页(面)一一对应。 5、页表储存在物理内存中,由操作系统维护。CPU中有一个 页表寄存器 ,里面存放着当前进程页表的 起始地址和页表长度

malloc的原理

霸气de小男生 提交于 2019-12-07 07:44:20
任何一个用过或学过C的人对malloc都不会陌生。大家都知道malloc可以分配一 段连续的内存空间,并且在不再使用时可以通过free释放掉。但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至把malloc当做操作系统 所提供的系统调用或C的关键字。实际上,malloc只是C的标准库中提供的一个普通函数,而且实现malloc的 基本 思想并不复杂,任何一个对C和操作系统有些许了解的程序员都可以很容易理解。 这篇文章通过实现一个简单的malloc来描述malloc背后的机制。当然与现有C的标准库实现(例如glibc)相比,我们实现的malloc 并不是特别高效,但是这个实现比目前真实的malloc实现要简单很多,因此易于理解。重要的是,这个实现和真实实现在基本原理上是一致的。 这篇文章将首先介绍一些所需的基本知识,如操作系统对进程的内存管理以及相关的系统调用,然后逐步实现一个简单的malloc。为了简单起见,这篇文章将只考虑x86_64体系结构,操作系统为Linux。 1 什么是malloc 2 预备知识 2.2.1 内存排布 2.2.2 Heap内存模型 2.2.3 brk与sbrk 2.2.4 资源限制与rlimit 2.1.1 虚拟内存地址与物理内存地址 2.1.2 页与地址构成 2.1.3 内存页与磁盘页 2.1 Linux内存管理 2.2 Linux进程级内存管理

物理内存与虚拟内存之间的映射

耗尽温柔 提交于 2019-12-06 19:31:39
1、用户编制程序时使用的地址称为 虚地址或逻辑地址 ,其对应的存储空间称为虚存空间或逻辑地址空间;而计算机物理内存的访问地址则称为实地址或物理地址,其对应的存储空间称为物理存储空间或主存空间。 2、虚拟存储器的 容量限制 :主存容量+辅存(硬盘)容量。 3、 物理内存: 在应用中,真实存在的,插在主板内存槽上的内存条的容量的大小。从本质上来说,物理内存是代码和数据在其中运行的窗口。 4、 虚拟内存: 使程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。 若计算机运行程序或操作所需的随机存储器(RAM)不足时,则 Windows 会用虚拟存储器进行补偿,即拿出一部分硬盘空间来充当内存使用,这部分空间即称为虚拟内存,虚拟内存在硬盘上的存在形式就是 PAGEFILE.SYS这个页面文件。它将计算机的RAM和硬盘上的临时空间组合。将数据移入分页文件可释放RAM,以便完成工作。 若计算机的速率由于RAM可用空间匮乏而减缓,则可尝试通过增加虚拟内存来进行补偿。但是,计算机从RAM读取数据的速率要比从硬盘读取数据的速率快,因而扩增RAM容量(可加内存条)是最佳选择。 分页文件:硬盘上一个或者多个隐藏文件pagefile.sys,Windows用于存储未存入内存的部分程序和数据文件

[转载]Linux缓存机制

☆樱花仙子☆ 提交于 2019-12-06 16:53:44
[转载]Linux缓存机制 来源: https://blog.csdn.net/weixin_38278334/article/details/96478405 linux下的缓存机制及清理buffer/cache/swap的方法梳理 缓存机制介绍 写的很好: https://www.cnblogs.com/kevingrace/p/5991604.html 在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘。 缓存机制优点:减少系统调用次数,降低CPU上下文切换和磁盘访问频率。 cache是高速缓存,用于CPU和内存之间的缓冲; buffer是I/O缓存,用于内存和硬盘的缓冲; CPU上下文切换:CPU给每个进程一定的服务时间,当时间片用完后,内核从正在运行的进程中收回处理器,同时把进程当前运行状态保存下来,然后加载下一个任务,这个过程叫做上下文切换。实质上就是被终止运行进程与待运行进程的进程切换。 Swap用途:Swap意思是交换分区,对应通常我们说的虚拟内存,是从硬盘中划分出的一个分区。当物理内存不够用的时候,内核就会释放缓存区(buffers/cache)里一些长时间不用的程序,然后将这些程序临时放到Swap中

从JVM内存模型谈线程安全

牧云@^-^@ 提交于 2019-12-06 12:14:27
作为一个三个多月没有去工作的独立开发者而言,今天去小米面试了一把.怎么说呢,无论你水平如何,请确保在面试之前要做准备,就像其中一位面试官说的一样,我知道你水平不错,但是无论如何也是要准备下的,不然你怎么会连这个方法也忘记了? 此刻,我突然觉得我是一个假程序员.为什么这么说呢,作为一个从12年就开始写代码的程序员来说,忘记某个方法太可耻了.等赶明写一篇文章就叫做"我是个假程序员"来谈谈这些有趣的事儿. 话不多说,今天要谈的主题是相对较深,较广,但我努力的让他看起来清晰明了. 存储器层次结构 对于开发者来说,存储器的层次结构应该是非常熟悉的,大体如下: 这里写图片描述 其中寄存器,L1,L2,L3都被封装在CPU芯片中,作为应用开发者而言我们很少去注意和使用它.之所以引入L1,L2,L3高速寄存器,其根本是为了解决访问运算器和内存速度不匹配.但缓存的引入也带来两个问题: 缓存命中率:缓存的数据都是主存中数据的备份,如果指令所需要的数据恰好在缓存中,我们就说缓存命中,反之,需要从主存中获取.一个好的缓存策略应该尽可能的提高命中率,如何提高却是一件非常困难的事情. 缓存一致性问题:我们知道缓存是主存数据的备份,但每个核心都有自己的缓存,当缓存中的数据和内存中的数据不一致时,应该以谁的数据为准呢,这就是所谓缓存一致性问题. 上面只是展示存储器的层次结构

Linux增加虚拟内存

五迷三道 提交于 2019-12-05 23:36:27
Docker容器启动Mysql镜像报错,提示无法分配内存,报错信息如下: 由此我们看到Swap为0,考虑适当增加swap。 Linux开启swap空间有好几种方法,在这里只介绍比较常用的两种。 使用交换文件 这种方式适用于,已经装完系统但是没有多余分区可以用来做swap分区。 使用交换分区 这种方式适用于有多余的分区可以用来做swap分区。 使用交换文件开启Swap a.创建交换文件 > fallocate -l 4G /swapfile 或 > dd if=/dev/zero of=/swapfile bs=1M count=4096 b.设置可访问权限 > chmod 600 /swapfile c.格式化文件 > mkswap /swapfile d.激活swap空间 > swapon /swapfile f.开机自动启用swap空间   编辑/etc/fstab,在文件末尾添加:/swapfile none swap default 0 0 关闭 SWAP   当系统出现内存不足时,开启 SWAP 可能会因频繁换页操作,导致 IO 性能下降。   如果要关闭 SWAP,可以采用如下方法。 1、free -m #查询SWAP分区设置 2、使用命令swapoff 关闭 SWAP,比如:   swapoff /mnt/swapfile 3、修改 /etc/fstab 文件

虚拟内存

余生长醉 提交于 2019-12-05 19:49:08
虚拟内存是一种抽象,它为每个进程提供了其专有使用主内存的错觉。每个进程都具有相同的内存统一视图,称为虚拟地址空间。 在linux中,地址空间的最上部分保留给操作系统中所有进程通用的代码和数据。地址空间的下半部分保存用户进程定义的代码和数据。 每个进程看到的虚拟地址空间由许多定义明确的区域组成每个区域都有特定的用途。 - 程序代码和数据。对于所有进程,代码都从相应的固定地址开始,然后是与全局c变量相对应的数据位置。代码和数据区域直接从可执行对象文件的内容(在本例中为hello可执行文件)初始化。 - 堆。代码和数据区域紧随运行时堆之后。与代码和数据区域不同,代码和数据区域在进程开始运行之后便会固定大小,而由于调用了C标准库历程,堆在运行时会动态扩展和收缩作为malloc和free。 - 共享库。在地址空间的中间附近是一个区域,用于保存C标准库和数学库等共享库的代码和数据。共享库的概念是一个功能强大但有些困难的概念。 - 栈。用户虚拟地址空间的顶部是用编译器用来实现函数调用的用户堆栈。就像堆一样,用户堆栈在程序执行期间动态地扩展和收缩。特别是,每次我们调用函数,栈会增长。每次我们从函数返回时,它都会收缩。 - kernel虚拟内存。地址空间的顶部区域是为kernel保留的。不允许应用程序读取或写入此区域的内容或直接调用kernel代码中定义的函数。相反

.NET资源泄露与处理方案

China☆狼群 提交于 2019-12-05 14:14:32
.NET虽然拥有强大易用的 垃圾回收机制 ,但并不是因为这样,你就可以对资源管理放任不管,其实在稍不注意的时候,可能就造成了资源泄露,甚至因此导致系统崩溃,到那时再来排查问题就已经是困难重重。 一、知识点简单介绍 常见的资源泄露有: 内存泄漏:非托管资源没有释放、非静态对象注册了静态实例。 GDI泄露:字体。 句柄泄露:Socket或线程。 用户对象泄露:移除的对象未释放。 二、具体实例 1. 内存泄漏 很常见的现象是分不清哪些对象需要释放,对于控件、Stream等一些非托管资源也只管新增,却没有释放,功能是实现了,却埋了颗不小的雷。 private void button1_Click(object sender, EventArgs e) { for(int i=0;i<1000;i++) this.Controls.Add(new TabPage()); } private void button1_Click(object sender, EventArgs e) { new Form2.ShowDialog(); } 如果你觉得写这样的代码很Cool,很简洁,你在项目中也有这么写代码,那你就碰到大麻烦了,你试试在上面Form2中开个大一点的数组来检查内存,然后运行,按几下按钮,你就会发现,内存一直增加,即使你调用了GC也无济于事。所以,对于此类非托管资源要记住释放

CPU上下文切换详解

二次信任 提交于 2019-12-05 13:54:12
我们都知道CPU上下文切换,会增加系统负载。那什么是CPU上下文,为什么要切换? 什么是CPU上下文 我们都知道,Linux 是一个多任务操作系统,它支持远大于 CPU 数量的任务同时运行。当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将 CPU 轮流分配给它们,造成多任务同时运行的错觉。 而在每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好 CPU 寄存器和程序计数器(Program Counter,PC)。 CPU 寄存器,是 CPU 内置的容量小、但速度极快的内存。而程序计数器,则是用来存储 CPU 正在执行的指令位置、或者即将执行的下一条指令位置。它们都是 CPU 在运行任何任务前,必须的依赖环境,因此也被叫做 CPU 上下文。 而这些保存下来的上下文,会存储在系统内核中,并在任务重新调度执行时再次加载进来。这样就能保证任务原来的状态不受影响,让任务看起来还是连续运行。 根据任务的不同,CPU的上下文切换可以分为不同的场景,也就是进程上下文切换、线程上下文切换、中断上下文切换。 进程上下文切换 Linux 按照特权等级,把进程的运行空间分为内核空间和用户空间,分别对应着下图中, CPU 特权等级的 Ring 0 和 Ring 3。 内核空间(Ring 0)具有最高权限,可以直接访问所有资源;

2019-2020-1 20175314 《信息安全系统设计基础》第9周学习总结

╄→尐↘猪︶ㄣ 提交于 2019-12-05 11:43:14
2019-2020-1 20175314 《信息安全系统设计基础》第9周学习总结 本周学习内容总结 虚拟存储器的概念和作用 虚拟存储器的概念: 虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。 虚拟存储器的作用: 内存在计算机中的作用很大,电脑中所有运行的程序都需要经过内存来执行,如果执行的程序很大或很多,就会导致内存消耗殆尽。为了解决这个问题,Window 虚拟存储器s中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。举一个例子来说,如果电脑只有128MB物理内存的话,当读取一个容量为200MB的文件时,就必须要用到比较大的虚拟内存,文件被内存读取之后就会先储存到虚拟内存,等待内存把文件全部储存到虚拟内存之后,跟着就会把虚拟内存里储存的文件释放到原来的安装目录里了。 总结起来说:虚拟存储器简化了链接、简化了加载、简化共享和简化存储器分配。 地址翻译的概念 IP地址耗尽促成了CIDR的开发