一面 (50mins 现场面,两个面试官混合双打,过)
因为我写了个静态http服务器,为了替代博客上的hexo的部分功能。
nginx多了解?配置情况?
Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。
什么是反向代理?
在计算机网络中,反向代理是代理服务器的一种。服务器根据客户端的请求,从其关联的一组或多组后端服务器(如Web服务器)上获取资源,然后再将这些资源返回给客户端,客户端只会得知反向代理的IP地址,而不知道在代理服务器后面的服务器簇的存在
根据正向代理,退出反向代理
我那http服务器一个连接到结束的整个流程
为什么需要timewait?
四次挥手最后一次等待时间,确认最后一次报文能够到达。断开连接
握手三次挥手四次?要是接收到FIN的时候没有消息要发送了呢?
tcp怎么实现可靠传输?
TCP 可靠传输
1、确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传。
2、数据校验
3、数据合理分片和排序:
(我不小心讲到了拥塞控制去了)拥塞控制和可靠传输和有关吗?
从输入网址到浏览器显示网页的过程?尽量详细
DNS域名解析,TCP连接,HTTP协议
讲一下dns协议
域名解析协议,将域名解析为ip地址
讲一下ip包在路由器的传播
arp协议怎么运作的?
一个arp包会穿过路由器传播吗?
http1.0和1.1的区别
1、HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理
HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。
浏览器怎么解析http的?
网络攻击有哪些?除了sql注入有了解过其他方面吗?
有在linux下抓过包吗?
如果遭遇Syn Flood攻击,怎么追查?wireshark用什么命令过滤?
epoll和select区别
(1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,但是select和poll在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。这就是回调机制带来的性能提升。
(2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,而epoll只要一次拷贝,而且把current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll内部定义的等待队列)。这也能节省不少的开销。
简单磊说,select,poll 需要不断轮询fd集合, epoll只需要判断就绪链表是否为空
select,poll每次调用都要需要把fd集合从用户态往内核态拷贝,epoll不需要拷贝。
c++多态?尽量详细
子类重写父类虚函数, 父类指针指向子类函数,调用子类虚函数,多态。
类的内存分配?有无虚函数和多继承情况下?
tcp/ip模型?
每层各有什么协议?
应用层有哪些协议用到udp?
数据库范式了解吗?建表的时候有用到?
数据库性能调优?
数据库引擎有哪些?区别?
数据库回滚是什么原理?
InnoDB普通查询会不会加锁?
乐观锁悲观锁讲一下?
为什么需要锁(并发控制)?
在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就是著名的并发性问题。
典型的冲突有:
- 丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失。例如:用户A把值从6改为2,用户B把值从2改为6,则用户A丢失了他的更新。
- 脏读:当一个事务读取其它完成一半事务的记录时,就会发生脏读取。例如:用户A,B看到的值都是6,用户B把值改为2,用户A读到的值仍为6。
为了解决这些并发带来的问题。 我们需要引入并发控制机制。
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。[1]
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。[1] 乐观锁不能解决脏读的问题。
除了自旋互斥锁还有什么锁?
进程线程之间通信的方式
一、进程间的通信方式
管道( pipe ):
管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
有名管道 (namedpipe) :
有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
信号量(semophore ) :
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
消息队列( messagequeue ) :
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
信号 (sinal ) :
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
共享内存(shared memory ) :
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
套接字(socket ) :
套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同设备及其间的进程通信。
二、线程间的通信方式
锁机制:包括互斥锁、条件变量、读写锁
互斥锁提供了以排他方式防止数据结构被并发修改的方法。
读写锁允许多个线程同时读共享数据,而对写操作是互斥的。
条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
信号量机制(Semaphore):包括无名线程信号量和命名线程信号量
信号机制(Signal):类似进程间的信号处理
线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。
windows api了解吗?
linux系统怎么看系统资源状况?
怎么看io情况?除了top呢?
我们来写一个简单的sql吧!(只写了外面一层sql,发现是leetcode原题178. 分数排名。)
为什么要做静态http服务器?
讲一下你的epoll怎么运作的
委托内核监听IO事件,处理IO请求。
如果对端传数据传的很慢,那么用非阻塞epoll是不是就读到不完整的请求了?
是的,改用水平触发模式可以解决
水平触发会不断提醒,边缘触发只会提醒一次
如果读的文件非常大,write返回0,但是文件还没写完怎么办,怎么办?(改用阻塞的话,tcp会自动阻塞直到可以发出。继续用非阻塞的话,服务端就要判断返回eagain的时候是否已经发送完成了,客户端方面可以使用Content-type,表示文件总大小)
手写一下get的请求和应答头
应答头和文件的分隔符?文件的结束符?
讲一下输入网址到显示网页
dns协议?
arp协议?
a主机访问b主机,在不同的局域网,那么ip包怎么传输?
tcp为什么不能是两次握手?
map和unordermap的区别?
求topK怎么求,N>>k
快排求topk复杂度
O(N)
(下面来了,我开始崩盘了,基本只回答了10%吧)
操作系统了解不?
物理内存和虚拟内存的区别?
为什么要用虚拟内存?
一个进程在内存中是不是连续的?
一个进程在内存中如果是不连续的,那么会产生很多内存碎片吧,内存碎片无法被利用,那怎么办?
Linux写入一个文件的过程中,这个文件被移动了,那怎么办?从linux的文件系统原理分析一下?