文章目录
- 简介
- Unix早期和程序断点
- 引入malloc
- 安全顾虑和转向更新内存分配器
- 新用法中的程序断点
- 总结
简介
这里说的程序断点(program break)和 gdb调试时的断点(运行断点),意思不同。
当深入研究Linux和类Unix操作系统的历史时,会遇到一个在内存管理中具有历史意义的术语 - “程序断点”(Program Break)。相应的有brk/sbrk的两个函数,都是调用系统调用brk,来实现修改program break的值,在进程的动态内存分配中扮演着至关重要的角色。但是这个break 已经完全脱离“休息,断点“的概念。其实设置的是程序使用内存的一个最大值(同时还要遵守系统设置的限制)。
Unix早期和程序断点
在Unix的早期,与今天的复杂机制相比,内存管理相对简单。进程的整个地址空间被划分为段,程序断点标记了数据段和堆之间的边界。这个边界是可调整的,这要归功于“sbrk”系统调用。所以如果想追踪program break的出处,是非常困难,不知道是谁第一个写出来的。那就没有什么好办法来更好的理解,了解这个概念了。就只能推测:是从“休息”引申过来的,比如take a break,作为一个名词,当程序的最后一个段终止的时候,就意味着程序在内存中的位置到头了。而brk/sbrk两个函数里的break又变成了动词,或者说成“set break”。
The first edition of the book “The C Programming Language” by Brian Kernighan and Dennis Ritchie, often referred to as the “K&R C,” was published in 1978. This book is an essential reference for C programming, and it discussed memory management and dynamic memory allocation using “malloc” and “free,” which involve the “sbrk” system call. While the term “program break” may not have been explicitly mentioned in the book, the concepts related to it were discussed.
引入malloc
随着编程语言的发展和更高级的函数的出现,动态内存分配变得更加普遍。 "malloc"函数的引入彻底改变了内存管理。 "malloc"允许开发人员动态请求内存,并在幕后与程序断点一起工作,从堆中分配内存。
现代内存分配:随着类Unix操作系统的成熟,需要更复杂的内存管理机制。引入了“mmap”系统调用,提供了更大的内存分配灵活性和效率。这个系统调用允许程序将文件或设备输入/输出映射到内存中,从而实现更高级的内存管理策略。
安全顾虑和转向更新内存分配器
使用“sbrk”进行内存分配并非没有缺陷。它可能导致内存碎片化,更重要的是,暴露进程于基于堆的漏洞。因此,现代内存分配器,如“glibc的malloc”,在“mmap”机制的基础上实施了其逻辑。这个转变提高了内存分配的安全性和性能。
新用法中的程序断点
虽然程序断点的概念在Linux和其他类Unix系统中仍然存在,但它在更高级的内存管理技术取而代之的情况下变得较不常用。 “brk”和“sbrk”现在主要用于系统库和动态链接器的低级内存管理,而不再是应用程序主要的内存分配手段。
总结
程序断点是一个充满历史背景的术语,代表了Unix和Linux世界中内存管理的重要方面。虽然它在早期的内存分配中起到了骨干作用,但已经为更高级和更安全的内存管理方法让路。在现代Linux环境中开发软件时,您更有可能遇到通过“malloc”或其他高级函数进行的内存分配,所有这些都是由内核不断发展的内存管理系统支持的。
理解这个历史背景可以加深您对Linux演变以及如何适应今天软件开发需求的理解。
https://blog.holbertonschool.com/hack-the-virtual-memory-malloc-the-heap-the-program-break/