[导读] 本文从内存管理的发展历程角度层层递进,介绍MMU的诞生背景,工作机制。而忽略了具体处理器的具体实现细节,将MMU的工作原理从概念上比较清晰的梳理了一遍。
虚拟内存是一种操作系统提供的机制,用于将每个进程分配的独立的虚拟地址空间映射到实际的物理内存地址空间上。通过使用虚拟内存,操作系统可以有效地解决多个应用程序直接操作物理内存可能引发的冲突问题。
后面打算系统性的介绍下NIO和Netty的内容,因为这块内容也是每个程序员必须要掌握的内容,而在介绍NIO之前我们需要先了解下一些前置的知识
软件安全一直是软件开发和互联网行业中的一个必先要考虑的问题,而编程语言的内存安全则是软件安全的一个重要分支。在编程语言中,内存安全的重要性体现在多个方面,对于程序的稳定性、可靠性以及安全性都具有至关重要的影响。
从应用程序或者应用开发者的角度来看,操作系统是计算机系统的核心软件,它为应用程序提供运行环境和基础服务。
内存管理是指操作系统或编程语言运行时环境对计算机系统中的内存资源进行分配、使用和回收的过程。其主要目标是有效地管理内存资源,以提供给程序足够的内存空间来存储和执行程序所需的数据和指令。内存管理的作用包括:
计算机是用来执行简单任务的复杂机器:比如 上网、文本编辑、网页服务、视频游戏……,还可以对数据进行操作,图片 音乐 文本 数据库……
linux内存管理卷帙浩繁,本文只能层层递进地带你领略冰山轮廓,通过本文你将了解到以下内容:
内存是计算机的主存储器。内存为进程开辟出进程空间,让进程在其中保存数据。我将从内存的物理特性出发,深入到内存管理的细节,特别是了解虚拟内存和内存分页的概念。
在初始化内存的结点和内存区域之前, 内核先通过pagging_init初始化了内核的分页机制.
作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载
CPU只能访问其寄存器(Register)和内存(Memory), 无法直接访问硬盘(Disk)。存储在硬盘上的数据必须首先传输到内存中才能被CPU访问。从访问速度来看,对寄存器的访问非常快,通常为1纳秒;对内存的访问相对较慢,通常为100纳秒(使用缓存加速的情况下);而对硬盘驱动器的访问速度最慢,通常为10毫秒。
对于精通 CURD 的业务同学,内存管理好像离我们很远,但这个知识点虽然冷门(估计很多人学完根本就没机会用上)但绝对是基础中的基础。
在存储器里以字节为单位存储信息,为正确地存放或取得信息,每一个字节单元给以一个唯一的存储器地址,称为物理地址(Physical Address),又叫实际地址或绝对地址。
我们都知道,在ring3下,如果我们的程序出错了.那么就崩溃了.但是在ring0下,只要我们的程序崩溃了.那么直接就蓝屏了.
程序到运行主要经过程序(外存)编译,链接,装入(内存)。《程序如何运行:编译、链接、装》:
在 Linux 系统中,采用了虚拟内存管理技术,事实上大多数现在操作系统都是如此!在 Linux 系统中,每一个进程都在自己独立的地址空间中运行,在 32 位系统中,每个进程的逻辑地址空间均为 4GB,这 4GB 的内存空间按照 3:1 的比例进行分配,其中用户进程享有 3G 的空间,而内核独自享有剩下的 1G 空间,如下所示:
大家好,我是 Guide哥!很多读者抱怨计算操作系统的知识点比较繁杂,自己也没有多少耐心去看,但是面试的时候又经常会遇到。所以,我带着我整理好的操作系统的常见问题来啦!这篇文章总结了一些我觉得比较重要的操作系统相关的问题比如进程管理、内存管理、虚拟内存等等。
众所周知, 在早期, 操作系统还没有分时的概念, 当时都是单进程执行, 只有一个进程结束了, 才能执行后一个进程. 但是这样的执行很容易想到的一个问题, 若进程在空闲状态, 则 CPU 就空下来了, 造成无谓的浪费. 后来为了解决这个问题, 于是进程可以主动申请轮换, 将当前时间交由其他进程. 但若是一个进程一直不出让控制权的话, 又退回到之前的情况了. 于是有了现在的分时系统, 即每个进程执行一小段时间, 然后强制切换到另一个进程执行, 由于切换的时间很短, 视觉上造成了很多进程同时执行的错觉.
之前写了两篇详细分析 Linux 内存管理的文章,读者好评如潮。但由于是分开两篇来写,而这两篇内容其实是有很强关联的,有读者反馈没有看到另一篇读起来不够不连贯,为方便阅读这次特意把两篇整合在一起,看这一篇就够了!
在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linux内核的内存模型. 例如在x86_32上需要切换到保护模式, 然后内核才能检测到可用内存和寄存器.
第一章:概述 什么是操作系统? 是一段一直运行在计算机上的程序 是资源的分配者 向上管理软件向下管理硬件 为用户提供良好接口 中断的概念? 中断指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。 中断向量的概念? 各种设备的中断处理子程序的地址数组 什么是系统调用? 由操作系统实现提供的所有系统调用所构成的集合即(Application Programming Interface,API)。是应用程序同系统之间的接口。 内存是什么? 内存是处理器可以直接访问的唯一的大容量存储区
我们知道程序代码和数据必须驻留在内存中才能得以运行,然而系统内存数量很有限,往往不能容纳一个完整程序的所有代码和数据,更何况在多任务系统中,可能需要同时打开子处理程序,画图程序,浏览器等很多任务,想让内存驻留所有这些程序显然不太可能。因此首先能想到的就是将程序分割成小份,只让当前系统运行它所有需要的那部分留在内存,其它部分都留在硬盘。当系统处理完当前任务片段后,再从外存中调入下一个待运行的任务片段。的确,老式系统就是这样处理大任务的,而且这个工作是由程序员自行完成。但是随着程序语言越来越高级,程序员对系统体系的依赖程度降低了,很少有程序员能非常清楚的驾驭系统体系,因此放手让程序员负责将程序片段化和按需调入轻则降低效率,重则使得机器崩溃;再一个原因是随着程序越来越丰富,程序的行为几乎无法准确预测,程序员自己都很难判断下一步需要载入哪段程序。因此很难再靠预见性来静态分配固定大小的内存,然后再机械地轮换程序片进入内存执行。系统必须采取一种能按需分配而不需要程序员干预的新技术。
离散分配 分页(Paging),分段,段页式 一、分页 一个进程的物理地址可以是非连续的; 将物理内存分成固定大小的块,称为块(frame); 将逻辑内存分为同样大小的块,称为页(page); 将连续的页分配并存放到不连续的若干内存块中; 建立页表,记录每一页对应的存储块的块号,将逻辑地址转换为物理地址。 将产生内部碎片 地址转换方法 将逻辑地址转换为虚拟地址: CPU生成的地址分成以下两部分: 1.页号(p):页号作为页表中的索引。页表中包含每页所在物理内存的基地址。 2.页偏移(d):与页的基地址组合就
CPU可以在一个cpu时钟内执行一个或多个其内置寄存器的指令。而访问内存需多个cpu时钟。由于内存频繁访问,可以再cpu与内存之间增加高速缓存
内存作为计算机系统的组成部分,跟开发人员的日常开发活动有着密切的联系,我们平时遇到的Segment Fault、OutOfMemory、Memory Leak、GC等都与它有关。本文所说的内存,指的是计算机系统中的主存(Main Memory),它位于存储金字塔中CPU缓存和磁盘之间,是程序运行不可或缺的一部分。
为了快速构建项目,使用高性能框架是我的职责,但若不去深究底层的细节会让我失去对技术的热爱。 探究的过程是痛苦并激动的,痛苦在于完全理解甚至要十天半月甚至没有机会去应用,激动在于技术的相同性,新的框架不再是我焦虑。 每一个底层细节的攻克,就越发觉得自己对计算机一无所知,这可能就是对知识的敬畏。
之所以这样构造是因为会使操作系统很方便的为每个应用程序构造页表,即虚拟页和物理页映射关系表
理想情况下用户对内存的期待是大容量、高速度和持久性,但是现实中却是一个由缓存、主存、磁盘组成的内存架构,该架构中,缓存低容量、速度快但是成本高,主存中速度、中容量和中成本,磁盘就是大容量、持久性但是速度慢。
包括程序装入等概念、交换技术、连续分配管理方式和非连续分配管理方式(分页、分段、段页式)。
操作系统确实是比较难啃的一门课,至少我认为比计算机网络难太多了,但它的重要性就不用我多说了。
本文为IBM RedBook的Linux Performanceand Tuning Guidelines的1.2节的翻译 原文地址:http://www.redbooks.ibm.com/redpapers/pdfs/redp4285.pdf 原文作者:Eduardo Ciliendo, Takechika Kunimasa, Byron Braswell 1.2 Linux内存架构 为了执行一个进程,Linux内核为请求的进程分配一部分内存区域。该进程使用该内存区域作为其工作区并执行请求的工作。它与你的
计算机是由很多资源组成的,像我们常见的 CPU、内存、硬盘等。如果我们想要使用这些资源去完成某个计算任务,那么就需要有一个管理者来协调这些资源,操作系统就是这个管理者。
面试的时候经常会被问到 malloc 的实现。从操作系统层面来说,malloc 确实是考察面试者对操作系统底层的存储管理理解的一个很好的方式,涉及到虚拟内存、分页/分段等。下面逐个细说。
进程是资源分配的基本单位,线程是 CPU 调度的基本单位。进程拥有独立的地址空间,线程是共享内存地址的。进程切换的开销比线程要大。
虚拟内存可以用来管理物理内存,进程直接和虚拟内存进行打交道而不是物理内存,为什么这样设计?
1、用户编制程序时使用的地址称为虚地址或逻辑地址,其对应的存储空间称为虚存空间或逻辑地址空间;而计算机物理内存的访问地址则称为实地址或物理地址,其对应的存储空间称为物理存储空间或主存空间。
为每个VM维护一个影子页表记录虚拟化内有与物理内存的映射关系。VMM将影子页表提交始CPU的内存管理单元MMU进行地址转换。VM的页表无需改动。
mmap是linux操作系统提供给用户空间调用的内存映射函数,很多人仅仅只是知道可以通过mmap完成进程间的内存共享和减少用户态到内核态的数据拷贝次数,但是并没有深入理解mmap在操作系统内部是如何实现的,原理是什么。
传统的多核运算是使用SMP(Symmetric Multi-Processor )模式:将多个处理器与一个集中的存储器和I/O总线相连。所有处理器只能访问同一个物理存储器,因此SMP系统有时也被称为一致存储器访问(UMA)结构体系,一致性意指无论在什么时候,处理器只能为内存的每个数据保持或共享唯一一个数值。
一个系统中的进程是与其他进程共享 CPU 和主存资源的。然而,共享主存会形成一些特殊的挑战。
一、内存管理架构 二、虚拟地址空间布局架构 三、物理内存体系架构 四、内存结构 五、内存模型 六、虚拟地址和物理地址的转换 七、内存映射原理分析 一、内存管理架构 内存管理子系统架构可以分为:用户空间、内核空间及硬件部分3个层面,具体结构如下所示:1、用户空间:应用程序使用malloc()申请内存资源/free()释放内存资源。2、内核空间:内核总是驻留在内存中,是操作系统的一部分。内核空间为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数。3、硬件:处理器包含一个内存管理单元(Memo
进程同步的主要任务:是对多个相关进程在执行次序上进行协调,以使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。
当我们要学习一个新知识点时,比较好的过程是先理解出现这个技术点的 背景原因,同期其他解决方案,新技术点解决了什么问题以及它存在哪些不足和改进之处,这样整个学习过程是 闭环 的,个人觉得这是个很好的学习思路。
虚拟内存就是在你电脑的物理内存不够用时把一部分硬盘空间作为内存来使用,这部分硬盘空间就叫作虚拟内存。
领取专属 10元无门槛券
手把手带您无忧上云