個人以為是為了提高CPU利用率。線程給操作系統帶來的創建維護和管理負擔要輕。因為與線程相關的信息比較少,交情的負擔意味著線程的代價或開銷比較少。當處理器除一個進程並激活另一個進程時,就要發生上下文切換。為了發生上下文切換,操作系統必須啟動和重新啟動每個進程所需的信息。這就意味著必須保存描述進程存在狀態的有關信息,在進程再次激活時,就可以從離開的地點繼續執行。那麼系統在進程切換時需要保存那些信息呢?下面一一列舉:
1、所需信息包括可執行程序、堆棧、以及靜態與動態分配變量內存的指針。
2、寄存器組中包含執行下一條指令的指針這樣的信息 。
3、重新任命進程時需要進程的狀態(進程是被掛起還是被阻塞)和優先權。同時程序的I/O狀態也被保存。
4、保存進程的規劃信息,內存管理信息以及計數信息。
5、進程需要文件描述器和讀寫指針來繼續使用資源。
而線程同樣需要上下文。當線程被搶先時同樣也會發生上下文切換。
與進程相比線程的優勢如下:
1、線程不需要地址空間。線程包含在進程的地址空間中。(所以在重新任命進程時所需的線程都不需要)
2、線程的上下文只包含一個堆棧、一個寄存器組和一個優先權。
3、寄存器組包含程序或指令指針以及堆棧指針。
4、線程的文本包含在他的進程的文本中。
5、進程擁有的所有資源都屬於線程。所以與資源相關的所有信息不是線程上下文的部分。
6、其他信息如規劃、計數等都是由進程所定義。無需包含在線程的上下文中。
線程與進程的相同之處是:都有ID,寄存器組、狀態、以及優先權。線程與子進程共享父進程的資源。
他們的不同之處是:
1、線程沒有自己的地址空間,如果進程創建了多個所有的線程都將包含在他的地址空間中。
2、父進程和子進程之間必須通過進程間通信機制來進行通信。而進程中的多個線程之間是通過讀取和寫入數據到進程變量來通信。
3、子進程對其他子進程不施加控制,而進程的線程被看做同位體(peer)並對進程的其他的線程施加控制。