首页 > 系统相关 >【Linux】内核学习笔记(一)——进程管理

【Linux】内核学习笔记(一)——进程管理

时间:2024-03-21 19:33:41浏览次数:20  
标签:SLAB 笔记 内存 分配器 Linux 进程 slab 分配 内核

1. 进程描述符

1.1. 进程描述符的表示和存放

进程描述符task_struct完整地描述了进程的所有信息,它由slab分配器  (小内存分配)分配产生,并存放在叫任务队列(task list)的双向循环链表中。

 

 

一文看懂slab分配器实现

https://zhuanlan.zhihu.com/p/523241576

 

伙伴系统和slab分配:

slab分配:内部碎片和外部碎片

外部碎片指的是还没有被分配出去(不属于任何进程)但由于太小而无法分配给申请内存空间的新进程的内存空闲区域。外部碎片是除了任何已分配区域或页面外部的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因,使得系统无法满足当前申请。简单示例如下图:

https://pic4.zhimg.com/80/v2-a8c043998653d8c3fe2e463c7262403b_1440w.webp

如果某进程现在需要向操作系统申请地址连续的32K内存空间,注意是地址连续,实际上系统中当前共有10K+23K=33K空闲内存,但是这些空闲内存并不连续,所以不能满足进程的请求。这就是所谓的外部碎片,造成外部碎片的原因主要是进程或者系统频繁的申请和释放不同大小的一组连续页框。Linux操作系统中为了尽量避免外部碎片而采用了伙伴系统(Buddy System)算法  (页表)2的n次方空间 4k 8k 16k

 

 

内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间;内部碎片是处于区域内部或页面内部的存储块,占有这些区域或页面的进程并不使用这个存储块,而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。简单示例如下图:

某进程向系统申请了3K内存空间,系统通过伙伴系统算法可能分配给进程4K(一个标准页面)内存空间,导致剩余1K内存空间无法被系统利用,造成了浪费。这是由于进程请求内存大小与系统分配给它的内存大小不匹配造成的。由于伙伴算法采用页框(Page Frame)作为基本内存区,适合于大块内存请求。在很多情况下,进程或者系统申请的内存都是4K(一个标准页面)的,依然采用伙伴算法必然会造成系统内存的极大浪费。为满足进程或者系统对小片内存的请求,对内存管理粒度更小的SLAB分配器就产生了。(注:Linux中的SLAB算法实际上是借鉴了Sun公司的Solaris操作系统中的SLAB模式)

kalloc valloc

https://blog.csdn.net/lukuen/article/details/6935068

https://blog.csdn.net/goodluckwhh/article/details/10026311

https://zhuanlan.zhihu.com/p/358891862

若仍然分配一页内存,这将严重浪费内存。那么该如何分配呢?slab 分配器专为小内存分配而生,由Sun公司的一个雇员Jeff BonwickSolaris 2.4中设计并实现。slab分配器分配内存以字节为单位,基于伙伴分配器的大内存进一步细分成小内存分配。换句话说,slab 分配器仍然从 Buddy 分配器中申请内存,之后自己对申请来的内存细分管理。

除了提供小内存外,slab 分配器的第二个任务是维护常用对象的缓存。对于内核中使用的许多结构,初始化对象所需的时间可等于或超过为其分配空间的成本。当创建一个新的slab 时,许多对象将被打包到其中并使用构造函数(如果有)进行初始化。释放对象后,它会保持其初始化状态,这样可以快速分配对象。

举例来说, 为管理与进程关联的文件系统数据, 内核必须经常生成struct fs_struct的新实例. 此类型实例占据的内存块同样需要经常回收(在进程结束时). 换句话说, 内核趋向于非常有规律地分配并释放大小为sizeof(fs_struct)的内存块. slab分配器将释放的内存块保存在一个内部列表中. 并不马上返回给伙伴系统. 在请求为该类对象分配一个新实例时, 会使用最近释放的内存块。S这有两个优点. 首先, 由于内核不必使用伙伴系统算法, 处理时间会变短. 其次, 由于该内存块仍然是”新”的,因此其仍然驻留在CPU硬件缓存的概率较高.[3]

 

 

SLAB分配器的最后一项任务是提高CPU硬件缓存的利用率。 如果将对象包装到SLAB中后仍有剩余空间,则将剩余空间用于为SLAB着色。 SLAB着色是一种尝试使不同SLAB中的对象使用CPU硬件缓存中不同行的方案。 通过将对象放置在SLAB中的不同起始偏移处,对象可能会在CPU缓存中使用不同的行,从而有助于确保来自同一SLAB缓存的对象不太可能相互刷新。 通过这种方案,原本被浪费掉的空间可以实现一项新功能。

通过命令sudo cat /proc/slabinfo可查看系统当前 slab 使用情况。以vm_area_struct结构体为例,当前系统已分配了 13014 个vm_area_struct缓存,每个大小为 216 字节,其中 active 的有 12392 个。

 

标签:SLAB,笔记,内存,分配器,Linux,进程,slab,分配,内核
From: https://www.cnblogs.com/ycjstudy/p/18088086

相关文章

  • 新人学习笔记之(盒子模型)
    一、盒子模型属性    1.width属性        (1)宽度:width:长度值|百分比|auto,最大宽度:max-width最小宽度:min-width.box1{width:300px;}.box2{min-width:1200px;}        2.height属性......
  • MATLAB学习笔记6:矩阵的操作1
    说了三篇各种矩阵的创建,终于进行到下一部分了,太不容易了,今天我们来说说矩阵的操作,说白了就是对矩阵进行一些我们平时计算需要在纸上操作的步骤,用软件肯定要方便得多1.矩阵的拼接这个还是很好理解嘛,比如两个3*3的矩阵就可以横着或者竖着拼接到一起,而4*5与4*6的矩阵就只能横着......
  • 自用笔记
    1.对DRSN的RSBU块做尝试1.1新的RSBU软阈值块作为Resnet的变体DRSN通过软阈值的方式消除噪声。其中经过残差的两次卷积后,将结果取绝对值,之后经过全局平均池化,之后再经过两次全连接层,该结果进行Sigmoid,最后将GAP的结果取平均后与两次取得平均值分别相乘,得到软阈值的结果。最后......
  • linux 调度器学习 转载;
    转载:http://www.wowotech.net/process_management/scheduler-history.html转载:O(n)、O(1)和CFS调度器任务调度器是操作系统一个很重要的部件,它的主要功能就是把系统中的task调度到各个CPU上去执行满足如下的性能需求:1、对于time-sharing的进程,调度器必须是公平的2、快速的进程......
  • 【Linux】内核学习笔记(八)——网络栈简介 转载
    转载:https://void-star.icu/archives/601网络栈从定义上还比较抽象。不过从功能上看,它是为了让主机之间交换数据而生的。要实现网络栈,最原始的一个方式就是:将想发送的报文封装成帧,然后发出去就完事了。接收主机会按约定好的方式解析。不过这种存在一个问题,如果要加密怎么办?要支......
  • nginx入门-31-学习笔记
    nginx入门-31-学习笔记环境环境:虚拟机ip:10.0.1.0网关:10.0.1.2子网掩码:255.255.255.0测试机器ip:10.0.1.101概念1.安装nginx软件安装:yum安装yuminstallepel-releaseyuminstallnginx-ysystemctlstartnginx编译安装(生产环境)yum-yinstallpcr......
  • Linux系统服务必学之NTP时间服务搭建
            NTP(NetworkTimeProtocol,网络时间协议)是一种用于同步计算机系统时间的网络协议。它允许计算机通过网络与时间服务器进行通信,以获取准确的时间信息并将其应用于本地系统。NTP的主要目标是确保计算机系统之间的时间同步,以便在分布式系统和网络中实现一致性和准......
  • linux 键盘按键键码捕捉测试
    捕捉linux中键盘输入对象的键码情况#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<errno.h>#include<linux/input......
  • VUE-小黑笔记本
    一、效果二、功能介绍1.输入框输入任务,按下回车键,添加任务至任务栏最后2.鼠标移动到某项任务,后面出现叉号,即可删除任务3.记事本最下方左边统计当前任务总数4.记事本最下方右边clear实现清空任务同时最底部一栏隐藏三、代码(含样式)<!DOCTYPEhtml><htmllang="en"><he......
  • Linux服务器上部署更新/重启nuxt项目
    启动/更新/重启nuxt项目步骤1、本地电脑打包生成nuxt文件夹2、压缩nuxt文件夹后上传到服务器3、替换掉服务器上旧的nuxt文件夹..3.1、建议备份服务器上的nuxt文件夹,不做删除操作,只重命名下mvnuxtnuxt20240310//重命名nuxt文件夹为nuxt20240310..3.2、......