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();
}
}
AbstractPollingProcess类read()方法中根据默认配置分配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》那本书里面的拓展题目,是从后往前拷贝是最优解,但是也要考虑到边界问题。
第一次面试,前一天还看了球,面的不好,哎。很多东西只是知道,都没有深深的想一想为什么?整体面试题目不难,但是自己的表现真的不好。在国企呆着逐渐觉着学不到东西了,技术也不是国企的主线。好好想想自己的未来吧。