> IT面试 >

网络、数据库相关的基础知识面试题

select和epoll相比的优缺点?
  socket编程中I/O多路复用有select, poll, epoll。
  select的缺点有 1)连接数受到限制,默认1024;2)随着连接数的增加,性能会下降,因为每都需要线性扫描文件描述符集合fd_set;
  3)每次需要将文件描述符集合在用户空间和内核之间拷贝,开销较大;4)select只支持水平触发。select的优点是简单。
  poll的实现和select相似,只是文件描述符集合采用pollfd而不是fd_set。
  epoll的优点:1)几乎没有连接数的限制,只受机器硬件资源限制;2)连接数增加不会导致性能下降,因为每次只有就绪的IO事件才会
  主动调用call_back函数,将事件从红黑树移动到就绪队列中,然后系统调用返回通知应用程序,返回的只有IO已就绪事件;3)使用mmap
  技术加速内核与用户空间的消息传递;4)epoll支持水平触发和边缘触发。
  epoll是用红黑树(存放应用程序注册的事件)+ 双向链表(存放已就绪事件)实现的。适用于连接数较多,但是活动连接数较少的情况。
  水平触发和边缘触发有什么区别?
  水平触发是指当IO事件就绪时,epoll_wait调用返回会通知应用程序,如果应用程序没有处理或者fd上还有未处理的数据,那么epoll_wait
  调用返回,应用程序会一直得到通知,这种模式可以保证数据的完整传输。边缘触发则只会在第一次对应用程序进行通知,属于高速模式,
  由于避免了同一个事件的多次触发,减少了内核资源的消耗,更高效(只支持非阻塞IO)。
  I/O多路复用一般的应用场景:
  1,一个客户端同时处理多个文件描述符的输入输出操作时
  2,一个程序同时处理多个套接字
  3,TCP服务器程序同时处理监听套接字和客户连接套接字
  4,服务器程序同时处理TCP和UDP协议
  5,服务器同时使用多种服务而每个服务使用的协议都有可能不同(如inetd)。
  多态在编译器里怎么实现的?
  C++编译器发现类中有虚函数,就为该类型建立一个虚函数表(存储虚成员函数指针的数据结构),类的每个实例中包含一个vptr指针。
  对象创建时,编译器根据对象的类型初始化vptr指针,从而让vptr正确的指向所属类的虚函数表。程序运行到动态绑定时,通过基类指针
  (或引用)指向的对象类型包含的vptr指针,找到相应的虚函数表vtable,然后调用相应方法,实现多态。
   
  代码段、数据段、堆栈段,进程的内存空间结构
  代码段就是存放程序代码文本,是只读的;
  数据段包含非零数据区,BSS,和堆(heap)。非零数据区存放初始化后的全局变量和静态变量,BSS存放未初始化的全局数据和静态数据,
  还有就是堆,这个区域供动态分配内存使用
  堆栈段(注意,堆栈段是stack,堆是heap),存放局部变量和函数参数。
   
  异步为何有高性能?如果是因为起了多个线程,那同步我也可以起多个线程啊?
  同步IO使用多进程/多线程模型虽然能够解决程序并发问题,但是系统上线程数不是无限制增加的,而且由于系统切换线程的开销也很大,
  所以,一旦线程数量过多,CPU的时间都花在线程切换上了,真正运行代码的时间就少了,结果导致性能严重下降。
   
  深刻理解TCP/IP,深刻理解异步高并发网络应用开发;(优酷土豆Linux C++服务端开发工程师)
   
   
  Mysql三种引擎的区别?OLAP,OLTP锁机制,存储限制,是否支持事务,全文索引
  InnoDB支持事务,锁的粒度在row,存储容量最大64TB,支持哈希索引,不支持全文索引,支持外键;MyISAM不支持事务,锁的粒度在table,
  存储容量无限制,不支持哈希索引,支持全文索引,不支持外键。
   
  多线程模型都有哪些?
  按需创建,线程池,Leader-Follower模式
  说说IO的同步非同步,阻塞非阻塞
  同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待(阻塞式)或者轮询的去查看IO操作是否就绪(IO
  复用),IO就绪后,内核通知应用程序,然后由应用程序完成实际的IO操作。而异步指的是用户进程触发IO操作后开始做自己的事情,
  当IO事件就绪并且由内核完成IO操作(从内核空间拷贝到用户空间,以recvfrom为例)后,内核通知应用程序IO完成。
  阻塞和非阻塞是针对进程在访问数据的时候采取的不同方式,阻塞方式下读写一个文件描述符,如果IO事件未就绪,无数据可读或者无法写
  数据就会一直阻塞等待,直到IO操作完成。非阻塞就是读写fd立即返回,返回成功就是操作完成,失败就会设置相应的errno状态码。
  理论上来说,阻塞IO,IO复用(包括epoll)和信号驱动IO都属于同步IO模型。
   
  Redis数据库
  redis是基于内存的高性能key-value数据库,整个数据库加载到内存中,定期以异步的方式flush到硬盘,具有快速和持久化的特点。因为是
  纯内存操作,性能非常好,可以到达每秒10万次的读写操作,是已知性能最好的key-value数据库。redis最大的特点是支持多种数据结构,
  单个value的最大限制是1GB。redis可以对存入的key-value设置过期时间。redis最大的缺点是数据库容量受物理内存的限制,适合小数据量
  的高性能操作和运算。redis是单进程和单线程,将并发访问变为串行访问。在分布式方面,redis支持主从模式。原则是master会将数据
  同步到slave,而slave不会将数据同步到master,这是典型的分布式读写分离模型。我们可以利用master来增删数据,slave提供检索,这样
  可以有效减少单个机器的并发访问数量。通过增加slave DB的数量,读的性能可以线性增加。读写分离架构的缺陷在于,不管是master还是
  slave,每个节点都必须保存完整的数据,如果在数据量很大的情况下,集群的扩展能力受限于单个节点的存储能力,而且对于写频繁的
  类型系统,读写分离架构并不合适。
   
   
  在浏览器中输入网址后都发生了什么(一次HTTP事务的流程)?
  1,域名解析,2,TCP三次握手连接,3,填充http请求报文(包含请求方法等内容),4,服务端填充响应报文(包括响应状态码,
  报文主体等内容),5,客户端解析html并请求其中的资源,6,页面渲染呈现给用户

(责任编辑:IT)