阿里一面
面试官:(先介绍了一下自己, 然后让我介绍一下自己)
我:巴拉巴拉吧拉, 个人信息说完后,问面试官,要不我先介绍一下项目
面试官:好的,可以的
我:我的项目是一个网络聊天室的项目,实现的功能是用户间的私聊和同一组用户间的群聊,用户可以实现注册登陆的功能...
面试官:为什么不直接用socket呢,为什么要用epoll?
我:socket需要对应一个客户端创建一个线程,当客户很多的时候cpu会负载过大..
面试官:你自己测试过吗?
我:没有诶
面试官:这个其实用户很多也是很快的哈,那这个用户登陆状态的保留为什么要用redis呢,用mysql不行吗
我:emmmm,用mysql也可以,其实记录一下登陆的cookie和时间就可以了
面试官:对呀,那为什么还要用redis呢
我:大概是就是为了学习一下redis的使用吧。。。
面试官:那我们来看看下一个项目吧,这个虚拟机调度,你知道现实的虚拟机调度需要考虑哪些因素吗?
我:我想一想,价格肯定是要考虑的,购买服务器的价格和服务器每天运行的维护费用之类的,然后,虚拟机的迁移?
面试官:虚拟机的迁移是怎么实现的呢,比如我现在cpu或者内存不够用了,我要怎么扩容呢?
我:难道是等他停止服务了把虚拟机迁移到另一个CPU和内存更大的服务器上去?
面试官:这个一般租用虚拟机的人他都不会关机的,因为业务它是不会停的嘛
我:这个,,我也不是很清楚
面试官:这个你可以之后去了解一下,mysql了解吗?
我:了解吧
面试官:mysql的事务,事务执行一半会怎么样?
我:噢,我知道事务是原子的,事务执行一半会回滚
面试官:那这个原子性是怎么保证的呢?
我:用日志实现的
面试官:日志怎么保证可靠性的
我:...(我记不太清说了什么了)
面试官:来问一下C++基础吧,new和malloc的区别?
我:new是对malloc的封装,new是类型安全的,malloc是库函数,new是运算符
面试官:em,对内存池有了解吗?有用过内存库之类的吗?gdbc?
我:没有了解
面试官:好吧,可以去了解一下 那我们来做个题吧,多线程平时编程的时候会用到吗
我:会用到
面试官:现在让你写一个多线程的程序你能写的出来吗
我:可能需要查一下函数怎么用,,
面试官:那这样吧,写一个循环队列可以吗
我:(噼里啪啦霹雳啪啦)写好了,面试官你看一下
面试官:这是单个线程访问循环队列,如果有多个线程访问循环队列的话,就得加锁是吧,你都知道哪些实现锁的方式?
我:互斥锁,自旋锁,也可以用信号量
面试官:那有没有不用锁来实现,比如写一个无锁队列?听说过吗?
我:(面试官让我写完发他邮箱)
我写了两天,觉得好难啊,呜呜呜,第一天在百度上找,标准库里面找,还找到了一篇论文,原理大概都了解了但是写起来真的好难,然后链表的实现方式比较简单,但循环队列的方式会出现各种各样的bug,其中ABA问题是最难解决的,我在网上看到了DoubleCAS的做法,可是看不懂,最后写了一个带有bug的版本发过去了,,希望人没事