http://blog.csdn.net/hellen1900/article/details/40421911
不得不承认网易游戏的低效,上个月27号,就笔试了,结果10月20日才通知我去面试,可能是备胎吧。
好吧,其实这是我第二次面试网易游戏的,第一次是今年五月份师兄内推的网易游戏QA实习,当时被问和很多什么都不懂。
如,(1)写一个单例;(2)写一个123的全排序;(3)http状态。其实都是不难的。
;3.会设计模式吗?写一个你最熟悉的设计模式?4.知道HTTP的状态码吗?
这一次面网易游戏,也没太大期待,因为我之前网申的时候是报游戏研发的,结果网易的hr打电话叫我换数据库系统工程师职位,
尼玛,好吧,数据库什么都不懂,不过为了有机会参加网易的笔试,也就同意了调岗,另外说道网易游戏的笔试,3个小时,做得狂抓啊。
《MySQL技术内幕InnoDB存储引擎》
好吧。笔试过了,其实只是做了一道算法题,面试的时候,面试官还在说我,怎么只做了一道算法题。
下面是面试的时候问到的:
(1)Linux进程间通信有哪些?
(2)有名管道具体的内部怎么实现的?
(3)共享内存有哪些?用过没有?
(4)说说(linux + apache+nginx+mysql+php)框架?
(5)Nginx和Apache的区别?
(6)Apache的rewrite为什么比Nginx强大?
(7)负载均衡策略还有哪些?
另外还聊了聊试卷上的数据库设计题。
大概这些吧。感觉答得不是很好,然后面试官叫我出去等等,然后就叫我回去了。
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