返回顶部
首页 > 资讯 > 操作系统 >Linux内存申请是怎样的
  • 610
分享到

Linux内存申请是怎样的

2023-06-16 15:06:31 610人浏览 安东尼
摘要

本篇内容主要讲解“linux内存申请是怎样的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux内存申请是怎样的”吧!先上基础,下图是Linux的内存映射模型每一个进程都有自己的进程空间,进

本篇内容主要讲解“linux内存申请是怎样的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux内存申请是怎样的”吧!

先上基础,下图是Linux的内存映射模型

  • 每一个进程都有自己的进程空间,进程空间的0-3G是用户空间,3G-4G是内核空间

  • 每个进程的用户空间不在同一个物理内存页,但是所有的进程的内核空间对应同样的物理地址

  • vmalloc分配的地址可以高端内存,也可以是低端内存

  • 0-896MB的物理地址是线性映射到物理映射区的。  

Linux内存申请是怎样的

内存动态申请

和应用层一样,内核程序也需要动态的分配内存,不同的是,内核进程可以控制分配的内存是在用户空间还是内核空间,前者可以用于给用户空间的堆区分配内存,eg,用户进程的用户空间的malloc最终就会通过系统调用回调内核空间的内存分配函数,此时该内存分配函数就属于该用户进程,可以给在该用户进程的堆区分配空间并返回,最终使得一个用会进程在自己的用户空间获得内存分配;后者只在内核空间分配,所以用户进程不能直接访问该空间,所以多用在满足内核程序自身的内存需求,下面是Linux内核空间申请内存常用api

kmalloc - kfree

kmalloc申请的内存在物理内存上是连续的,他们与真实的物理地址只有一个固定的偏移,因此存在简单的转换关系。这个API 多用来申请不到一个page大小的内存。kmalloc的底层需要调用__get_free_pages,参数中表示内存类型的gtp_t flags正是这个函数的缩写,常用的内存类型有GFP_USER,GFP_KERNEL,GFP_ATOMIC几种。

  • GFP_USER表示为用户空间页分配内存,可以阻塞;

  • GFP_KERNEL是最常用的flag,注意,使用这个flag来申请内存时,如果暂时不能满足,会引起进程阻塞,So,一定不要在中断处理函数,tasklet和内核定时器等非进程上下文中使用GFP_KERNEL!!!

  • GFP_ATOMIC就可以用于上述三种情境,这个flag表示如果申请的内存不能用,则立即返回。

 void *kmalloc(size_t size, gfp_t flags);  void kfree(const void *objp);

同系列API还有

void *kzalloc(size_t size, gfp_t flags)

__get_free_pages - free_pages

__get_free_pages()与kmalloc()一样是物理连续的内存,这一系列函数是Linux内核中***层的用于获取空闲内存的方法,因为底层的buddy算法都是以(2^n)×PAGE_SIZE来管理内存的,所以他们总是以页为单位分配内存的

unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)  void free_pages(unsigned long addr, unsigned int order)

同系列API还有

unsigned long __get_free_page(gfp_t gfp)        unsigned long get_zeroed_page(gfp_t gfp_mask)    struct page *alloc_pages(gfp_t gfp_mask, unsigned int order)
void free_page(unsigned long addr)

vmalloc - vfree

vmalloc在虚拟内存空间给出一块连续的内存区,实质上,这片连续的虚拟内存在物理内存中并不一定连续,所以vmalloc申请的虚拟内存和物理内存之间也就没有简单的换算关系,正因如此,vmalloc()通常用于分配远大于__get_free_pages()的内存空间,它的实现需要建立新的页表,此外还会调用使用GFP_KERN的kmalloc,so,一定不要在中断处理函数,tasklet和内核定时器等非进程上下文中使用vmalloc!

void *vmalloc(unsigned long size)   void vfree(const void *addr)

同系列的API还有

void *vmalloc_32(unsigned long size)

slab缓存

我们知道,页是内存映射的基本单位,但内核中很多频繁创建的对象所需内存都不到一页,此时如果仍然按照页映射的方式,频繁的进行分配和释放就会造成资源的浪费,同时也会降低系统性能。为了解决的这样的问题,内核引入了slab机制,使对象在前后两次被使用时被分配在同一块内存或同一类内存空间,且保留了基本的数据结构,就可以大大提高效率。kmalloc的底层即是使用slab算法管理分配的内存的。注意,slab依然是以页为单位进行映射,只是映射之后分割这些页为相同的更小的单元,从而节省了内存。slab分配的单元不能小于32B或大于128K。

struct kmem_cache *kmem_cache_create(const char *name, size_t size, size_t align,unsigned long flags, void (*ctor)(void *))void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)  void kmem_cache_free(struct kmem_cache *cachep, void *objp)  void kmem_cache_destroy(struct kmem_cache *s)

范例

//创建slab对象  struct kmem_cache_t *xj_sbcache; xj_sbcache = kmem_cache_create("xjslab",sizeof(struct xj_unit_t),0,SLAB_CACHE_DMA|SLAB_PANIC,NULL,NULL);//分配slab缓存  struct xj_unit_t *xj_unit; xj_unit = kmem_cache_alloc(xj_sbcache,GFP_KERNEL);    kmem_cache_free(xj_sbcache, xj_unit);   kmem_cache_destroy(xj_sbcache);

内存池

除了slab机制,内核还提供了传统的内存池机制来管理小块内存的分配。内存池主要是用来解决可能出现的内存不足的情况,因为一个内存池在创建的时候就已经分配好了一内存,当我们用mempool_alloc向一个已经创建好的内存池申请申请内存时,该函数首先会尝试回调内存池创建时的分配内存函数,如果已经没有内存可以分配,他就会使用内存池创建时预先分配的内存,这样就可以避免因为无内存分配而陷入休眠,当然,如果预分配的内存也已经使用完毕,还是会陷入休眠。slab机制的目的是提高内存使用率以及内存管理效率,内存池的目的是避免内存的分配失败。下面是内核中提供的关于内存池的API

 mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn, mempool_free_t *free_fn, void *pool_data)        void * mempool_alloc(mempool_t *pool, gfp_t gfp_mask)            void mempool_free(void *element, mempool_t *pool)            void mempool_destroy(mempool_t *pool)

到此,相信大家对“Linux内存申请是怎样的”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Linux内存申请是怎样的

本文链接: https://lsjlt.com/news/283985.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Linux内存申请是怎样的
    本篇内容主要讲解“Linux内存申请是怎样的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux内存申请是怎样的”吧!先上基础,下图是Linux的内存映射模型每一个进程都有自己的进程空间,进...
    99+
    2023-06-16
  • Linux内核环境下怎么申请大块内存
    这篇文章主要为大家展示了“Linux内核环境下怎么申请大块内存”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux内核环境下怎么申请大块内存”这篇文章吧。在Linux内核环境下,申请大块内存...
    99+
    2023-06-12
  • Linux内存布局是怎样的
    这篇“Linux内存布局是怎样的”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux内存布局是怎样的”文章吧。我们先来看...
    99+
    2023-06-28
  • Linux IO内存的访问是怎样的
    本篇内容主要讲解“Linux IO内存的访问是怎样的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux IO内存的访问是怎样的”吧!IO内存访问流程我们知道,为了管理最重要的系统资源并让物...
    99+
    2023-06-16
  • C++ vector怎么动态申请内存的元素
    这篇文章主要介绍C++ vector怎么动态申请内存的元素,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!vector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问。由于具有连续的存储空间,所以在插入和删...
    99+
    2023-06-20
  • Linux内核是怎样的
    这篇文章主要介绍“Linux内核是怎样的”,在日常操作中,相信很多人在Linux内核是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux内核是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-05
  • go语言内存申请和释放的方法是什么
    在Go语言中,内存的申请和释放是由Go的垃圾回收器自动管理的,开发者不需要手动申请和释放内存。Go语言使用了自动垃圾回收(Garba...
    99+
    2023-10-20
    go语言
  • 怎样申请云服务器
    要申请云服务器,您可以按照以下步骤进行操作: 确定您需要的云服务器类型 您可以根据需要选择云服务器提供商提供的云服务器类型。例如:如果您需要在 AWS 上托管您的数据,AWS 提供商可能会提供 WebSphere 或 Azure。如果您...
    99+
    2023-10-26
    服务器
  • C++ vector如何动态申请内存的元素
    vector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问。由于具有连续的存储空间,所以在插入和删除操作方面,效率比较慢。vector有多个构造函数,默认的构造函数是构...
    99+
    2024-04-02
  • Linux内核是怎么样的
    这篇文章将为大家详细讲解有关Linux内核是怎么样的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Linux 内核,这个经常听见,却不不知道它具体是干嘛的东西,是不是觉得非常神秘Linux 内核看不见摸不...
    99+
    2023-06-16
  • 怎样申请域名并建站
    小编给大家分享一下怎样申请域名并建站,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  如何申请域名的流程  1.域名查询  域名具有全球唯一性,如何申请域名的第一...
    99+
    2023-06-07
  • 怎样申请阿里云代理
    选择阿里云代理服务:你可以根据自己的需求和预算选择适合自己的代理服务。一些大型的云计算服务提供商会提供多个地区和不同层级的代理服务,比如亚马逊AWS、阿里云、腾讯云等。 注册阿里云账号:你需要注册一个阿里云账号,并绑定相关的信息,例如身份...
    99+
    2023-10-28
    阿里
  • 国内免费的vps怎么申请
    国内免费的VPS申请一般有三种方式:1、参加社区活动一些VPS运营商会在社区活动中通过抽奖、竞标等形式来提供免费VPS服务。2、注册...
    99+
    2023-03-07
    国内免费的vps 国内vps vps
  • JVM内存的结构是怎样的
    这篇文章主要介绍“JVM内存的结构是怎样的”,在日常操作中,相信很多人在JVM内存的结构是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JVM内存的结构是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-02
  • linux内核结构是怎样的
    Linux内核是一个分层的结构,由多个模块组成,每个模块负责不同的功能。下面是Linux内核的主要组成部分:1. 进程管理模块:负责...
    99+
    2023-10-08
    linux
  • Linux内核调优是怎样的
    这篇文章主要为大家分析了Linux内核调优是怎样的的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Linux内核调优是怎样的”的知识吧。一、内核文件系统操作系...
    99+
    2023-06-28
  • 申请云服务器的流程是什么样的
    如果您需要在云服务器上托管应用程序,以下是一个简单的步骤: 购买:您可以在各大云服务平台上购买云服务器,如AWS、Microsoft Azure和Google Cloud Platform(GCP)等。 选择云服务器:根据应用程序的需求...
    99+
    2023-10-26
    流程 服务器
  • 怎样申请阿里云服务器
    阿里云服务器可以通过以下方式进行购买和租赁: 在阿里云官网(aliyun.com)上注册帐户,并选择“我需要购买服务”或“我有一个免费的阿里云帐户”。 在阿里云官网(aliyun.com)上选择适合您的服务器类型,选择“云服务器”选项。...
    99+
    2023-10-26
    阿里 服务器
  • 怎样申请云服务器开通
    要申请云服务器开通,需要向您所在的公司或组织申请。您可以通过以下步骤申请云服务器: 登录您所申请的云服务器帐户:首先需要打开公司或组织网站,并在网站主页上注册账户。输入您的用户名和密码,以及登录密码和云服务器用户名。 选择云服务提供商:...
    99+
    2023-10-26
    服务器
  • 怎样申请云服务器账号
    要申请云服务器账号,您可以按照以下步骤进行操作: 进入 https://cloudservermanagement.org/,注册一个帐户,并创建虚拟服务器。 选择您的云服务器配置和服务。这将决定您需要使用哪种云服务和服务提供商。您可以...
    99+
    2023-10-26
    账号 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作