计算机专业常考面试题

2023-12-28 15:18:06

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数目的增加而线性下降

文章来源:https://blog.csdn.net/weixin_46969363/article/details/135254004
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。