線程的實現(xiàn)方式
線程已在許多系統(tǒng)中實現(xiàn),但各系統(tǒng)的實現(xiàn)方式并不完全相同,有的系統(tǒng),特別是一些數(shù)據(jù)庫管理系統(tǒng),如infomix所實現(xiàn)的是用戶級線程,另一些系統(tǒng)實現(xiàn)的是內核支持線程或同時實現(xiàn)內核支持線程和用戶支持線程
內核支持線程KST(Kernel Supported Threads)
描述:
在OS中的所有進程,無論是系統(tǒng)進程還是用戶進程,都是在操作系統(tǒng)內核的支持下運行的,是與內核緊密相關的。而內核支持線程同樣是在內核的支持下運行的,它們的創(chuàng)建、阻塞、撤銷、和切換等,也都是在內核空間實現(xiàn)的。為了對內核線程進行控制和管理,在內核空間也為每一個內核線程設置了一個線程控制塊,內核根據(jù)該控制塊而感知某線程的存在,并對其加以控制。目前大多數(shù)OS都支持線程。-
優(yōu)點:
- 在多處理機系統(tǒng)中,內核能夠同時調度同一進程中的多個線程并行執(zhí)行
- 如果進程中的一個線程被阻塞了,內核可以調度該進程中的其他線程占有處理機運行,也可以運行其他進程中的線程
- 內核支持線程具有很小的數(shù)據(jù)結構和堆棧,線程的切換比較快,切換開銷小
- 內核本身也可以采用多線程技術,可以提高系統(tǒng)的執(zhí)行速度和效率
缺點:
對于用戶的線程切換而言,其模式切換的開銷比較大,在同一個進程中,從一個線程切換到另一個線程時,需要從用戶態(tài)轉到核心態(tài)進行,這是因為用戶進程的線程在用戶態(tài)運行,而線程的調度和管理是在內核實現(xiàn)的,系統(tǒng)開銷較大
用戶級線程ULT(User Level Threads)
描述:
用戶級線程是在用戶空間中實現(xiàn)的。線程的創(chuàng)建、撤銷、同步、通信等功能,無需內核支持,即用戶級線程與內核無關,這些線程的任務控制塊都是設置在用戶空間,而線程所執(zhí)行的操作無需內核的幫助,因而內核完全不知道用戶線程的存在-
優(yōu)點:
- 線程的切換不需要轉到內核空間,節(jié)省了模式切換的開銷
- 調度算法可以由進程根據(jù)需要,對自己的線程選擇調度算法進行管理和調度,而與OS的低級調度算法無關
- 用戶級線程的實現(xiàn)與OS平臺無關,因為對于線程管理的代碼是屬于用戶程序的一部分,因此用戶級線程甚至可以在不支持線程機制的操作平臺上實現(xiàn)
-
缺點:
系統(tǒng)調用阻塞問題,再基于進程機制的OS中,大多數(shù)系統(tǒng)調用將使進程阻塞,因此當線程執(zhí)行一個系統(tǒng)調用時,不僅該線程被阻塞,而且進程內的所有線程會被阻塞。而內核支持線程中的其他線程依然能運行
不能利用多處理機進行多重處理的優(yōu)點,內核每次分配給一個進程的僅有一個CPU,因此,進程中僅有一個線程能執(zhí)行,在該線程放棄CPU前,其他線程只能等待
組合方式
- 用戶級線程通過時分多路復用內核支持線程來實現(xiàn)。組合方式的線程中,同一個進程內多個線程可以同時在多處理機上并行執(zhí)行,并且阻塞一個線程,不需要把整個線程都阻塞
線程的實現(xiàn)
內核支持線程的實現(xiàn)
- 系統(tǒng)在創(chuàng)建一個新進程的時候,便為其分配一個任務數(shù)據(jù)區(qū)PTDA(Per Task Data Area),其中包含若干個線程控制塊TCB空間,這些TCB及其所在的任務數(shù)據(jù)區(qū)被保存到內核中,每當進程創(chuàng)建一個線程時,便為線程分配PDTA中的一個TCB,將有關信息填入到該TCB中,并為其分配其運行時所需的必要資源
用戶級線程的實現(xiàn)
- 用戶級線程是在用戶空間實現(xiàn)的,所有的用戶級線程都具有相同的結構,它們都運行在一個中間系統(tǒng)上,當前有兩種方式實現(xiàn)中間系統(tǒng),即運行時系統(tǒng)和內核控制線程