1. 程式人生 > >愛奇藝筆試面試題

愛奇藝筆試面試題

筆試題目主要側重於作業系統:

1.某完全二叉樹的總結點數為967,求葉子節點數?484

2.以下幾種方式都可以用於程序中執行緒的通訊,只能用於同一程序中的執行緒通訊為()

a.事件

b.訊號量

c.互斥量

d.臨界區

關於執行緒間通訊,涉及到同一程序內的所有執行緒通訊和不同程序的執行緒間通訊; 因為同一程序中的所有執行緒均可以訪問所有的全域性變數,因而全域性變數成為同一程序間多執行緒通訊的最簡單方式。但如何訪問全域性變數是多執行緒程式必須考慮的一個問題.而對於不同程序間執行緒通訊問題實質上就是程序間通訊問題。

在WIN32中,同步機制主要有以下幾種:
(1)事件(Event);(內)核心物件,多用於overlapped. 適用於不同程序的執行緒
(2)訊號量(semaphore);核心物件,無擁有者. 適用於不同程序的執行緒
(3)互斥量(mutex);:核心物件(內)核心物件,排他性物件,甚至適用於不同程序的執行緒.
(4)臨界區(Critical section)。:區域性物件,不是(內)核心物件,僅適用於同一個程序的不同執行緒.

3.磁碟利用率:RAID0 100% RAID5 80% > RAID6 (n-1/n)>RAID10 50%

4.

已有一個隨機數發生器,生成0的概率為p,生成1的概率為1-p,求如何利用這個隨機數發生器製作一個生成1~n的概率都是 1/n 的發生器

製作 1 2 發生概率都是 1 / 2 的發生器,連續發生2次,則發生00,11的概率為p*p,(1-p)(1-p),發生10,01的概率都為p(1-p),在發生10時返回1,發生01時返回2,則發生1,2的概率相等

製作 1 2 3 發生概率都是 1 / 3的發生器,連續發生3次,則發生001,010,100的概率都為p*p*(1-P),或者是110,101,011概率都為p*(1-p)*(1-p),則用001,010,100分別對應1,2,3返回,即可使得發生1,2,3的概率都為1/3

5.對12354進行排序,用哪種排序演算法最快?

a.快速排序

b.氣泡排序

c.merge sort

d.shell sort

6.記憶體越大,程式執行越快,怎麼理解?

虛擬記憶體將計算機的 RAM 和硬碟上的臨時空間組合在一起。當 RAM 執行速度緩慢時,虛擬記憶體將資料從 RAM 移動到稱為分頁檔案的空間中。將資料移入與移出分頁檔案可以釋放 RAM,以便計算機可以完成工作。計算機的 RAM 越多,程式執行得越快。如果計算機的速度由於缺少 RAM 而降低,則可以嘗試增加虛擬記憶體來進行補償。但是,計算機從 RAM 讀取資料的速度要比從硬碟讀取資料的速度快得多,因此增加 RAM 是更好的方法。

7.程式,程序和執行緒之間的聯絡,區別?

程序和程式區別和聯絡表現在以下方面: 
1)程式只是一組指令的有序集合,它本身沒有任何執行的含義,它只是一個靜態的實體。而程序則不同,它是程式在某個資料集上的執行。 程序是一個動態的實體,它有自己的生命週期。它因建立而產生,因排程而執行,因等待資源或事件而被處於等待狀態,因完成任務而被撤消。反映了一個程式在一定的資料集上執行的全部動態過程。

2)程序和程式並不是一一對應的,一個程式執行在不同的資料集上就成為不同的程序,可以用程序控制塊來唯一地標識每個程序。而這一點正是程式無法做到的,由於程式沒有和資料產生直接的聯絡,既使是執行不同的資料的程式,他們的指令的集合依然是一樣的,所以無法唯一地標識出這些運行於不同資料集上的程式。一般來說,一個程序肯定有一個與之對應的程式,而且只有一個。而一個程式有可能沒有與之對應的程序(因為它沒有執行),也有可能有多個程序與之對應(執行在幾個不同的資料集上)。

3)程序還具有併發性和交往性,這也與程式的封閉性不同。

----------------------------------------------------------------------------------------------

程序和執行緒都是由作業系統所體會的程式執行的基本單元,系統利用該基本單元實現系統對應用的併發性。程序和執行緒的區別在於: 
簡而言之,一個程式至少有一個程序,一個程序至少有一個執行緒.

執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。

另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。

執行緒在執行過程中與程序還是有區別的。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。

從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別。


程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位.

執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),但是它可與同屬一個程序的其他的執行緒共享程序所擁有的全部資源.

一個執行緒可以建立和撤銷另一個執行緒;同一個程序中的多個執行緒之間可以併發執行.

8.大小端和堆疊生長方向判斷

10.什麼叫死鎖?死鎖發生的必要條件?如何預防?

死鎖的規範定義:集合中的每一個程序都在等待只能由本集合中的其他程序才能引發的事件,那麼該組程序是死鎖的。

死鎖的四個必要條件

互斥條件(Mutual exclusion):資源不能被共享,只能由一個程序使用。
請求與保持條件(Hold and wait):已經得到資源的程序可以再次申請新的資源。
非剝奪條件(No pre-emption):已經分配的資源不能從相應的程序中被強制地剝奪。
迴圈等待條件(Circular wait):系統中若干程序組成環路,該環路中每個程序都在等待相鄰程序正佔用的資源。

處理死鎖的基本方法  在系統中已經出現死鎖後,應該及時檢測到死鎖的發生,並採取適當的措施來解除死鎖。目前處理死鎖的方法可歸結為以下四種:

  1) 預防死鎖。

  這是一種較簡單和直觀的事先預防的方法。方法是通過設定某些限制條件,去破壞產生死鎖的四個必要條件中的一個或者幾個,來預防發生死鎖。

  2) 避免死鎖。

  該方法同樣是屬於事先預防的策略,但它並不須事先採取各種限制措施去破壞產生死鎖的的四個必要條件,而是在資源的動態分配過程中,用某種方法去防止系統進入不安全狀態,從而避免發生死鎖。

  3)檢測死鎖。

  這種方法並不須事先採取任何限制性措施,也不必檢查系統是否已經進入不安全區,此方法允許系統在執行過程中發生死鎖。但可通過系統所設定的檢測機構,及時地檢測出死鎖的發生,並精確地確定與死鎖有關的程序和資源,然後採取適當措施,從系統中將已發生的死鎖清除掉。

  4)解除死鎖。

  這是與檢測死鎖相配套的一種措施。當檢測到系統中已發生死鎖時,須將程序從死鎖狀態中解脫出來。常用的實施方法是撤銷或掛起一些程序,以便回收一些資源,再將這些資源分配給已處於阻塞狀態的程序,使之轉為就緒狀態,以繼續執行。死鎖的檢測和解除措施,有可能使系統獲得較好的資源利用率和吞吐量,但在實現上難度也最大。

---------------------------------------------------------------------------------------------------------------------------

排序:

1,快排的思想

2,10000個數取前50,用哪種排序

shell:

1,檢視程序

2,產看磁碟空間

3,vi查詢並且替換的命令

程式設計:

1,用const還是巨集

2,c中static作用:

附:static作用:

1. static 變數  靜態變數的型別說明符是static靜態變數當然是屬於靜態儲存方式,但是屬於靜態儲存方式的量不一定就是靜態變數。例如外部變數雖屬於靜態儲存方式,但不一定是靜態變數,必須由static加以定義後才能成為靜態外部變數,或稱靜態全域性變數。2. 靜態區域性變數  靜態區域性變數屬於靜態儲存方式,它具有以下特點:(1)靜態區域性變數在函式內定義它的生存期為整個源程式,但是其作用域仍與自動變數相同,只能在定義該變數的函式內使用該變數。退出該函式後,儘管該變數還繼續存在,但不能使用它。(2)允許對構造類靜態區域性量賦初值例如陣列,若未賦以初值,則由系統自動賦以0值。(3)對基本型別的靜態區域性變數若在說明時未賦以初值,則系統自動賦予0值。而對自動變數不賦初值,則其值是不定的。根據靜態區域性變數的特點,可以看出它是一種生存期為整個源程式的量。雖然離開定義它的函式後不能使用,但如再次呼叫定義它的函式時,它又可繼續使用,而且儲存了前次被呼叫後留下的值。因此,當多次呼叫一個函式且要求在呼叫之間保留某些變數的值時,可考慮採用靜態區域性變數。雖然用全域性變數也可以達到上述目的,但全域性變數有時會造成意外的副作用,因此仍以採用區域性靜態變數為宜。3.靜態全域性變數

全域性變數(外部變數)的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別雖在於非靜態全域性變數的作用域是整個源程式,當一個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。而靜態全域性變數則限制了其作用域,即只在定義該變數的原始檔內有效,在同一源程式的其它原始檔中不能使用它。由於靜態全域性變數的作用域侷限於一個原始檔內,只能為該原始檔內的函式公用,因此可以避免在其它原始檔中引起錯誤。從以上分析可以看出,把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域性變數改變為靜態變數後是改變了它的作用域,限制了它的使用範圍。因此static 這個說明符在不同的地方所起的作用是不同的。