1、用户空间内存的申请

用户空间内存的申请函数为 malloc,相对应的内存释放函数为 free。malloc 函数具备一下的内存能力

(1)二次管理的的能力

当用户空间 malloc 了一块内存,这块被申请的内存被立即 free 之后,并不会立即将这块内存还给内核,而是将这块内存还给了 C 库,这块内存还是属于这个进程,只是将这块内存交给 C 库去进行管理。因此后续的内存申请,就可以占用这块被释放的内存了。

(2)Linux 内核总是按需分配

当 malloc 成功之后,返回。虽然是成功返回,但是内核并没有将这块内存真正给进程,这个时候,如果去读的话,会发现内容全部是零,而且这个内存也是只读的。当在写这个内存的时候,内核会在出现页错误的时候,真正把这块内存给这个进程。

2、内核空间动态申请内存

2.1、kmalloc

void * kmalloc(size, flags)

size ,分配内存大小。flags,分配的标志,一般较为常用的是 GFP_KERNEL,GFP_AROMIC。

kmalloc 申请的内存,位于 DMA映射区,最重要的是,物理上,也是连续的,它们与真是的物理地址只有一个固定的便宜。这一点对 DMA 至关重要。

kmalloc 分配内存空间的大小,一般是比较的小,大小为 128KB-16B。

当 flags 是 GFP_KERNEL 的时候,若是申请内存空间的请求不被满足,则进程就会睡眠,引起阻塞。所以,标志为 GFP_KERNEL 的话,就不能出现在中断的上下文,自旋锁,或者原子操作中。所以,在中断的上下文, ,tasklet、内核的定时器,等不能出现进程切换的位置中,就只能使用 GFP_ATOMIC 去申请内存,若是此时申请不到的话,就不等待睡眠了,直接进行返回。、

使用 kfree 去释放申请的内存空间。

2.2、vmalloc

vmalloc 使用方法类似,但是 vmalloc 一般是用于申请内存空间较大的应用场景,而且,vmalloc 申请的内存空间,只在虚拟内存空间上是连续的,但是实质上,在物理内存空间并不一定连续。所以,申请的虚拟地址空间和实际的物理地址空间更没有固定的偏移关系。

vmalloc 内部的实现,是借助了 GFP_KERNEL 标志的 kmalloc 去实现的,所以,vmalloc 也是不能用在原子的上下文。

同理,使用 vfree 去进行内存的释放。

转载于:https://www.cnblogs.com/qxj511/p/5509831.html

12、内存空间的申请相关推荐

  1. arrays中copyof_在内存只有10M的空间中申请一块5M的数组空间,会导致OOM吗?

    面试三连 面试官:使用过集合吗?能说说都使用过哪些吗? 小明:当然使用过,使用比较多的就是ArrayList与HashMap,还有LinkedList.HashTable.ConcurrentHash ...

  2. 【转】VB中NEW的用法(申请内存空间)

    Private Sub Form_Click() Dim S As New StdFont Dim A As StdFont Dim B As StdFont '给原始对象赋值 S.Size = 72 ...

  3. python 申请内存空间、用于创建多维数组_python 申请内存空间,用于创建多维数组的实例...

    以三维数组为例 先申请1个一维数组空间: mat = [None]*d1 d1是第一维的长度. 再把mat中每个元素扩展为第二维的长度: for i in range(len(mat)): mat[i ...

  4. malloc一次性最大能申请多大内存空间

    受用户态内存地址空间的限制.64 位系统下分配几个 T 不成问题. 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:zz matrix 链接:http://www.zhi ...

  5. c++申请内存空间_有没有想过:malloc分配的内存空间地址连续吗

    来自公众号:技术让梦想更伟大 提出问题 我们在写程序中经常会用到malloc函数进行动态内存分配,但是我们有没有想过,在C语言中,向操作系统请求malloc内存空间的地址是连续的吗??? 测试 我使用 ...

  6. linux 内核空间 缺页,Linux-3.14.12内存管理笔记【缺页异常处理(1)】

    发布时间:2017-06-18 15:57:06 缺页异常是很常见的现象,但是其来源有两种,一种是真实的异常,这是由于内存访问的地址未分配并未映射而产生的访问了非法地址的情况:另外一种是虚拟内存已经分 ...

  7. C语言为四维数组申请动态内存空间的方法(二)

    尝试了用堆栈的方式为四维数组申请动态内存空间,并将申请内存的操作封装成了子函数,方便在主程序中使用.希望对大家有用.代码如下: #include <stdio.h> #include &l ...

  8. C语言为四维数组申请动态内存空间的方法(一)

    尝试了用结构体为四维数组申请动态内存空间,希望对大家有用.代码如下: #include <stdio.h> #include <stdlib.h>typedef struct ...

  9. C语言动态申请内存空间

    为什么要动态内存申请 1.定义数组的时候数组的长度是预先定义好的,在整个程序中固定不变; 2.但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定 3.为了解决 ...

最新文章

  1. Crash+Kdump 分析内核崩溃内存转储文件之环境搭建
  2. PHP 数组变量之写时复制的要点 只有数组才有的概念。
  3. 如何删除 Windows.old 文件夹
  4. 介绍python修饰器的书_python修饰器
  5. 光纤收发器长距离的传输过程出现死机的解决方案
  6. shiro 角色与权限的解读
  7. LinuxGPIO操作和MTK平台GPIO
  8. 使用particles.js实现网页背景粒子特效
  9. html5权威指南 预读,《HTML5权威指南》
  10. IDEA创建javaweb项目,及常见的请求和响应头
  11. 2020牛客多校训练3 G Operating on a Graph(并查集+链式结构)
  12. 基于单片机的热敏电阻测温设计
  13. 品管(QC)七大手法
  14. 28.STM32电阻与电容触摸屏幕
  15. mysql 中文转拼音(简拼/全拼) 支持多音
  16. spark(scala) shell 里面输入多行代码
  17. PowerPoint PPT 模板插入可修改的文本框
  18. linux下,Telnet连接输入正确的用户名和密码后,却还一直提示输用户名和密码,解决方案。
  19. 生成对抗网络项目:6~9
  20. 11个免费的Web安全测试工具

热门文章

  1. 标签打印软件中信软件_软件标签翻译不是那么容易
  2. 一天一个 Linux 命令(30):hdparm 命令
  3. 浅谈可重入函数与不可重入函数
  4. SQL Server中的报表–使用SQL Server数据工具将三个报表合并为一个报表
  5. Appium 启动 App Code: ‘255‘ 错误
  6. php判断平板,能够判断手机或者平板的PHP代码
  7. Kubernetes 应用部署实战
  8. 二、微信小程序-快速回顾 ( 页面文件 )
  9. jquery-3.4.1.min.js
  10. mysql数据库中插入数据并进行自动迭代更新