面試筆試題整理

面試筆試題整理

1、乘客在公交車站等車,有兩路公交車A和B,A車十分鐘一趟,B車五分鐘一趟,兩種車沒有任何相關性,求顧客的平均等待時間。

(1)每5分鐘來輛A車,每10分鐘來輛B車,平均下來每10分鐘可來3輛車,於是平均等待時間爲10/3=3分20秒。 (2)概率密度的方法,不贅述。

2、有一個字符串s,和一個哈希表m,哈希表包含一些單詞。判斷字符串能不能被哈希表裏邊的單詞完全分割。例如string s = "dogandcat",m=[dog, and, cat],s可以被m完全分割。但如果s1="qwerfda",就不行。

3、介紹一下TCP四次揮手

因爲TCP連接是全雙工通信,斷開連接時,兩邊都需要發送FIN並回發ACK。

4、堆和棧的區別是什麼?

棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。在Windows下,棧是向低地址擴展的數據結 構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是 一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。

堆區(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收。堆是向高地址擴展的數據結構,是不連續的內存區域。windows和linux對堆的管理方式可能完全不一樣。堆的大小受限於計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。

在C++中,內存分成5個區,他們分別是堆(new)、棧、自由存儲區(malloc)、全局/靜態存儲區和常量存儲區。

5、進程切換的時候操作系統會做哪些事情?

6、進程之間的通信方法都有哪些?

7、死鎖的條件

8、網絡調用裏的select和epoll

9、大概說一下OOP的多態機制。

10、C++裏的多態怎麼實現的

(主要是虛函數相關的內容)

11、用兩種方式將.π、65536、"ABCDEFG"這三個值連續寫到磁盤文件上,一種是文本方式,一種是二進制方式,問文件的大小分別是多少。

12、樂觀鎖、悲觀鎖

這兩兄弟是針對向數據庫寫數據來說的。一般寫數據的過程是讀出數據,處理後再寫進去。

對於樂觀鎖來說,讀出時判斷數據版本號,寫入時再判斷數據版本號有沒有變。一般是在應用程序層面實現的。

對於悲觀鎖來說,從讀出時就鎖上數據,防止其他人寫數據,其他讀數據的請求需要等待,寫入後放開鎖。

13、蓄水池抽樣

https://blog.csdn.net/huagong_adu/article/details/7619665

我們總是選擇第一個對象,以1/2的概率選擇第二個,以1/3的概率選擇第三個,以此類推,以1/m的概率選擇第m個對象。當該過程結束時,每一個對象具有相同的選中概率,即1/n。

14、讀者寫者問題

https://blog.csdn.net/cz_hyf/article/details/4443551

模型:

有一些讀者線程和寫者線程要訪問資源。

要求:

臨界區內讀寫互斥,寫寫互斥。

額外知識:

記錄型信號量semaphore的wait操作(P操作)和signal操作(V操作)是原子化操作。

wait操作是指如果信號量的值等於0,那麼等待,直到信號量變回正數,就給它減1,繼續執行後面操作。

signal操作是指信號量加1。

方案:

(1)讀者優先:有讀者進入臨界區後,阻塞寫者進入;有寫者進入臨界區後,阻塞讀者和寫者進入。

semaphore fmutex=1, rdcntmutex=1;
//fmutex --> access to file; rdcntmutex --> access to readcount
int readcount = 0;
//每個讀者線程跑這個函數
void reader(){
    while(1){
        wait(rdcntmutex);
        if(0 == readcount)wait(fmutex);
        readcount = readcount + 1;
        signal(rdcntmutex);

        //Do read operation ...

        wait(rdcntmutex);
        readcount = readcount - 1;
        if(0 == readcount)signal(fmutex);
        signal(rdcntmutex);
    }
}
//每個寫者線程跑這個函數
void writer(){
    while(1){
        wait(fmutex);
        //Do write operation ...
        signal(fmutex);
    }
}

(2)寫者優先:增加個隊列。寫者進入隊列時會阻塞後面讀者進入隊列,等待此時臨界區所有讀者讀完後寫者一個一個進入臨界區。如果隊列裏沒有寫者後,允許讀者進入。

semaphore fmutex=1, rdcntmutex=1, wtcntmutex=1, queue=1;
//fmutex --> access to file; rdcntmutex --> access to readcount
//wtcntmutex --> access to writecount
int readcount = 0, writecount = 0;
void reader(){
    while(1){
        wait(queue);
        wait(rdcntmutex);
        if(0 == readcount)wait(fmutex);
        readcount = readcount + 1;
        signal(rdcntmutex);
        signal(queue);
        //Do read operation ...
        wait(rdcntmutex);
        readcount = readcount - 1;
        if(0 == readcount)signal(fmutex);
        signal(rdcntmutex);
    }
}
void writer(){
    while(1){
        wait(wtcntmutex);
        if(0 == writecount)wait(queue);
        writecount = writecount + 1;
        signal(wtcntmutex);
        wait(fmutex);
        //Do write operation ...
        signal(fmutex);
        wait(wtcntmutex);
        writecount = writecount - 1;
        if(0 == writecount)signal(queue);
        signal(wtcntmutex);
    }
}

從實現上來說,增加了queue信號量,寫者隊列有成員就會一直佔着queue信號量。讀者如果想要進入讀者隊列(即讓readcount自增),需要獲得queue信號量。

(3)公平競爭:寫者進入隊列時會阻塞後面讀者和寫者進入隊列。等此時臨界區所有讀者讀完後,隊列裏唯一一個寫者進入臨界區。然後隊列就可以再隨機進讀者或者寫者。

semaphore fmutex=1, rdcntmutex=1, queue=1;
//fmutex --> access to file; rdcntmutex --> access to readcount
int readcount = 0;
void reader(){
    while(1){
        wait(queue);
        wait(rdcntmutex);
        if(0 == readcount)wait(fmutex);
        readcount = readcount + 1;
        signal(rdcntmutex);
        signal(queue);
        //Do read operation ...
        wait(rdcntmutex);
        readcount = readcount - 1;
        if(0 == readcount)signal(fmutex);
        signal(rdcntmutex);
    }
}
void writer(){
    while(1){
        wait(queue);
        wait(fmutex);
        signal(queue);
        //Do write operation ...
        signal(fmutex);
    }
}

15、進程同步的幾種方式

信號量:一般是記錄型信號量 管程:管程是由一個或多個過程、一個初始化序列和局部數據組成的軟件模塊。在任何時候,只能有一個進程在管程中執行,調用管程的任何其他進程都被阻塞,以等待管程可用。 消息傳遞:源進程通過send(destination,message)發送消息,目的進程通過receive(source,message)接收消息。

網絡整理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章