虚拟内存

进程和线程 的随笔和简述

坚强是说给别人听的谎言 提交于 2020-03-07 06:49:45
虚拟内存技术 每个进程看到自己独占一部分空间,但其实所有进程是共享一个物理内存,进程创建的时候,内核为建立了虚拟内存的布局,初始化进程控制表中相关的链表,但没有立刻拷贝对应数据和代码到当前位置,就是在进程运行时要分配动态内存时,分配虚拟内存,只有访问此数据时,发生缺页异常,才会立刻拷贝数据。 好处: 扩大地址空间 公平内存空间 内存保护:各自进程有各自独立的虚拟内存地址空间,虚存会对特定的地址提供写保护 通信时,可用虚拟共享 节省空间,不同进程使用相同代码时,可以映射同一个代码,不需要拷贝多个 适合多道程序设计 需要连续空间时,实际物理内存空间可以不连续 代价: 需要建立多个数据结构 地址转换要耗时 页面切换需要磁盘io 数据少时比较浪费内存 进程 所有等待态的当条件满足立刻进入就绪态 PCB -》数据结构 进程控制块 存进程的状态放入队 用数组管理所有的pcb 就绪 运行 堵塞 等待io/事件 程序控制cpu,整个系统下一个执行什么完全由cpu控制 操作系统通过时钟中断,控制不让程序继续运行 进入等待态系统程序需要系统调用 软硬件协同设计 内核启动shell在启动其他的线条 双击图表告诉资源管理器就是shell windows 父进程子进程毫无瓜葛 消息传递 堵塞系统调用 非阻塞系统调用 每个进程都有自己的独立地址空间都是从0开始的都是虚拟地址 待更新--------------

又能扯皮了!没内存了还能看片?

拥有回忆 提交于 2020-03-06 15:35:58
虚拟内存 尽管基址寄存器和变址寄存器用来创建地址空间的抽象,但是这有一个其他的问题需要解决: 管理软件的膨胀(managing bloatware) 。虽然内存的大小增长迅速,但是软件的大小增长的要比内存还要快。在 1980 年的时候,许多大学用一台 4 MB 的 VAX 计算机运行分时操作系统,供十几个用户同时运行。现在微软公司推荐的 64 位 Windows 8 系统至少需要 2 GB 内存,而许多多媒体的潮流则进一步推动了对内存的需求。 这一发展的结果是,需要运行的程序往往大到内存无法容纳,而且必然需要系统能够支持多个程序同时运行,即使内存可以满足其中单独一个程序的需求,但是从总体上来看内存仍然满足不了日益增长的软件的需求(感觉和xxx和xxx 的矛盾很相似)。而交换技术并不是一个很有效的方案,在一些中小应用程序尚可使用交换,如果应用程序过大,难道还要每次交换几 GB 的内存?这显然是不合适的,一个典型的 SATA 磁盘的峰值传输速度高达几百兆/秒,这意味着需要好几秒才能换出或者换入一个 1 GB 的程序。 SATA(Serial ATA)硬盘,又称串口硬盘,是未来 PC 机硬盘的趋势,已基本取代了传统的 PATA 硬盘。 那么还有没有一种有效的方式来应对呢?有,那就是使用 虚拟内存(virtual memory) ,虚拟内存的基本思想是,每个程序都有自己的地址空间

虚拟内存管理

独自空忆成欢 提交于 2020-03-05 08:54:54
1、什么是虚拟内存 虚拟内存是计算机系统内存管理的一种技术。它使的应用程序认为他拥有连续的可用内存( 一个连续完整的地址空间 ),而实际上,他通常是被分割成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。 注意:虚拟内存不只是“用磁盘空间来扩展物理内存”的意思--这只是扩充内存级别以使其包含磁盘驱动器而已,把内存扩展到磁盘只是使用虚拟内存技术的一个结果,他的作用可以通过覆盖或者把处于不活动状态的程序以及他们的数据交换到磁盘上等方式实现。 2、为什么会有虚拟内存 许多年以前,当人们还在使用DOS或更古老的操作系统的时候,计算机内存还非常小,一般都是以K为单位进行计算的,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图像界面的想起还有用户需求的不断增大,应用程序的规模也随之膨胀起来。终于一个难题出现在程序员面前,那就是应用程序太大以至于内存容不下该程序,通常解决的办法是把程序分割成许多覆盖快的片段。覆盖块0首先运行,结束时他将调用另一个覆盖块。虽然覆盖块的交换是由os完成的,但是必须先有程序员吧程序先进行分割,这是一个费时费力的工作,而且相当枯燥。虚拟存储器就应运而生。 3、物理地址、虚拟地址、逻辑地址区别 32位系统的地址总线是32位的, 64位 CPU是指 CPU 内部的通用寄存器的宽度为 64 比特

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

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

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 区域都可以供用户自由使用,但是它在刚开始的时候并没有映射到 内存空间内,是不可访问的

armv8虚拟内存架构简述

倾然丶 夕夏残阳落幕 提交于 2020-03-01 19:08:58
粗略看了一下armv8的虚拟内存的文档。记录一下,细节留待以后用到时再去细究。 程序在运行的时候使用的内存一般是虚拟内存,需要经过转换才能接触到物理内存。其中的底层支持就是硬件架构,现代架构都是支持硬件虚拟内存转换的,一般就是说提供MMU。armv8架构作为现代架构也不例外,但是不太一样的是armv8架构支持两级转换:stage 1 和stage 2. 上图包含了安全世界和非安全世界的东西,由于安全世界的东西过于复杂(主要是我也不懂),下面我们就忽略掉安全世界的东西。从上图的第四条:VA->IPA->PA.很明显,VA到PA可以最多经过两次转换,当然每个stage都是可以取消的,比如只有stage1 或只有stage2. 为什么需要两级转换呢?这是为支持虚拟化而设置的,对于虚拟机内的程序一般需要经过两级转换才能访问到主机的物理地址。所以一般地可以认为,对于主机上跑的应用程序只需要一级转换,而在虚拟机中的程序要经过两级转换。那怎样控制这些内存转换机制呢? 控制虚拟内存转换的接口就是一系列寄存器,主要有:SCTLR_EL1,TCR_EL1, TCR_EL2, HCR_EL2,TTBR0_EL1, TTBR1_EL1, VTTBR_EL2。下面分别介绍一下。 SCTLR_EL1:顶级系统控制寄存器,其中Mbit控制MMU 对EL0和EL1的stage 1的使能,一旦置位1

简述:Unix/Linux内存管理

人盡茶涼 提交于 2020-03-01 03:58:48
一、底层结构 采用三层结构,实际使用中可以方便映射到两层或者三层结构,以适用不同的硬件结构。最下层的申请内存函数get_free_page。之上有三种类型的内存分配函数: 1.kmalloc类型。内核进程使用,基于切片(slab)技术,用于管理小于内存页的内存申请。思想出发点和应用层的内存缓冲池同出一辙。但它针对内核结构,特别处理应用场景固定,不考虑释放。 2.vmalloc类型。内核进程使用。用于申请不连续内存。 3.brk/mmap类型。用户进程使用。malloc/free实现的基础。 二、内存管理的相关函数图 STL -> 内存自动分配和自动回收(C++) | C++ -> new分配内存,delete回收内存 | C -> malloc分配内存,free回收内存 | Unix 系统函数 -> sbrk/brk 分配和回收内存 | Unix底层系统函数 -> mmap/munmap分配回收 (用户层) ---------------------------------------------------------------------------- (内核层) Unix内核函数 kmalloc/vmalloc/get_free_page 三、进程与内存 a.所有进程(执行的程序)都必须占用一定数量的内存 b.对任何一个普通进程来讲,它都会涉及到5种不同的数据段

虚拟内存页面置换算法

≡放荡痞女 提交于 2020-02-29 09:06:51
// VC08---虚拟内存页面置换算法.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> using namespace std; const int MaxNumber=100; int PageOrder[MaxNumber];//页面访问序列 int Simulate[MaxNumber][MaxNumber];//访问各个时刻物理块的记录 int PageCount[MaxNumber];//物理块 int PageNum,LackNum,blockNum;//PageNum页面个数,LackNum缺页数 double LackPageRate;//缺页率 bool found; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 初始化 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void initialization(){ cin>>blockNum; cin>>PageNum; for(int i=0;i<PageNum;cin>>PageOrder[i++]); cout<<"初始化的页面访问序列"<<endl; for(int i=0;i<PageNum;cout<<PageOrder[i++]<<" , ")

虚拟内存

孤人 提交于 2020-02-28 12:46:12
手动设置虚拟内存 在默认状态下,是让系统管理虚拟内存的,但是系统默认设置的管理方式通常比较保守,在自动调节时会造成页面文件不连续,而降低读写效率,工作效率就显得不高,于是经常会出现“内存不足”这样的提示,下面就让我们自已动手来设置它吧。 ①用右键点击桌面上的“我的电脑”图标,在出现的右键菜单中选“属性”选项打开“系统属性”窗口。在窗口中点击“高级”选项卡,出现高级设置的对话框 ②点击“性能”区域的“设置”按钮,在出现的“性能选项”窗口中选择“高级”选项卡,打开其对话框。 ③在该对话框中可看到关于虚拟内存的区域,点击“更改”按钮进入“虚拟内存”的设置窗口。选择一个有较大空闲容量的分区,勾选“自定义大小”前的复选框,将具体数值填入“初始大小”、“最大值”栏中,而后依次点击“设置→确定”按钮即可,最后重新启动计算机使虚拟内存设置生效。 转自:百度知道 http://baike.baidu.com/view/976.htm 虚拟内存是计算机系统 内存管理 的一种技术。它使得 应用程序 认为它拥有连续的可用的 内存 (一个连续完整的 地址空间 ),而实际上,它通常是被分隔成多个 物理内存 碎片,还有部分暂时存储在外部 磁盘存储器 上,在需要时进行 数据交换 。 目录 简介 作用 虚拟内存不足的原因 1、感染病毒 2、虚拟内存设置不当 3、系统空间不足 4、因为SYSTEM用户权限设置不当

释放内存

南笙酒味 提交于 2020-02-27 09:05:25
hiberfil.sys 休眠文件 命令窗口中输入 powercfg -h off,即可关闭休眠功能,同时 Hiberfil.sys 文件也会自动删除。 在cmd 命令窗口中输入 powercfg -h on ,就能开启休眠功能 pagefile.sys就是虚拟内存(简称为系统分页文件). 如果计算机在较低的 RAM 下运行,并且立即需要更多RAM,则 Windows 会用硬盘空间来模拟系统RAM。这叫做 虚拟内存 ,通常称为 页面文件 。也就由于虚拟内存的设定产生了pagefile.sys文件[1] 。通过上面的文字不难看出,虚拟内存的设定对于自己计算机的性能在一定程度上面是有好处的。所以这里建议大家还是保留虚拟内存。甚至可以扩大虚拟内存的容量,不过本文件通常也会占用较大的存储位置,硬盘资源紧张的用户可以考虑禁用或移动及缩小大小。关于sys格式文件[2] :此类文件包含了微软DOS和Windows操作系统中的系统设置和变量,以及用于运行操作系统的功能,常用的存储设备驱动程序和其他核心的Windows功能。 首先 我的电脑(鼠标右键)--属性。 然后在左侧找到 “高级系统设置”, 点击进入。 弹出系统属性窗口,切换到 “高级” 选项卡。 点击“高级”窗口下 性能选项的“设置” 按钮,发现在性能中有一项叫做虚拟内存的应该就是我这个文件的专属名称。 在性能选项窗口,切换到 “高级”