前言
什么是線程
多線程模型
線程庫
一贯城、什么是線程
1.1 引入線程的原因
引入線程主要出于三方面因素考慮:性能、應(yīng)用和硬件。
- 從性能角度來看衣形,由于進程是重量級的,負載了程序運行中所有的內(nèi)容姿鸿,操作系統(tǒng)的開銷比較大谆吴,另外切換進程需保存現(xiàn)場和恢復(fù)現(xiàn)場,消耗也是比較大苛预。所以需要引入一種比進程開銷更小的線程單位句狼。
- 從應(yīng)用角度來看,進程內(nèi)的代碼也有并行執(zhí)行的要求碟渺。如PPT在編輯(輸入鲜锚、拼寫、存盤等操作)的時候苫拍,也需要同時進行其他操作(如排版)芜繁。
- 從硬件角度來看,多核處理器是目前主流的硬件架構(gòu)绒极,為了充分利用多核處理器的性能骏令,加速進程的運行,也是引入線程的重要原因垄提。
1.2 線程概念
什么是線程榔袋?
線程是可在 CPU 上運行的基本執(zhí)行單位。進程內(nèi)部的一個代碼片段可以被創(chuàng)建為一個線程铡俐。也就是說線程寄生在進程中凰兑。同進程一樣,線程也有多種狀態(tài)(就緒审丘、運行吏够、等待)和操作(創(chuàng)建、撤銷、等待锅知、喚醒)播急。但是有一點要注意,線程只是 CPU 上運行的基本執(zhí)行單位售睹,而進程是資源分配的基本單位桩警。線程自己不擁有系統(tǒng)資源,只能通過進程申請資源昌妹。
1.3 線程和進程關(guān)系
線程和進程的關(guān)系可以從代碼捶枢、資源、調(diào)度捺宗、切換和生命周期做比較柱蟀,如下圖:
1.4 線程結(jié)構(gòu)
線程由代碼和數(shù)據(jù)、各類資源蚜厉、線程控制塊(TCP)組成长已。其中代碼和數(shù)據(jù)以及各類資源都來源于進程。線程控制塊由線程ID昼牛、程序計算器PC术瓮、寄存器集、椃〗。空間組成胞四。
早期操作系統(tǒng)都是單線程,即一個進程只有一個線程伶椿。目前的操作系統(tǒng)都包含多個線程辜伟。如下圖為單線程和多線程。PS:register為寄存器的意思脊另。
1.5 線程優(yōu)點
- 響應(yīng)度高:線程創(chuàng)建開銷小导狡。
- 資源共享:進程中的線程可以共享進程資源。
- 經(jīng)濟性:線程創(chuàng)建偎痛、上下文切換比進程快旱捧。如Solaris 系統(tǒng)中,創(chuàng)建線程比進程快 30 倍踩麦,線程切換比進程切換快 5 倍枚赡。
- 可以充分利用多核處理器結(jié)構(gòu),并行運行縮短時間谓谦。
二贫橙、多線程模型
線程由兩種狀態(tài)用戶態(tài)和核心態(tài),分別對應(yīng)用戶線程和內(nèi)核線程反粥。按照用戶線程和內(nèi)核線程劃分料皇,可以分為三種線程模型: 一對一模型谓松、多對一模型和多對多模型。
2.1 用戶線程和內(nèi)核線程
用戶線程是由用戶線程庫進行管理的線程践剂。系統(tǒng)內(nèi)核看不到用戶線程,用戶線程的創(chuàng)建和調(diào)度始終存在于用戶空間娜膘,內(nèi)核無法干預(yù)逊脯。用戶線程應(yīng)用于傳統(tǒng)的只支持進程的操作系統(tǒng)。常用的用于創(chuàng)建用戶線程的線程庫有:Java threads竣贪、Win32 threads军洼。
內(nèi)核線程是由內(nèi)核進行管理的線程。需要內(nèi)核的支持演怎,由內(nèi)核完成線程調(diào)度匕争、創(chuàng)建和撤銷。Windows XP/2000爷耀、Linux甘桑、Tru64 UNIX、Mac OS X等操作系統(tǒng)都支持內(nèi)核線程歹叮。
2.2 多對一模型
主要應(yīng)用在不支持內(nèi)核線程只支持進程的操作系統(tǒng)中跑杭。該操作系統(tǒng)內(nèi)核只能看到一個進程。為了在進程中創(chuàng)建線程就需要借助第三方線程庫實現(xiàn)咆耿。此種情況下德谅,進程中的用戶線程由進程自己管理,無需內(nèi)核干涉萨螺。缺點是一個線程的切換窄做,會導(dǎo)致進程的阻塞。
2.3 一對一模型
該模型用于支持線程的操作系統(tǒng)慰技,可以由操作系統(tǒng)統(tǒng)一管理線程椭盏。優(yōu)點是并發(fā)性好,多個線程可并行運行在多個處理器上惹盼;缺點是內(nèi)核開銷較大庸汗。
2.4 多對多模型
該模型中,多個用戶線程映射為相等或更小數(shù)目的內(nèi)核線程手报。如下圖四個用戶線程映射為三個內(nèi)核線程蚯舱。該模型的有點是兼顧了并發(fā)性和效率;缺點應(yīng)為映射的處理掩蛤,復(fù)雜度增加枉昏,需要額外的線程管理模塊實現(xiàn)映射。
上述說了三個用戶線程模型揍鸟,現(xiàn)在的操作系統(tǒng)中也有存在混合使用三種模型的情況兄裂。
三句旱、線程庫
為程序員提供API來創(chuàng)建和管理線程。線程庫有兩種模式:用戶庫和內(nèi)核庫晰奖。
用戶庫用于創(chuàng)建和管理用戶線程谈撒,僅存在與用戶空間,沒有內(nèi)核支持匾南,不會產(chǎn)生系統(tǒng)調(diào)用啃匿;內(nèi)核庫用于創(chuàng)建內(nèi)核線程,存在于內(nèi)核蛆楞,需要操作系統(tǒng)支持溯乒,會產(chǎn)生系統(tǒng)調(diào)用。
常用的線程庫有Pthreads線程庫豹爹、Java線程庫裆悄、Win32線程庫。Pthreads線程庫常用與創(chuàng)建用戶線程臂聋;Java線程庫常用與創(chuàng)建用戶線程光稼;而Win32線程庫常用于創(chuàng)建內(nèi)核線程。