• 【linux】进程存储管理


    看《Linux高级程序设计》的笔记

    设有一个hello的可执行文件

    ①显示该文件的基本信息

    ls hello -l

    ②文件基本情况

    file hello

    ③列出文件的存储区域情况

    size hello

    text(代码区): 存放代码和有const修饰的变量和字符串常量。

    data(静态数据/全局初始化数据区):存放已经被初始化的全局变量和静态变量(有const修饰的除外)。

    bss(未初始化数据区):存放未初始化的全局变量和静态变量。

    dec(十进制总和)/hex(十六进制总和):总大小

    全局变量的声明和使用:

    方法① 在头文件中定义了全局变量:其他文件通过引用头文件使用该变量。

    方法② 在源文件中定义了全局变量: 其他文件通过extern关键字来访问。

    字符串常量:

    如果在同一个文件中有char * a = "hello", char * b = "hello", char * c = "hello" 则这三个指针会指向同一个存储区,即只有一个”hello"字符串常量。

    如果在文件1中有char * a = "hello", 文件2中有char * b = "hello", 这两个指针指向不同的存储空间,即每个文件都有一个“hello"字符串常量。

    栈和堆的区别:

    ①管理方式不同:栈由操作系统自动管理(也可以用alloca来在栈上显示的分配空间);堆由程序员手工控制

    ②空间大小不同:栈从高地址向下扩展,是连续的内存区域,最大容量系统预先规定;堆向高地址扩展,是不连续的内存区域,系统用链表来存储空闲内存地址的,链表的遍历方向是由低地址向高地址。

    ③产生的碎片不同:频繁的malloc/free(new/delete)会造成内存空间的不连续,形成大量的碎片,使程序效率降低。栈一定是连续的内存空间。

    ④分配效率不同:栈有操作系统底层支持,快;堆靠C函数库提供,机制复杂,慢。

    在释放内存后,把指针设为NULL的好处:

    ①后面对该指针的访问将立即失败

    ②后面的代码如果出现对指针的二次释放不会造成程序的崩溃,只是free函数失败。

    内存动态申请函数

    ①malloc/free (new/delete)

    ②realloc 更改已经配置的内存空间 返回新分配的空间地址。

                           如果当前内存段后面的空间够用,则直接扩展这段内存,返回原地址

                           如果当前内存段后面空间不够用,则找到第一个能够满足要求的内存块,并将目前数据复制到新的位置,并将原来地址释放(自己不用释放了),返回新地址

                           如果找不到满足的内存,返回NULL原地址还可以用

                故不可以这样写 ptr = realloc(ptr, new_amount),因为如果分配失败会导致原来的空间不可获得

    ③calloc函数  是malloc的简单包装,把malloc的数据初始化为0

    ④alloca  在栈上分配空间,不用自己释放,系统自动释放

    内存数据管理函数

    1.memcpy() 复制内存  bcopy()类似

    2.memmove()  复制内存的时候考虑了源地址和目的地址重叠的情况

    3.memset() 初始化指定内存单元 bzero()实现类似功能,初始化s起始的n字节为''

    4.memchr() 在一段内存空间中查找某个字符第一次出现的位置

    5.memcmp() 比较内存单元s1和s2起始位置的前n个字节是否相等

  • 相关阅读:
    [leetcode]Length of Last Word
    本周第一天
    本月第一周的第一天
    获取本周的第一天
    PHP实现今天是星期几
    mysql获取相隔时间段的数据
    在mysql中给查询的结果添加序号列
    《岛上书店》
    正则表达式:在大写字母前面加_
    Git忽略文件的三个办法
  • 原文地址:https://www.cnblogs.com/dplearning/p/4671588.html
Copyright © 2020-2023  润新知