C/C++程序的内存分区
其实C和C++的内存分区还是有一定区别的,但此处不作区分:
1)、栈区(stack)一由编译器自动分配释放,存放函数的参数值,局部变量的值等。其
操作方式类似于数据结构中的栈。
2)、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回
收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3)、全局区(静态区)(static)一,全局变量和静态变量的存储是放在一块的,初始化的
全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另
一块区域。程序结束后由系统释放。
4)、文字常量区一常量字符串就是放在这里的。程序结束后由系统释放。
5)、程序代码区一存放函数体的二进制代码。
栈区与堆区的区别:
1)堆和栈中的存储内容:栈存局部变量、函数参数等。堆存储使用new、malloc申请的变量等;
2)申请方式:找内存由系统分配,堆内存由自己申请;
3)申请后系统的响应:栈——只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢
出。
堆一一首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第
一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序;
4)申请大小的限制:Windows下栈的大小一般是2M,堆的容量较大;
5)申请效率的比较:栈由系统自动分配,速度较快。堆使用new、mal1oc等分配,较慢;
总结:栈区优势在处理效率,堆区优势在于灵活:
内存模型:自由区、静态区、动态区:
根据c/e++对象生命周期不同,c/c++的内存模型有三种不同的内存区域,即:自由存储区,动态区、静态区。
自由存储区:局部非静态变量的存储区域,即平常所说的栈;
动态区:用new,malloc分配的内存,即平常所说的堆:
静态区:全局变量,静态变量,字符串常文本接口:专业版文本未能识别
注:代码虽然占内存,但不属于c/c++内。
I0模型——I0多路复用机制
10模型有4中:同步阻塞I0、同步非阻塞10、异步阻塞I0、异步非阻塞IO:10多路复用属于I0模型中的异步阻塞I0模
型,在服务器高性能IO构建中常常用到。
同步异步是表示服务端的,阻塞非阻塞是表示用户端,所以可解释为什么I0多路复用(异步阻塞)常用于服务器端
的原因:
文件描述符(FD,又叫文件句柄):描述符就是一个数字,它指向内核中的一个结构体(文件路径,数据区等属
性)。具体来源:Linux内核将所有外部设备都看作一个文件来操作,对文件的操作都会调用内核提供的系统命令,返回一个fd(文件描述符)。
下面开始介绍I0多路复用:
(1)I/0多路复用技术通过把多个I/0的阻塞复用到同一个select、pol1或epol1的阻塞上,从而使得系统在单线程
的情况下可以同时处理多个客户端请求。与传统的多线程/多进程模型比,I/0多路复用的最大优势是系统开销小,系统不需要创建新的额外进程或者线程。
(2)select,po11,epo11本质上都是同步I/0,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这
个读写过程是阻塞的,而异步I/0则无需自己负责进行读写,异步I/0的实现会负责把数据从内核拷贝到用户空间。(3)I/0多路复用的主要应用场景如下:
服务器需要同时处理多个处于监听状态或者多个连接状态的套接字:
服务器需要同时处理多种网络协议的套接字;
(4)目前支持I/0多路复用的系统调用有select,pol1,epol1,epo11与select的原理比较类似,但epol1作了很
多重大改进,现总结如下:
①支持一个进程打开的文件句柄FD个数不受限制(为什么select的句柄数量受限制:select使用位域的方式来传递
关心的文件描述符,因为位域就有最大长度,在Linux下是1024,所以有数量限制);
②I/0效率不会随着FD数目的增加而线性下降