線程是指進程內的一個執行單元,也是進程內的可調度實體.
與進程的區別:
(1)調度:線程作為調度和分配的基本單位,進程作為擁有資源的基本單位
(2)並發性:不僅進程之間可以並發執行,同一個進程的多個線程之間也可並發執行
(3)擁有資源:進程是擁有資源的獨立單位,線程不擁有系統資源,但可以訪問隸屬於進程的資源.
(4)系統開銷:在創建或撤消進程時,由於系統都要為之分配和回收資源,導致系統的開銷明顯大於創建或撤消線程時的開銷。
用內存映射或全局原子(互斥變量)、查找窗口句柄FindWindow,互斥,寫標志到文件或注冊表,共享內存。
鍵盤鉤子SetWindowsHookEx
4.程序什麼時候應該使用線程,什麼時候單線程效率高。
1.耗時的操作使用線程,提高應用程序響應
2.並行操作時使用線程,如C/S架構的服務器端並發線程響應用戶的請求。
3.多CPU系統中,使用線程提高CPU利用率
4.改善程序結構。一個既長又復雜的進程可以考慮分為多個線程,成為幾個獨立或半獨立的運行部分,這樣的程序會利於理解和修改。
其他情況都使用單線程。
5.Linux有內核級線程麼?
答:線程通常被定義為一個進程中代碼的不同執行路線。從實現方式上劃分,線程有兩種類型:“用戶級線程”和“內核級線程”。 用戶線程指不需要內核支持而在用戶程序中實現的線程,其不依賴於操作系統核心,應用進程利用線程庫提供創建、同步、調度和管理線程的函數來控制用戶線程。這種線程甚至在象 DOS 這樣的操作系統中也可實現,但線程的調度需要用戶程序完成,這有些類似 Windows 3.x 的協作式多任務。另外一種則需要內核的參與,由內核完成線程的調度。其依賴於操作系統核心,由內核的內部需求進行創建和撤銷,這兩種模型各有其好處和缺點。用戶線程不需要額外的內核開支,並且用戶態線程的實現方式可以被定制或修改以適應特殊應用的要求,但是當一個線程因 I/O 而處於等待狀態時,整個進程就會被調度程序切換為等待狀態,其他線程得不到運行的機會;而內核線程則沒有各個限制,有利於發揮多處理器的並發優勢,但卻占用了更多的系統開支。 Windows NT和OS/2支持內核線程。Linux 支持內核級的多線程。
6.使用線程是如何防止出現大的波峰?
答:意思是如何防止同時產生大量的線程,方法是使用線程池,線程池具有可以同時提高調度效率和限制資源使用的好處,線程池中的線程達到最大數時,其他線程就會排隊等候。
7.進程之間通信的途徑
共享存儲系統
消息傳遞系統
管道:以文件系統為基礎
8.進程死鎖的原因
資源競爭及進程推進順序非法
9.死鎖的處理
鴕鳥策略、預防策略、避免策略、檢測與解除死鎖
10. 操作系統中進程調度策略有哪幾種?
FCFS(先來先服務),優先級,時間片輪轉,多級反饋
11.線程與進程的區別和聯系? 線程是否具有相同的堆棧? dll是否有獨立的堆棧?
進程是死的,只是一些資源的集合,真正的程序執行都是線程來完成的,程序啟動的時候操作系統就幫你創建了一個主線程。
每個線程有自己的堆棧。
DLL中有沒有獨立的堆棧,這個問題不好回答,或者說這個問題本身是否有問題。因為DLL中的代碼是被某些線程所執行,只有線程擁有堆棧,如果DLL中的代碼是EXE中的線程所調用,那麼這個時候是不是說這個DLL沒有自己獨立的堆棧?如果DLL中的代碼是由DLL自己創建的線程所執行,那麼是不是說DLL有獨立的堆棧?
以上講的是堆棧,如果對於堆來說,每個DLL有自己的堆,所以如果是從DLL中動態分配的內存,最好是從DLL中刪除,如果你從DLL中分配內存,然後在EXE中,或者另外一個DLL中刪除,很有可能導致程序崩潰
12.以下多線程對int型變量x的操作,哪幾個需要進行同步: ABC
A. x=y; B. x++; C. ++x; D. x=1;