内存管理

Windows驱动开发入门系列教程

自作多情 提交于 2019-12-07 21:37:12
从事驱动开发也有一段时间了,从最初的无头苍蝇到懵懵懂懂,到入门,直至今天,感觉一路走来,走了不少的弯路,只因为没有人引导。前几天,一个朋友问到我怎么学习 Windows 驱动开发,我就想到把我学习 Windows 驱动开发的过程分享一下,也算我的一点总结。 我总结了一下,大概分为这么几部分内容: 第一讲:开发环境与工具篇 主要讲述驱动开发的工具、调试的工具,开发环境的配置等知识,通过本篇的学习,您能配置好 Windows 驱动开发、编译、调试的基本环境,为下一步的开发打下坚实的基础。 第二讲:我的第一个驱动 为了方便驱动开发的学习,我们通过一个简单的驱动程序来直观的了解一下驱动程序的开发。 第三讲: Windows 驱动的结构 本篇主要讲解 Windows 驱动程序的结构,分别讲解 NT 驱动和 WDM 驱动程序的结构。然后呢讲解一下驱动程序中的一些重要的数据结构 IRP 、 DriverObject 等。 第四讲:基本编程技术 在了解了 Windows 驱动程序的基本结构之后,我们就需要学习一下基本的编程技巧 -- 内核函数的使用,主要包括字符串的操作、文件的操作、以及常用内核函数的命名特点 第五讲: Windows 内存管理 在内核程序开发过程中,内存管理是一个比较重要的项目。本篇主要讲解 Windows 的内存管理机制,并且使得大家能够掌握如何在驱动中有效的使用内存。 第六讲

malloc的原理

霸气de小男生 提交于 2019-12-07 07:44:20
任何一个用过或学过C的人对malloc都不会陌生。大家都知道malloc可以分配一 段连续的内存空间,并且在不再使用时可以通过free释放掉。但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至把malloc当做操作系统 所提供的系统调用或C的关键字。实际上,malloc只是C的标准库中提供的一个普通函数,而且实现malloc的 基本 思想并不复杂,任何一个对C和操作系统有些许了解的程序员都可以很容易理解。 这篇文章通过实现一个简单的malloc来描述malloc背后的机制。当然与现有C的标准库实现(例如glibc)相比,我们实现的malloc 并不是特别高效,但是这个实现比目前真实的malloc实现要简单很多,因此易于理解。重要的是,这个实现和真实实现在基本原理上是一致的。 这篇文章将首先介绍一些所需的基本知识,如操作系统对进程的内存管理以及相关的系统调用,然后逐步实现一个简单的malloc。为了简单起见,这篇文章将只考虑x86_64体系结构,操作系统为Linux。 1 什么是malloc 2 预备知识 2.2.1 内存排布 2.2.2 Heap内存模型 2.2.3 brk与sbrk 2.2.4 资源限制与rlimit 2.1.1 虚拟内存地址与物理内存地址 2.1.2 页与地址构成 2.1.3 内存页与磁盘页 2.1 Linux内存管理 2.2 Linux进程级内存管理

java的内存管理机制

不打扰是莪最后的温柔 提交于 2019-12-06 21:23:29
C++内存管理详解: 内存分配方式简介   在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。   栈,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。   堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。   自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。   全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。   常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。 堆和栈究竟有什么区别? 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事

[转载]Linux缓存机制

☆樱花仙子☆ 提交于 2019-12-06 16:53:44
[转载]Linux缓存机制 来源: https://blog.csdn.net/weixin_38278334/article/details/96478405 linux下的缓存机制及清理buffer/cache/swap的方法梳理 缓存机制介绍 写的很好: https://www.cnblogs.com/kevingrace/p/5991604.html 在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘。 缓存机制优点:减少系统调用次数,降低CPU上下文切换和磁盘访问频率。 cache是高速缓存,用于CPU和内存之间的缓冲; buffer是I/O缓存,用于内存和硬盘的缓冲; CPU上下文切换:CPU给每个进程一定的服务时间,当时间片用完后,内核从正在运行的进程中收回处理器,同时把进程当前运行状态保存下来,然后加载下一个任务,这个过程叫做上下文切换。实质上就是被终止运行进程与待运行进程的进程切换。 Swap用途:Swap意思是交换分区,对应通常我们说的虚拟内存,是从硬盘中划分出的一个分区。当物理内存不够用的时候,内核就会释放缓存区(buffers/cache)里一些长时间不用的程序,然后将这些程序临时放到Swap中

《Glibc内存管理》笔记DAY5

谁都会走 提交于 2019-12-06 15:07:34
分箱式内存管理 Unsorted bin   Unsorted bin 可以看作是 small bins 和 large bins 的 cache,只有一个 unsorted bin,以双向链表管理空闲 chunk,空闲 chunk 不排序,所有的 chunk 在回收时都要先放到 unsorted bin 中,分配时,如果在 unsorted bin 中没有合适的 chunk,就会把 unsorted bin 中的所有 chunk 分别加入到所属的 bin 中,然后再在 bin 中分配合适的 chunk。Bins 数组中的元素 bin[1]用于存储 unsorted bin 的 chunk 链表头。 /* The otherwise unindexable 1-bin is used to hold unsorted chunks. */ #define unsorted_chunks(M) (bin_at(M, 1)) /* Conveniently, the unsorted bin can be used as dummy top on first call */ #define initial_top(M) (unsorted_chunks(M)) unsorted_chunks(M):把 bin[1]设置为 unsorted bin 的 chunk 链表头。

VxWorks 内存管理 个人总结DDR SDRAM和Flash

跟風遠走 提交于 2019-12-06 12:37:53
在VxWorks内核编程手册中: 在不支持进程的情况下,vxworks的内存映射是这样的:(SDRAM) 在支持进程的情况下,内存映射另外一个样子: 对应本ppc2020板的内存分配如下:以此为例,可参考来做其他项目。参考模型为支持进程方式。 PowerPC处理器是主控模块的核心部件,以处理器最小系统为中心,扩展外围接口,完成整个系统所需要的功能。Flash(ROM)接口、SDRAM地址空间分配如下: 表2.2-1存储器地址空间映射表 空间 地址 大小 占用片选信号 SDRAM 0x0000_0000--0x3FFF_FFFF 1GB SDCS0# FLASH 0xF000_0000--0xFFFF_FFFF 256MB RCS0# FLASH内存空间说明:0xF000_0000--0xFFFF_FFFF 0xF000_0000--0xF1FF_FFFF Tffs文件系统预留(32M) 0xF200_0000--0xFFEF_FFFF 用户保留存储空间(223M) 0xFFF0_0000-0xFFFF_FFFF Bootrom存储位置(1M) SDRAM存储空间说明:0x0000_0000--0x3FFF_FFFF 0x0000 0000 – 0x0010 0000 VxWorks低端内存区(系统占用) 0x0010 0000 – FREE_RAM_ADRS (end)

从JVM内存模型谈线程安全

牧云@^-^@ 提交于 2019-12-06 12:14:27
作为一个三个多月没有去工作的独立开发者而言,今天去小米面试了一把.怎么说呢,无论你水平如何,请确保在面试之前要做准备,就像其中一位面试官说的一样,我知道你水平不错,但是无论如何也是要准备下的,不然你怎么会连这个方法也忘记了? 此刻,我突然觉得我是一个假程序员.为什么这么说呢,作为一个从12年就开始写代码的程序员来说,忘记某个方法太可耻了.等赶明写一篇文章就叫做"我是个假程序员"来谈谈这些有趣的事儿. 话不多说,今天要谈的主题是相对较深,较广,但我努力的让他看起来清晰明了. 存储器层次结构 对于开发者来说,存储器的层次结构应该是非常熟悉的,大体如下: 这里写图片描述 其中寄存器,L1,L2,L3都被封装在CPU芯片中,作为应用开发者而言我们很少去注意和使用它.之所以引入L1,L2,L3高速寄存器,其根本是为了解决访问运算器和内存速度不匹配.但缓存的引入也带来两个问题: 缓存命中率:缓存的数据都是主存中数据的备份,如果指令所需要的数据恰好在缓存中,我们就说缓存命中,反之,需要从主存中获取.一个好的缓存策略应该尽可能的提高命中率,如何提高却是一件非常困难的事情. 缓存一致性问题:我们知道缓存是主存数据的备份,但每个核心都有自己的缓存,当缓存中的数据和内存中的数据不一致时,应该以谁的数据为准呢,这就是所谓缓存一致性问题. 上面只是展示存储器的层次结构

Python深入之python内存管理机制(重点)

旧街凉风 提交于 2019-12-06 10:59:33
前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 作者:醍醐三叶 关于python的存储问题, (1)由于python中万物皆对象,所以python的存储问题是对象的存储问题,并且对于每个对象,python会分配一块内存空间去存储它 (2)对于整数和短小的字符等,python会执行缓存机制,即将这些对象进行缓存,不会为相同的对象分配多个内存空间,如果对我讲的还不懂,说明你基础学的还不是和很好,可以去小编的Python交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面很多最新Python精讲的教程项目。 (3)容器对象,如列表、元组、字典等,存储的其他对象,仅仅是其他对象的引用,即地址,并不是这些对象本身 关于引用计数器 (1)一个对象会记录着引用自己的对象的个数,每增加一个引用,个数加一,每减少一个引用,个数减一 (2)查看引用对象个数的方法:导入sys模块,使用模块中的getrefcount(对象)方法,由于这里也是一个引用,故输出的结果多1 (3)增加引用个数的情况:1.对象被创建p = Person(),增加1;2.对象被引用p1 = p,增加1;3.对象被当作参数传入函数func(object),增加2,原因是函数中有两个属性在引用该对象;4.对象存储到容器对象中l = [p]

2019-2020-1 20191232 《信息安全专业导论》第九周学习总结

ⅰ亾dé卋堺 提交于 2019-12-06 06:57:29
教材学习内容总结 1.现代软件:应用软件(帮助我们解决现实世界问题)、系统软件(管理计算机系统并与硬件进行交互) 2.内存管理: 三种技术的基本原理 单块内存管理 把应用程序载入一段连续的内存区域的内存管理方法 分区内存管理 固定分区法:把内存分为特定数目的分区以载入程序的内存管理方法 动态分区法:根据容纳程序的需要对内存分区的内存管理方法 页式内存管理 把进程划分为大小固定的页,载入内存时存储在帧中的内存管理方法 3. 进程状态:创建状态、准备就绪状态、运行状态、等待状态、终止状态。 4.CPU调度:抢先调度(当操作系统决定照顾另一个进程而抢占当前执行进程的CPU资源时发生的CPU调度)、非抢先调度(当前执行的进程自愿放弃了CPU时发生的CPU调度)。 5.非抢先调度(先到先服务、最短作业优先)、抢先调度(轮询法)。 从准备就绪状态首选哪个进程进入运行状态的方法 先到先服务 进程按照它们到达运行状态的顺序转移到CPU 最短作业优先 查看所有处于准备就绪状态的进程,并分派一个具有最短服务时间的 轮询法 把处理时间平均分配给所有准备就绪的进程 6.文件: 文本文件(包含字符的文件)、二进制文件(包含特定格式的数据的文件,要求给位串一个特定的解释)。 文件扩展名 : 扩展名 文件类型 txt 文本数据文件 mp3、au、wav 音频文件 gif、tiff、jpg 图像文件 doc

2019-2020-1 20191320 《信息安全专业导论》第九周学习总结

…衆ロ難τιáo~ 提交于 2019-12-06 06:41:55
2019-2020-1 20191320 《信息安全专业导论》第九周学习总结 教材学习内容总结 第十章 这周学习了操作系统、文件系统和目录两章。在第十章中,我们先学了操作系统的角色。操作系统为应用程序分配硬件资源,使得这些应用程序得以正常运行。形象的比喻就是“管家婆”。我们又进一步学习了内存,进程,CPU管理的相关知识,大致理解了他们的相关概念。 我们还学习了一些以往管理和使用计算机的方法。以前有专门的人来充当着操作系统的角色,进行批处理,同时以前还可以通过哑终端来控制主机,即使只有一台主机,有多个哑终端,就会给人一种多人在使用计算机,但给人感受只有一个人在使用计算机的假象。 接下来我们又学了实时系统和响应时间的概念,了解到评价操作系统的好坏,响应时间越短越好。我们还学习了几种内存管理的实例,地址分为逻辑地址和物理地址。地址联编即是将逻辑地址和物理地址联系起来的方法。单块内存管理和分区内存管理各有各自的优点。存储一个程序时一般使用单块内存管理。分区内存管理又分为固定分区和动态分区法。最先匹配,最佳匹配和最差匹配各有各自使用的情况。我们还学了页式内存管理法,充分使用了内存,理解了其工作的原理。但也了解了其存在一定的不足,即可能导致系统颠簸,即频繁的页面交换造成的低效处理。 进程管理中介绍了进程的不同状态以及改变状态的条件,我尝试了使用python模拟这些状态,可以在代码中完成模拟