《秋招日記》阿里一面
阿里一面
面試官:(先介紹了一下自己, 然後讓我介紹一下自己)
我:巴拉巴拉吧拉, 個人資訊說完後,問面試官,要不我先介紹一下專案
面試官:好的,可以的
我:我的專案是一個網路聊天室的專案,實現的功能是使用者間的私聊和同一組使用者間的群聊,使用者可以實現註冊登陸的功能...
面試官:為什麼不直接用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的版本發過去了,,希望人沒事