近期的面试问题
2014-10-21 22:57
239 查看
1.为什么要三次握手
TCP是一个面向连接的协议,所谓面向连接就是指通信双方任何一方向对方发送数据前,
必须将建立安全通道,就像打电话一样,必须要等到对方的手机响铃,并且对方接听电话时,才能与对方通信。
三次握手过程:
(1)第一次握手:建立连接时,客户端发送SYN包(假设序列号seq = x)给服务器,并进入SYN_SEND状态,等到服务器的确认;
(2)第二次握手:服务器收到SYN包之后,必须确认客户端,所以就要发送ACK包(ack = x+1),同时服务器还必须发送SYN包(seq = y),等客户端的确认,此时服务器进入SYN_RECV状态。
(3)第三次握手:客户端接收到SYN+ACK包后,向服务器发送确认包ACK(y+1),该发送完毕,此时客户端与服务器进入ESTABLISHED,两者就可以进行数据交换了,完成三次握手。
四次挥手过程:
(1)第一次挥手:客户端发送数据完毕后,发送一个FIN,提出断开连接要求。
(2)第二次挥手:服务器收到该FIN包后,对其作出响应,发送一个ACK包,确认这一方向的连接将关闭。CLOSE_WAIT/FIN_WAIT_1
(3)第三次挥手:等服务器的应用程序做好关闭准备时,服务器反向发送一个FIN包给客户端,请求关闭连接请求。LAST_ACK/FIN_WAIT_2
(4)第四次挥手:客户机对服务器发送的请求进行确认,并发送ACK包 TIME_WAIT
2.为什么需要TIME_WAIT?
最后一次主机Host1发送的ACK可能丢失导致HOST2重新发送FIN消息,TIME_WAIT维护连接状态
另外,TIME_WAIT为连接中“离群的段“提供从网络中消失的时间。
3.同步与异步,阻塞与非阻塞的区别?
同步:是指在发出一个功能调用时,在没用得到结果之前,该调用就不返回,
也就是必须一件一件事做等前一件做完了才能做下一件事情。
异步:和同步相对,当一个异步过程调用发出后,调用者不能立即得到结果,
实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
阻塞:阻塞调用时指调用结果返回之前,当前线程会被挂起。函数只有得到结果后
才会返回。
非阻塞:和阻塞是相对的,指在不能立即得到结果之前,该函数不会阻塞当前线程,
而会立即返回。
1. 同步,就是我调用一个功能,该功能没有结束前,我死等结果。
2. 异步,就是我调用一个功能,不需要知道该功能结果,该功能有结果后通知我(回调通知)
3. 阻塞, 就是调用我(函数),我(函数)没有接收完数据或者没有得到结果之前,我不会返回。
4. 非阻塞, 就是调用我(函数),我(函数)立即返回,通过select通知调用者
同步IO和异步IO的区别在于:数据拷贝的时候,进程是否阻塞;
阻塞IO和非阻塞IO的区别在于:应用程序的调用是否立即返回。
4. select, poll和epoll的区别?
select的缺点:
(1)单个进程可监视的fd数量被限制,即能监听的端口大小有限。
(2)多socket进行扫描是线性扫描,即采用轮询的方法,效率低下。
(3)需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间传递
该结构时复制开销大。
poll:
poll和select没有本质的区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态。
如果设备就绪则在设备等队列中加入一项并继续遍历,如果遍历完所有fd后,没有发现就绪设备,则挂起
当前进程,直到设备就绪或主动超时,被唤醒后它又要再遍历fd。
poll的缺点:
大量的fd数组被整体复制于用户态和内核地址空间之间。
没有最大连接数限制。
epoll_create
epoll_ctl
epoll_wait
epoll的优点:
1. 没有最大并发连接的限制
2. 效率提升,不是采用轮询方式。
3. 内存拷贝,利用mmap文件映射内存加速与内核空间的消息传递。
五,什么是数据库索引?
索引是一种提高数据库查询速度的机制,它是一个在数据库的表或视图上按照某个关键字段值,升序或降序排序创建的对象。
用户查询索引字段是,它可以快速地执行检索操作。
索引的类型有:聚集索引和非聚集索引
提高性能:
(1)通过创建唯一索引,可以保证数据库表中每一行数据的唯一性;
(2)通过索引,可以大大加快数据的检索速度;
(3)通过索引可以加速表和表之间的连接,从而有效实现数据的参考完整性;
建立索引注意:
(1)创建索引和维护索引要耗费时间,空间。
(2)每个索引需要占用一定的物理空间。
(3)对表中数据进行增加,删除和修改,索引也要动态地维护,从而降低了数据的维护速度。
六,MySql中的存储引擎
MyISAM索引实现:
(1)使用B+树作为索引结构,叶子节点的data域存放的数据记录的地址。
(2)MyISAM的索引方式也叫”非聚集的“。
MyISAM索引的原理图:
主索引:
MyISAM辅助索引:
InnoDB索引实现:
(1)使用B+树作为索引结构,具体实现方式与MyISAM截然不同。
(2)InnoDB的数据文件本身就是索引文件,叶子节点data域保存了完整的数据记录
(3)InnoDB的辅助索引data域存储响应记录主键的值而不是地址。
聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要
检索两遍索引:首先检索辅助索引获得主键,然后通过主键到主索引中检索记录。
InnoDB实现原理图:
主索引:
InnoDB的辅助索引:
七,GDB使用
> gcc -g mygdb.c
> gdb a.out
> b 4
> r
> bt //查看运行时的堆栈
> p a //打印变量a
> p b
>up
1. 加入断点:
break 行号
break 函数名
break ... if
(1) list
(2) run
(3) countinue
(4) next
(5) step
(6) enter
(7) until
(8) info locals
(9) clear
多线程中:
info threads
threads IDX
break file.c 20 thread all
当程序奔溃时,内核有可能把该程序当前内存映射到core文件里,方便程序员调试。
> gdb core
用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
core dump 一般是在segmentation fault(段错误)的情况下产生的文件,需要通过ulimit来设置才会得到的。
ulimit -c 1024
ulimit -c unlimited
调试的话输入: gdb filename core
filename就是产生core文件的可执行文件
八,Nginx和Apache区别
LNAMP
= Linux + Nginx + Apache + MySQL + PHP
Apach服务器是重量级Web服务器,功能强大,而且性能稳定;
缺点:每建立一个网络连接就会创建一个进程;
Nginx服务器是轻量级Web服务器,处理静态Web十分出色,可以作为
负载均衡服务器,反向代理服务器,高并发。
(1)轻量级,占用更少内存资源,抗并发,异步非阻塞
(2)高并发下,能保存低资源,低消耗,高性能;
(3)高度模块的设计,编写模块相对简单;
Apache相对Nginx的优点:
(1)rewrite比Nginx的rewrite要强大;
(2)模块超多,少bug
TCP是一个面向连接的协议,所谓面向连接就是指通信双方任何一方向对方发送数据前,
必须将建立安全通道,就像打电话一样,必须要等到对方的手机响铃,并且对方接听电话时,才能与对方通信。
三次握手过程:
(1)第一次握手:建立连接时,客户端发送SYN包(假设序列号seq = x)给服务器,并进入SYN_SEND状态,等到服务器的确认;
(2)第二次握手:服务器收到SYN包之后,必须确认客户端,所以就要发送ACK包(ack = x+1),同时服务器还必须发送SYN包(seq = y),等客户端的确认,此时服务器进入SYN_RECV状态。
(3)第三次握手:客户端接收到SYN+ACK包后,向服务器发送确认包ACK(y+1),该发送完毕,此时客户端与服务器进入ESTABLISHED,两者就可以进行数据交换了,完成三次握手。
四次挥手过程:
(1)第一次挥手:客户端发送数据完毕后,发送一个FIN,提出断开连接要求。
(2)第二次挥手:服务器收到该FIN包后,对其作出响应,发送一个ACK包,确认这一方向的连接将关闭。CLOSE_WAIT/FIN_WAIT_1
(3)第三次挥手:等服务器的应用程序做好关闭准备时,服务器反向发送一个FIN包给客户端,请求关闭连接请求。LAST_ACK/FIN_WAIT_2
(4)第四次挥手:客户机对服务器发送的请求进行确认,并发送ACK包 TIME_WAIT
2.为什么需要TIME_WAIT?
最后一次主机Host1发送的ACK可能丢失导致HOST2重新发送FIN消息,TIME_WAIT维护连接状态
另外,TIME_WAIT为连接中“离群的段“提供从网络中消失的时间。
3.同步与异步,阻塞与非阻塞的区别?
同步:是指在发出一个功能调用时,在没用得到结果之前,该调用就不返回,
也就是必须一件一件事做等前一件做完了才能做下一件事情。
异步:和同步相对,当一个异步过程调用发出后,调用者不能立即得到结果,
实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
阻塞:阻塞调用时指调用结果返回之前,当前线程会被挂起。函数只有得到结果后
才会返回。
非阻塞:和阻塞是相对的,指在不能立即得到结果之前,该函数不会阻塞当前线程,
而会立即返回。
1. 同步,就是我调用一个功能,该功能没有结束前,我死等结果。
2. 异步,就是我调用一个功能,不需要知道该功能结果,该功能有结果后通知我(回调通知)
3. 阻塞, 就是调用我(函数),我(函数)没有接收完数据或者没有得到结果之前,我不会返回。
4. 非阻塞, 就是调用我(函数),我(函数)立即返回,通过select通知调用者
同步IO和异步IO的区别在于:数据拷贝的时候,进程是否阻塞;
阻塞IO和非阻塞IO的区别在于:应用程序的调用是否立即返回。
4. select, poll和epoll的区别?
select的缺点:
(1)单个进程可监视的fd数量被限制,即能监听的端口大小有限。
(2)多socket进行扫描是线性扫描,即采用轮询的方法,效率低下。
(3)需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间传递
该结构时复制开销大。
poll:
poll和select没有本质的区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态。
如果设备就绪则在设备等队列中加入一项并继续遍历,如果遍历完所有fd后,没有发现就绪设备,则挂起
当前进程,直到设备就绪或主动超时,被唤醒后它又要再遍历fd。
poll的缺点:
大量的fd数组被整体复制于用户态和内核地址空间之间。
没有最大连接数限制。
epoll_create
epoll_ctl
epoll_wait
epoll的优点:
1. 没有最大并发连接的限制
2. 效率提升,不是采用轮询方式。
3. 内存拷贝,利用mmap文件映射内存加速与内核空间的消息传递。
五,什么是数据库索引?
索引是一种提高数据库查询速度的机制,它是一个在数据库的表或视图上按照某个关键字段值,升序或降序排序创建的对象。
用户查询索引字段是,它可以快速地执行检索操作。
索引的类型有:聚集索引和非聚集索引
提高性能:
(1)通过创建唯一索引,可以保证数据库表中每一行数据的唯一性;
(2)通过索引,可以大大加快数据的检索速度;
(3)通过索引可以加速表和表之间的连接,从而有效实现数据的参考完整性;
建立索引注意:
(1)创建索引和维护索引要耗费时间,空间。
(2)每个索引需要占用一定的物理空间。
(3)对表中数据进行增加,删除和修改,索引也要动态地维护,从而降低了数据的维护速度。
六,MySql中的存储引擎
MyISAM索引实现:
(1)使用B+树作为索引结构,叶子节点的data域存放的数据记录的地址。
(2)MyISAM的索引方式也叫”非聚集的“。
MyISAM索引的原理图:
主索引:
MyISAM辅助索引:
InnoDB索引实现:
(1)使用B+树作为索引结构,具体实现方式与MyISAM截然不同。
(2)InnoDB的数据文件本身就是索引文件,叶子节点data域保存了完整的数据记录
(3)InnoDB的辅助索引data域存储响应记录主键的值而不是地址。
聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要
检索两遍索引:首先检索辅助索引获得主键,然后通过主键到主索引中检索记录。
InnoDB实现原理图:
主索引:
InnoDB的辅助索引:
七,GDB使用
> gcc -g mygdb.c
> gdb a.out
> b 4
> r
> bt //查看运行时的堆栈
> p a //打印变量a
> p b
>up
1. 加入断点:
break 行号
break 函数名
break ... if
(1) list
(2) run
(3) countinue
(4) next
(5) step
(6) enter
(7) until
(8) info locals
(9) clear
多线程中:
info threads
threads IDX
break file.c 20 thread all
当程序奔溃时,内核有可能把该程序当前内存映射到core文件里,方便程序员调试。
> gdb core
用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
core dump 一般是在segmentation fault(段错误)的情况下产生的文件,需要通过ulimit来设置才会得到的。
ulimit -c 1024
ulimit -c unlimited
调试的话输入: gdb filename core
filename就是产生core文件的可执行文件
八,Nginx和Apache区别
LNAMP
= Linux + Nginx + Apache + MySQL + PHP
Apach服务器是重量级Web服务器,功能强大,而且性能稳定;
缺点:每建立一个网络连接就会创建一个进程;
Nginx服务器是轻量级Web服务器,处理静态Web十分出色,可以作为
负载均衡服务器,反向代理服务器,高并发。
(1)轻量级,占用更少内存资源,抗并发,异步非阻塞
(2)高并发下,能保存低资源,低消耗,高性能;
(3)高度模块的设计,编写模块相对简单;
Apache相对Nginx的优点:
(1)rewrite比Nginx的rewrite要强大;
(2)模块超多,少bug
相关文章推荐
- 近期面试遇到问题
- python近期遇到的一些面试问题(一)
- 近期笔面试问题总结
- python近期遇到的一些面试问题(二)
- 近期面试遇到的问题以及总结(python和openstack)
- 就近期面试所见,谈谈求职者的问题和面试官的问题
- python近期遇到的一些面试问题(三)
- 面试时最经常被问到的问题(Frenquently asked interview questions)之C/C++篇
- 面试时最经常被问到的问题(Frenquently asked interview questions)之Misc. Topics篇
- 面试时最经常被问到的问题(Frenquently asked interview questions)之Java篇
- 面试时最经常被问到的问题(Frenquently asked interview questions)之终结篇--提问面试官
- 英语面试问题集及其对策
- 面试的27个经典问题 [推荐]
- ZT面试宝典:最常问面试问题和最佳答案
- 面试时最经常被问到的问题(Frenquently asked interview questions)之 Databases 篇
- 面试时最经常被问到的问题(Frenquently asked interview questions)之Analytical, puzzles, and brain-teasers篇
- 面试时最经常被问到的问题(Frenquently asked interview questions)之Microsoft and other companies篇
- 经典面试问题回答思路
- 面试的27个经典问题 [推荐]
- 转:ORACLE 面试问题-技术篇