1. 我問一下Windows方面的問題,安全性方面的。帳戶登入Windows後,個人資訊是怎樣被載入到進程中的,是怎麼實現的? Windows資源分派和執行的最小單位是什嗎?檔案夾的許可權是什麼時候、怎樣被確定的,Windows是怎麼實現這個許可權的?
第一個問題就傻眼,我只回答了,資源分派的最小單位是進程,執行的最小單位是線程,不知道對不對(關於(1)系統與進程、(2)進程和線程的關係,我在想是不是可以這樣來類比:(1)的關係就像(2)的關係;一個系統裡可以同時進行N多個進程,一個進程有N>=1個線程。)
這裡我自然而來又想到另外一個問題,到底什麼是進程同步,什麼是線程同步,進程同步和線程同步有什麼區別?
這個問題中的其它子問題我一概不知,請賜教。
2. 聽說過Kerberos嗎?是什麼東西?用來幹什麼的?
沒有聽說過。網上查過之後,說是什麼用來加密的,對稱式加密什麼的,不是很懂。
3. 什麼是Fiber?
Fiber是光纖的意思(我是念物理的,我估計面試官那時已經FT了)。
Fiber是纖程,是UNIX裡的一些概念,類似於Windows裡面的線程,但是要把代碼從UNIX移植到Windows裡面時,需要進行ConvertThreadToFiber的轉換(這是書上看來的,我就覺得奇怪了,為什麼不是ConvertFiberToThread? 因為是從UNIX移植到Windows!)
4. 怎樣在一個單向鏈表的當前指標前面插入一個結點?
我就奇了怪了,怎麼可能在單向鏈表中的當前指標前面插入一個結點呢,我看的資料結構的書上,是同時記住兩個指標的,一個是currPtr(當前指標),另一個是prevPtr,所以這樣是很容易辦到的。但是面試官要求就一個當前指標,這可怎麼操作啊?可能是我理解錯了,或者是他要什麼答案。我當時回答時,只說了從head一個個找直到找到當前head為此(其實這樣也是要使用prevPtr的)
5. 在User Mode時,調用Windows API, 就轉入了Kernel層面,請問有些什麼變化?
什麼什麼變化啊?什麼叫做User Mode,什麼叫做Kernel層面啊?
6. 你知道try catch這些東西的嵌套使用嗎?怎樣使用,應注意些什嗎?
不知道。從來沒有用try catch.可能平常寫的都是小程式,也用不著,所以當時就載了,因為不懂錯誤處理的面試者,面試官看了肯定亂搖頭。估計他又FT了。
7. 一個已經編譯的程式在運行時,怎樣對它進行調試?
編譯好了脫離了編譯器而運行了,還能調試嗎?我FT了。
8. 在調試一個迴圈時,如果設定斷點,那麼每次進入迴圈碰到這個斷點都會停下來,當然可以在裡面設定監視變數,但是這樣做修改了原始碼,請問有什麼辦法嗎?
還真沒有這麼調試過,我都是直接設定監視變數的。用assert()?
9. C/C++中有兩套動態分配:(1)malloc() free() (2)new delete 請問能互動使用嗎,要注意些什麼,你能作些什麼評論嗎?
FT,我的原則是用了malloc就一要用free來釋放,用了new就用delete,這個應該總歸沒有錯的吧?這兩個的唯一區別是,在使用抽象類別型Class時,前者不會調用Constructor/Destructor,而後者會。我還能作些什麼評論呢?
10. 用free可不可以翻譯鏈表記憶體?
不可以,但是我知道只是這樣回答應該是不對的。我又說,如果只是free(head)了,那麼只是把頭結點給釋放了,其它後面所有的結點記憶體還是在的,但是它們由於頭結點的丟失而永遠不會被retrieve到了。(這個就是記憶體流失的一種吧?)
如果確實要用free來釋放鏈表記憶體的話,就應該遍曆鏈表,釋放每個結點。
11. 我們在定義一個函數時:
type f(arglist...)
{
/*
編譯器會在這裡加些什嗎?
*/
int a, b;/* 程式員定義一些函數體現內的變數 */
char x, y;
....
return;
/*
編譯器會在這裡又加些什嗎?
*/
}
我其實是不懂他要問些什麼。我只知道,從main()過來執行f()時,要進行f參數的初始化(副本Copy),退出時撤銷內建變數和副本Copy。編譯器還做些什麼呢?
12. C/C++編譯器對沒有初始化的記憶體地區是怎樣處理的,有哪些初始化工作?(實際上是進行了初始化,請問有哪幾種)
這個我倒真是不知道,我就隨便說了,我看到過一個沒有初始化的變數用來輸出調試時,會看到0xcccccccc。面試官說這幾是其中一種,請問還有其它的嗎?我說不知道。
13. 多個檔案中的全域變數是什麼時候定義、分配空間和初始化?
這個東西我不知道怎麼回答,我只知道全域變數是跟static變數是分配在同一記憶體類型地區中的。
(以下填目是我面試歸來自己想出來的,覺得很重要,但是網上又搜尋不到很直接很通俗的答案,非常消耗時間,請大家幫幫忙)
14. C中的static與C++中的static有什麼區別?
15. vtable的基本原理?
16. C/C++和C#中的Class與Struct的區別有什麼不同?
17. 國安字型檔中共有91251個漢字,那麼Unicode裡是怎樣表示這些漢字的呢,因為兩位元組(65536個組合)根本就不夠用?Linux裡用UTF-8肯定是可以的,Windows裡是怎麼實現的?我一直沒有明白為什麼會用Unicode來表示世界上所有的文字,再怎麼蠢的設計師也應該知道字型檔要擴充的,再說MS裡總歸用中國人吧,是中國人總歸應該知道所有的漢字是不能只用兩個位元組的Unicode表示的。
18. 指標操作時,比方說定義了一個指標:
type* p;
那麼執行:
p++;
就會使p移動sizeof(type)個位元組。
我就在想了,系統是怎麼知道要移動這麼些個位元組的?肯定是在記憶體的某些地方記住了這個指標的類型,請問在哪裡記住的呢? 是不是程式一開始運行就有一張表記住了每個變數的屬性?
這個其實是跟定義一個非指標變數也是同樣的:
int x;
系統是怎麼知道要取4個位元組呢(32位機)
19. 磁碟分割的FAT32(NTFS又是幾位的呢) vs. 物理CPU的32位 vs. 作業系統核心的32位它們之間有什麼聯絡?
20. 微軟會不會在以後的作業系統中用UTF-8呢?基於相容性和商業市場操作,可能不太會吧?
21. 現在兩種結構體:
typedef struct _S1
{
int x;
char y;
char z;
}S1;
typedef struct _S2
{
char x;
int y;
char z;
}S2;
sizeof(S1) = ?
sizeof(S2) = ?
答案:
sizeof(S1) = 8
sizeof(S2) = 8
我的問題是到底是怎樣對齊的,空位元組的地方的值是什麼呢,有初始化嗎?
typedef struct _TEST
{
char x1;
short x2;
float x3;
char x4;
}TEST;
sizeof(TEST)又是多少呢?(答案12)
22. malloc()是怎樣實現的?我看過VS6中的原始碼,實在是太複雜了,看不懂,能講講思路嗎?
23. 怎樣測試一台Coke Machine(這是我電話面試時的一個問題)?有哪些Test Cases?
24. 作業系統中PV操作的問題,請問怎樣來確定是互斥還是同步?PV操作的順序怎樣來排放和確定?應該設定幾個訊號量?怎樣來設定?請用通俗的語言回答。這裡:
http://www.ahtvu.ah.cn/jxc1/zhykch/5103/kc2.htm
可能已經講得很清楚了,可是我還是不懂?五哲學家進餐的問題我還是沒有搜到稱心如意的解釋,疑問重重。請幫幫我吧。
引申的問題:進程同步和線程同步到底有什麼區別?
Q. 我問一下Windows方面的問題,安全性方面的。帳戶登入Windows後,個人資訊是怎樣被載入到進程中的,是怎麼實現的? Windows資源分派和執行的最小單位是什嗎?檔案夾的許可權是什麼時候、怎樣被確定的,Windows是怎麼實現這個許可權的?
A: 主要由winlogon.exe進程負責載入使用者資訊,windows資源分派和執行的最小單位是頁(page), 檔案夾的許可權由系統控制代碼掛鈎,詳見Native API - NtQueryInforamtionFile
Q. 聽說過Kerberos嗎?是什麼東西?用來幹什麼的?
A. 安全性憑證加密驗證.參見<<Windows 2000分布式管理>>
Q. 什麼是Fiber?
A. 纖程. 參見 <<Windows 核心編程>>
Q. 在User Mode時,調用Windows API, 就轉入了Kernel層面,請問有些什麼變化?
A. 主要變化是在User mode下訪問記憶體是受OS保護的32/64位虛擬位址, 而在核心層是不受保護的實模式.
Q. 你知道try catch這些東西的嵌套使用嗎?怎樣使用,應注意些什嗎?
A. 異常捕獲需要注意的是分清楚結構化異常(例如, 被零除)還是win32異常.特別注意的是堆棧的處理, 詳見<<C++ Primer>>
Q. 一個已經編譯的程式在運行時,怎樣對它進行調試?
A. WinDbg.exe, SoftICE, etc.
Q. 在調試一個迴圈時,如果設定斷點,那麼每次進入迴圈碰到這個斷點都會停下來,當然可以在裡面設定監視變數,但是這樣做修改了原始碼,請問有什麼辦法嗎?
A. Visual C++ IDE提供了條件斷點設定.
Q. C/C++中有兩套動態分配:(1)malloc() free() (2)new delete 請問能互動使用嗎,要注意些什麼,你能作些什麼評論嗎?
A. Refer to MSDN: The new operator is used to allocate objects and arrays of objects. The new operator allocates from a program memory area called the “free store.” In C, the free store is often referred to as the “heap.”