b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

tls现代的应用程序都运行在一个内存空间里,在32位的系统里(3)

电脑杂谈  发布时间:2018-02-13 20:45:13  来源:网络整理

1.3.1 什么是堆

光有栈对于面向过程的程序设计还远远不够,因为栈上的数据在函数返回的时候就会被释放掉,所以无法将数据传递至函数外部。而全局变量没有办法动态地产生,只能在编译的时候定义,有很多情况下缺乏表现力。在这种情况下,堆是唯一的选择。

堆是一个块巨大的内存空间,常常占据整个虚拟空间的绝大部分。在这片空间里,程序可以请求一块连续内存,并自由使用,这块内存在程序主动放弃之前都会一直保持有效。

例如:

那么malloc到底是怎么实现的呢?有一种做法是,把进程的内存管理交给操作系 统内核去做,既然内核管理着进程的地址空间,那么如果它提供了一个系统调用,那么让程序使用这个系统调用申请内存,不就可以了吗?当然这是一种理论上的做 法,但实际上这样不可行,如果每次程序的申请和释放都要进程系统调用,那么性能的开销很大。比较好的做法是程序向操作系统申请一块适当大小的堆空间,然后 由程序自己管理这块空间,而具体来讲,管理着堆空间分配的往往是程序的运行库。

运行库相当于向操作系统“批发”了一块较大的堆空间,然后“零售”给程序用。 当全部“售完”(由malloc分配)或程序由大量的内存需求时,再根据实际需求向操作系统“进货”(由brk和mmap分配)。当然运行库在向程序零售 堆空间时,必须管理它批发来的堆空间,不能把同一块地址出售两次,导致地址的冲突。于是运行库需要一个算法来管理堆空间,这个算法就是堆的分配算法。不过 在了解具体的分配算法之前,我们来看看运行库是怎么向操作系统批发内存的。

malloc分配的时候,首先在堆中查找是否有空闲块用来分配,如果有空闲块,则直接分配;如果没有,当要分配的内存小于128KB时,malloc函数中调用brk申请虚拟内存用来进行分配,否则,调用mmap向操作系统批发虚拟内存,然后分配给用户。

可以看看:

1.3.2 Linux进程堆管理

Linux下的进程堆管理有两种分配方式,即两个系统调用:一个是brk()系统调用,另外一个是mmap()。(这两个函数用于向操作系统批发内存作为堆空间)

int brk(void *end_data_segment);

brk()的作用实际上就是设置进程数据段的结束地址,即它可以扩大或者缩小数据段。

mmap()的作用就是向操作系统申请一段虚拟地址空间,当然这块虚拟地址空间可以映射到某个文件,当它不将地址空间映射到某个文件时,我们又称这块空间为匿名空间,匿名空间就可以拿来作为堆空间。它的声明如下:

void *mmap(void *start,size_t length,int prot,int flags,int fd, off_t offset);

mmap的前两个参数分配用于指定需要申请的空间的起始地址和长度,如果起始地址设置为0,那么Linux系统会自动挑选合适的起始地址。

tls_tls与ssl的区别_不安全的tls安全设置

Q&A

Q:可以重复释放两次堆里的同一片内存吗?

A:不能。几乎所有的堆实现里,都会在重复释放同一片堆里的内存时产生错误。

Q:调用malloc会不会最后调用到系统调用或者API?

A:这个取决于当前进程向操作系统批发的那些空间还够不够用,如果够用了,那么它可以直接在仓库里取出来卖给用户;如果不够用了,它就只能通过系统调用或者API向操作系统再进一批货了。

Q:malloc申请的内存,进程结束以后还会不会存在?

A:不会存在。因为当进程结束后,所有与进程相关的资源,包括进程的地址空间、内存空间、打开的文件、网络链接等都被操作系统关闭或者收回,所以无论malloc申请了多少内存,进程结束以后都不存在了。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-76057-3.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...