天天看點

電話面試1 20160323_1916_18min1、什麼是虛拟記憶體?2、debug斷點的原理3、程序和線程的差別4、MFC handler作用5、矩陣鍵盤6、序列槽通信是一對多的嗎7、序列槽通信的話怎麼校驗?8、TCP/IP協定三次握手,四次揮手9、不同系統的位元組序知道嗎

1、什麼是虛拟記憶體?

(以下答案摘自hfm_honey學習樂園)

實體記憶體,在應用中,自然是顧名思義,實體上,真實的插在闆子上的記憶體是多大就是多大了。而在CPU中的概念,實體記憶體就是CPU的位址線可以直接進行尋址的記憶體空間大小。比如8086隻有20根位址線,那麼它的尋址空間就是1MB,我們就說8086能支援1MB的實體記憶體,即使我們安裝了128M的記憶體條在闆子上,我們也隻能說8086擁有1MB的實體記憶體空間。同理我們現在大部分使用的是32位的機子,32位的386以上CPU就可以支援最大4GB的實體記憶體空間了。

先說說為什麼會有虛拟記憶體和實體記憶體的差別。正在運作的一個程序,他所需的記憶體是有可能大于記憶體條容量之和的,比如你的記憶體條是256M,你的程式卻要建立一個2G的資料區,那麼不是所有資料都能一起加載到記憶體(實體記憶體)中,勢必有一部分資料要放到其他媒體中(比如硬碟),待程序需要通路那部分資料時,在通過排程進入實體記憶體。是以,虛拟記憶體是程序運作時所有記憶體空間的總和,并且可能有一部分不在實體記憶體中,而實體記憶體就是我們平時所了解的記憶體條。有的地方呢,也叫這個虛拟記憶體為記憶體交換區。關鍵的是不要把虛拟記憶體跟真實的插在主機闆上的記憶體條相挂鈎,虛拟記憶體它是“虛拟的”不存在,假的啦,它隻是記憶體管理的一種抽象!

那麼,什麼是虛拟記憶體位址和實體記憶體位址呢。假設你的計算機是32位,那麼它的位址總線是32位的,也就是它可以尋址0~0xFFFFFFFF(4G)的位址空間,但如果你的計算機隻有256M的實體記憶體0x~0x0FFFFFFF(256M),同時你的程序産生了一個不在這256M位址空間中的位址,那麼計算機該如何處理呢?回答這個問題前,先說明計算機的記憶體分頁機制。

計算機會對虛拟記憶體位址空間(32位為4G)分頁産生頁(page),對實體記憶體位址空間(假設256M)分頁産生頁幀(page frame),這個頁和頁幀的大小是一樣大的,是以呢,在這裡,虛拟記憶體頁的個數勢必要大于實體記憶體頁幀的個數。在計算機上有一個頁表(page table),就是映射虛拟記憶體頁到實體記憶體頁的,更确切的說是頁号到頁幀号的映射,而且是一對一的映射。但是問題來了,虛拟記憶體頁的個數大于實體記憶體頁幀的個數,豈不是有些虛拟記憶體頁的位址永遠沒有對應的實體記憶體位址空間?不是的,作業系統是這樣處理的。作業系統有個頁面失效(page fault)功能。作業系統找到一個最少使用的頁幀,讓他失效,并把它寫入磁盤,随後把需要通路的頁放到頁幀中,并修改頁表中的映射,這樣就保證所有的頁都有被排程的可能了。這就是處理虛拟記憶體位址到實體記憶體的步驟。

現在來回答什麼是虛拟記憶體位址和實體記憶體位址。虛拟記憶體位址由頁号(與頁表中的頁号關聯)和偏移量組成。頁号就不必解釋了,上面已經說了,頁号對應的映射到一個頁幀。那麼,說說偏移量。偏移量就是我上面說的頁(或者頁幀)的大小,即這個頁(或者頁幀)到底能存多少資料。舉個例子,有一個虛拟位址它的頁号是4,偏移量是20,那麼他的尋址過程是這樣的:首先到頁表中找到頁号4對應的頁幀号(比如為8),如果頁不在記憶體中,則用失效機制調入頁,否則把頁幀号和偏移量傳給MMU(CPU的記憶體管理單元)組成一個實體上真正存在的位址,接着就是通路實體記憶體中的資料了。總結起來說,虛拟記憶體位址的大小是與位址總線位數相關,實體記憶體位址的大小跟實體記憶體條的容量相關。

最後我自己來總結一下:

1)對計算機而言,實體記憶體的大小即主機闆上插着的記憶體條的大小;對CPU而言,的實體記憶體的大小即CPU上位址線可尋址的大小。

2)虛拟記憶體即某個程式運作時所建立的資料區,它的大小可能大于實體記憶體,它是一種記憶體管理上的抽象。

3)由于虛拟記憶體很可能大于實體記憶體,是以作業系統使用一種記憶體分頁機制,将虛拟記憶體分成多個頁(page),将實體記憶體分成多個頁幀(page frame),頁和頁幀的大小相同。現使用的虛拟記憶體頁将會通過頁表(page table)映射到實體記憶體頁幀上,顯然實時映射的範圍最大隻能是實體記憶體的大小範圍。如果現需使用的某個虛拟記憶體頁沒有處于這個映射當中,則作業系統使某個使用較少的頁幀失效,并将該頁幀的内容存入其他媒介當中(比如磁盤),然後在該頁幀的實體記憶體和需要空間的虛拟記憶體頁映射起來。

4)虛拟記憶體位址由頁号(與頁表中的頁号關聯)和偏移量組成。

2、debug斷點的原理

每生成一個斷點相當于插入一個int 3彙編指令,調試時,程式遇到這條指令後則會停在那裡,将相關變量傳給調試線程。

3、程序和線程的差別

線程是指程序内的一個執行單元,也是程序内的可排程實體.

與程序的差別:

(1)位址空間:線程是程序内的一個執行單元;程序至少有一個線程;它們共享程序的位址空間;而程序有自己獨立的位址空間;

(2)資源擁有:程序是資源配置設定和擁有的機關,同一個程序内的線程共享程序的資源(記憶體資源);

(3)線程是處理器排程的基本機關,但程序不是;

4)二者均可并發執行;

4、MFC handler作用

句柄,像水杯的杯柄一樣,獲得了某個對象的句柄,即可對這個對象進行相關操作。

5、矩陣鍵盤

行選,列選

6、序列槽通信是一對多的嗎

序列槽可以異步全雙工通信,可以一對多

7、序列槽通信的話怎麼校驗?

兩台裝置之間的校驗,可以通過像三次握手一樣發送應答;收到的資料是否正确,可以通過奇偶校驗,也可以預定好一個校驗公式,在發送資料時插入到資料尾,然後收資料時根據資料來算一這個校驗公式,然後将結果和資料位的結果對比。

8、TCP/IP協定三次握手,四次揮手

參見我的一篇部落格戲說 TCP 三次握手 四次揮手

9、不同系統的位元組序知道嗎

不同cpu不同作業系統的位元組序不同,網絡位元組序為大端位元組序,即高位資料在低位位址,低位資料在高位位址。

使用htons,可以将一個unsigned short型資料的主機位元組序換成網絡位元組序,如果這個主機位元組序是小端位元組序,則htons會進行轉換成大端位元組序,如果這個主機位元組序本身是大端位元組序,也htons函數會被定義成空。

繼續閱讀