1. 程式人生 > 其它 >《秋招日記》阿里一面

《秋招日記》阿里一面

阿里一面

面試官:(先介紹了一下自己, 然後讓我介紹一下自己)

我:巴拉巴拉吧拉, 個人資訊說完後,問面試官,要不我先介紹一下專案

面試官:好的,可以的

我:我的專案是一個網路聊天室的專案,實現的功能是使用者間的私聊和同一組使用者間的群聊,使用者可以實現註冊登陸的功能...

面試官:為什麼不直接用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的版本發過去了,,希望人沒事