首页 > 编程语言 >C++开发面试题合集

C++开发面试题合集

时间:2023-02-03 15:33:08浏览次数:38  
标签:面试题 epoll int C++ 缓冲区 描述符 内核 进程 合集

1.epoll的工作原理(【360实习】C++开发)

epoll是一种I/O事件通知机制,是linux 内核实现IO多路复用的一个实现。在一个操作里同时监听多个输入输出源,在其中一个或多个输入输出源可用的时候返回,然后对其的进行读写操作。
比如调用read一个fd没有就绪就需要阻塞,直到读到数据。即使设置非阻塞,立即返回0,也需要下次再调用read,轮询直到读到数据。而epoll由内核提供了一种机制,只要epoll_wait返回这个fd就绪,那么read这个fd就一定能读到数据。

输入输出的对象可以是文件(file), 网络(socket),进程之间的管道(pipe)。在linux系统中,都用文件描述符(fd)来表示。

  • 可读事件,当文件描述符关联的内核读缓冲区可读,则触发可读事件
  • 可写事件,当文件描述符关联的内核写缓冲区可写,则触发可写事件。

通知机制,就是当事件发生的时候,则主动通知。通知机制的反面,就是轮询机制。

epoll的通俗解释是一种当文件描述符的内核缓冲区非空的时候,发出可读信号进行通知,当写缓冲区不满的时候,发出可写信号通知的机制。

epoll的核心是3个API,核心数据结构是:1个红黑树和1个链表

int epoll_create(int size)
内核会产生一个epoll 实例数据结构并返回一个文件描述符,这个特殊的描述符就是epoll实例的句柄,后面的两个接口都以它为中心

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
将被监听的描述符添加到红黑树或从红黑树中删除或者对监听事件进行修改

typedef union epoll_data {
    void *ptr; /* 指向用户自定义数据 */
    int fd; /* 注册的文件描述符 */
    uint32_t u32; /* 32-bit integer */
    uint64_t u64; /* 64-bit integer */
} epoll_data_t;

struct epoll_event {
    uint32_t events; /* 描述epoll事件 */
    epoll_data_t data; /* 见上面的结构体 */
};

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
阻塞等待注册的事件发生,返回事件的数目,并将触发的事件写入events数组中。

2.进程间的通信方式,最快的通信方式是什么(【360实习】C++开发)

每个进程都各自拥有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。

1.管道/无名管道:
管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有血缘关系的进程间使用。进程的血缘关系通常指父子进程关系。
2.命名管道:
也是半双工的通信方式,但是它允许无亲缘关系进程间通信。
3.消息队列:
这三个场景也是消息队列的经典场景,大家基本上要烂熟于心那种,就是一说到消息队列你脑子就要想到异步、削峰、解耦,条件反射那种。

小伙子我打断你一下,你说了异步,那我用线程,线程池去做不是一样的么?
如果各个异步任务,比如扣积分,发短信,扣库存写在一起,不单单是耦合这一个问题,出问题排查也麻烦,流程里面随便一个地方出问题搞不好会影响到其他的点。
但是你用了消息队列,耦合这个问题就迎刃而解了呀。

削峰:就拿我上一期写的秒杀来说,你平时流量很低,但是你要做秒杀活动00 :00的时候流量疯狂怼进来,你的服务器,Redis,MySQL各自的承受能力都不一样,你直接全部流量照单全收肯定有问题啊,直接就打挂了。

把请求放到队列里面,然后至于每秒消费多少请求,就看自己的服务器处理能力,你能处理5000QPS你就消费这么多,可能会比正常的慢一点,但是不至于打挂服务器,等流量高峰下去了,你的服务也就没压力了。
你看阿里双十一12:00的时候这么多流量瞬间涌进去,有时候是不是会慢一点,但是人家没挂啊,或者降级给你个友好的提示页面,等高峰过去了又是一条好汉了。

常见的消息队列包括:kafka(java), rocketmq(java), zmq(cpp)

4.共享内存(最快的 Inter Process Commuication 方式)
两个不同进程 A、B 共享内存的意思是:同一块物理内存被映射到进程 A、B 各自的进程地址空间。比如使用mmap映射出shared的内存空间,进程 A 可以即时看到进程 B 对共享内存中数据的更新,因为进程是直接对内存进行存取,所以最快。

5.套接字socket
此⽅法主要⽤于在客户端和服务器进程之间通过网络进⾏通信。

标签:面试题,epoll,int,C++,缓冲区,描述符,内核,进程,合集
From: https://www.cnblogs.com/lygin/p/17089421.html

相关文章

  • 常见Linux运维面试题,你答对了吗?
    学习完Linux技术之后,接下来我们就需要面临找工作的事情。谈到找工作,很多小伙伴肯定好奇,面试官会问些什么问题?本为为大家汇总了一些常见Linux运维面试题,希望能够给大家......
  • C++ 哈希表查询_进入哈希函数结界的世界
    1.前言哈希表或称为散列表,是一种常见的、使用频率非常高的数据存储方案。哈希表属于抽象数据结构,需要开发者按哈希表数据结构的存储要求进行API定制,对于大部分高级语言......
  • C++第四章类与对象
    一、面向对象的基本特点1.  抽象对同一类对象的共同属性和行为进行概括,形成类。先注意问题的本质及描述,其次是实现过程或细节。数据抽象:描述某类对象的属性或状态(对象相互......
  • 【八大数据排序法】希尔排序法的图形理解和案例实现 | C++
    第十七章希尔排序法:::hljs-center目录第十七章希尔排序法●前言●认识排序●一、希尔排序法是什么?1.简要介绍2.图形理解3.算法分析●二、案例实现1.......
  • c++中调用QML中的函数和设置QML中的属性的问题
    1.这里主要是介绍,如何在c++中调用QML中的函数和设置QML中的属性的问题  2.具体代码    //UICtest.qmlimportQt4.7Rectangle{   id:mainWid......
  • C/C++编译链接
    一、编译链接过程名词解释编译:由编译器对各个源文件进行词法分析、语法分析、语义分析等操作,最终生成多个目标文件。由于这些文件可能存在互相调用对方的函数或变量,还......
  • 现代C++实战30讲
    本文记录学习吴咏炜老师的《现代C++实战》课程的心得体会,记录自认为值得记录的知识点。重新认识的点如果临时对象被绑定到一个引用上,则它的生命周期会延长到跟这个引用......
  • 现代C++实战30讲(2)
    本文记录学习吴咏炜老师的《现代C++实战》课程的心得体会,记录自认为值得记录的知识点。重新认识的点编译期间的多态所有容器类都有begin和end函数成员,这为通用遍......
  • spring面试题
    1.IOC控制反转在一开始设计组件依赖的时候就考虑到未来出现改动的可能性,所有需要import组件的地方都被替换成了接口,任何业务组件都不再直接控制import哪个具体组件,而是把......
  • c++学习2 基础关键词
    三volatile强制访问内存在一个变量的频繁使用中,系统为了提高效率,会自动将内存里面的数据放入CPU里的寄存器里。但在某些特殊场景下,放入寄存器这个操作反倒会导致CPU无法......