進程、線程概念性問題

任務概念task

         任務是由軟件完成的一個活動,是一系列達到某種共同目的的操作。一個任務既可以由一個進程實現,也可以作為一個線程來實現。

 

進程概念 process

  進程是表示資源分配的基本單位又是調度運行的基本單位。例如,用戶運行自己的程序,系統就創建一個進程,并為它分配資源,包括各種表格、內存空間、磁盤空間、IO設備等。然后,把該進程放人進程的就緒隊列。進程調度程序選中它,為它分配CPU以及其它有關資源,該進程才真正運行。所以,進程是系統中的并發執行的單位。 

 在MacWindows NT等采用微內核結構的操作系統中,進程的功能發生了變化:它只是資源分配的單位,而不再是調度運行的單位。在微內核系統中,真正調度運行的基本單位是線程。因此,實現并發功能的單位是線程。

線程概念tread

  線程是進程中執行運算的最小單位,亦即執行處理機調度的基本單位。如果把進程理解為在邏輯上操作系統所完成的任務,那么線程表示完成該任務的許多可能的子任務之一。例如,假設用戶啟動了一個窗口中的數據庫應用程序,操作系統就將對數據庫的調用表示為一個進程。假設用戶要從數據庫中產生一份工資單報表,并傳到一個文件中,這是一個子任務;在產生工資單報表的過程中,用戶又可以輸人數據庫查詢請求,這又是一個子任務。這樣,操作系統則把每一個請求――工資單報表和新輸人的數據查詢表示為數據庫進程中的獨立的線程。線程可以在處理器上獨立調度執行,這樣,在多處理器環境下就允許幾個線程各自在單獨處理器上進行。操作系統提供線程就是為了方便而有效地實現這種并發性

進程和線程的關系

1)一個線程只能屬于一個進程,而一個進程可以有多個線程,但至少有一個線程。

2)資源分配給進程,同一進程的所有線程共享該進程的所有資源。

3)處理機分給線程,即真正在處理機上運行的是線程。

4)線程在執行過程中,需要協作同步。不同進程的線程間要利用消息通信的辦法實現同步。

引入線程的好處

1)易于調度。

2)提高并發性。通過線程可方便有效地實現并發性。進程可創建多個線程來執行同一程序的不同部分。

3)開銷少。創建線程比創建進程要快,所需開銷很少。。

4)利于充分發揮多處理器的功能。通過創建多線程進程(即一個進程可具有兩個或更多個線程),每個線程在一個處理器上運行,從而實現應用程序的并發性,使每個處理器都得到充分運行。

多線程技術

         多線程應用程序將程序劃分為多個獨立的任務,每個任務由一個線程處理。多線程處理可以同時運行多個線程。

多線程技術的優點

(1)多線程技術使程序的響應速度更快 ,因為用戶界面可以在進行其它工作的同時一直處于活動狀態;

(2)當前沒有進行處理的任務時可以將處理器時間讓給其它任務;

(3)占用大量處理時間的任務可以定期將處理器時間讓給其它任務;

(4)可以隨時停止任務;

(5)可以分別設置各個任務的優先級以優化性能。

 是否需要創建多個線程取決于各種因素。在以下情況下,最適合采用多線程處理:

(1)耗時或大量占用處理器的任務阻塞用戶界面操作;

(2)各個任務必須等待外部資源 (如遠程文件或 Internet連接)

多線程技術的缺點

1)等候使用共享資源時造成程序的運行速度變慢。這些共享資源主要是獨占性的資源 ,如打印機等。

(2)對線程進行管理要求額外的 CPU開銷。線程的使用會給系統帶來上下文切換的額外負擔。當這種負擔超過一定程度時,多線程的特點主要表現在其缺點上,比如用獨立的線程來更新數組內每個元素。

(3)線程的死鎖。即較長時間的等待或資源競爭以及死鎖等多線程癥狀。

(4)對公有變量的同時讀或寫。當多個線程需要對公有變量進行寫操作時,后一個線程往往會修改掉前一個線程存放的數據,從而使前一個線程的參數被修改;另外 ,當公用變量的讀寫操作是非原子性時,在不同的機器上,中斷時間的不確定性,會導致數據在一個線程內的操作產生錯誤,從而產生莫名其妙的錯誤,而這種錯誤是程序員無法預知的。

為什么不使用多進程?

較之進程,線程輕便、價廉,啟動速度快,退出比較快,對系統資源的沖擊比較小。

如果使用多進程,最困難的問題是如何把窗口句柄交給另一個進程。在Win32中,句柄只在其誕生地(進程中)才有意義。這是一種安全警戒,避免某個進程有意無意地危及到另一個進程的資源。

為了分享窗口句柄,你必須明明白白地產生該句柄的一個副本,并且可以被其他進程使用。在一個多線程程序中,所有線程都可以使用這個窗口的句柄,因為句柄和線程生活在同一個進程中。

 如果兩個線程分屬不同的進程,那它們通常沒有辦法共享任何內存。不同進程間如果要通訊,唯有依賴特別的設計,使之擁有共享內存(shared memory)。

如果兩線程屬于同一進程,它們將共享所有的內存(包括全局變量、靜態變量),很容易就實現了線程之間的通訊。

Note:主要是資源共享問題