阿里-測試工程師面試題目記錄
阿里面試題目記錄2018-10-09
題目一:
linux如何實現凌晨定時執行指令碼?
Linux中,週期執行的任務一般由cron這個守護程序來處理。cron讀取一個或多個配置檔案,這些配置檔案中包含了命令列及其呼叫時間。cron的配置檔案稱為“crontab”,是“cron table”的簡寫。
題目二:
java如何實現多執行緒?執行緒的狀態有哪些?
java實現多執行緒有兩種方法
1、繼承Thread類
2、實現Runnable介面
這兩種方法的共同點:
不論用哪種方法,都必須用Thread(如果是Thead子類就用它本身)產生執行緒,然後再呼叫start()方法。
兩種方法的不同點:
1、繼承Thread類有一個缺點就是單繼承,而實現Runnable介面則彌補了它的缺點,可以實現多繼承
2、繼承Thread類必須如果產生Runnable例項物件,就必須產生多個Runnable例項物件,然後再用Thread產生多個執行緒;而實現Runnable介面,只需要建立一個實現這個類的例項,然後用這一個例項物件產生多個執行緒。即實現了資源的共享性
執行緒共有6種狀態:
NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED
分別對應於
新建、執行、阻塞、等待、帶超時的等待、終止
題目三:
如何做能保證執行緒安全?(程序安全是什麼?)
執行緒安全
一般說來,確保執行緒安全的方法有這幾個:
競爭與原子操作、同步與鎖、可重入、過度優化。
競爭與原子操作
多個執行緒同時訪問和修改一個數據,可能造成很嚴重的後果。出現嚴重後果的原因是很多操作被作業系統編譯為彙編程式碼之後不止一條指令,因此在執行的時候可能執行了一半就被排程系統打斷了而去執行別的程式碼了。一般將單指令的操作稱為原子的(Atomic),因為不管怎樣,單條指令的執行是不會被打斷的。
因此,為了避免出現多執行緒操作資料的出現異常,Linux系統提供了一些常用操作的原子指令,確保了執行緒的安全。但是,它們只適用於比較簡單的場合,在複雜的情況下就要選用其他的方法了。
同步與鎖
為了避免多個執行緒同時讀寫一個數據而產生不可預料的後果,開發人員要將各個執行緒對同一個資料的訪問同步,也就是說,在一個執行緒訪問資料未結束的時候,其他執行緒不得對同一個資料進行訪問。
同步的最常用的方法是使用鎖(Lock),它是一種非強制機制,每個執行緒在訪問資料或資源之前首先試圖獲取鎖,並在訪問結束之後釋放鎖;在鎖已經被佔用的時候試圖獲取鎖時,執行緒會等待,直到鎖重新可用。
二元訊號量是最簡單的一種鎖,它只有兩種狀態:佔用與非佔用,它適合只能被唯一一個執行緒獨佔訪問的資源。對於允許多個執行緒併發訪問的資源,要使用多元訊號量(簡稱訊號量)。
可重入
一個函式被重入,表示這個函式沒有執行完成,但由於外部因素或內部因素,又一次進入該函式執行。一個函式稱為可重入的,表明該函式被重入之後不會產生任何不良後果。可重入是併發安全的強力保障,一個可重入的函式可以在多執行緒環境下放心使用。
過度優化
在很多情況下,即使我們合理地使用了鎖,也不一定能夠保證執行緒安全,因此,我們可能對程式碼進行過度的優化以確保執行緒安全。
我們可以使用volatile關鍵字試圖阻止過度優化,它可以做兩件事:第一,阻止編譯器為了提高速度將一個變數快取到暫存器而不寫回;第二,阻止編譯器調整操作volatile變數的指令順序。
在另一種情況下,CPU的亂序執行讓多執行緒安全保障的努力變得很困難,通常的解決辦法是呼叫CPU提供的一條常被稱作barrier的指令,它會阻止CPU將該指令之前的指令交換到barrier之後,反之亦然。
題目四:
查詢資料庫比較慢可能是哪些原因造成的?
1、沒有索引或者沒有用到索引(這是查詢慢最常見的問題,是程式設計的缺陷)
2、I/O吞吐量小,形成了瓶頸效應。
3、沒有建立計算列導致查詢不優化。
4、記憶體不足
5、網路速度慢
6、查詢出的資料量過大(可以採用多次查詢,其他的方法降低資料量)
7、鎖或者死鎖(這也是查詢慢最常見的問題,是程式設計的缺陷)
8、sp_lock,sp_who,活動的使用者檢視,原因是讀寫競爭資源。
9、返回了不必要的行和列
10、查詢語句不好,沒有優化