版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、5.1Module 5: Threads線程線程Overview 綜述綜述Benefits 益處益處User and Kernel Threads 用戶和內(nèi)核線程用戶和內(nèi)核線程Multithreading Models 多線程模型多線程模型Solaris 2 Threads Solaris 2線程線程Java Threads Java線程線程5.2線程的引入線程的引入作為并發(fā)執(zhí)行的進(jìn)程具有二個(gè)根本的屬性:進(jìn)程作為并發(fā)執(zhí)行的進(jìn)程具有二個(gè)根本的屬性:進(jìn)程既是一個(gè)擁有資源的獨(dú)立單位,它可獨(dú)立分配虛既是一個(gè)擁有資源的獨(dú)立單位,它可獨(dú)立分配虛地址空間、主存和其它,又是一個(gè)可獨(dú)立調(diào)度和地址空間、主存和其它
2、,又是一個(gè)可獨(dú)立調(diào)度和分派的根本單位。這二個(gè)根本屬性使進(jìn)程成為并分派的根本單位。這二個(gè)根本屬性使進(jìn)程成為并發(fā)執(zhí)行的根本單位。發(fā)執(zhí)行的根本單位。在一些在一些OSOS中,象大多數(shù)中,象大多數(shù)UNIXUNIX系統(tǒng)、系統(tǒng)、LinuxLinux等,進(jìn)程等,進(jìn)程同時(shí)具有這二個(gè)屬性。同時(shí)具有這二個(gè)屬性。5.3線程的引入線程的引入而另一些而另一些OSOS中,象中,象WindowsNTWindowsNT、SolarisSolaris、OSOS2 2、Mac OSMac OS等,這二個(gè)屬性由等,這二個(gè)屬性由OSOS獨(dú)立處置。獨(dú)立處置。為了區(qū)分二個(gè)屬性為了區(qū)分二個(gè)屬性 ,資源擁有單位稱為進(jìn)程,資源擁有單位稱為進(jìn)程,
3、調(diào)度的單位稱為線程、又稱輕進(jìn)程調(diào)度的單位稱為線程、又稱輕進(jìn)程light light weight processweight process。線程只擁有一點(diǎn)兒在運(yùn)轉(zhuǎn)中必不可省的資源程線程只擁有一點(diǎn)兒在運(yùn)轉(zhuǎn)中必不可省的資源程序計(jì)數(shù)器、一組存放器和棧,但它可與同屬一序計(jì)數(shù)器、一組存放器和棧,但它可與同屬一個(gè)進(jìn)程的其它線程共享進(jìn)程擁有的全部資源。個(gè)進(jìn)程的其它線程共享進(jìn)程擁有的全部資源。線程定義為進(jìn)程內(nèi)一個(gè)執(zhí)行單元或一個(gè)可調(diào)度實(shí)線程定義為進(jìn)程內(nèi)一個(gè)執(zhí)行單元或一個(gè)可調(diào)度實(shí)體。體。5.4線程的引入線程的引入進(jìn)程:資源分配單位存儲(chǔ)器、文件和進(jìn)程:資源分配單位存儲(chǔ)器、文件和CPU調(diào)度調(diào)度分派單位。分派單位。線
4、程:作為線程:作為CPU調(diào)度單位,而進(jìn)程只作為其他資源調(diào)度單位,而進(jìn)程只作為其他資源分配單位分配單位只擁有必不可少的資源,如:線程形狀、存放器上只擁有必不可少的資源,如:線程形狀、存放器上下文和棧下文和棧同樣具有就緒、阻塞和執(zhí)行三種根本形狀同樣具有就緒、阻塞和執(zhí)行三種根本形狀5.5Threads線程線程A thread (or lightweight process) is a basic unit of CPU utilization; it consists of: 線程輕型進(jìn)程是線程輕型進(jìn)程是CPU運(yùn)用的一個(gè)根本單元,包括運(yùn)用的一個(gè)根本單元,包括program counter 程序計(jì)數(shù)器
5、程序計(jì)數(shù)器register set 存放器集存放器集stack space 棧空間??臻gA thread shares with its peer threads its: 一個(gè)線程與它的對(duì)等線程共享:一個(gè)線程與它的對(duì)等線程共享:code section 代碼段代碼段data section 數(shù)據(jù)段數(shù)據(jù)段operating-system resources 操作系統(tǒng)資源操作系統(tǒng)資源 such as open files and signals 如翻開的文件和信號(hào)量如翻開的文件和信號(hào)量collectively known as a task. 總體作為一個(gè)義務(wù)總體作為一個(gè)義務(wù)A traditio
6、nal or heavyweight process is equal to a task with one thread 傳統(tǒng)的或重型進(jìn)程等價(jià)于只需一個(gè)線程的義務(wù)傳統(tǒng)的或重型進(jìn)程等價(jià)于只需一個(gè)線程的義務(wù)5.6線程的優(yōu)點(diǎn):減小并發(fā)執(zhí)行的時(shí)間和空間開銷線程的優(yōu)點(diǎn):減小并發(fā)執(zhí)行的時(shí)間和空間開銷線程的創(chuàng)建、退出和調(diào)度,因此允許在系統(tǒng)中線程的創(chuàng)建、退出和調(diào)度,因此允許在系統(tǒng)中建立更多的線程來提高并發(fā)程度。建立更多的線程來提高并發(fā)程度。線程的創(chuàng)建時(shí)間比進(jìn)程短;線程的創(chuàng)建時(shí)間比進(jìn)程短;線程的終止時(shí)間比進(jìn)程短;線程的終止時(shí)間比進(jìn)程短;同進(jìn)程內(nèi)的線程切換時(shí)間比進(jìn)程短;同進(jìn)程內(nèi)的線程切換時(shí)間比進(jìn)程短;由于同進(jìn)程
7、內(nèi)線程間共享內(nèi)存和文件資源,可直由于同進(jìn)程內(nèi)線程間共享內(nèi)存和文件資源,可直接進(jìn)展不經(jīng)過內(nèi)核的通訊;接進(jìn)展不經(jīng)過內(nèi)核的通訊;5.7Threads線程線程Many software packages that run on modern desktop PCs are multi-threaded.例如:一個(gè)字處置程序例如:一個(gè)字處置程序(如如word)能夠同時(shí)能夠同時(shí)有一個(gè)線程接納用戶輸入,另外一個(gè)線程有一個(gè)線程接納用戶輸入,另外一個(gè)線程顯示圖形,還有一個(gè)線程執(zhí)行拼寫檢查。顯示圖形,還有一個(gè)線程執(zhí)行拼寫檢查。又例如:一個(gè)運(yùn)用程序要完成幾個(gè)類似的又例如:一個(gè)運(yùn)用程序要完成幾個(gè)類似的義務(wù),那么可以創(chuàng)
8、建幾個(gè)線程來完成。比義務(wù),那么可以創(chuàng)建幾個(gè)線程來完成。比如一個(gè)如一個(gè)web server,可以為每個(gè)用戶的懇,可以為每個(gè)用戶的懇求創(chuàng)建一個(gè)效力線程。求創(chuàng)建一個(gè)效力線程。5.8進(jìn)程和線程的比較進(jìn)程和線程的比較地址空間和其他資源如翻開文件:進(jìn)程間相地址空間和其他資源如翻開文件:進(jìn)程間相互獨(dú)立,同一進(jìn)程的各線程間共享某進(jìn)程內(nèi)互獨(dú)立,同一進(jìn)程的各線程間共享某進(jìn)程內(nèi)的線程在其他進(jìn)程不可見的線程在其他進(jìn)程不可見通訊:進(jìn)程間通訊通訊:進(jìn)程間通訊IPC,線程間可以直接讀寫進(jìn),線程間可以直接讀寫進(jìn)程數(shù)據(jù)段如全局變量來進(jìn)展通訊需求進(jìn)程數(shù)據(jù)段如全局變量來進(jìn)展通訊需求進(jìn)程同步和互斥手段的輔助,以保證數(shù)據(jù)的一致性程同步
9、和互斥手段的輔助,以保證數(shù)據(jù)的一致性調(diào)度:線程上下文切換比進(jìn)程上下文切換要快得調(diào)度:線程上下文切換比進(jìn)程上下文切換要快得多;多;5.9線程與進(jìn)程的比較線程與進(jìn)程的比較調(diào)度:在傳統(tǒng)的操作系統(tǒng)中,擁有資源的根本單位和獨(dú)立調(diào)度:在傳統(tǒng)的操作系統(tǒng)中,擁有資源的根本單位和獨(dú)立調(diào)度、分派的根本單位都是進(jìn)程。調(diào)度、分派的根本單位都是進(jìn)程。并發(fā)性:在引入線程的操作系統(tǒng)中,不僅進(jìn)程之間可以并并發(fā)性:在引入線程的操作系統(tǒng)中,不僅進(jìn)程之間可以并發(fā)執(zhí)行,而且在一個(gè)進(jìn)程中的多個(gè)線程之間亦可并發(fā)執(zhí)行發(fā)執(zhí)行,而且在一個(gè)進(jìn)程中的多個(gè)線程之間亦可并發(fā)執(zhí)行,因此使操作系統(tǒng)具有更好的并發(fā)性,從而能更有效地運(yùn),因此使操作系統(tǒng)具有更好
10、的并發(fā)性,從而能更有效地運(yùn)用系統(tǒng)資源和提高系統(tǒng)吞吐量。用系統(tǒng)資源和提高系統(tǒng)吞吐量。擁有資源:不論是傳統(tǒng)的操作系統(tǒng),還是設(shè)有線程的操作擁有資源:不論是傳統(tǒng)的操作系統(tǒng),還是設(shè)有線程的操作系統(tǒng),進(jìn)程都是擁有資源的一個(gè)獨(dú)立單位,它可以擁有本系統(tǒng),進(jìn)程都是擁有資源的一個(gè)獨(dú)立單位,它可以擁有本人的資源。人的資源。系統(tǒng)開銷:由于在創(chuàng)建或吊銷進(jìn)程時(shí),系統(tǒng)都要為之分配系統(tǒng)開銷:由于在創(chuàng)建或吊銷進(jìn)程時(shí),系統(tǒng)都要為之分配或回收資源,如內(nèi)存空間、或回收資源,如內(nèi)存空間、I/O設(shè)備等。因此,操作系統(tǒng)設(shè)備等。因此,操作系統(tǒng)所付出的開銷將明顯地大于在創(chuàng)建或吊銷線程時(shí)的開銷。所付出的開銷將明顯地大于在創(chuàng)建或吊銷線程時(shí)的開銷。
11、 5.10ThreadControlBlockUserStackUserStackKernelStackKernelStackUserAddressSpaceUserAddressSpaceProcessControlBlockProcessControlBlockThreadSingle-ThreadedProcess ModelMultithreadedProcess ModelThreadControlBlockUserStackKernelStackThreadThreadControlBlockUserStackKernelStackThread線程切換和進(jìn)程切換5.11Multip
12、le Threads within a Task一個(gè)義務(wù)中的多線程一個(gè)義務(wù)中的多線程5.12Single and Multithreaded Processes單個(gè)和多線程進(jìn)程單個(gè)和多線程進(jìn)程5.13Responsiveness 呼應(yīng):一個(gè)多線程的運(yùn)用在執(zhí)行中,即使其中的某個(gè)線呼應(yīng):一個(gè)多線程的運(yùn)用在執(zhí)行中,即使其中的某個(gè)線程阻塞,其他的線程還可繼續(xù)執(zhí)行,從而提高呼應(yīng)速度程阻塞,其他的線程還可繼續(xù)執(zhí)行,從而提高呼應(yīng)速度Resource Sharing 資源共享:同一進(jìn)程的多個(gè)線程共享該進(jìn)程的內(nèi)存等資資源共享:同一進(jìn)程的多個(gè)線程共享該進(jìn)程的內(nèi)存等資源源Economy經(jīng)濟(jì)性:創(chuàng)建和切換線程的開銷要
13、低于進(jìn)程。比如,經(jīng)濟(jì)性:創(chuàng)建和切換線程的開銷要低于進(jìn)程。比如,Solaris中進(jìn)程創(chuàng)建時(shí)間是線程創(chuàng)建的中進(jìn)程創(chuàng)建時(shí)間是線程創(chuàng)建的30倍,進(jìn)程切換時(shí)倍,進(jìn)程切換時(shí)間是線程切換的間是線程切換的5倍。倍。Utilization of MP Architectures MP體系構(gòu)造的運(yùn)用:多線程更適用于多處置機(jī)構(gòu)造。體系構(gòu)造的運(yùn)用:多線程更適用于多處置機(jī)構(gòu)造。Benefits益處益處5.14Threads線程線程(Cont.)In a multiple threaded task, while one server thread is blocked and waiting, a second thr
14、ead in the same task can run. 在一個(gè)多線程義務(wù)在一個(gè)多線程義務(wù)中,當(dāng)一個(gè)效力器線程被阻塞后,在同一個(gè)義務(wù)中的第中,當(dāng)一個(gè)效力器線程被阻塞后,在同一個(gè)義務(wù)中的第2個(gè)線程可運(yùn)轉(zhuǎn)個(gè)線程可運(yùn)轉(zhuǎn)Cooperation of multiple threads in same job confers higher throughout and improved performance. 同一作業(yè)中多線程協(xié)同導(dǎo)致高同一作業(yè)中多線程協(xié)同導(dǎo)致高吞吐量并改善性能吞吐量并改善性能Applications that require sharing a common buffer (i.e.
15、, producer-consumer) benefit from thread utilization. 運(yùn)用程序需求共享一個(gè)公用運(yùn)用程序需求共享一個(gè)公用的緩沖即消費(fèi)者的緩沖即消費(fèi)者-消費(fèi)者,從線程運(yùn)用中得利消費(fèi)者,從線程運(yùn)用中得利Kernel-supported threads內(nèi)核支持線程內(nèi)核支持線程 (Mach and OS/2). User-level threads; supported above the kernel, via a set of library calls at the user level (Project Andrew from CMU). 用戶級(jí)線程;在內(nèi)核
16、用戶級(jí)線程;在內(nèi)核之上,經(jīng)過用戶級(jí)的庫調(diào)用之上,經(jīng)過用戶級(jí)的庫調(diào)用(creation,scheduling,and management with no support from kernel)Hybrid approach implements both user-level and kernel-supported threads (Solaris 2). 混合處置實(shí)現(xiàn)用戶級(jí)和內(nèi)核支持線程混合處置實(shí)現(xiàn)用戶級(jí)和內(nèi)核支持線程5.15User Threads用戶線程用戶線程Thread Management Done by User-Level Threads Library由用戶級(jí)線程庫進(jìn)展管
17、理的線程由用戶級(jí)線程庫進(jìn)展管理的線程.線程庫為線程的線程庫為線程的創(chuàng)建、調(diào)度和管理提供支持,無需內(nèi)核支持。創(chuàng)建、調(diào)度和管理提供支持,無需內(nèi)核支持。Examples例子例子- POSIX Pthreads- Mach C-threads- Solaris threads5.16用戶級(jí)線程用戶級(jí)線程(user-level thread)用戶線程的維護(hù)由運(yùn)用進(jìn)程完成;用戶線程的維護(hù)由運(yùn)用進(jìn)程完成;內(nèi)核不了解用戶線程的存在;內(nèi)核不了解用戶線程的存在;用戶線程切換不需求內(nèi)核特權(quán);用戶線程切換不需求內(nèi)核特權(quán);用戶線程調(diào)度算法可針對(duì)運(yùn)用優(yōu)化;用戶線程調(diào)度算法可針對(duì)運(yùn)用優(yōu)化;不依賴于不依賴于OS中心,運(yùn)用進(jìn)程
18、利用線程庫提供創(chuàng)建、同步、調(diào)中心,運(yùn)用進(jìn)程利用線程庫提供創(chuàng)建、同步、調(diào)度和管理線程的函數(shù)來控制用戶線程。如:數(shù)據(jù)庫系統(tǒng)度和管理線程的函數(shù)來控制用戶線程。如:數(shù)據(jù)庫系統(tǒng)informix,圖形處置,圖形處置Aldus PageMaker。調(diào)度由運(yùn)用軟件內(nèi)部。調(diào)度由運(yùn)用軟件內(nèi)部進(jìn)展,通常采用非搶先式和更簡(jiǎn)單的規(guī)那么,也無需用戶態(tài)進(jìn)展,通常采用非搶先式和更簡(jiǎn)單的規(guī)那么,也無需用戶態(tài)/中中心態(tài)切換,所以速度特別快。心態(tài)切換,所以速度特別快。Drawbacks: 一個(gè)線程發(fā)起系統(tǒng)一個(gè)線程發(fā)起系統(tǒng)調(diào)用而阻塞,那么整個(gè)進(jìn)程在等待。時(shí)間片分配給進(jìn)程,多線調(diào)用而阻塞,那么整個(gè)進(jìn)程在等待。時(shí)間片分配給進(jìn)程,多線程那
19、么每個(gè)線程就慢。程那么每個(gè)線程就慢。5.17用戶線程的實(shí)現(xiàn)用戶線程的實(shí)現(xiàn)用戶級(jí)線程在用戶空間實(shí)現(xiàn)用戶級(jí)線程在用戶空間實(shí)現(xiàn), ,運(yùn)轉(zhuǎn)在一個(gè)運(yùn)轉(zhuǎn)在一個(gè)中間系統(tǒng)上面中間系統(tǒng)上面, ,有兩種方式的中間系統(tǒng)有兩種方式的中間系統(tǒng): : 1) 1)運(yùn)轉(zhuǎn)時(shí)系統(tǒng)運(yùn)轉(zhuǎn)時(shí)系統(tǒng): :是用于管理和控制線程是用于管理和控制線程的函數(shù)的函數(shù)( (過程過程) )的集合的集合. . 2) 2)內(nèi)核控制線程內(nèi)核控制線程(LWP),(LWP),每個(gè)用戶級(jí)線程每個(gè)用戶級(jí)線程利用利用LWPLWP與內(nèi)核通訊與內(nèi)核通訊, ,每一個(gè)每一個(gè)LWPLWP都要銜接都要銜接到一個(gè)內(nèi)核級(jí)線程上到一個(gè)內(nèi)核級(jí)線程上5.18Kernel Threads內(nèi)核
20、線程內(nèi)核線程Supported by the Kernel由內(nèi)核支持由內(nèi)核支持Examples例子例子- Windows 95/98/NT - Solaris- Digital UNIX5.19內(nèi)核維護(hù)進(jìn)程和線程的上下文信息;內(nèi)核維護(hù)進(jìn)程和線程的上下文信息;線程切換由內(nèi)核完成;線程切換由內(nèi)核完成;一個(gè)線程發(fā)起系統(tǒng)調(diào)用而阻塞,不會(huì)影響其他線一個(gè)線程發(fā)起系統(tǒng)調(diào)用而阻塞,不會(huì)影響其他線程的運(yùn)轉(zhuǎn)。程的運(yùn)轉(zhuǎn)。時(shí)間片分配給線程,所以多線程的進(jìn)程獲得更多時(shí)間片分配給線程,所以多線程的進(jìn)程獲得更多CPU時(shí)間。時(shí)間。依賴于依賴于OS中心,由內(nèi)核進(jìn)展創(chuàng)建和撤銷,用來執(zhí)行一中心,由內(nèi)核進(jìn)展創(chuàng)建和撤銷,用來執(zhí)行一個(gè)指
21、定的函數(shù)。個(gè)指定的函數(shù)。Windows NT和和OS/2支持內(nèi)核線程支持內(nèi)核線程內(nèi)核線程內(nèi)核線程(kernel-level thread)5.20系統(tǒng)在創(chuàng)建一個(gè)新進(jìn)程時(shí)系統(tǒng)在創(chuàng)建一個(gè)新進(jìn)程時(shí),便為它分配一個(gè)便為它分配一個(gè)義務(wù)數(shù)據(jù)區(qū)義務(wù)數(shù)據(jù)區(qū),其中包括假設(shè)干個(gè)線程控制塊其中包括假設(shè)干個(gè)線程控制塊TCB空間空間.每創(chuàng)建一個(gè)線程時(shí)每創(chuàng)建一個(gè)線程時(shí),為新線程分為新線程分配一個(gè)配一個(gè)TCB,將有關(guān)信息填入該將有關(guān)信息填入該TCB中中,并并分配必要的資源分配必要的資源.內(nèi)核支持線程的實(shí)現(xiàn)內(nèi)核支持線程的實(shí)現(xiàn)5.21用戶級(jí)線程和內(nèi)核支持線程用戶級(jí)線程和內(nèi)核支持線程1線程的調(diào)度與切換速度:內(nèi)核支持線程的調(diào)度和線
22、程的調(diào)度與切換速度:內(nèi)核支持線程的調(diào)度和切換與進(jìn)程的調(diào)度和切換非常類似。切換與進(jìn)程的調(diào)度和切換非常類似。 2系統(tǒng)功能調(diào)用:當(dāng)傳統(tǒng)的用戶進(jìn)程調(diào)用一個(gè)系統(tǒng)系統(tǒng)功能調(diào)用:當(dāng)傳統(tǒng)的用戶進(jìn)程調(diào)用一個(gè)系統(tǒng)功能調(diào)用時(shí),要由用戶態(tài)進(jìn)入中心態(tài),用戶進(jìn)程將被功能調(diào)用時(shí),要由用戶態(tài)進(jìn)入中心態(tài),用戶進(jìn)程將被阻塞。當(dāng)內(nèi)核完成系統(tǒng)調(diào)用而前往時(shí),才將該進(jìn)程喚阻塞。當(dāng)內(nèi)核完成系統(tǒng)調(diào)用而前往時(shí),才將該進(jìn)程喚醒,繼續(xù)執(zhí)行。而用戶級(jí)線程在切換時(shí)不須轉(zhuǎn)入中心醒,繼續(xù)執(zhí)行。而用戶級(jí)線程在切換時(shí)不須轉(zhuǎn)入中心態(tài)態(tài).用戶級(jí)線程是不能直接利用系統(tǒng)調(diào)用的用戶級(jí)線程是不能直接利用系統(tǒng)調(diào)用的. 3線程執(zhí)行時(shí)間線程執(zhí)行時(shí)間 :對(duì)于只設(shè)置了用戶級(jí)線程的
23、系統(tǒng):對(duì)于只設(shè)置了用戶級(jí)線程的系統(tǒng),調(diào)度是以進(jìn)程為單位進(jìn)展的。在采用輪轉(zhuǎn)調(diào)度算法,調(diào)度是以進(jìn)程為單位進(jìn)展的。在采用輪轉(zhuǎn)調(diào)度算法時(shí),各個(gè)進(jìn)程輪番執(zhí)行一個(gè)時(shí)間片,這對(duì)諸進(jìn)程而言時(shí),各個(gè)進(jìn)程輪番執(zhí)行一個(gè)時(shí)間片,這對(duì)諸進(jìn)程而言似乎是公平的。似乎是公平的。 5.22Multithreading ModelsMultithreading Models多線程模型多線程模型Many-to-One:多對(duì)一多對(duì)一(many user_level threads to one kernel thread,thread management is done in user space)多個(gè)用戶線程對(duì)應(yīng)一個(gè)內(nèi)核多個(gè)用戶
24、線程對(duì)應(yīng)一個(gè)內(nèi)核線程線程One-to-One:一對(duì)一一對(duì)一(each user thread maps to a kernel thread,it allows multiple threads to run in parallel on multiprocessors,but every user thread need a kernel thread.windows nt and os/2) 一個(gè)用戶線程對(duì)應(yīng)一個(gè)內(nèi)核線程一個(gè)用戶線程對(duì)應(yīng)一個(gè)內(nèi)核線程Many-to-Many:多對(duì)多多對(duì)多(Solaris,IRIX,Digital UNIX)5.23Many-to-OneMany-to-One
25、多對(duì)一多對(duì)一Many User-Level Threads Mapped to Single Kernel Thread.多個(gè)用戶級(jí)線程映像進(jìn)單個(gè)內(nèi)核線程多個(gè)用戶級(jí)線程映像進(jìn)單個(gè)內(nèi)核線程線程管理在用戶空間實(shí)現(xiàn)線程管理在用戶空間實(shí)現(xiàn)任一時(shí)辰只能有一個(gè)線程可以訪問內(nèi)核任一時(shí)辰只能有一個(gè)線程可以訪問內(nèi)核(并并發(fā)性低發(fā)性低)Used on Systems That Do Not Support Kernel Threads. 用于不支持內(nèi)核線程的系統(tǒng)中用于不支持內(nèi)核線程的系統(tǒng)中5.24Many-to-one Model多對(duì)一模型多對(duì)一模型5.25One-to-OneOne-to-One一對(duì)一一對(duì)一Ea
26、ch User-Level Thread Maps to a Kernel Each User-Level Thread Maps to a Kernel Thread.Thread.每個(gè)用戶級(jí)線程映像進(jìn)一個(gè)內(nèi)核線程每個(gè)用戶級(jí)線程映像進(jìn)一個(gè)內(nèi)核線程提供了更好的并發(fā)性提供了更好的并發(fā)性每創(chuàng)建一個(gè)用戶級(jí)線程需創(chuàng)建一個(gè)相應(yīng)的內(nèi)每創(chuàng)建一個(gè)用戶級(jí)線程需創(chuàng)建一個(gè)相應(yīng)的內(nèi)核線程核線程, ,帶來了額外開銷帶來了額外開銷, ,所以許多系統(tǒng)限制所以許多系統(tǒng)限制運(yùn)用中的線程數(shù)目運(yùn)用中的線程數(shù)目ExamplesExamples- Windows 95/98/NT- Windows 95/98/NT- OS/2- OS
27、/25.26One-to-one Model一對(duì)一模型一對(duì)一模型5.27Many-to-many Model多對(duì)多模型多對(duì)多模型5.28Many-to-many Model多對(duì)多模型多對(duì)多模型多對(duì)一模型的缺陷:不能實(shí)現(xiàn)真正多對(duì)一模型的缺陷:不能實(shí)現(xiàn)真正的并發(fā)的并發(fā)一對(duì)一模型的缺陷:需限制運(yùn)用中一對(duì)一模型的缺陷:需限制運(yùn)用中的線程數(shù)目的線程數(shù)目多對(duì)多模型:不限制運(yùn)用的線程數(shù)多對(duì)多模型:不限制運(yùn)用的線程數(shù)、多個(gè)線程可以并發(fā)、多個(gè)線程可以并發(fā)5.29線程舉例線程舉例SUN Solaris 2Solaris支持內(nèi)核線程支持內(nèi)核線程(Kernel threads)、輕權(quán)、輕權(quán)進(jìn)程進(jìn)程(Lightweig
28、ht Processes)和用戶級(jí)線程和用戶級(jí)線程(User Level Threads)。一個(gè)進(jìn)程可有大量用戶線程;大量用戶線程一個(gè)進(jìn)程可有大量用戶線程;大量用戶線程復(fù)用少量的輕權(quán)進(jìn)程,不同的輕權(quán)進(jìn)程分別復(fù)用少量的輕權(quán)進(jìn)程,不同的輕權(quán)進(jìn)程分別對(duì)應(yīng)不同的內(nèi)核線程。對(duì)應(yīng)不同的內(nèi)核線程。5.30Solaris 2 Threads Solaris 2線程線程5.31Threads Support in Solaris 2 Solaris 2支持的線程支持的線程Solaris 2 is a version of UNIX with support for threads at the kernel a
29、nd user levels, symmetric multiprocessing, and real-time scheduling. Solaris 2 是是UNIX的一個(gè)版本,支持內(nèi)核級(jí)和用戶級(jí)的一個(gè)版本,支持內(nèi)核級(jí)和用戶級(jí)線程,對(duì)稱多處置和實(shí)時(shí)調(diào)度線程,對(duì)稱多處置和實(shí)時(shí)調(diào)度LWP (lightweight processes)intermediate level between user-level threads and kernel-level threads. 輕權(quán)進(jìn)程輕權(quán)進(jìn)程:在用戶級(jí)線程和內(nèi)核級(jí)線程之間在用戶級(jí)線程和內(nèi)核級(jí)線程之間5.32Threads Support in
30、Solaris 2 Solaris 2支持的線程支持的線程Resource needs of thread types: 不同類型線程需求的資源不同類型線程需求的資源Kernel thread: small data structure and a stack; thread switching does not require changing memory access information relatively fast. 內(nèi)核線程:小數(shù)據(jù)構(gòu)造及棧;線內(nèi)核線程:小數(shù)據(jù)構(gòu)造及棧;線程切換相對(duì)快程切換相對(duì)快LWP: PCB with register data, accounting an
31、d memory information,; switching between LWPs is relatively slow. LWP:帶有存放器數(shù)據(jù)的帶有存放器數(shù)據(jù)的PCB,記賬和內(nèi)存信息;在,記賬和內(nèi)存信息;在LWP之間之間切換相對(duì)慢切換相對(duì)慢User-level thread: only need stack and program counter; no kernel involvement means fast switching. Kernel only sees the LWPs that support user-level threads. 用戶級(jí)線程用戶級(jí)線程:只需棧及
32、程序計(jì)數(shù)器;無內(nèi)核涉及所以切換快。內(nèi)核只關(guān)注:只需棧及程序計(jì)數(shù)器;無內(nèi)核涉及所以切換快。內(nèi)核只關(guān)注支持用戶級(jí)線程的支持用戶級(jí)線程的LWP5.33輕權(quán)進(jìn)程輕權(quán)進(jìn)程(Light Weight Process)它是內(nèi)核支持的線程。一個(gè)進(jìn)程可有一它是內(nèi)核支持的線程。一個(gè)進(jìn)程可有一個(gè)或多個(gè)輕權(quán)進(jìn)程,每個(gè)輕權(quán)進(jìn)程由一個(gè)或多個(gè)輕權(quán)進(jìn)程,每個(gè)輕權(quán)進(jìn)程由一個(gè)單獨(dú)的內(nèi)核線程來支持。個(gè)單獨(dú)的內(nèi)核線程來支持。LWP是內(nèi)核數(shù)據(jù)構(gòu)造,駐留在內(nèi)核空間。是內(nèi)核數(shù)據(jù)構(gòu)造,駐留在內(nèi)核空間。只需當(dāng)一個(gè)用戶線程與內(nèi)核通訊時(shí)才需只需當(dāng)一個(gè)用戶線程與內(nèi)核通訊時(shí)才需求求LWP的協(xié)助。的協(xié)助。5.34Solaris 2 Threads So
33、laris 2線程線程綁定綁定BindingBinding:一個(gè)用戶線程永久地銜:一個(gè)用戶線程永久地銜接到一個(gè)接到一個(gè)LWPLWP對(duì)于沒有綁定的對(duì)于沒有綁定的LWPLWP,那么由線程庫動(dòng)態(tài)地,那么由線程庫動(dòng)態(tài)地進(jìn)展調(diào)整:一個(gè)進(jìn)程對(duì)應(yīng)的進(jìn)展調(diào)整:一個(gè)進(jìn)程對(duì)應(yīng)的LWPLWP組成組成LWPLWP池池,線程庫動(dòng)態(tài)調(diào)整池中的數(shù)目,以保證運(yùn),線程庫動(dòng)態(tài)調(diào)整池中的數(shù)目,以保證運(yùn)用的最正確性能:當(dāng)池中的用的最正確性能:當(dāng)池中的LWPLWP全部阻塞,全部阻塞,而進(jìn)程中還有線程可以運(yùn)轉(zhuǎn),那么線程庫而進(jìn)程中還有線程可以運(yùn)轉(zhuǎn),那么線程庫會(huì)為之創(chuàng)建另一個(gè)會(huì)為之創(chuàng)建另一個(gè)LWPLWP;而當(dāng)一個(gè);而當(dāng)一個(gè)LWPLWP長(zhǎng)時(shí)長(zhǎng)
34、時(shí)間沒用老化,普通為間沒用老化,普通為5 5分鐘,那么線程分鐘,那么線程庫會(huì)刪除它。庫會(huì)刪除它。5.35Process 1PermanentlyBoundThreadsProcess 1KTKTKTKTKTKTCPU 1CPU 1LWPUTUTUTUTLWPLWPUnboundThreadsPool of LWPs forUnbound ThreadsKernalUTLWP用戶線程、輕權(quán)進(jìn)程和中心線程的關(guān)系用戶線程、輕權(quán)進(jìn)程和中心線程的關(guān)系5.36Solaris Process Solaris 線程線程5.37Timesliceor PreemptWakeupStopBlockingSyste
35、mCallWakeupDispatchRunnableRunningActiveStoppedContinueStopStopStopSleepDispatchStopWakeupContinuePreemptStoppedRunnableActiveSleeping用戶級(jí)線程輕權(quán)進(jìn)程Solaris用戶線程和輕權(quán)進(jìn)程用戶線程和輕權(quán)進(jìn)程5.38用戶級(jí)線程在運(yùn)用系統(tǒng)調(diào)用時(shí)如文件用戶級(jí)線程在運(yùn)用系統(tǒng)調(diào)用時(shí)如文件讀寫,需求讀寫,需求“綁定綁定(binding)在一個(gè)在一個(gè)LWP上。上。永久綁定:一個(gè)永久綁定:一個(gè)LWP固定被一個(gè)用戶級(jí)固定被一個(gè)用戶級(jí)線程占用,該線程占用,該LWP移到移到LWP池之外池
36、之外暫時(shí)綁定:從暫時(shí)綁定:從LWP池中暫時(shí)分配一個(gè)未池中暫時(shí)分配一個(gè)未被占用的被占用的LWP線程舉例線程舉例5.39在運(yùn)用系統(tǒng)調(diào)用時(shí),假設(shè)一切在運(yùn)用系統(tǒng)調(diào)用時(shí),假設(shè)一切LWP已被其已被其他用戶級(jí)線程所占用綁定,那么該線他用戶級(jí)線程所占用綁定,那么該線程阻塞直到有可用的程阻塞直到有可用的LWP例如例如6個(gè)用戶個(gè)用戶級(jí)線程,而級(jí)線程,而LWP池有池有4個(gè)個(gè)LWP假設(shè)假設(shè)LWP執(zhí)行系統(tǒng)調(diào)用時(shí)阻塞如執(zhí)行系統(tǒng)調(diào)用時(shí)阻塞如read()調(diào)用,那么當(dāng)前綁定在調(diào)用,那么當(dāng)前綁定在LWP上的用戶級(jí)上的用戶級(jí)線程也阻塞。線程也阻塞。線程舉例線程舉例5.40有關(guān)的有關(guān)的C庫函數(shù)庫函數(shù)/* 創(chuàng)建用戶級(jí)線程創(chuàng)建用戶級(jí)線程
37、*/ int thr_create(void *stack_base, size_t stack_size, void *(*start_routine)(void *), void *arg, long flags,thread_t *new_thread_id);其中其中flags包括:包括:THR_BOUND永久捆綁永久捆綁, THR_NEW_LWP創(chuàng)建新創(chuàng)建新LWP放入放入LWP池,池,假設(shè)兩者同時(shí)指定那么創(chuàng)建兩個(gè)新假設(shè)兩者同時(shí)指定那么創(chuàng)建兩個(gè)新LWP,一,一個(gè)永久捆綁而另一個(gè)放入個(gè)永久捆綁而另一個(gè)放入LWP池池5.41有關(guān)的有關(guān)的C庫函數(shù)庫函數(shù)/* 在當(dāng)前進(jìn)程中創(chuàng)建在當(dāng)前進(jìn)程中創(chuàng)建L
38、WP*/ int _lwp_create(ucontext_t *contextp, unsigned long flags, lwpid_t *new_lwp_id); /* 構(gòu)造構(gòu)造LWP上下文上下文*/ void _lwp_makecontext(ucontext_t *ucp, void (*start_routine)( void *), void *arg, void *private, caddr_t stack_base, size_t stack_size); /* 留意:沒有進(jìn)展留意:沒有進(jìn)展捆綁捆綁操作的系統(tǒng)調(diào)用操作的系統(tǒng)調(diào)用 */5.42就緒形狀就緒形狀(Ready):
39、進(jìn)程已獲得除處置機(jī)外的所需資源,等待執(zhí)行。:進(jìn)程已獲得除處置機(jī)外的所需資源,等待執(zhí)行。備用形狀備用形狀(Standby):特定處置器的執(zhí)行對(duì)象,系統(tǒng)中每個(gè)處置器上只:特定處置器的執(zhí)行對(duì)象,系統(tǒng)中每個(gè)處置器上只能有一個(gè)處于備用形狀的線程。能有一個(gè)處于備用形狀的線程。運(yùn)轉(zhuǎn)形狀運(yùn)轉(zhuǎn)形狀(Running):完成描畫表切換,線程進(jìn)入運(yùn)轉(zhuǎn)形狀,直到內(nèi)核:完成描畫表切換,線程進(jìn)入運(yùn)轉(zhuǎn)形狀,直到內(nèi)核搶先、時(shí)間片用完、線程終止或進(jìn)展等待形狀。搶先、時(shí)間片用完、線程終止或進(jìn)展等待形狀。等待形狀等待形狀(Waiting):線程等待對(duì)象句柄,以同步它的執(zhí)行。等待終了:線程等待對(duì)象句柄,以同步它的執(zhí)行。等待終了時(shí),根據(jù)
40、優(yōu)先級(jí)進(jìn)入運(yùn)轉(zhuǎn)、就緒形狀。時(shí),根據(jù)優(yōu)先級(jí)進(jìn)入運(yùn)轉(zhuǎn)、就緒形狀。轉(zhuǎn)換形狀轉(zhuǎn)換形狀(Transition):線程在預(yù)備執(zhí)行而其內(nèi)核堆棧處于外存時(shí),線:線程在預(yù)備執(zhí)行而其內(nèi)核堆棧處于外存時(shí),線程進(jìn)入轉(zhuǎn)換形狀;當(dāng)其內(nèi)核堆棧調(diào)回內(nèi)存,線程進(jìn)入就緒形狀。程進(jìn)入轉(zhuǎn)換形狀;當(dāng)其內(nèi)核堆棧調(diào)回內(nèi)存,線程進(jìn)入就緒形狀。終止形狀終止形狀(Terminated):線程執(zhí)行完就進(jìn)入終止形狀;如執(zhí)行體有一:線程執(zhí)行完就進(jìn)入終止形狀;如執(zhí)行體有一指向線程對(duì)象的指針,可將線程對(duì)象重新初始化,并再次運(yùn)用。指向線程對(duì)象的指針,可將線程對(duì)象重新初始化,并再次運(yùn)用。初始化形狀初始化形狀(Initialized):線程創(chuàng)建過程中的線程形狀
41、;:線程創(chuàng)建過程中的線程形狀;Windows NT的線程形狀的線程形狀5.43運(yùn)行終止就緒等待描述表切換搶先或時(shí)間片結(jié)束等待對(duì)象句柄執(zhí)行完成初始化轉(zhuǎn)換備用選擇執(zhí)行搶先放入就緒隊(duì)列等待完成等待完成換出的內(nèi)核堆棧換入的內(nèi)核堆棧重新初始化創(chuàng)建和初始化線程對(duì)象Windows NT的線程形狀的線程形狀5.44Windows 2000線程形狀線程形狀5.45ResourceAvailableUnblock/ResumeResource AvailableUnblockResource Not AvailableBlock/SuspendTerminateSwitchPick toRunPreemptedT
42、ransitionWaitingTerminatedNot RunnableRunnableReadyStandbyRunningWindows NT的線程形狀的線程形狀5.46NTNT線程的有關(guān)線程的有關(guān)APIAPICreateThread()函數(shù)在調(diào)用進(jìn)程的地址空間上創(chuàng)建函數(shù)在調(diào)用進(jìn)程的地址空間上創(chuàng)建一個(gè)線程,以執(zhí)行指定的函數(shù);前往值為所創(chuàng)建線一個(gè)線程,以執(zhí)行指定的函數(shù);前往值為所創(chuàng)建線程的句柄。程的句柄。ExitThread()函數(shù)用于終了本線程。函數(shù)用于終了本線程。SuspendThread()函數(shù)用于掛起指定的線程。函數(shù)用于掛起指定的線程。ResumeThread()函數(shù)遞減指定線程
43、的掛起計(jì)數(shù),函數(shù)遞減指定線程的掛起計(jì)數(shù),掛起計(jì)數(shù)為掛起計(jì)數(shù)為0時(shí),線程恢復(fù)執(zhí)行。時(shí),線程恢復(fù)執(zhí)行。5.47Java Threads JavaJava Threads Java線程線程Java provides support at the language level for creation and management of threads.Java provides commands that allow the developer to creat and manipulate additional threads of control within the program. Java
44、 在言語級(jí)提供線程的創(chuàng)建和管理在言語級(jí)提供線程的創(chuàng)建和管理, Java 提供了相關(guān)的命令提供了相關(guān)的命令,使得開發(fā)人員可以在使得開發(fā)人員可以在程序中創(chuàng)建和支配線程程序中創(chuàng)建和支配線程5.48JavaJava線程線程Java不直接支持異步事件。例如,一個(gè)客戶端想不直接支持異步事件。例如,一個(gè)客戶端想與某個(gè)與某個(gè)server建立銜接,那么該客戶阻塞直到建建立銜接,那么該客戶阻塞直到建立銜接或超時(shí),但由于立銜接或超時(shí),但由于Java不直接支持異步事件不直接支持異步事件如超時(shí),那么客戶只能不斷等待建立銜接。如超時(shí),那么客戶只能不斷等待建立銜接。但假設(shè)該但假設(shè)該server不幸不幸down機(jī)了?機(jī)了?J
45、ava的處理方案:利用多線程。在上述情況下,的處理方案:利用多線程。在上述情況下,建立兩個(gè)線程,其一為銜接線程建立兩個(gè)線程,其一為銜接線程T1,另一個(gè)為超,另一個(gè)為超時(shí)線程時(shí)線程T2, T2創(chuàng)建之后就睡眠一段時(shí)間,如創(chuàng)建之后就睡眠一段時(shí)間,如60秒,然后會(huì)醒來,去檢查秒,然后會(huì)醒來,去檢查T1能否還在試圖建立銜能否還在試圖建立銜接,假設(shè)是,那么中止它。接,假設(shè)是,那么中止它。5.49Java Threads JavaJava Threads Java線程線程Java Threads有兩種創(chuàng)建方法:有兩種創(chuàng)建方法:擴(kuò)展擴(kuò)展Thread類,并重置它的類,并重置它的RUN方法方法定義一個(gè)類,實(shí)現(xiàn)定義
46、一個(gè)類,實(shí)現(xiàn)Runnable接口接口5.50Extending the Thread Class擴(kuò)展擴(kuò)展Thread類類class Worker1 extends Threadpublic void run() System.out.println(“I am a Worker Thread);Thread creation by extending the thread classIt is the start() method that actually creates the new thread,start():allocates memory and initializes a ne
47、w thread in the JVM;call the run()method 新線程是由新線程是由start() 方法創(chuàng)建的方法創(chuàng)建的, start() 方法為方法為JVM中的一個(gè)新線程分配內(nèi)存并初中的一個(gè)新線程分配內(nèi)存并初始化始化,然后調(diào)用然后調(diào)用run()方法方法5.51Creating the Thread創(chuàng)建線程創(chuàng)建線程public class Firstpublic static void main(String args) Worker runner = new Worker1();runner.start();System.out.println(“I am the main
48、 thread);新線程是由新線程是由start() 方法創(chuàng)建的方法創(chuàng)建的, start() 方法為方法為JVM中的一個(gè)新線程分配內(nèi)中的一個(gè)新線程分配內(nèi)存并初始化存并初始化,然后調(diào)用然后調(diào)用run()方法方法5.52Extending the Thread Class擴(kuò)展擴(kuò)展Thread類類上面程序運(yùn)轉(zhuǎn)后,上面程序運(yùn)轉(zhuǎn)后,JVM創(chuàng)建了兩個(gè)線創(chuàng)建了兩個(gè)線程:程:第一個(gè)是運(yùn)轉(zhuǎn)第一個(gè)是運(yùn)轉(zhuǎn)main()方法的線程方法的線程第二個(gè)是第二個(gè)是runner線程:是由線程:是由start()方方法創(chuàng)建的法創(chuàng)建的5.53The Runnable InterfaceThe Runnable Interface可運(yùn)
49、轉(zhuǎn)接口可運(yùn)轉(zhuǎn)接口public interface Runnablepublic abstract void run();Runnable接口提供了接口提供了run()方法,所以接方法,所以接下來要定義一個(gè)類實(shí)現(xiàn)下來要定義一個(gè)類實(shí)現(xiàn)Runnable接口的接口的話,必需定義一個(gè)話,必需定義一個(gè)run()方法方法5.54Implementing the Runnable Interface可運(yùn)轉(zhuǎn)接口的實(shí)現(xiàn)可運(yùn)轉(zhuǎn)接口的實(shí)現(xiàn)class Worker2 implements Runnable public void run() System.out.println(“I am a Worker Threa
50、d);類類Worker2實(shí)現(xiàn)了實(shí)現(xiàn)了Runnable接口,并定義了接口,并定義了run() 方法方法5.55Creating the Thread創(chuàng)建線程創(chuàng)建線程public class Secondpublic static void main(String args) Runnable runner = new Worker2();Thread thrd = new Thread(runner);thrd.start();System.out.println(“I am the main thread);/*創(chuàng)建了一個(gè)線程對(duì)象傳送給創(chuàng)建了一個(gè)線程對(duì)象傳送給Runnable對(duì)象,當(dāng)這個(gè)新的線程由對(duì)象,當(dāng)這個(gè)新的線程由start()方法創(chuàng)建后,新線程開場(chǎng)執(zhí)行方法創(chuàng)建后,新線程開場(chǎng)執(zhí)行Runnable對(duì)象的對(duì)象的run()方法方法*/5.56Java Thread ManagementJava線程的管理線程的管理suspend() suspends execution of the currently running th
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度房產(chǎn)出售中介服務(wù)合同標(biāo)的物質(zhì)量保證書4篇
- 2025年度票務(wù)代理與電商平臺(tái)合作協(xié)議范本4篇
- 二零二四年度協(xié)議離婚全程跟蹤與風(fēng)險(xiǎn)評(píng)估合同3篇
- 二零二五年度養(yǎng)殖技術(shù)培訓(xùn)與承包協(xié)議3篇
- 2025年中國濾清器制造行業(yè)市場(chǎng)運(yùn)營現(xiàn)狀及投資戰(zhàn)略咨詢報(bào)告
- 二零二五年度南京市住建部房屋租賃標(biāo)準(zhǔn)合同范本
- 2025年玻璃器具項(xiàng)目可行性研究報(bào)告
- 2025年迷你警報(bào)喇叭行業(yè)深度研究分析報(bào)告
- 2025年度商業(yè)綜合體場(chǎng)地?zé)o償使用租賃合同范本4篇
- 2025-2031年中國胃藥行業(yè)市場(chǎng)調(diào)查研究及發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
- 數(shù)學(xué)-山東省2025年1月濟(jì)南市高三期末學(xué)習(xí)質(zhì)量檢測(cè)濟(jì)南期末試題和答案
- 中儲(chǔ)糧黑龍江分公司社招2025年學(xué)習(xí)資料
- 湖南省長(zhǎng)沙市2024-2025學(xué)年高一數(shù)學(xué)上學(xué)期期末考試試卷
- 船舶行業(yè)維修保養(yǎng)合同
- 2024年3月江蘇省考公務(wù)員面試題(B類)及參考答案
- 醫(yī)院科室考勤表
- 春節(jié)期間化工企業(yè)安全生產(chǎn)注意安全生產(chǎn)
- 數(shù)字的秘密生活:最有趣的50個(gè)數(shù)學(xué)故事
- 移動(dòng)商務(wù)內(nèi)容運(yùn)營(吳洪貴)任務(wù)一 移動(dòng)商務(wù)內(nèi)容運(yùn)營關(guān)鍵要素分解
- 基于ADAMS的汽車懸架系統(tǒng)建模與優(yōu)化
- 當(dāng)前中國個(gè)人極端暴力犯罪個(gè)案研究
評(píng)論
0/150
提交評(píng)論