操作系统内存分配算法_操作系统基础45-伙伴系统和slab内存分配

当在用户模式下运行进程请求额外内存时,从内核维护的空闲页帧列表上分配页面。这个列表通常使用页面置换算法来填充,如前所述,它很可能包含散布在物理内存中的空闲页面。也要记住,如果用户进程请求单个字节内存,那么就会导致内部碎片,因为进程会得到整个帧。
用于分配内核内存的空闲内存池通常不同于用于普通用户模式进程的列表。这有两个主要原因:

  1. 内核需要为不同大小的数据结构请求内存,其中有的小于一页。因此,内核应保守地使用内存,并努力最小化碎片浪费。这一点非常重要,因为许多操作系统的内核代码或数据不受调页系统的控制。
  2. 用户模式进程分配的页面不必位于连续物理内存。然而,有的硬件设备与物理内存直接交互,即无法享有虚拟内存接口带来的便利,因而可能要求内存常驻在连续物理内存中。


下面讨论两个策略,以便管理用于内核进程的空闲内存:“伙伴系统”和 slab 分配。

伙伴系统

伙伴系统从物理连续的大小固定的段上进行分配。从这个段上分配内存,采用 2 的幂分配器来满足请求分配单元的大小为 2 的幂(4KB、 8KB、16KB 等)。请求单元的大小如不适当,就圆整到下一个更大的 2 的幂。例如,如果请求大小为 11KB,则按 16KB 的段来请求。
让我们考虑一个简单例子。假设内存段的大小最初为 256KB,内核请求 21KB 的内存。最初,这个段分为两个伙伴,称为 AL 和 AR,每个的大小都为 128KB;这两个伙伴之一进一步分成两个 64KB 的伙伴,即 BL 和 BR。然而,从 21KB 开始的下一个大的 2 的幂是 32KB,因此 BL 或 BR 再次划分为两个 32KB 的伙伴 CL 和 CR。因此,其中一个 32KB 的段可用于满足 21KB 请求。这种方案如下图所示,其中 CL 段是分配给 21KB 请求的。

a408c05cd09852746ebe9ae1eacee663.gif

伙伴系统分配

伙伴系统的一个优点是:通过称为合并的技术,可以将相邻伙伴快速组合以形成更大分段。例如,在图 1 中,当内核释放已被分配的 CL 时,系统可以将 CL 和 CR 合并成 64KB 的段。段 BL 继而可以与伙伴 BR 合并,以形成 128KB 段。最终,可以得到原来的 256KB 段。
伙伴系统的明显缺点是:由于圆整到下一个 2 的幂,很可能造成分配段内的碎片。例如,33KB 的内存请求只能使用 64KB 段来满足。事实上,我们不能保证因内部碎片而浪费的单元一定少于 50%。

slab分配

分配内核内存的第二种策略称为slab分配。每个slab由一个或多个物理连续的页面组成,每个cache由一个或多个slab组成,每个内核数据结构都有一个cache。
例如,用于表示进程描述符、文件对象、信号量等的数据结构都有各自单独的cache。每个cache 含有内核数据结构的对象实例(称为object)。例如,信号量cache有信号量对象,进程描述符cache有进程描述符对象,等等。

ef23fb58bafc881d695ced2d54851b4e.gif

slab 分配

上图显示了slab、cache及object 三者之间的关系。该图显示了2个大小为3KB 的内核对象和3个大小为7KB的对象,它们位于各自的cache中。slab分配算法采用 cache来存储内核对象。在创建 cache 时,若干起初标记为free的对象被分配到 cache。cache内的对象数量取决于相关slab的大小。例如,12KB slab(由3个连续的4KB页面组成)可以存储6个2KB对象。最初,cache内的所有对象都标记为空闲。当需要内核数据结构的新对象时,分配器可以从cache上分配任何空闲对象以便满足请求。从cache上分配的对象标记为used(使用)。
让我们考虑一个场景,这里内核为表示进程描述符的对象从slab分配器请求内存。在 Linux 系统中,进程描述符属于 struct task_struct 类型,它需要大约1.7KB的内存。当Linux内核创建一个新任务时,它从cache中请求 struct task_struct对象的必要内存。cache 利用已经在slab中分配的并且标记为 free (空闲)的 struct task_struct对象来满足请求。
在Linux中,slab可以处于三种可能状态之一:

  1. 满的:slab的所有对象标记为使用。
  2. 空的:slab上的所有对象标记为空闲。
  3. 部分:slab上的对象有的标记为使用,有的标记为空闲。

slab分配器首先尝试在部分为空的slab中用空闲对象来满足请求。如果不存在,则从空的slab 中分配空闲对象。如果没有空的slab可用,则从连续物理页面分配新的slab,并将其分配给cache;从这个slab上,再分配对象内存。slab分配器提供两个主要优点:

  1. 没有因碎片而引起内存浪费。碎片不是问题,因为每个内核数据结构都有关联的cache,每个 cache都由一个或多个slab组成,而slab按所表示对象的大小来分块。因此,当内核请求对象内存时,slab 分配器可以返回刚好表示对象的所需内存。
  2. 可以快速满足内存请求。因此,当对象频繁地被分配和释放时,如来自内核请求的情况,slab 分配方案在管理内存时特别有效。分配和释放内存的动作可能是一个耗时过程。然而,由于对象已预先创建,因此可以从cache 中快速分配。再者,当内核用完对象并释放它时,它被标记为空闲并返回到cache,从而立即可用于后续的内核请求。

slab 分配器首先出现在 Solaris 2.4 内核中。由于通用性质,Solaris 现在也将这种分配器用于某些用户模式的内存请求。最初,Linux使用的是伙伴系统;然而,从版本2.2开始,Linux 内核采用 slab 分配器。
现在,最近发布的 Linux 也包括另外两个内核内存分配器,SLOB和SLUB分配器(Linux 将 slab 实现称为SLAB)。
简单块列表(SLOB)分配器用于有限内存的系统,例如嵌入式系统。SLOB工作采用3个对象列表:小(用于小于 256 字节的对象)、中(用于小于1024字节的对象)和大(用于小于页面大小的对象)。内存请求采用首先适应策略,从适当大小的列表上分配对象。
从版本2.6.24开始,SLUB分配器取代SLAB,成为Linux内核的默认分配器。SLUB通过减少SLAB 分配器所需的大量开销,来解决slab分配的性能问题,一个改变是,在SLAB分配下每个slab 存储的元数据,移到Linux内核用于每个页面的结构 page。此外,对于SLAB分配器,每个CPU都有队列以维护每个cache内的对象,SLUB会删除这些队列。
对于具有大量处理器的系统,分配给这些队列的内存量是很重要的。因此,随着系统处理器数量的增加,SLUB性能也更好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457283.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sublime Text 3新建工程

1. 创建工程 Project > Add Folder to Project 这时在sidebar中将出现刚刚添加的文件目录,如果还需要添加其他目录,则重复这一操作即可。 2. 保存工程 Project > Save Project As 点击保存后Sublime Text将自动生成两个文件: 如图&…

445端口 mysql_关于如何关闭window端口445的详细介绍

首先,来查看下系统当前都开放了什么端口,怎样查看呢?调出cmd命令行程序,输入命令”netstat -na“,可以看到。接着,可以发现当前系统开放了135、445以及5357端口,而且从状态看都处于监听状态”Li…

输入圆的半径,计算并输出圆的周长和面积

转载于:https://www.cnblogs.com/nicebaby/p/5866320.html

Mac下运行git报错xcrun: error: invalid active developer path ..

错误:xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun 如图: 解决方法: 终端输入: xcode-select --install 之后点击…

CodeForces 15B Laser

题目链接:http://codeforces.com/problemset/problem/15/B题意:给出n*m的一块巧克力,再给出两个点,两点只能同时移动,两点所占位置巧克力会融化,问所有能走位置走遍之后还剩下几块巧克力。思路:…

datetime-时间日期模块

import datetime例1:把nginx的日志格式转化为易懂的格式time 10/Aug/2016:03:20:09 0800a datetime.datetime.strptime(time,%d/%b/%Y:%H:%M:%S %z)a.strftime(%Y%m%d%H%m)转载于:https://blog.51cto.com/liuzhengwei521/1892274

tensorflow独热编码方法_吴恩达课后作业学习2-week3-tensorflow learning-1-基本概念

参考:https://blog.csdn.net/u013733326/article/details/79971488希望大家直接到上面的网址去查看代码,下面是本人的笔记到目前为止,我们一直在使用numpy来自己编写神经网络。现在我们将一步步的使用深度学习的框架来很容易的构建属于自己的…

基于Dubbo框架构建分布式服务

一、Dubbo服务集群容错 假设我们使用的是单机模式的Dubbo服务,如果在服务提供方(Provider)发布服务以后,服务消费方(Consumer)发出一次调用请求,恰好这次由于网络问题调用失败,那么我…

如果我们不曾相遇

五月天的演唱会定的是9月10号,周六晚上7点。 而我,差不多,从一周前就开始准备了,因为公司最近在赶工,特别忙。为了周末不加班我提前一周就旁敲侧击地询问师父的时间安排,最后又耿直地告诉师父我的周末计划&…

win下php的memcached的安装与使用

1、memcache的php扩展与memcached服务器的区别? php要操作memcached就必须要安装memcache的扩展, 在http://windows.php.net/downloads/pecl/releases/memcache/下载相应版本安装。 而php要操作memcached就必须要有memcached的服务,不然没有服…

mysql 表的存储类型_MySQL数据表存储引擎类型及特性

数据表类型(存储引擎)常见引擎比对 特点 Myisam InnoDB Memory BDB Archive 存储限制 无穷制 64TB 有 没有 没有 事务安然 - 支撑 - 支撑 - 锁机制 表锁 行锁 表锁 页锁 行锁 B树索引 支撑 支撑 支撑 支撑 - 哈希索引 - 支撑 支撑 - - 全文索引 支撑 - - - - 集群索引 - 支撑 -…

ORM中的Model与DDD中的DomainModel

0.引言 在现有的系统开发中,大部分的系统应该都会用到ORM,无论用的是EF还是NHibernate。作为对象和持久化数据的桥梁,ORM确实非常方便,以至于在DDD的时候,我们很自然的将 ORM中的Model(实体)表达成DDD中的 DomainModel…

jsp java语法_JSP基础语法

Java JSP 的 JSP基础语法在本章中,我们将了解和学习JSP语法。并了解JSP开发涉及的简单语法(即元素)的基本用法。为了方便演示,使用Eclipse创建一个动态Web项目:jspsyntax,用于运行以下涉及到的示例代码。JSP的元素JSP的元素如下所…

iOS - Core Animation 核心动画

1、UIView 动画 具体讲解见 iOS - UIView 动画2、UIImageView 动画 具体讲解见 iOS - UIImageView 动画3、CADisplayLink 定时器 具体讲解见 iOS - OC NSTimer 定时器CADisplayLink 是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器。我们在应用中创建一个新的…

【BZOJ 1597】 [Usaco2008 Mar]土地购买 (斜率优化)

1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3601 Solved: 1322Description 农夫John准备扩大他的农场,他正在考虑N (1 < N < 50,000) 块长方形的土地. 每块土地的长宽满足(1 < 宽 < 1,000,000; 1 < 长 < 1,000,000). …

深入浅出学java_《深入浅出学JAVA开发初级》

整体说明&#xff1a;Java私塾的这一套视频是完全真实课堂录制&#xff0c;实际上课时间为十一天&#xff0c;主要内容包括&#xff1a;1&#xff1a;系统完整的学习Java的基础知识2&#xff1a;深入剖析重点知识点的理论3&#xff1a;超多的编程题目和程序讲解4&#xff1a;最…

Linux bashrc和profile的用途和区别

导读使用终端ssh登录Linux操作系统的控制台后&#xff0c;会出现一个提示符号&#xff08;例如&#xff1a;#或~&#xff09;&#xff0c;在这个提示符号之后可以输入命令&#xff0c;Linux根据输入的命令会做回应&#xff0c;这一连串的动作是由一个所谓的Shell来做处理。Shel…

Golang 特性简介

by sheepbao 主要大概介绍go语言的历史和特性&#xff0c;简单的入门。 来历 很久以前&#xff0c;有一个IT公司&#xff0c;这公司有个传统&#xff0c;允许员工拥有20%自由时间来开发实验性项目。在2007的某一天&#xff0c;公司的几个大牛&#xff0c;正在用c开发一些比较繁…

华为2017java笔试题_2017年java华为面试题

2017年java华为面试题通过HCNP认证&#xff0c;将证明您对中小型网络有全面深入的了解&#xff0c;掌握中小型网络的通用技术&#xff0c;并具备独立设计中小型网络以及使用华为路由交换设备实施设计的能力。下面是小编收集的关于java华为面试题&#xff0c;希望大家认真阅读!1…