c# 進(jìn)程和線程的區(qū)別與聯(lián)系
引入線程是為了減少程序在并發(fā)執(zhí)行時(shí)所付出的時(shí)空開銷。
屬性:
- 輕型實(shí)體。它不擁有系統(tǒng)資源,只是有一點(diǎn)必不可少的、能保證獨(dú)立運(yùn)行的資源。
- 獨(dú)立調(diào)度和分派的基本單位。在多線程OS中,線程是獨(dú)立運(yùn)行的基本單位,因而也是獨(dú)立調(diào)度和分派的基本單位,但由于線程很輕,故線程的切換非常迅速且開銷小。
- 可并發(fā)執(zhí)行。在一個(gè)進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行,甚至允許在一個(gè)進(jìn)程中的所有線程都能并發(fā)執(zhí)行;同樣,不同進(jìn)程中的線程也能并發(fā)執(zhí)行。
- 共享進(jìn)程資源。在同一個(gè)進(jìn)程中的各個(gè)線程都可以共享該進(jìn)程所擁有的資源,這首先表現(xiàn)在:所有線程都具有相同的地址空間(進(jìn)程的地址空間),這意味著,線程可以訪問該地址空間中的每一個(gè)虛地址;此外,還可以訪問進(jìn)程所擁有的已打開文件、定時(shí)器、信號量機(jī)構(gòu)等。
線程的創(chuàng)建和終止
雖然已被終止但尚未釋放資源的線程,仍可以被需要他的線程所調(diào)用,以使被終止的線程重新恢復(fù)運(yùn)行。為此,調(diào)用者線程須調(diào)用一條被稱為“等待線程終止”的連接命令,來與該線程重新連接,如果在一個(gè)調(diào)用者線程調(diào)用"等待線程終止"的連接命令,試圖與指定線程相連接時(shí),若指定線程尚未被終止,則調(diào)用連接命令的線程將會阻塞,直至指定線程被終止后,才能實(shí)現(xiàn)它與調(diào)用者線程的連接并繼續(xù)執(zhí)行,若指定線程已被終止,則調(diào)用線程不會被阻塞而是繼續(xù)執(zhí)行。
多線程OS中的進(jìn)程:
- 作為系統(tǒng)資源分配的單位。在多線程OS中,仍然是以進(jìn)程作為系統(tǒng)資源分配的基本單位,在任何一個(gè)進(jìn)程中所擁有的資源包括:受到分別保護(hù)的用戶地址空間、用于實(shí)現(xiàn)進(jìn)程間和線程間同步和通信的機(jī)制、已打開的文件和已收申請到I/O設(shè)備,以及一張由核心進(jìn)程維護(hù)的地址映射表,該表用于實(shí)現(xiàn)用戶程序的邏輯地址到其內(nèi)存物理地址的映射。
- 可包括多個(gè)線程。通常一個(gè)進(jìn)程都含有多個(gè)相對獨(dú)立的線程,其數(shù)目可多可少,但至少也要有一個(gè)線程,由進(jìn)程為這些線程提供資源及運(yùn)行環(huán)境,使這些線程可并發(fā)執(zhí)行。在OS中的所有線程都只能屬于某個(gè)特定的進(jìn)程。
- 進(jìn)程不是一個(gè)可執(zhí)行的實(shí)體。在多線程OS中,是把線程作為獨(dú)立運(yùn)行的基本單位,所以此時(shí)的進(jìn)程已不再是一個(gè)可執(zhí)行的實(shí)體。
定義:
一、進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動,是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。
二、線程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,他是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位,線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),一個(gè)線程可以創(chuàng)建和撤銷另一個(gè)線程;
進(jìn)程和線程的關(guān)系:
(1)一個(gè)線程只能屬于一個(gè)進(jìn)程,而一個(gè)進(jìn)程可以有多個(gè)線程,但至少有一個(gè)線程。
(2)資源分配給進(jìn)程,同一進(jìn)程的所有線程共享該進(jìn)程的所有資源。
(3)線程在執(zhí)行過程中,需要協(xié)作同步。不同進(jìn)程的線程間要利用消息通信的辦法實(shí)現(xiàn)同步。
(4)處理機(jī)分給線程,即真正在處理機(jī)上運(yùn)行的是線程。
(5)線程是指進(jìn)程內(nèi)的一個(gè)執(zhí)行單元,也是進(jìn)程內(nèi)的可調(diào)度實(shí)體。
線程與進(jìn)程的區(qū)別:
(1)調(diào)度:線程作為調(diào)度和分配的基本單位,進(jìn)程作為擁有資源的基本單位。
(2)并發(fā)性:不僅進(jìn)程之間可以并發(fā)執(zhí)行,同一個(gè)進(jìn)程的多個(gè)線程之間也可以并發(fā)執(zhí)行。
(3)擁有資源:進(jìn)程是擁有資源的一個(gè)獨(dú)立單位,線程不擁有系統(tǒng)資源,但可以訪問隸屬于進(jìn)程的資源。
(4)系統(tǒng)開銷:在創(chuàng)建或撤銷進(jìn)程的時(shí)候,由于系統(tǒng)都要為之分配和回收資源,導(dǎo)致系統(tǒng)的明顯大于創(chuàng)建或撤銷線程時(shí)的開銷。但進(jìn)程有獨(dú)立的地址空間,進(jìn)程崩潰后,在保護(hù)模式下不會對其他的進(jìn)程產(chǎn)生影響,而線程只是一個(gè)進(jìn)程中的不同的執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨(dú)的地址空間,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯,但是在進(jìn)程切換時(shí),耗費(fèi)的資源較大,效率要差些。
線程的劃分尺度小于進(jìn)程,使得多線程程序的并發(fā)性高。
另外,進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享內(nèi)存,從而極大的提高了程序運(yùn)行效率。
線程在執(zhí)行過程中,每個(gè)獨(dú)立的線程有一個(gè)程序運(yùn)行的入口,順序執(zhí)行序列和程序的出口。但是線程不能夠獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,有應(yīng)用程序提供多個(gè)線程執(zhí)行控制。
從邏輯角度看,多線程的意義子啊與一個(gè)應(yīng)用程序中,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行。但操作系統(tǒng)并沒有將多個(gè)線程看做多個(gè)獨(dú)立的應(yīng)用,來實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。這就是進(jìn)程和線程的重要區(qū)別。
以上就是c# 進(jìn)程和線程的區(qū)別與聯(lián)系的詳細(xì)內(nèi)容,更多關(guān)于c# 進(jìn)程和線程的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#獲取進(jìn)程的主窗口句柄的實(shí)現(xiàn)方法
C#獲取進(jìn)程的主窗口句柄的實(shí)現(xiàn)方法,需要的朋友可以參考一下2013-04-04
C#使用迭代法實(shí)現(xiàn)Fibnaci數(shù)列
這篇文章主要介紹了C#使用迭代法實(shí)現(xiàn)Fibnaci數(shù)列的方法,較為詳細(xì)的分析了Fibnaci數(shù)列的原理與迭代法實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-05-05
winfrom 在業(yè)務(wù)層實(shí)現(xiàn)事務(wù)控制的小例子
winfrom 在業(yè)務(wù)層實(shí)現(xiàn)事務(wù)控制的小例子,需要的朋友可以參考一下2013-03-03
Windows系統(tǒng)中C#讀寫ini配置文件的程序代碼示例分享
這篇文章主要介紹了C#讀寫ini配置文件的程序代碼示例分享,在Windows下可以利用Win32的API函數(shù)輕松實(shí)現(xiàn),需要的朋友可以參考下2016-04-04
WPF利用DrawingContext實(shí)現(xiàn)繪制溫度計(jì)
這篇文章主要為大家詳細(xì)介紹了如何利用WPF和DrawingContext實(shí)現(xiàn)繪制溫度計(jì),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下2022-09-09
C# 實(shí)現(xiàn)簡易的串口監(jiān)視上位機(jī)功能附源碼下載
這篇文章主要介紹了C# 實(shí)現(xiàn)簡易的串口監(jiān)視上位機(jī)功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11

