張 蕊
天津師范大學計算機與信息工程學院,天津 300387
對并行計算的研究是當代高效計算機系統設計中至關重要的一部分,并行的效果往往依賴于支持并行性的系統所提供的并發機制。進程是計算機資源分配的單位。一個大任務一般可以分成多個子任務, 這些子任務的執行組成了整個任務功能。線程和進程的區別主要存在于創建線程的階段, 線程相較于進程并不是復制父進程映象, 而是和父進程一起實現共享。多個線程一起共享各種資源和同一地址空間, 不同的只有代碼段和私有棧。因此創建線程和調度線程的費用與原來的方式相比明顯降低了。
所謂線程(thread),簡單地說就是指進程中的單一順序控制流(a thread is a single stream of execution with in a process)。線程是程序的一個調度單位,同時也是計算機科學領域的術語之一。線程的另一個別稱是輕量級進程(lightweight processes)。線程往往有自己的寄存器集、局部線程變量、棧、線程說明數據、程序計數器、狀態信息以及線程說明信號掩碼。一個進程里的多個線程之間往往要共享同樣的的地址空間并共同構成一個大的進程,線程執行的基礎是要先有進程的執行,也就是說線程其實是無法獨立執行的。
多線程是從硬件或軟件上實現多個線程并發執行的一種技術。有多線程能力的計算機往往具有強大的硬件支持,因而能夠同時運行多于一個的線程,進而提升了整體處理的效能。引進多線程具有一定的必要性,因為多線程具有諸多優點。多線程可以提高系統的吞吐率和程序的響應效率,同時有助于改善程序的結構,從而使用戶能夠更加有效地利用好系統的資源。此外,多線程在降低資源的占用和加強用戶間通信效果等諸多方面也有積極的作用。例如,我們在word 中打印文件的過程,對文件的編輯并不會影響到對文件的打印,編輯操作和打印操作其實是異步執行的,或者可以理解為打印操作是在后臺完成的。這是因為系統創建了兩個獨立線程來分別完成對文件的編輯和對文件的打印,同時規定負責編輯文檔的線程的優先級要高于負責打印文檔的線程。在我們實際的應用中,多線程的方法非常適合用于解決多個獨立任務組成的問題。
用戶級線程(user level threads)是由用戶程序來負責管理的,傳統的操作系統內核只負責對進程的管理。
操作系統通常會提供一個能夠在用戶空間里執行的線程庫,以方便用戶程序對于用戶級線程的管理工作。這個能夠在用戶空間里執行的線程庫提供了包括線程的創建、線程的調度、線程的執行、線程的撤銷、線程間通信以及存儲上下文在內的一些功能。有了線程庫提供的這些功能,用戶級線程的實現就不再需要操作系統給予其他的特殊支持了。此外,對于操作系統分配的用戶堆棧和用戶寄存器,用戶級進程只能使用其所屬進程被分配的用戶堆棧和用戶寄存器。
用戶級線程的上下文切換與內核無關,所以可能存在相關進程的狀態是阻塞或等待的,而屬于該進程的線程狀態卻是執行情況。
核心及線程與用戶級線程的不同之處在于,前者不僅可以在同一個處理機上被并發執行,還可以在不同處理機上被并行執行。所以操作系統內核在負責同一進程內部的不同線程的調度工作的同時,可能也要進行不同進程之間的調度工作。這種工作機制有效地避免線程處于執行狀態、進程處于等待或阻塞狀態的情況發生。而另外,為了達到提高操作系統內核程序執行效率的效果,核心級線程技術也會用于內核程序自身。綜上,和用戶級線程進行比較,核心級線程在上下文切換上所用的時間要大于用戶級線程。
在JAVA 語言中,可采用兩種方式產生線程。第一種方法是繼承,即通過繼承Thread 類的方法,重寫和覆蓋部分方法run(),然后即可創建和啟用自己定義的線程實例,當然這些線程實例是在應用程序類里創建和啟動的。另一種方法是實現Runnable 接口。這種方法也是目前是非常常用的創建線程的方法之一,它打破了第一種方法(即繼承Thread 類)受到的的限制。在JAVA 的類庫里,Runnable 接口中僅僅包含了一個run()方法。所有對象,只要屬于能夠實現該接口的類,就應該可以用線程的方式執行。當然,只是對類進行聲明是無法對任何對線程提供支持的,因此還需要對Thread 類實例進行創建。
JAVA 對多線程同步控制的方法主要是圍繞關鍵字synchronized 展開,并配合wait、sleep、notify 等方法,來實現類似操作系統中PV 原語的信號量機制。因此將JAVA 對多線程的同步控制步驟歸納如下:
1) 對需要同步保護的幾個方法或代碼段增加synchronized 限制符,這就是加鎖的過程;
2)對增加了synchronized 限制符的方法或代碼中配合使用wait、sleep 等阻塞方法,來實現需要的功能;
3)在增加了synchronized 限制符的代碼或方法最后用notif 或notifyall 等方法喚醒阻塞中的線程,實現線程間的通信。
目前,對計算機中多線程問題的研究主要應用于局域網服務器中的文件管理或通信控制、WWW 服務器的多線程并發研究兩個方面。在局域網服務器的文件管理中,服務器進程會派生出相應的線程來處理用戶訪問文件的要求。為了能夠應對同時接受到多個訪問文件要求的情況,操作系統可以采取派生出多個線程的方法進行處理。當計算機的系統是多處理的情況下,線程還能在不同處理機上被執行。www 服務器分為重復服務器和并發服務器。重復服務器一般面向能在短時間內處理完成的請求, 并且是由服務器來對這些請求進行處理的。并發服務器則面向那些處理完成時間不定長的請求, 由服務器的進程或線程來處理每個請求。
[1]張玉蓉,藍雯飛.Java的多線程技術探討[J].計算機教育,2006(4).
[2]http://uule.iteye.com/blog/1106710.