内存管理

聊一聊内存管理(1)

孤街醉人 提交于 2019-12-10 04:18:31
“最近的电脑打开程序非常慢,而且运行的时候很卡,有没有什么解决办法呢?” “去京东买个4G 的内存条加到电脑里面吧!” 在我们的生活中,经常会遇到这样的对话。当我们的电脑运行程序变得很慢很卡的时候,就会听到身边的朋友建议我们去增加电脑的内存。这是为什么呢?内存在计算机体系结构中起了什么样的作用?当我们有了4G 的内存,操作系统又是如何管理这些内存的呢? 本系列博客将和大家一起深入的探讨这些问题,主要介绍操作系统原理中的内存管理部分,从而让您更好的理解计算机。力求用最简单易懂的语言介绍相关原理及算法,即使您没有任何的专业基础,也能和我们一起来感受操作系统的魅力。 问题定义 介绍任何技术及理论之前,我们首先都需要搞明白需要解决的问题是什么,也就是问题的定义,这是极其关键的一步。很多学生在学习的时候,往往不知道我为什么要学习这个知识点,这个知识点和前后章节以及其他课程的关系是什么,这个知识点解决了什么问题,只是简单的去学某个知识点,而忽视了问题的定义以及前后关联。 每一个程序的运行都需要占用内存,每一个程序运行结束了以后,都会释放其占有的内存。 这是大家首先需要了解的一个前提。 首先我们来给大家介绍下什么叫内存管理。所谓内存管理简单来说就是你要运行一个程序,就需要给这个程序分配相应的内存,那么该如何分配这些内存呢? 可能有些同学说,这不是很简单的事情吗?比如 我有 4G 的内存条

内存管理

╄→尐↘猪︶ㄣ 提交于 2019-12-10 00:29:19
内存管理 习题 一.选择题 1、设备分配问题中,算法实现时,同样要考虑安全性问题,防⽌在多个进程进⾏设备请求时,因相互等待对⽅释放所占设备所造成的(D)现象。 A.瓶颈 B.碎⽚ C.系统抖动 D.死锁 2、主存与辅存间频繁的页⾯置换现象被称为(C)。 A.请求调页 B.碎⽚整理 C.系统抖动 D.输⼊输出 3、在可变分区存储管理中,最差适应分配算法要求对空闲区表项按( C)进⾏排列 A.地址从⼤到⼩ B.地址从⼩到⼤ C.尺⼨从⼤到⼩ D.尺⼨从⼩到⼤ 若为最优适应分配算法则D 最优适应分配算法可把空闲区按长度以递增顺序登记在空闲区表中。分配时顺序查找空闲区表,由于查找时每次总是从分区中的最小的一个区开始,所以,找到的第一个能满足作业要求的分区,一定是所有能满足作业要求的分区中的最小的一个分区。 4、段页式存储管理汲取了页式管理和段式管理的长处,其实现原理结合了页式和段式管理的基本思想,即( B )。 A、⽤分段⽅法来分配和管理物理存储空间,⽤分页⽅法来管理⽤户地址空间。 B、⽤分段⽅法来分配和管理⽤户地址空间,⽤分页⽅法来管理物理存储空间。 C、⽤分段⽅法来分配和管理主存空间,⽤分页⽅法来管理辅存空间。 D、⽤分段⽅法来分配和管理辅存空间,⽤分页⽅法来管理主存空间。 段页式存储管理兼有页式管理和段式管理的优点,采用分段方法来分配和管理用户地址空间,用分页方法来管理物理存储空间。

Linux的内存管理

走远了吗. 提交于 2019-12-09 23:53:55
Linux采用请求分页存储管理方法。 系统为每个进程提供4GB的虚拟内存空间。各虚拟内存空间各自独立。 一 硬件基础 还是逻辑地址,线性地址,物理地址,分段机制和分页机制依次转换。 其中涉及到GDT,LDT,段寄存器,段描述符, 逻辑地址到线性地址的转换 linux的分段模型 Linux使用如下段描述符 内核代码段,内核数据段,用户代码段,用户数据段,TSS段,默认LDT段 段基地址为0,段界限4GB,偏移量=线性地址 Linux必须分别为内核和用户程序创建代码段和数据段 虚拟地址等同于线性地址 分页机制 二 虚拟内存的管理 linux中,每个用户都可以访问4GB的线性虚拟地址空间。 分为用户空间和内核空间。 用户空间 :0到3GB-1,可以直接访问 内核空间: 3GB到4GB-1,存放供操作系统和内核访问的代码和数据,用户进程不能访问 注意!!!!!   所有的进程的3GB到4GB-1的虚拟空间都是一样的, linux以此方式让内核态进程共享代码段和数据段。 注意!!!!! 一个进程通过系统调用之后,就进入内核态了。,,一开始还想task_struct中有没有什么标志位神马的。 附上神图 好图+1 mm_struct详解 前面也已经提到过了这个,task_struct的mm项指向这个,描述进程的虚拟空间。 现在给出具体代码 struct mm_struct { struct vm

memcache 内存管理 机制

北慕城南 提交于 2019-12-09 23:22:57
一、Memcache内存分配机制 关于这个机制网上有很多解释的,我个人的总结如下。 Page为内存分配的最小单位。 Memcached 的内存分配以page为单位,默认情况下一个page是1M,可以通过-I参数在启动时指定。如果需要申请内存时,memcached会划分出一个新的 page并分配给需要的slab区域。page一旦被分配在重启前不会被回收或者重新分配(page ressign已经从1.2.8版移除了) Slabs划分数据空间。 Memcached 并不是将所有大小的数据都放在一起的,而是预先将数据空间划分为一系列slabs,每个slab只负责一定范围内的数据存储。如下图,每个slab只存储 大于其上一个slab的size并小于或者等于自己最大size的数据。例如:slab 3只存储大小介于137 到 224 bytes的数据。如果一个数据大小为230byte将被分配到slab 4中。从下图可以看出,每个slab负责的空间其实是不等的,memcached默认情况下下一个slab的最大值为前一个的1.25倍,这个可以通过修 改-f参数来修改增长比例。 Chunk才是存放缓存数据的单位。 Chunk 是一系列固定的内存空间,这个大小就是管理它的slab的最大存放大小。例如:slab 1的所有chunk都是104byte,而slab 4的所有chunk都是280byte

内存管理之程序内存分布

二次信任 提交于 2019-12-09 17:50:30
在多任务操作系统中的每一个进程都运行在一个属于它自己的内存沙盘中。这个沙盘就是虚拟地址空间(virtual address space)。 1 32位虚拟内存布局 在32位模式下虚拟地址空间总是一个4GB的内存地址块。这些虚拟地址通过页表(page table)映射到物理内存,页表由操作系统维护并被处理器引用。每一个进程拥有一套属于它自己的页表,但是还有一个隐情。只要虚拟地址被使用,那么它就会作用于这台机器上运行的所有软件,包括内核本身。因此一部分虚拟地址必须保留给内核使用: 图 1 这并不意味着内核使用了那么多的物理内存,仅表示它可支配这么大的地址空间,可根据内核需要,将其映射到物理内存。内核空间在页表中拥有较高的 特权级 (ring 2或以下),因此只要用户态的程序试图访问这些页,就会导致一个页错误(page fault),用户程序不可访问内核页。在Linux中,内核空间是持续存在的,并且在所有进程中都映射到同样的物理内存。内核代码和数据总是可寻址的,随时准备处理中断和系统调用。与此相反,用户模式地址空间的映射随进程切换的发生而不断变化: 图 2 图2中,蓝色区域表示映射到物理内存的虚拟地址,而白色区域表示未映射的部分。在上面的例子中,Firefox使用了相当多的虚拟地址空间,因为它是传说中的吃内存大户。地址空间中的各个条带对应于不同的内存段(memory segment),如

Memcached 内存管理(一)

北战南征 提交于 2019-12-09 12:51:04
Memcached是一个高效的分布式内存cache,了解memcached的内存管理机制,便于我们理解memcached,让我们可以针对我们数据特点进行调优,让其更好的为我所用。这里简单谈一下我对memcached的内存管理的一些认识,在没有特别注明的情况下,这里谈到的memcached是1.2版本,1.1和1.2版本有一些差异。 基本概念:Slab和chunk 在Memcached内存结构中有两个非常重要的概念:slab 和 chunk,我们先从下图中对这两个概念有一个感性的认识: 图 1 memcached内存结构 Slab是一个内存块,它是memcached一次申请内存的最小单位。在启动memcached的时候一般会使用参数-m指定其可用内存,但是并不是在启动的那一刻所有的内存就全部分配出去了,只有在需要的时候才会去申请,而且每次申请一定是一个slab。Slab的大小固定为1M(1048576 Byte),一个slab由若干个大小相等的chunk组成。每个chunk中都保存了一个item结构体、一对key和value。 虽然在同一个slab中chunk的大小相等的,但是在不同的slab中chunk的大小并不一定相等,在memcached中按照chunk的大小不同,可以把slab分为很多种类(class)。在启动memcached的时候可以通过-vv来查看slab的种类: 图2

Effective C++ Notes(读书笔记)

限于喜欢 提交于 2019-12-09 12:05:57
1,视C++为一种语言联邦,大致分为4个部分: A)C。说到底C++仍是以C为基础。区块、语句、预处理器、内置数据类型、数组、指针等等统统来自C。 B)Object-Oriented C++。这部分也就是C with Classes所诉求的:classes(包括构造函数和虚构函数)、封装、继承、多态,虚函数等等。 C)Template C++。这是C++的范型编程部分,tamplates威力强大,它给我们带来了崭新的编程范型,也就是所谓的TMP模板元编程。 D)STL。STL是个template程序库,它对容器、迭代器、算法以及函数对象的规范有极佳的紧密配合与协调,然后template及程序库也可以其他想法建置出来。 2,尽量使用const,enum,inline代替#define A)#define不被视为语言的一部分,属于预处理指令,编译不会计入符号表无法调试。 B)#define在预处理器处理阶段只做简单的替换,这将带来很多预期意外的行为。如 #define MAX(a, b) ((a)>(b)?(a):(b)) 尽管上述宏定义已将变量用括号括起来了,但是还是不能避免MAX(++a, b+10)这样给a所带来的两次不是预期内的自增行为。以为替换为: template<typename T> inline T Max(const T& a, const T& b) {

OC学习之旅 (一) 内存管理及OC常用方法

人盡茶涼 提交于 2019-12-09 10:47:10
最近学习OC,所以在博客写下自己的笔记. OC的基本: 1 id 相当于java的Object 代表任何对象. 所以id是关键字,不能用作变量!! 2 oc中使用"."符号是调用 int a =object.a 是调用的是 [object getA]; object.a=3; object.a是调用object.setA方法!! 3 @property : Objective-C语言关键词,与@synthesize配对使用。xcode4.5以及以后的版本,@synthesize可以省略. 功能:让 编译器 自动编写一个与 数据成员 同名的方法声明来省去读写方法的声明。要在头文件声明变量后,在声明 @property, 再回到.m文件使用注解 @synthesize . 假如在oc里面.m中有@synthesize a , 但在.h头文件中没有这个属性 和没有 @property a, 它会自动生成的.还有关于@property标准写法再下面贴出的例子有. 4 关于oc 的类的初始话 . oc的构造器方法是 init , 而不像java用类名的名字作为成员方法.假如我的类中有一个ID的属性,初始化它,并赋值给ID ,如: -(id)initWithID:(int)newID{ //判断self是否为空 if(self = [super init]){ _ID = newID;

内存泄漏以及常见的解决方法

…衆ロ難τιáo~ 提交于 2019-12-08 11:15:04
内存泄漏以及常见的解决方法 1. 什么是内存泄漏(memory leak)? 指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是 应用程序 分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。 A memory leak is a particular type of unintentional memory consumption by a computer program where the program fails to release memory when no longer needed. This condition is normally the result of a bug in a program that prevents it from freeing up memory that it no longer needs.This term has the potential to be confusing, since memory is not physically lost from the computer. Rather, memory is allocated to a program, and that program subsequently loses the

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

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