面試經歷

積夢智能 由於工做中沒有了解過my sql,業務不符合從這裏開始就掛了吧,記下來幾個問題
1.mysql的鎖有了解嗎?行鎖,表鎖,業鎖?
2.oauth2.0實現過程?
3.分佈式鎖有了解嗎?回答知道redis的setnx,繼續問實現過程?問etcd作鎖不能夠嗎?
分佈式鎖html

4.如何限制goroutine的併發數?
5.用過context的那些用法?有沒有用context設置goroutine執行時間?
6.用過go的那些調試工具?回答就是IDE裏面界面調試,繼續問調試又分性能調試,錯誤調試,有用過pprof嗎?java

1.MySQL中按照鎖的粒度能夠細分爲行鎖、頁鎖、表鎖 node

  • 行鎖
    行鎖的鎖定顆粒度在MySQL中是最細的,應用於InnoDB存儲引擎,只針對操做的當前行進行加鎖。併發狀況下,產生鎖等待的機率較低,支持較大的併發數,但開銷大,加鎖慢,並且會出現死鎖。 在InnoDB中使用行鎖有一個前提條件:檢索數據時須要經過索引!由於InnoDB是經過給索引的索引項加鎖來實現行鎖的。 在不經過索引條件查詢的時候,InnoDB會使用表鎖,這在併發較大時,可能致使大量的鎖衝突。此外,行鎖是針對索引加鎖,存在這種狀況,雖然是訪問的不一樣記錄,但使用的是同一索引項,也可能會出現鎖衝突。 提示:不必定使用了索引檢索就必定會使用行鎖,也有可能使用表鎖。由於MySQL會比較不一樣執行計劃的代價,當全表掃描比索引效率更高時,InnoDB就使用表鎖。所以須要結合SQL的執行計劃去分析鎖衝突。 行鎖會產生死鎖,由於在行鎖中,鎖是逐步得到的,主要分爲兩步:鎖住主鍵索引,鎖住非主鍵索引。如:當兩個事務同時執行時,一個鎖住了主鍵索引,在等待其餘索引;另外一個鎖住了非主鍵索引,在等待主鍵索引。這樣便會發生死鎖。InnoDB通常均可以檢測到這種死鎖,並使一個事務釋放鎖回退,另外一個獲取鎖完成事務。
  • 表鎖
    表鎖的鎖定顆粒度在MySQL中是最粗的,InnoDB、MyISAM引擎中都有應用,對當前整張表加鎖。不適合高併發的場景,但開銷小,加鎖快,不會出現死鎖,發生鎖衝突的機率最大。
  • 頁鎖
    頁鎖的粒度介於行鎖和表鎖之間,應用於BDB引擎,併發度通常,開銷和加鎖速度也介於行鎖和表鎖之間

4.限制併發數,用一個無阻塞的通道就能夠了,併發開始寫入一個數,併發結束釋放mysql

5.context有幾種用法? context包裏有幾個重要函數linux

func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
func WithValue(parent Context, key, val interface{}) Context
複製代碼

withCancel函數用法 這個函數能夠建立一個可取消的子Context,而後看成參數傳給goroutine使用,這樣就可使用這個子Context跟蹤這個goroutine。 在goroutine中,使用select調用<-ctx.Done()判斷是否要結束,若是接收到值的話,就能夠返回結束goroutine了;若是接收不到,就會繼續進行監控。 調用context.WithCancel(parent)函數生成子Context的時候返回的cancel函數是CancelFunc類型的。咱們調用它就能夠發出取消指令,而後咱們的監控goroutine就會收到信號,就會返回結束 具體是這個函數會將ctx.Done()返回的通道關閉,關閉的通道是能夠讀取值的,因此select調用<-ctx.Done() 就從阻塞變成能夠讀,就會結束了,default處理過程當中cancel了,須要在default處理完,纔會到<-ctx.Done(),不會出現一旦cancel了,強行終止default,立馬執行<-ctx.Done()case語句nginx

func main() {
	ctx, cancel := context.WithCancel(context.Background())
	go watch(ctx,"【監控1】")
	go watch(ctx,"【監控2】")
	go watch(ctx,"【監控3】")

	time.Sleep(10 * time.Second)
	fmt.Println("能夠了,通知監控中止")
	cancel()
	//爲了檢測監控過是否中止,若是沒有監控輸出,就表示中止了
	time.Sleep(5 * time.Second)
}

func watch(ctx context.Context, name string) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println(name,"監控退出,中止了...")
			return
		default:
			fmt.Println(name,"goroutine監控中...")
			time.Sleep(2 * time.Second)
		}
	}
}
複製代碼

WithDeadline函數 這個應該就是面試官問的問題了,怎樣利用context設置goroutine的執行時間 WithDeadline函數,和WithCancel差很少,它會多傳遞一個截止時間參數,意味着到了這個時間點,會自動取消Context,固然咱們也能夠不等到這個時候,能夠提早經過返回的取消函數進行取消git

WithTimeout和WithDeadline基本上同樣,這個表示是超時自動取消,是多少時間後自動取消Context的意思golang

WithValue函數 能夠傳遞元數據到goroutine當中,至關於給併發函數傳參數,只不過經過context傳遞web

最後Context是線程安全的,能夠放心的在多個goroutine中傳遞面試

6.錯誤調試能夠直接用IDE裏面的debug就能夠了,性能調試的話須要用go自帶工具pprof pprof

工具型應用,運行一下就結束,能夠在代碼裏將信息保存在文件中

服務性應用,如web應用,導入"net/http/pprof包後,會自動建立默認路由,訪問路徑能夠獲得相應診斷信息,CPU 的內存的等

滴滴一面記錄
1.golang中的channel底層實現原理?採用什麼機制接收發送數據?
2.事件處理方式select poll epoll區別? epoll如何實現不用遍歷就得到ready文件描述符?
3.golang是如何實現高併發的?假設如今有多個物理核,高併發是怎麼實現的?
4.golang中協程和線程的區別?
5.編程語言面向對象的特色有哪些?
6.虛函數表在內存中是如何分配的?一個空類佔多少內存?類有一個int類型變量?有一個虛函數表?有一個本身的成員變量分別佔多少內存?
7.MQTT協議怎麼解析的?
8.tcp 和 udp的區別?四次握手實現闡釋?爲何三次握手結束四次握手?time_wait在什麼狀況下會出現? tcp在那些場景下會返回reset?
9.redis適合場景? redis中有兩個鎖,二者有什麼區別?
10.mongodb和mysql有什麼區別?mongodb a b c複合索引,經過a b能找到嗎?
11.進程和線程有什麼區別?多進程有什麼好處?多進程和多線程分別適用於那些場景?好壞?

1.channel底層是一個結構體,新建一個通道也就是分配一塊內存給這個結構體,結構體裏面有緩衝buf(有緩衝的通道纔有buf),是一個環形鏈表,若是緩衝滿了,有一個協程在發送數據,就會阻塞,底層是看到buf滿了,把這個協程給放到結構體中的發送協程隊列中,這個協程用調度器將本身等待,讓出資源讓其餘協程使用,直到有讀數據,從buf讀取衣蛾數據,channel會將阻塞的協程從隊列拿出來,將數據寫到buf,協程從新放回可執行協程隊列,具體看文章

2.這個問題在這裏,詳細問了epoll爲何不須要遍歷全部文件描述符就能夠獲得準備好的文件描述符,回答 中間加了一層,用一個鏈表存放全部準備好的文件描述符,應該對了就沒再繼續往下問了,可是仍是要本身深究弄更明白

3.golang 併發採用二GPM模型,G是goroutine,P是邏輯處理器,M是系統線程,建立一個goroutine先會放到全局隊列當中,而後調度器將可執行的goroutine分配給一個邏輯處理器,放到邏輯處理器的本地隊列當中,邏輯處理器與一個可用的系統線程綁定,線程處理隊列裏面的goroutine,若是有一個goroutine阻塞了,會將goroutine和線程兩個從邏輯處理器上分離,給邏輯處理器在找一個可用的線程,處理隊列裏面其餘的goroutine,若是咱們在一個Goroutine中經過go關鍵字建立了大量G,這些G雖然暫時會被放在同一個隊列, 但若是這時還有空閒P(系統內P的數量默認等於系統cpu核心數),Go運行時系統始終能保證至少有一個(一般也只有一個)活躍的M與空閒P綁定去各類G隊列去尋找可運行的G任務,該種M稱爲自旋的M。通常尋找順序爲:本身綁定的P的隊列,全局隊列,而後其餘P隊列。若是本身P隊列找到就拿出來開始運行,不然去全局隊列看看,因爲全局隊列須要鎖保護,若是裏面有不少任務,會轉移一批到本地P隊列中,避免每次都去競爭鎖。若是全局隊列仍是沒有,就要開始玩狠的了,直接從其餘P隊列偷任務了(偷一半任務回來)。這樣就保證了在還有可運行的G任務的狀況下,總有與CPU核心數相等的M+P組合 在執行G任務或在執行G的路上(尋找G任務) 因此阻塞的時候,和線程邏輯處理器主動尋找可執行的goroutine這些策略對高併發都有幫助
閱讀文章 總結一下高併發:
1.GPM模型
2.阻塞執行策略
3.主動尋找任務
4.協程切換不涉及內核,資源消耗小,代價小等
多個物理核,默認邏輯處理器和CPU個數一致,將goroutine平均分配到全部邏輯處理器上,讓系統線程執行。

  1. 協程 線程區別 好文章
  • 棧大小區別 線程棧大小是固定的值,通常2mb,協程不是,go採用了動態擴張收縮的策略:初始化爲2KB,最大可擴張到1GB
  • goroutine沒有id 每個線程有惟一id,能夠經過id操做某個線程,協程沒有
  • 切換
    協程和線程的區別在於:線程切換須要陷入內核,而後進行上下文切換,切換時間點也是內核決定,而協程在用戶態由協程調度器完成,不須要陷入內核,並且切換時間點由調度器決定,這代價就小了

5.面向對象特色 封裝、繼承、多態
封裝,也就是把客觀事物封裝成抽象的類,而且類能夠把本身的數據和方法只讓可信的類或者對象操做,對不可信的進行信息隱藏

6.空類佔1個字節,有虛函數,類裏面只是存儲了一個指針,指針指向虛函數表,不管有多少個虛函數,都佔4個字節,表示表的地址,當咱們說類大小實際是說類實體的大小,成員函數仍是以通常的函數同樣的存在,再也不實體裏面。即成員函數的大小不在類的對象裏面,同一個類的多個對象共享函數代碼,因此不佔空間

關於多態,基類指針指向派生類地址

8.以前寫的 time_wait就是第四次握手以後等待時間,tcp 返回reset這個實際項目沒有碰到不會不要緊

9.redis適合小而熱場景,兩個鎖 紅鎖和setnx
紅鎖講的很詳細的文章 文章一 文章二
基於單Redis節點的分佈式鎖在failover的時候會產生解決不了的安全性問題,所以antirez提出了新的分佈式鎖的算法Redlock,它基於N個徹底獨立的Redis節點

antirez提出的redlock算法大概是這樣的:

在Redis的分佈式環境中,咱們假設有N個Redis
master。這些節點徹底互相獨立,不存在主從複製或者其餘集羣協調機制。咱們確保將在
N個實例上使用與在Redis單實例下相同方法獲取和釋放鎖。如今咱們假設有5個Redis
master節點,同時咱們須要在5臺服務器上面運行這些Redis實例,這樣保證他們不會同時
都宕掉。

爲了取到鎖,客戶端應該執行如下操做:

獲取當前Unix時間,以毫秒爲單位。
依次嘗試從5個實例,使用相同的key和具備惟一性的value(例如UUID)獲取鎖。當向Redi
s請求獲取鎖時,客戶端應該設置一個網絡鏈接和響應超時時間,這個超時時間應該小於
鎖的失效時間。例如你的鎖自動失效時間爲10秒,則超時時間應該在5-50毫秒之間。這樣
能夠避免服務器端Redis已經掛掉的狀況下,客戶端還在死死地等待響應結果。若是服務
器端沒有在規定時間內響應,客戶端應該儘快嘗試去另一個Redis實例請求獲取鎖。
客戶端使用當前時間減去開始獲取鎖時間(步驟1記錄的時間)就獲得獲取鎖使用的時間
。當且僅當從大多數(N/2+1,這裏是3個節點)的Redis節點都取到鎖,而且使用的時間
小於鎖失效時間時,鎖纔算獲取成功。
若是取到了鎖,key的真正有效時間等於有效時間減去獲取鎖所使用的時間(步驟3計算的
結果)。
若是由於某些緣由,獲取鎖失敗(沒有在至少N/2+1個Redis實例取到鎖或者取鎖時間已經
超過了有效時間),客戶端應該在全部的Redis實例上進行解鎖(即使某些Redis實例根本
就沒有加鎖成功,防止某些節點獲取到鎖可是客戶端沒有獲得響應而致使接下來的一段時
間不能被從新獲取鎖)。
複製代碼

10寫不動了,區別 複合索引 mongodb索引類型有

默認建立的_id索引
單索引
複合索引
全文索引
地理空間索引
複製代碼

mongodb a b c複合索引,經過a b能找到嗎,面試官考察的應該是複合索引的prefix概念,

使用 compound 索引須要知足 prefix 原則
Index prefix 是指 index fields 的左前綴子集,考慮如下索引:
{ "item": 1, "location": 1, "stock": 1 }
複製代碼這個索引包含如下 index prefix:
{ item: 1 }
{ item: 1, location: 1 }
複製代碼因此只要語句知足 index prefix 原則都是能夠支持使用 compound index 的
複製代碼

因此a b知足a b c的前綴要求能夠查找到

11.進程線程區別 多進程相比較來講,進城之間獨立,比較可靠穩定,一個線程掛了就會致使整個進程掛掉。

騰訊網絡協議開發電話面試
1.grpc底層協議是怎麼實現的? 有抓過包嗎?
2.http2瞭解嗎? https和http有什麼區別?https具體怎麼加密的?
3.tcp的狀態機是什麼樣的?tcp三次握手?第一次握手發送syn包後socket處於什麼狀態? tcp流量控制和擁塞控制的區別?
4.MQTT報文格式?都有什麼主題?MQTT和websocket區別?MQTT輕量體如今哪裏?MQTT有心跳機制嗎?若是有一個連接長期不發數據還會一直保持連接嗎?
5.數據庫索引底層實現原理?(其中一種是B樹,B+樹)
6.多線程之間有哪些同步方法? (加鎖?)
7.malloc底層系統調用? (brk)

5.MongoDB 索引選擇B-樹,而 Mysql 索引選擇B+樹 mongodb專欄

7.看了一下,和stl差很少維護一個鏈表,而後也有整合之類的文章

天壤智能
1.sync.map 怎麼實現讀寫進程安全的?
2.restful用過?gin框架路由底層實現?
3.linux信號瞭解嗎?kill -9 pid -9是什麼,爲何用-9就能夠殺死進程?
4.進程之間如何通訊?
5.如何程序運行不中斷狀況下修改日誌打印級別?
6.我問了怎麼學操做系統?

1.說了兩個重要函數load store,load返回的參數2ok true表明找到這個鍵,false表明沒有找到, store沒有返回值

2.restful用了gin開源框架,Gin的路由實現使用了相似前綴樹的數據結構,只需遍歷一遍字符串便可,時間複雜度爲O(n) 這個我以前不知道,可是蒙對了,嘿嘿

3.當你執行一個"kill"命令,你實際上發送了一個信號給系統,讓它去終結不正常的應用,總共有60個你可使用的信號,可是基本上你只須要知道SIGTERM(15)和SIGKILL(9)。能夠用kill -l查看全部信號列表,
SIGTERM - 此信號請求一個進程中止運行。此信號是能夠被忽略的。進程能夠用一段時間來正常關閉,一個程序的正常關閉通常須要一段時間來保存進度並釋放資源。換句話說,它不是強制中止。
SIGKILL - 此信號強制進程馬上中止運行。程序不能忽略此信號,而未保存的進度將會丟失。

4.linux進程間通訊有6種方式

  • 消息隊列 在內核中建立一隊列,消息隊列能夠認爲是一個全局的一個鏈表,鏈表節點鐘存放着數據報的類型和內容,有消息隊列的標識符進行標記

  • 管道
    匿名管道:在內核中申請一塊固定大小的緩衝區,程序擁有寫入和讀取的權利,通常使用fork函數實現父子進程的通訊。
    命名管道FIFO:在內核中申請一塊固定大小的緩衝區,程序擁有寫入和讀取的權利,沒有血緣關係的進程也能夠進程間通訊。

  • 信號
    信號是比較複雜的通訊方式,用於通知接受進程有某種事件發生,除了用於進程間通訊外,進程還能夠發送信號給進程自己,linux kill -9 就是給進程發送一個信號

  • 信號量
    信號量是一個計數器,能夠用來控制多個進程對共享資源的訪問。它常做爲一種鎖機制,防止某進程正在訪問共享資源時,其餘進程也訪問該資源。所以,主要做爲進程間以及同一進程內不一樣線程之間的同步手段

  • 共享內存
    將同一塊物理內存一塊映射到不一樣的進程的虛擬地址空間中,實現不一樣進程間對同一資源的共享,共享內存是最快的 IPC 方式

  • socket通訊
    可用於不一樣機器之間的進程間通訊

總結 是一個計數器。信號量用於實現進程間的互斥與同步,而不是用於存儲進程間通訊數據

5.是第四個問題的延伸,我回答了能夠用一個http接口,設置修改程序內全局變量,日誌打印會查看全局變量的值,這樣作到動態更新配置。面試官說不想暴露接口在外面,因此就能夠用上面幾種進程通訊的方法,好比共享內存,找到共享內存的地址將裏面的值更新就能夠,只用幾行命令就能夠實現,但通常會寫個小程序,往共享內存更新數據

6.面試官人很好,給了不少意見,讓我看C++裏面用一個包epoll實現一臺機器10萬連接,網上能夠搜一臺機器10萬鏈接,go裏面也實現了epoll,還有nginx也是C寫的,實現機制也是select epoll poll 能夠看一下,redis集羣也能夠了解一下

B站直播開發

1.瞭解那些排序?排序穩定是指?那些排序算法是穩定的?
2.堆排序是怎麼實現的?一千萬個數找到第100大的數?
3.Mac地址和IP關係或者區別?
4.redis和memcached區別?redis數據結構瞭解嗎?ziplist數據結構是什麼樣的?
5.作一個簡單的會議室預訂系統,數據庫應該怎麼建表?怎麼查詢是否能夠約定某一時間段?
6.channel有幾種類型?
7.我問面試官對個人評價,建議?

1.穩定是相等數據的相對位置保持不變,堆排序,快速排序,選擇排序是不穩定的
2.堆排序從下到上建堆,找到第一百大的數,創建一個最大堆,根節點是100個數裏面最大值,每次跟根節點比較,若是比根節點大就直接扔掉,若是比根節點小就替換根節點,而後下溯,維持堆排序,直到找到比他大節點交換位置,直到葉節點,比完一千萬個數,這100個是全部數裏面最小的100個,根節點就是第100大的數

3.Mac地址是數據鏈路層及如下使用地址,IP是網絡層及以上使用地址,IP數據報放在Mac幀的數據部分,IP地址在數據鏈路層是看不到的,利用ARP協議找到IP地址對應的Mac地址
4.

redis mamcached
數據結構 豐富 string list set zset hash 簡單k-v類型
使用核 單核 多核
持久化 能夠持久化 不能夠
性能 適合小數據 100k以上的數據中,Memcached性能要高於Redis

redis總結

5.表裏面應該有 誰預約了哪一個房間 開始時間 結束時間 四個字段 查詢某個房間startTIME endTIME時間段有沒有預定 查詢語句應該是 開始時間《endTIME && 結束時間》startTIME 若是找到數據則說明已經有預定 6.channel有阻塞 無阻塞
7.會議室約定系統那裏能夠表現更好一點,通常面試這種題目很常見,讓你設計一個建議的系統,好比瀏覽器只須要輸入短網址就能夠自動替換成完整網址怎麼設計(用哈希映射)或者設計一個發號器保證數字全局惟一(41bit做爲毫秒數 10bit做爲機器編號 12bit做爲毫秒內序列號相似,機器編號確保不一樣主機號碼不一樣,毫秒數記錄確保同一機器不一樣毫秒號碼不一樣 毫秒內序列號確保贊成主機同一毫秒號碼不一樣)

b站 智能雲平臺 (一個半小時,最後尚未問我有什麼問題嗎 好變態哦)

1.gin 框架裏面路由像 A/B A/:B實際用的時候會處理的模糊,出現錯誤嗎?
2.怎麼應對高併發狀況?有什麼優化方法?
3.grpc爲何要用?有從性能方面考慮嗎?
4.linux文件格式瞭解嗎?
5.cgroup namespace瞭解嗎?
6.網絡三次握手?
7.linux一些命令 查找文件 內核版本 機器啓動時間 查看進程 CPU 端口號 查看DNS路由 文本查找某字段 截取文本字段
8.雙向鏈表?反轉鏈表實現思路?
9.二叉樹中序遍歷實現思路?
10.各類算法 以及複雜度?哪些不穩定?B站真的很喜歡問算法 感受說的算法種類還不夠多。他問我還有嗎? 快排,堆排具體怎麼實現的?

11.kubectl 各類命令 不知道的有kubectl edit kubectl create 怎麼查看一個deployment的yaml文件,kubectl get deployment -o yaml
k8S master節點裏面又有哪些組件?controllermanager 作什麼工做? scheduler分配pod給節點如何肯定給哪個節點?

12.docker 後端存儲格式哪些?直到shim嗎?docker相關cgroup namespace瞭解嗎? docker一些常見命令 查看容器信息 查看全部容器

13.git 經常使用命令 若是一些文件修改已經add到暫存區,怎麼回退?(git reset -hard HEAD^) 合併衝突怎麼解決? git rebase瞭解嗎?(將分叉的提交歷史變直)

1.gin有個缺點 :符號不支持路由排序,會認爲是路由衝突。 好比: 路由Get("/name")和 Get("/:id") ,通常來講,只要把Get("/name")放在Get("/:id")前面,就是不衝突的。路由模塊,會先嚐試匹配前面那個,沒匹配上,再去匹配後面的。gin會給出提醒,不讓編譯經過

2.應對高併發 )系統集羣化部署,分佈式部署,防止單機宕機,負載均衡流量分攤 )數據庫分庫分表 + 讀寫分離 分庫,機器請求數變少,讀寫分離也是 )緩存集羣引入,加快查詢熱數據速度 )引入消息中間件集羣,異步處理,減輕服務壓力

3.gRPC是由Google主導開發的RPC框架,使用HTTP/2協議並用Protobuf做爲序列化工具。與REST不一樣的是,REST是基於HTTP1.1 JOSN格式的一種輕量級服務模式,那麼從這兩方面來對比gRPC與REST就比較容易了。

首先能夠從JOSN與Protobuf之間的差異入手進行對比,Protobuf很難讀,它是面向機器的文字格式,而JOSN則是面向人的;Protobuf相對於JOSN而言編解碼速度都很是快;最後就是兼容性,如今基本全部瀏覽器都支持JOSN格式,而Protobuf目前僅部分語言支持。 HTTP/2 採用二進制格式傳輸數據,而非 HTTP 1.x的文本格式,二進制協議解析起來更高效

7.查看路由信息 traceroute 內核版本 uname 機器啓動時間 uptime cat /proc/uptime

黑鳳梨 電話面試
1.gin框架裏面中間件限流?
gin中間件兩大功能 限流 身份驗證
rate-limit 限流中間件,下面設定1qps,超過則報「服務繁忙,請稍後再試...

lmt := tollbooth.NewLimiter(1, nil)
lmt.SetMessage("服務繁忙,請稍後再試...")
複製代碼

2.mongodb索引哪些類型?怎麼提升查找性能?
默認,單,複合,地圖索引 加索引
3.sync.map怎麼實現線程安全的?
解釋

今日頭條

1.數組和切片有什麼區別?

a := make([]int,0,4)
	a=append(a,1)
	a=append(a,2)
	a=append(a,3)
	a=append(a,4)
	c := a[2:4]
	c[3]=5
	c=append(c,6)
	c=append(c,7)
	c=append(c,8)
	c=append(c,9)
	c[3]=6
	i := a[3]
	print(i)
複製代碼

以上題目a[3]爲多少?

媽的,挖坑讓我往裏跳,c[3]=5根本運行會出錯,c只有兩個元素,哪有第4個元素,頭條面試官真的壞! 主要考察點就是從一個切片建立出另外一個切片,二者會共享同一個底層數組,因此修改共享部分,另外一個切片也會感知到

2.redis爲何設計這麼多數據類型?若是讓你設計一個redis,應該怎麼作?
頭條面試果真水深,都是考理解力的,死記硬背不奏效 設計redis我說了底層用一個redisObject封裝每個鍵 值,用一個字典存儲全部的鍵值對,過時的也用一個字典存儲,expires 字典的鍵是一個指向dict 字典(鍵空間)裏某個鍵的指針,而字典的值則是鍵所指 向的數據庫鍵的到期時間,面試官問我按期刪除的時候去哪裏找,內存仍是磁盤?我說磁盤他說對

3.考了一個深度優先遍歷的算法題,相似於leetcode 200題島嶼數量

寒武紀
1.deployment 和 statefulset 有什麼區別?

在 Kubernetes 的世界中,ReplicaSet 和 Deployment 主要用於處理無狀態的服務,無狀態服務的需求每每很是簡單而且輕量,每個無狀態節點存儲的數據在重啓以後就會被刪除,雖然這種服務雖然常見,可是咱們仍然須要有狀態的服務來實現一些特殊的需求,StatefulSet 就是 Kubernetes 爲了運行有狀態服務引入的資源,例如 Zookeeper、Kafka 等 StatefulSet 會爲每一個 Pod 設置一個單獨的持久標識符,這些用於標識序列的標識符在發生調度時也不會丟失 它爲了解決有狀態服務的問題,它所管理的Pod擁有固定的Pod名稱,啓停順序 RC、Deployment、DaemonSet都是面向無狀態的服務,它們所管理的Pod的IP、名字,啓停順序等都是隨機的,而StatefulSet是什麼?顧名思義,有狀態的集合,管理全部有狀態的服務,好比MySQL、MongoDB集羣等。

2.damonset瞭解嗎?
DaemonSet 確保所有(或者某些)節點上運行一個 Pod 的副本。當有節點加入集羣時,也會爲他們新增一個 Pod 。 當有節點從集羣移除時,這些 Pod 也會被回收。刪除 DaemonSet 將會刪除它建立的全部 Pod

3.kubelet是幹什麼的?若是kubelet忽然掛掉了而後又重啓了,他是怎麼實現當前node狀態和想要狀態同樣呢?
4.算法題,一個一維數組,一個整型值target 求數組中全部元素和爲target的組合 1 1 2 3 4 5 target=5 [1,4] [1,1,3] [2,3] [5] 注意不能有相同數組,好比這裏兩個1 不能都和4組

思路:先排序 遍歷數組,以每個元素爲起點深度遍歷,遍歷時哈希去重,前面已經有該值做爲起點,則跳過,好比上面第2個1就不能做爲起點,由於前面的1已經把全部可能都遍歷過了

華爲南京研究所
1.C++中基類析構函數爲何是虛函數?
這樣作是爲了當用一個基類的指針刪除一個派生類的對象時,派生類的析構函數會被調用,若是基類析構函數不是虛函數,用一個基類指針指向派生類對象,delete時候不會調用派生類析構函數,可能形成內存泄露

2.若是git修改已經上傳到了遠程分支,怎麼取消

Git 撤銷已經 push 到遠端的 commit
狀況1:本地不須要回退(即讓遠端回退到本地的版本)
提交到遠端
git push origin <分支名> --force
狀況二:本地須要回退
先在本地回退到須要的版本
git reset --hard <須要回退到的版本號(只需輸入前幾位)>
版本號可用以下指令查看
git log remotes/origin/分支名
提交到遠端
git push origin <分支名> --force
複製代碼

3.給一個整型數組,求三數之和乘積最大?

思路:1排序 2最小兩個數和最大一個數的乘積  最大三個數的乘積 取二者最大值
複製代碼

探探
1.golang 和C++?

C++ golang
運行速度
變量初始化 變量前面要加類型名 簡短聲明
數組/切片 數組,固定長度 切片動態增加
支持泛型 支持 不支持
繼承/組合 繼承 組合

Go語言並不包括如異常處理、繼承、泛型、斷言、虛函數等功能,但增長了slice型、併發、管道、垃圾回收、接口(interface)等特性的語言

2.業務裏面爲何用mongodb不用mysql
MongoDB的靈活數據模型,文檔能夠靈活的添加刪除字段

3.golang內存管理?
Go中的內存管理機制,一個方面是內存池,另外一個方面是垃圾回收 關於內存池,先講一下stl裏面內存分配,而後golang裏面更復雜一點,分的更細, Go中爲每一個系統線程分配一個本地的MCache(前面介紹的結構體M中的MCache域),少許的地址分配就直接從MCache中分配,而且按期作垃圾回收,將線程的MCache中的空閒內存返回給全局控制堆,大對象直接從全局控制堆上以頁(4k)爲單位進行分配

Go語言中使用的垃圾回收使用的是標記清掃算法。進行垃圾回收時會stoptheworld。不過,在當前1.3版本中,實現了精確的垃圾回收和並行的垃圾回收,大大地提升了垃圾回收的速度,進行垃圾回收時系統並不會長時間卡住。

4.golang線程和Java線程不一樣? JVM 會爲每一個線程分配 1M 的棧,Go 的棧是動態分配大小的,隨着存儲數據的數量而增加和收縮, Goroutine 只有大約 4KB 的棧 由於 JVM 使用了操做系統線程,因此依賴操做系統內核來調度它們。當內核從一個線程切換至另外一個線程時,有不少的工做要作,golang用本身的調度器完成切換

5.redis 跳躍表怎麼插入數據?

6.redis裏面一些設計不少鍵的操做可能會花費不少時間,怎麼優化?

7.樂觀鎖,悲觀鎖?應用?

悲觀鎖
老是假設最壞的狀況,每次去拿數據的時候都認爲別人會修改,因此每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖(共享資源每次只給一個線程使用,其它線程阻塞,用完後再把資源轉讓給其它線程)。傳統的關係型數據庫裏邊就用到了不少這種鎖機制,好比行鎖,表鎖等,讀鎖,寫鎖等,都是在作操做以前先上鎖。Java中synchronized和ReentrantLock等獨佔鎖就是悲觀鎖思想的實現。
樂觀鎖
老是假設最好的狀況,每次去拿數據的時候都認爲別人不會修改,因此不會上鎖,可是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可使用版本號機制和CAS算法實現。樂觀鎖適用於多讀的應用類型,這樣能夠提升吞吐量,像數據庫提供的相似於write_condition機制,其實都是提供的樂觀鎖。在Java中java.util.concurrent.atomic包下面的原子變量類就是使用了樂觀鎖的一種實現方式CAS實現的
樂觀鎖適用於寫比較少的狀況下(多讀場景),即衝突真的不多發生的時候,這樣能夠省去了鎖的開銷,加大了系統的整個吞吐量。但若是是多寫的狀況,通常會常常產生衝突,這就會致使上層應用會不斷的進行retry,這樣反卻是下降了性能,因此通常多寫的場景下用悲觀鎖就比較合適

做者:SnailClimb
連接:https://juejin.im/post/5b4977ae5188251b146b2fc8
來源:掘金
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
複製代碼

騰訊 1.如何不使用額外空間交換兩個數的值?

方法1:

int a = 10;
int b = 20;
a = a^b;
b = b^a;
a = a^b;
這個方法用到了一個事實:任何數本身和本身異或(XOR)後等於0.
方法2:

int a = 10;
int b = 20;
a = a + b;
b = a - b;
a = a - b;

這兩種方法最好選用第一種,由於第二種會有溢出的狀況發生
————————————————
版權聲明:本文爲CSDN博主「beiyeqingteng」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://blog.csdn.net/beiyeqingteng/article/details/7105446
複製代碼

2.tcp傳輸中,ack爲何要取隨機值,不是一個固定值? 協議統一規定,防止一些不法分子掌握其中規律,傳遞非法數據回來

3.爲何要三次握手?

4.500萬個數找第100萬大的? -用最大堆,時間複雜度O(Nlogn) N=500萬 n=100萬 空間 o(n) n=100萬 -用bitmap,每一位表示一個數,若是是500萬里面的數則置1,最大值是2的32次方,則須要這些個位 時間O(N) 空間o(2的32次方位)換算一下除以8就是字節 -用快排的方式,找第100萬大的數,沒有找到就在左半部分或者有半部分查找,面試官說時間能夠達到O(N),可是我以爲這樣是O(NlgN),空間爲O(1)

5.一對夫妻有兩個小孩,其中一個是男孩,另外一個是女兒的機率是多少?
首先,兩個小孩機率上四中狀況,男男,女女,男女,女男,一個爲男生,排序女女狀況,還有三種狀況,其中兩種有女孩,因此2/3

魔門塔面試 挺難 1.C++ golang共同點

2.C++有的數據結構golang裏面有嗎

3.如何在golang裏面實現C++裏面的set,應該考慮那些問題?

4.redis插入數據api接口是什麼?

5.dockrfile裏面都有那些經常使用命令? endpoint 和 cmd 區別?

CMD 指令容許用戶指定容器的默認執行的命令。
此命令會在容器啓動且 docker run 沒有指定其餘命令時運行。
若是 docker run 指定了其餘命令,CMD 指定的默認命令將被忽略。
若是 Dockerfile 中有多個 CMD 指令,只有最後一個 CMD 有效
下面看看 CMD 是如何工做的。Dockerfile 片斷以下:
CMD echo "Hello world"
運行容器 docker run -it [image] 將輸出:
Hello world
但當後面加上一個命令,好比 docker run -it [image] /bin/bash,CMD 會被忽略掉,命令 bash 將被執行:
root@10a32dc7d3d3:/#

ENTRYPOINT 看上去與 CMD 很像,它們均可以指定要執行的命令及其參數。不一樣的地方在於 ENTRYPOINT 不會被忽略,必定會被執行,即便運行 docker run 時指定了其餘命令
ENTRYPOINT 中的參數始終會被使用,而 CMD 的額外參數能夠在容器啓動時動態替換掉。
好比下面的 Dockerfile 片斷:
ENTRYPOINT ["/bin/echo", "Hello"]  
CMD ["world"]
當容器經過 docker run -it [image] 啓動時,輸出爲:
Hello world
而若是經過 docker run -it [image] CloudMan 啓動,則輸出爲:
Hello CloudMan
複製代碼
相關文章
相關標籤/搜索