{eval=Array;=+count(Array);}
首先,Linux多線程和多進程的作用其實作用都差不多,主要是為了完成并發(fā)任務(wù)。
其次,我們再來看看什么是進程,什么是線程,以及它們之間的關(guān)系。
線程是執(zhí)行體,用來執(zhí)行我們寫的代碼或指令,多個線程可以同時執(zhí)行。
進程是容器,包含了線程執(zhí)行所需要的一切系統(tǒng)資源,線程只能在進程空間中執(zhí)行,進程中可以包含多個執(zhí)行線程,但只有一個主線程,我們代碼中包含main函數(shù)的線程也就是進程中的主線程。
進程本身是不活躍的,在Linux中,如果進程中的所有執(zhí)行線程都已經(jīng)退出,而父進程沒有捕獲子進程結(jié)束的信號,此時該進程則會變?yōu)榻┦M程,該進程不占CPU時間,但會占據(jù)系統(tǒng)資源,如果大量存在,必定會導致系統(tǒng)資源被耗盡,導致死機。
通俗的比喻就是,操作系統(tǒng)就像一個手工作坊,進程就相當于作坊中一個個獨立的工作車間,而線程就相當于車間中真正勞作的工人,沒有工人的車間是無法進行生產(chǎn)的。
進程空間之間彼此隔離,可以說互不影響,就相當于上述手工作坊中的兩個車間中都有個叫張三的人,但其中一個因為上班時間玩手機被老板開除了,而另一個車間中的張三卻不會受到任何影響。(當然,這不是絕對的,Linux子進程會在創(chuàng)建初期共享父進程的進程空間,而vfork系統(tǒng)調(diào)用會導致這種共享一直存在,導致父進程中的變量修改會影響子進程數(shù)據(jù),而fork則采用寫時拷貝技術(shù)來避免了這個問題)。
由于進程的這種隔離性,進程之間共享數(shù)據(jù)和通信也變得麻煩許多,一般的技術(shù)手段就是管道,POSIX信號,System V信號,共享內(nèi)存,Socket網(wǎng)路通信等等。
線程之間也沒有進程那么麻煩,它們是共享整個進程空間的,這就像車間里要開小組會議,一個人發(fā)言的時候大家都能聽到,但這又造成了另一個問題,畢竟一個車間十來號人,難免人多嘴雜,怎么保證一個人發(fā)言的中途沒人插嘴呢,這就是線程同步的問題,一般的技術(shù)手段就是信號量,互斥鎖,讀寫鎖,文件鎖等等。
當然,多線程中同步的問題在多進程中依然會遇到,解決辦法自然也就和多線程差不多。
先聲明下,什么是多進程、多線程
什么是多進程?
在計算中,進程是正在執(zhí)行的計算機程序的一個實例。或者簡單地說,運行程序也稱為進程。
多進程意味著“在單個計算機系統(tǒng)中具有兩個或更多個CPU。
例如,如果計算機系統(tǒng)具有雙核心,并且同時運行(執(zhí)行)兩個進程(同時),則可以通過將每個進程分配給系統(tǒng)的每個核心來實現(xiàn)。因此,這兩個過程可以同時執(zhí)行。換句話說,多進程可以定義為多個進程可以同時執(zhí)行,而不是一個接一個地執(zhí)行。在多進程中,每個進程都有不同的地址空間和資源。
什么是多線程?
進程是線程的集合。線程是一個輕量級的過程。線程執(zhí)行是執(zhí)行的小處理單元。
每個進程包含許多線程,所有線程共享相同的內(nèi)存空間。
同一個進程中可以存在多個線程,共享內(nèi)存等資源,而不同的進程不共享這些資源。
在單個處理器上,多線程通常通過時分多路復(fù)用(如多任務(wù)處理):處理器在不同的線程之間切換。
這種上下文切換通常發(fā)生得足夠頻繁,以至于用戶感覺到線程或任務(wù)同時運行。
線程與進程有什么不同?
線程不同于傳統(tǒng)的多任務(wù)操作系統(tǒng)進程:
進程通常是獨立的,而線程作為進程的子集存在
進程比線程攜帶更多的狀態(tài)信息,而進程內(nèi)的多個線程共享進程狀態(tài)以及內(nèi)存和其他資源
進程具有獨立的地址空間,而線程共享其地址空間
進程只能通過系統(tǒng)提供的進程間通信機制進行交互
同一進程中的線程之間的上下文切換通常比進程之間的上下文切換更快
多線程調(diào)度
操作系統(tǒng)通過以下兩種方式之一來調(diào)度線程:
先發(fā)制人的多線程一般被認為是優(yōu)越的方法,因為它允許操作系統(tǒng)確定何時發(fā)生上下文切換。搶占式多線程的缺點是系統(tǒng)可能會在不恰當?shù)臅r間進行上下文切換,引起鎖車隊,優(yōu)先級反轉(zhuǎn)或其他負面影響,這可能會通過協(xié)作式多線程來避免。
另一方面,合作多線程依賴于線程自己放棄控制,一旦他們在停止點。如果線程正在等待資源變?yōu)榭捎脿顟B(tài),則會產(chǎn)生問題。
線程的保護機制
一個線程將共享父進程的所有全局變量和文件描述符,允許程序員在一個進程內(nèi)輕松地分離多個任務(wù)。
它共享一切,除了每個線程將有自己的程序計數(shù)器,堆棧和寄存器。由于每個線程都有自己的堆棧,所以線程之間不會共享局部變量。
由于一個進程的所有線程共享相同的全局變量,所以同步訪問全局變量會出現(xiàn)問題。例如,我們假設(shè)你有一個全局變量X和兩個線程A和B.假設(shè)線程A和B只會增加X的值。當線程A開始執(zhí)行時,它將把X的值復(fù)制到寄存器中并遞增。在它有機會將值寫回內(nèi)存之前,此線程被暫停。下一個線程開始,讀取第一個線程讀取的相同的X值,遞增并寫回到內(nèi)存。然后,第一個線程完成執(zhí)行并將其值從寄存器寫回到內(nèi)存。在這兩個線程完成之后,X的值會按照您的預(yù)期遞增1而不是2。
0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答