这次面试是我准备跳槽前的最后一次面试,其实也知道自己肯定面不过,毕竟社招需要相关工作经验,而我确实没有,C++服务器编程。第二轮面试的面试官直接拒绝了我,其实也不是太尴尬,就在意料之中。我们需要的是对同步异步,epoll LT和ET,网络收发包有经验的人,考了多个千万级数组求交,如何用libevent做收发包,同步、异步、阻塞和非阻塞的区别。
不过第一轮面试聊了两个小时,收获还挺大的。
1.new和malloc的区别:
我说到new分为new operator和placement new两步。placement new主要用于内存池技术等。后面就被扩展问到为什么内存池效率较高,其实每个程序也是预先分配了一片内存,利用内存池和一个个new然后回收有什么区别。我提到了保存一片内存和多片内存应该对操作系统的消耗有区别,然后对于nontrivial destructor也不用去调析构函数。
2.int A[100];
memset(A, 0, sizeof(A));
for(int i=0; i<100;i++)
A[i] = 0;
谁效率高,我说我没看过memset的实现,我猜肯定是memset高。这个上网搜了一下,memset有cache的优化。
3.vector<T> 和 set<T> 频繁插入各是什么情况?
这个是老生常谈,每场面试都遇得到,不过又被扩展问了一个问题,vector<T>::clear()函数能不能让内存回收,我回答不会,面试官又问如果我要让它回收应该怎么办,我就回答一般这个是分配在栈上的,函数调用完就能回收,如果是静态变量就在程序结束后回收。感觉他对这个回答不是很满意,不过我也没get到点。
4.class A{
public:
void hehe(){cout<<endl;}
virtual void haha(){}
};
A *aa = NULL;
aa->hehe();
aa->haha();
结果会怎样?
我提到第一个不会用到this指针,而第二个会用到this指针,因为虚函数的地址是根据函数地址去寻找的。他说我看你也了解汇编,那么从汇编角度如何分析,并引导我说第一个函数在代码段,而第二个函数不在。NULL指针一般是0,那么对NULL去地址为什么会使程序崩溃呢?我觉得0地址是操作系统的地址,肯定会引起崩溃。不过这个说法有待验证。http://www.tuicool.com/articles/VRbERz
4. void fun(){
char * pChar = new char[100];
一些代码;
delete pChar;}
有什么问题?除了delete []呢?应该如何解决,我提到了auto_ptr、share_ptr,然后是自己写个类利用类的析构函数来解决。
5.如何查看程序打开了哪些端口。
查看cpu的命令,top,里面有一个cpuinfo的含义是cpu利用率么?我说不是我见过200%,那么这个200%是什么含义?
5.public、protected、private继承的区别
回答这个问题我有点傻逼,有些记不清private的是怎么继承的了。反正这个三个继承和类里面的函数的访问权限是如何的有些蒙逼。如何防止类被继承,我提到让其构造函数为私有。而且居然不知道virtual继承和菱形继承,确实没见过。。。。。 然后又谈到单例模式,说直接返回一个static,并且是lazy_initialization的是不是线程安全的,我说这个构造分为两个过程,不是线程安全的,他说那加锁呢,我说是。
6.类模板的偏特化和全特化
这个我的回答是
template<int, T> template<int, int>
class A{} 有些晕菜,艹!! class A{} 其实他还提示了我A后面还有没有什么。。。。
7.让链表反转,当我写完后说这个链表万一有环呢,我说快慢指针,他让我边翻转边判断,我晕,好难,没答出来。
8.Timewait和closewait有什么区别,并提到 timewait状态太多怎么解决,我提了tw_reuse和tw_recycle,并说了下这两个怎么用,但是在说什么时候可以reuse时有些蒙。然后他又问我除了这个还能有啥,并提到在发送FIN后和收到timewait之间是什么状态,我说直接设置close的选项so_linger直接RST,不过这个答案不是他想要的,那到底是什么呢。。。
8.select ,poll, epoll的区别,并提到epoll搜寻fd的复杂度O(1),而且没有用到哈希,蒙逼,回头我要好好看看源码了,下次扯淡也能扯一些。
然后是LT和ET的区别。我把man手册里的说了一下,估计太没实际经验了。
9.写一个MYSQL内联查询,left right inner什么区别,我说left就在左边,他说right就在又边,inner就在中间是吧,然后大笑 v-v。头一次面试我没写对,这一次还是写对了。
7.了解过binlog吗?
没有-_-||!!
最后我问了我要转这行该咋办,他说必须看操作系统的源代码啦。其实我也深有体会,所有tcp这些分析到最后都是源码,我们记忆的不过是一些抽象的东西,上不得台面。
另外我问了他syn攻击该怎么化解,其实我是认为在syn_sent状态的描述符是一定的。他解释道,这种攻击影响最大的是内存,那么我们先把这个东西用硬盘存起来,最后发现这个IP的有毛病,以后就不接受他的连接了。另外他还介绍了DDos,黑客在网络上寻找肉鸡,然后一起攻击你,这时候办法就只能是扩容了,建立服务器集群,另外还有反弹攻击,利用服务器攻击服务器。要伪装IP不是普通人有的,至少是运营商级别。其实我开始以为可以随随便便搞IP-_-||
已经过去两三天了还记住这么多,以后再理一下吧。