1. 程式人生 > >Windows常見面試題——進程、線程

Windows常見面試題——進程、線程

進程;線程

1.什麽是進程,什麽是線程,請談談你的理解

答:進程和線程是操作系統中一個很重要的概念。進程是指操作系統中運行的應用程序,而線程是指程序中獨立完成某一任務、實現某一功能所需的單元。進程就像一個工廠,可以完成某種產品的生產,而線程就像是工廠不同的部門,可以互補幹擾獨立的完成某項工作。一個進程至少運行著一個線程。

2.如何在不同進程中訪問同一個內核對象。請說出至少三種方法

答:要訪問內核對象,那麽就需要在進程的句柄表中都有一個句柄項是指向此內核對象的。
a.由父進程繼承給子進程,當父進程創建子進程時,若指定了繼承句柄的屬性,則子進程能夠將父進程中所有可繼承的句柄全部繼承到自己的句柄表中。(但是即便繼承了句柄,子進程卻不知道自己繼承了誰,句柄值是什麽,只能由父進程通過進程通訊的方式告訴它)

b.在進程A中創建內核對象時,給內核對象命名,在進程B中通過名字打開內核對象。(如果內核對象不能命名或者沒有一個標識,則不能采用此方法。)
c.使用DuplicateHandle()這個API打開對象,獲得句柄。

3.當一個進程銷毀時,內核對象句柄表中的句柄都會被銷毀嗎?結合引用計數,談談你對這個問題的理解。

答:每一個內核對象都有一個引用計數,你可以認為每一個內核對象結構體都有一個字段叫做引用計數,當有一個進程創建或打開了此內核對象,那麽內核對象的引用計數自增1,進程終止或者關閉句柄,引用計數自減1,當引用計數減為0時,內核對象自動銷毀。因此,當一個內核對象M在進程A創建,另外一個進程對象也使用了此內核對象,進程A退出後,M並不會被銷毀,因為他還在進程B中使用,只有沒有進程使用此內核對象,內核對象才會自動銷毀。

4.請談一下你所掌握的進程間通訊的方式,越詳細越好。

a.WM_COPYDATA消息
WM_COPYDATA消息是一個專門用於數據傳輸的消息,可以攜帶一個大體積的消息參數。不過WM_COPYDATA的數據會被發送到目標進程的棧空間進行保存,因此單次發送的數據不宜過大
b.郵槽
郵槽是Windows系統最簡單的一種進程間通訊方式,一個進程可以創建一個郵槽,其他進程可以通過打開此郵槽與創建郵槽的進程進行通訊。郵槽的通訊時單向的,服務端只能讀取消息,客戶端只能寫入消息,消息被寫入郵槽以隊列的形式保存。

Windows常見面試題——進程、線程