《秋招日记》阿里一面

阿里一面

面试官:(先介绍了一下自己, 然后让我介绍一下自己)

我:巴拉巴拉吧拉, 个人信息说完后,问面试官,要不我先介绍一下项目

面试官:好的,可以的

我:我的项目是一个网络聊天室的项目,实现的功能是用户间的私聊和同一组用户间的群聊,用户可以实现注册登陆的功能...

面试官:为什么不直接用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的版本发过去了,,希望人没事

原文地址:https://www.cnblogs.com/Dancing-Fairy/p/15181303.html