標籤:進程;線程
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常見面試題——進程、線程