進(jìn)程、線程概念性問題
任務(wù)概念(task)
任務(wù)是由軟件完成的一個(gè)活動(dòng),是一系列達(dá)到某種共同目的的操作。一個(gè)任務(wù)既可以由一個(gè)進(jìn)程實(shí)現(xiàn),也可以作為一個(gè)線程來實(shí)現(xiàn)。
進(jìn)程概念 (process)
進(jìn)程是表示資源分配的基本單位,又是調(diào)度運(yùn)行的基本單位。例如,用戶運(yùn)行自己的程序,系統(tǒng)就創(chuàng)建一個(gè)進(jìn)程,并為它分配資源,包括各種表格、內(nèi)存空間、磁盤空間、I/O設(shè)備等。然后,把該進(jìn)程放人進(jìn)程的就緒隊(duì)列。進(jìn)程調(diào)度程序選中它,為它分配CPU以及其它有關(guān)資源,該進(jìn)程才真正運(yùn)行。所以,進(jìn)程是系統(tǒng)中的并發(fā)執(zhí)行的單位。
在Mac、Windows NT等采用微內(nèi)核結(jié)構(gòu)的操作系統(tǒng)中,進(jìn)程的功能發(fā)生了變化:它只是資源分配的單位,而不再是調(diào)度運(yùn)行的單位。在微內(nèi)核系統(tǒng)中,真正調(diào)度運(yùn)行的基本單位是線程。因此,實(shí)現(xiàn)并發(fā)功能的單位是線程。
線程概念(tread)
線程是進(jìn)程中執(zhí)行運(yùn)算的最小單位,亦即執(zhí)行處理機(jī)調(diào)度的基本單位。如果把進(jìn)程理解為在邏輯上操作系統(tǒng)所完成的任務(wù),那么線程表示完成該任務(wù)的許多可能的子任務(wù)之一。例如,假設(shè)用戶啟動(dòng)了一個(gè)窗口中的數(shù)據(jù)庫應(yīng)用程序,操作系統(tǒng)就將對(duì)數(shù)據(jù)庫的調(diào)用表示為一個(gè)進(jìn)程。假設(shè)用戶要從數(shù)據(jù)庫中產(chǎn)生一份工資單報(bào)表,并傳到一個(gè)文件中,這是一個(gè)子任務(wù);在產(chǎn)生工資單報(bào)表的過程中,用戶又可以輸人數(shù)據(jù)庫查詢請(qǐng)求,這又是一個(gè)子任務(wù)。這樣,操作系統(tǒng)則把每一個(gè)請(qǐng)求――工資單報(bào)表和新輸人的數(shù)據(jù)查詢表示為數(shù)據(jù)庫進(jìn)程中的獨(dú)立的線程。線程可以在處理器上獨(dú)立調(diào)度執(zhí)行,這樣,在多處理器環(huán)境下就允許幾個(gè)線程各自在單獨(dú)處理器上進(jìn)行。操作系統(tǒng)提供線程就是為了方便而有效地實(shí)現(xiàn)這種并發(fā)性
進(jìn)程和線程的關(guān)系
(1)一個(gè)線程只能屬于一個(gè)進(jìn)程,而一個(gè)進(jìn)程可以有多個(gè)線程,但至少有一個(gè)線程。
(2)資源分配給進(jìn)程,同一進(jìn)程的所有線程共享該進(jìn)程的所有資源。
(3)處理機(jī)分給線程,即真正在處理機(jī)上運(yùn)行的是線程。
(4)線程在執(zhí)行過程中,需要協(xié)作同步。不同進(jìn)程的線程間要利用消息通信的辦法實(shí)現(xiàn)同步。
引入線程的好處
(1)易于調(diào)度。
(2)提高并發(fā)性。通過線程可方便有效地實(shí)現(xiàn)并發(fā)性。進(jìn)程可創(chuàng)建多個(gè)線程來執(zhí)行同一程序的不同部分。
(3)開銷少。創(chuàng)建線程比創(chuàng)建進(jìn)程要快,所需開銷很少。。
(4)利于充分發(fā)揮多處理器的功能。通過創(chuàng)建多線程進(jìn)程(即一個(gè)進(jìn)程可具有兩個(gè)或更多個(gè)線程),每個(gè)線程在一個(gè)處理器上運(yùn)行,從而實(shí)現(xiàn)應(yīng)用程序的并發(fā)性,使每個(gè)處理器都得到充分運(yùn)行。
多線程技術(shù)
多線程應(yīng)用程序?qū)⒊绦騽澐譃槎鄠€(gè)獨(dú)立的任務(wù),每個(gè)任務(wù)由一個(gè)線程處理。多線程處理可以同時(shí)運(yùn)行多個(gè)線程。
多線程技術(shù)的優(yōu)點(diǎn)
(1)多線程技術(shù)使程序的響應(yīng)速度更快 ,因?yàn)橛脩艚缑婵梢栽谶M(jìn)行其它工作的同時(shí)一直處于活動(dòng)狀態(tài);
(2)當(dāng)前沒有進(jìn)行處理的任務(wù)時(shí)可以將處理器時(shí)間讓給其它任務(wù);
(3)占用大量處理時(shí)間的任務(wù)可以定期將處理器時(shí)間讓給其它任務(wù);
(4)可以隨時(shí)停止任務(wù);
(5)可以分別設(shè)置各個(gè)任務(wù)的優(yōu)先級(jí)以優(yōu)化性能。
是否需要?jiǎng)?chuàng)建多個(gè)線程取決于各種因素。在以下情況下,最適合采用多線程處理:
(1)耗時(shí)或大量占用處理器的任務(wù)阻塞用戶界面操作;
(2)各個(gè)任務(wù)必須等待外部資源 (如遠(yuǎn)程文件或 Internet連接)。
多線程技術(shù)的缺點(diǎn)
1)等候使用共享資源時(shí)造成程序的運(yùn)行速度變慢。這些共享資源主要是獨(dú)占性的資源 ,如打印機(jī)等。
(2)對(duì)線程進(jìn)行管理要求額外的 CPU開銷。線程的使用會(huì)給系統(tǒng)帶來上下文切換的額外負(fù)擔(dān)。當(dāng)這種負(fù)擔(dān)超過一定程度時(shí),多線程的特點(diǎn)主要表現(xiàn)在其缺點(diǎn)上,比如用獨(dú)立的線程來更新數(shù)組內(nèi)每個(gè)元素。
(3)線程的死鎖。即較長時(shí)間的等待或資源競爭以及死鎖等多線程癥狀。
(4)對(duì)公有變量的同時(shí)讀或?qū)憽.?dāng)多個(gè)線程需要對(duì)公有變量進(jìn)行寫操作時(shí),后一個(gè)線程往往會(huì)修改掉前一個(gè)線程存放的數(shù)據(jù),從而使前一個(gè)線程的參數(shù)被修改;另外 ,當(dāng)公用變量的讀寫操作是非原子性時(shí),在不同的機(jī)器上,中斷時(shí)間的不確定性,會(huì)導(dǎo)致數(shù)據(jù)在一個(gè)線程內(nèi)的操作產(chǎn)生錯(cuò)誤,從而產(chǎn)生莫名其妙的錯(cuò)誤,而這種錯(cuò)誤是程序員無法預(yù)知的。
為什么不使用多進(jìn)程?
較之進(jìn)程,線程輕便、價(jià)廉,啟動(dòng)速度快,退出比較快,對(duì)系統(tǒng)資源的沖擊比較小。
如果使用多進(jìn)程,最困難的問題是如何把窗口句柄交給另一個(gè)進(jìn)程。在Win32中,句柄只在其誕生地(進(jìn)程中)才有意義。這是一種安全警戒,避免某個(gè)進(jìn)程有意無意地危及到另一個(gè)進(jìn)程的資源。
為了分享窗口句柄,你必須明明白白地產(chǎn)生該句柄的一個(gè)副本,并且可以被其他進(jìn)程使用。在一個(gè)多線程程序中,所有線程都可以使用這個(gè)窗口的句柄,因?yàn)榫浔途€程生活在同一個(gè)進(jìn)程中。
如果兩個(gè)線程分屬不同的進(jìn)程,那它們通常沒有辦法共享任何內(nèi)存。不同進(jìn)程間如果要通訊,唯有依賴特別的設(shè)計(jì),使之擁有共享內(nèi)存(shared memory)。
如果兩線程屬于同一進(jìn)程,它們將共享所有的內(nèi)存(包括全局變量、靜態(tài)變量),很容易就實(shí)現(xiàn)了線程之間的通訊。
Note:主要是資源共享問題