本文小編為大家詳細介紹“Linux進程和線程有哪些區別”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Linux進程和線程有哪些區別”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
在理解進程和線程概念之前首選要對并發有一定的感性認識,如果服務器同一時間內只能服務于一個客戶端,其他客戶端都再那里傻等的話,可見其性能的低下估計會被客戶罵出翔來,因此并發編程應運而生,并發是網絡編程中必須考慮的問題。實現并發的方式有多種:比如多進程、多線程、IO多路復用。
進程是資源(CPU、內存等)分配的基本單位,它是程序執行時的一個實例。程序運行時系統就會創建一個進程,并為它分配資源,然后把該進程放入進程就緒隊列,進程調度器選中它的時候就會為它分配CPU時間,程序開始真正運行。
Linux系統函數fork()
可以在父進程中創建一個子進程,這樣的話,在一個進程接到來自客戶端新的請求時就可以復制出一個子進程讓其來處理,父進程只需負責監控請求的到來,然后創建子進程讓其去處理,這樣就能做到并發處理。
# -*- coding:utf-8 -*- import os print('當前進程:%s 啟動中 ....' % os.getpid()) pid = os.fork() if pid == 0: print('子進程:%s,父進程是:%s' % (os.getpid(), os.getppid())) else: print('進程:%s 創建了子進程:%s' % (os.getpid(),pid ))
輸出結果:
當前進程:27223 啟動中 .... 進程:27223 創建了子進程:27224 子進程:27224,父進程是:27223
fork函數會返回兩次結果,因為操作系統會把當前進程的數據復制一遍,然后程序就分兩個進程繼續運行后面的代碼,fork分別在父進程和子進程中返回,在子進程返回的值pid永遠是0,在父進程返回的是子進程的進程id。
線程是程序執行時的最小單位,它是進程的一個執行流,是CPU調度和分派的基本單位,一個進程可以由很多個線程組成,線程間共享進程的所有資源,每個線程有自己的堆棧和局部變量。線程由CPU獨立調度執行,在多CPU環境下就允許多個線程同時運行。同樣多線程也可以實現并發操作,每個請求分配一個線程來處理。
進程是資源分配的最小單位,線程是程序執行的最小單位。
進程有自己的獨立地址空間,每啟動一個進程,系統就會為它分配地址空間,建立數據表來維護代碼段、堆棧段和數據段,這種操作非常昂貴。而線程是共享進程中的數據的,使用相同的地址空間,因此CPU切換一個線程的花費遠比進程要小很多,同時創建一個線程的開銷也比進程要小很多。
線程之間的通信更方便,同一進程下的線程共享全局變量、靜態變量等數據,而進程之間的通信需要以通信的方式(IPC)進行。不過如何處理好同步與互斥是編寫多線程程序的難點。
但是多進程程序更健壯,多線程程序只要有一個線程死掉,整個進程也死掉了,而一個進程死掉并不會對另外一個進程造成影響,因為進程有自己獨立的地址空間。
讀到這里,這篇“Linux進程和線程有哪些區別”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。