一锁孟、進(jìn)程與線程的區(qū)別:
1、進(jìn)程是資源分配的最小單位仿贬,線程是程序執(zhí)行的最小單位(資源調(diào)度的最小單位)
2纽竣、進(jìn)程有自己的獨(dú)立地址空間,每啟動(dòng)一個(gè)進(jìn)程茧泪,系統(tǒng)就會(huì)為它分配地址空間蜓氨,建立數(shù)據(jù)表來(lái)維護(hù)代碼段、堆棧段和數(shù)據(jù)段队伟,這種操作非常昂貴穴吹。
而線程是共享進(jìn)程中的數(shù)據(jù)的,使用相同的地址空間嗜侮,因此CPU切換一個(gè)線程的花費(fèi)遠(yuǎn)比進(jìn)程要小很多港令,同時(shí)創(chuàng)建一個(gè)線程的開(kāi)銷(xiāo)也比進(jìn)程要小很多啥容。
3、線程之間的通信更方便顷霹,同一進(jìn)程下的線程共享全局變量咪惠、靜態(tài)變量等數(shù)據(jù),而進(jìn)程之間的通信需要以通信的方式(IPC)進(jìn)行淋淀。不過(guò)如何處理好同步與互斥是編寫(xiě)多線程程序的難點(diǎn)遥昧。
4、但是多進(jìn)程程序更健壯朵纷,多線程程序只要有一個(gè)線程死掉渠鸽,整個(gè)進(jìn)程也死掉了,而一個(gè)進(jìn)程死掉并不會(huì)對(duì)另外一個(gè)進(jìn)程造成影響柴罐,因?yàn)檫M(jìn)程有自己獨(dú)立的地址空間。
參考:https://www.cnblogs.com/zhehan54/p/6130030.html
二憨奸、進(jìn)程與線程的資源:
1革屠、堆與棧
堆: 是大家共有的空間,分全局堆和局部堆排宰。全局堆就是所有沒(méi)有分配的空間似芝,局部堆就是用戶分配的空間。堆在操作系統(tǒng)對(duì)進(jìn)程初始化的時(shí)候分配板甘,運(yùn)行過(guò)程中也可以向系統(tǒng)要額外的堆党瓮,但是記得用完了要還給操作系統(tǒng),要不然就是內(nèi)存泄漏盐类。
棧:是個(gè)線程獨(dú)有的寞奸,保存其運(yùn)行狀態(tài)和局部自動(dòng)變量的。棧在線程開(kāi)始的時(shí)候初始化在跳,每個(gè)線程的椙固眩互相獨(dú)立,因此猫妙,棧是 thread safe的瓷翻。操作系統(tǒng)在切換線程的時(shí)候會(huì)自動(dòng)的切換棧,就是切換「钭埂SS/ESP寄存器齐帚。棧空間不需要在高級(jí)語(yǔ)言里面顯式的分配和釋放彼哼。
2对妄、其他
線程共享的環(huán)境包括:進(jìn)程代碼段、進(jìn)程的公有數(shù)據(jù)(利用這些共享的數(shù)據(jù)沪羔,線程很容易的實(shí)現(xiàn)相互之間的通訊)饥伊、進(jìn)程打開(kāi)的文件描述符象浑、信號(hào)的處理器、進(jìn)程的當(dāng)前目錄和進(jìn)程用戶ID與進(jìn)程組ID琅豆。
進(jìn)程擁有這許多共性的同時(shí)愉豺,還擁有自己的個(gè)性。有了這些個(gè)性茫因,線程才能實(shí)現(xiàn)并發(fā)性蚪拦。這些個(gè)性包括:
1.線程ID
每個(gè)線程都有自己的線程ID,這個(gè)ID在本進(jìn)程中是唯一的冻押。進(jìn)程用此來(lái)標(biāo)
識(shí)線程驰贷。
2.寄存器組的值
由于線程間是并發(fā)運(yùn)行的,每個(gè)線程有自己不同的運(yùn)行線索洛巢,當(dāng)從一個(gè)線
程切換到另一個(gè)線程上時(shí)括袒,必須將原有的線程的寄存器集合的狀態(tài)保存,以便
將來(lái)該線程在被重新切換到時(shí)能得以恢復(fù)稿茉。
3.線程的堆棧
堆棧是保證線程獨(dú)立運(yùn)行所必須的锹锰。
線程函數(shù)可以調(diào)用函數(shù),而被調(diào)用函數(shù)中又是可以層層嵌套的漓库,所以線程
必須擁有自己的函數(shù)堆棧恃慧,使得函數(shù)調(diào)用可以正常執(zhí)行,不受其他線程的影
響渺蒿。
4.錯(cuò)誤返回碼
由于同一個(gè)進(jìn)程中有很多個(gè)線程在同時(shí)運(yùn)行痢士,可能某個(gè)線程進(jìn)行系統(tǒng)調(diào)用
后設(shè)置了errno值,而在該線程還沒(méi)有處理這個(gè)錯(cuò)誤茂装,另外一個(gè)線程就在此時(shí)
被調(diào)度器投入運(yùn)行怠蹂,這樣錯(cuò)誤值就有可能被修改。
所以训唱,不同的線程應(yīng)該擁有自己的錯(cuò)誤返回碼變量褥蚯。
5.線程的信號(hào)屏蔽碼
由于每個(gè)線程所感興趣的信號(hào)不同,所以線程的信號(hào)屏蔽碼應(yīng)該由線程自
己管理况增。但所有的線程都共享同樣的信號(hào)處理器赞庶。
6.線程的優(yōu)先級(jí)
由于線程需要像進(jìn)程那樣能夠被調(diào)度,那么就必須要有可供調(diào)度使用的參
數(shù)澳骤,這個(gè)參數(shù)就是線程的優(yōu)先級(jí)歧强。
參考:https://blog.csdn.net/shuilan0066/article/details/7683315
3、進(jìn)程與線程的同步
進(jìn)程:無(wú)名管道为肮、有名管道摊册、信號(hào)、共享內(nèi)存颊艳、消息隊(duì)列茅特、信號(hào)量
進(jìn)程:互斥量忘分、讀寫(xiě)鎖、自旋鎖白修、線程信號(hào)妒峦、條件變量