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,页面渲染呈现给用户 |