去哪儿面试

1.项目和mina
(1)线程池机制,为何要用三个线程池?
     IoAcceptor IoProcessor IoHandler
     连接到建立     IO            CPU
     一个Selector专门用来响应连接的建立(OP_ACCEPT),有多少连接都能接过来?
     还有一个Selector专门响应读(OP_READ),IoProcessor是一个对象池,默认的大小是CPU数+1。
     至于为什么在IoFilter上配置线程池专门处理IoHandler中的业务逻辑,主要考虑IoHandler是否会占用CPU太长时间造成IO受影响,如果否可以不配置这个线程池,线程的上下文切换代价也不小(这个理解的不够深)。
     (a)NioSocketAcceptor类中的open()方法的部分代码
     channel.register( selector , SelectionKey. OP_ACCEPT);
   AbstractPollingIoAcceptor类中的processHandles()方法
     S session = accept( processor, handle);
     (b)这个是NioProcessor类init()方法中的代码
     session.setSelectionKey(ch.register(selector, SelectionKey.OP_READ, session));
   (c)AbstractPollingProcess中Processor类做select(),然后
    private void process() throws Exception {
        //针对每一个session去处理
        for (Iterator<S> i = selectedSessions(); i.hasNext();) {
            S session = i.next();
            process(session);
            i.remove();
        }
    }
   AbstractPollingProcessread()方法中根据默认配置分配IoBuffer的大小,后面会动态调整,所以配置这个参数意义不大。
   调用filterChain.fireMessageReceived(buf);将buf放到职责链上去做处理
   (d)ProtocolCodecFilter中的messageReceived()方法,
     ProtocolDecoder decoder factory .getDecoder(session);
     这个Decoder我们会自己写。我们在最后decoderOut.write(IoBuffer);把解码数据放入ConcurrentLinkedQueue。
     decoderOut.flush(nextFilter, session);是从一个ConcurrentLinkedQueue<Object>中读出解码的结果(IoBuffer)然后放到链上。
   (e)如果配置了ExecutorFilter,会用新的线程池去调用。
   (f)DefaultIoFilterChain中的private static class TailFilter extends IoFilterAdapter中的
messageReceived()调用session.getHandler ().messageReceived(s, message);做最后的解析处理。
(2)连接接到了6万没有问题,是否能接到10万甚至更多?为什么?会有什么问题吗?
     以PC来说,4核处理器,当IO处理不过来时,内存会不会持续上涨?出现大量粘包的情况。
     单节点的瓶颈在哪里????为什么要用分布式的?
(3)粘包怎么处理的?
     使用了MINA的内部机制,有CumulativeProtocolDecoder类,每次判断session中是否有残留数据,若有需要把数据拷贝出来,同理处理完后有剩余也需要保存。
(4)数据内存如何使用的?
     中间有哪些内存数据的拷贝吗?

2.ArrayBlockingQueue  Blocking何解? 当读时,Queue为空则Condiion.await(),对写同理。数组有两个游标分别指示读和写。
     Synchronized的使用。
3.数据库索引《高性能MYSQL》那本书,可惜去年没有把它研究透
(1)索引数据结构? 
     B树,B+树
(2)主键索引和唯一索引的区别? 
     主键索引是特殊的唯一索引的一种特例,主键索引不可为空?
(3)三列建索引可以通过中间列查找吗?不可以的,组合索引的查找还是先按照第一列去查找。
     不能跳过索引中的列。
     如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查询。
(4)能否用hash做索引
     当然可以,而且速度上会更快。缺陷呢?a.数据量很大,会退化?b.做范围查询呢?排序之类的呢?
4.合并两个排序数组
《剑指Offer》那本书里面的拓展题目,是从后往前拷贝是最优解,但是也要考虑到边界问题。

第一次面试,前一天还看了球,面的不好,哎。很多东西只是知道,都没有深深的想一想为什么?整体面试题目不难,但是自己的表现真的不好。在国企呆着逐渐觉着学不到东西了,技术也不是国企的主线。好好想想自己的未来吧。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值