進程與線程的區(qū)別是很重要的一個知識點秸讹,也是面試中經常問到的檀咙。網上轉載博客痕跡明顯,且千篇一律璃诀。我簡單提取下弧可,記錄下來,希望能幫到你劣欢。另外在 LeetCode 上也有關于此問題的討論棕诵,可以直接瀏覽“Read more” 部分。
1凿将、引入進程之前–多道程序設計
概述
多道程序設計技術是操作系統(tǒng)最早引入的技術年鸳,它的設計思想是允多個程序同時進入內存并運行,其目的是為了CPU的利用率丸相,進而提高系統(tǒng)效率搔确。
特點
多道程序設計技術引入之前,多個程序串行執(zhí)行。只存在一個程序計數器(PC, program counter),一個程序執(zhí)行完畢之后膳算,才會執(zhí)行下一個程序座硕。而多道程序設計技術允許多個程序同時進入內存并運行,那就要每個程序分配程序計數器涕蜂。如果內存中有四個程序在并發(fā)執(zhí)行华匾,那就需要四個程序計數器。
新技術帶來的問題
一個技術机隙、一個機制的引入蜘拉,一方面解決了以前棘手的問題,但同時有鹿,往往帶來新的問題旭旭。多道程序設計技術也是如此。
多道程序設計技術允許多個程序同時進入內存并運行葱跋,在這樣的并發(fā)環(huán)境下持寄,如何描述、刻畫這樣執(zhí)行的程序呢娱俺?因此引入了“進程”稍味。
2、進程(Process)
定義
進程是具有獨立功能的程序關于某個數據集合上的一次運行活動荠卷,是系統(tǒng)進行資源分配和調度(若不支持線程機制模庐,進程的系統(tǒng)調度的單位。否則油宜,線程是系統(tǒng)調度的單位)的獨立單位赖欣。
特點
- 進程是程序的一次執(zhí)行過程。若程序執(zhí)行兩次甚至多次验庙,則需要兩個甚至多個進程。
- 進程是是正在運行程序的抽象社牲。它代表運行的CPU粪薛,也稱進程是對CPU的抽象。(虛擬技術的支持搏恤,將一個CPU變幻為多個虛擬的CPU)
- 系統(tǒng)資源(如內存违寿、文件)以進程為單位分配。
- 操作系統(tǒng)為每個進程分配了獨立的地址空間
- 操作系統(tǒng)通過“調度”把控制權交給進程熟空。
為什么引入線程 有了進程這概念之后 應用程序可以并發(fā)地去執(zhí)行了 那么為什么要在進程當中再派生出線程呢藤巢?
3、為什么引入線程息罗?
首先我們引入了進程這個概念掂咒,雖然進程有利于資源的管理和保護。然而在實際應用中,進程有這樣的問題:
1. 進程切換的代價绍刮、開銷比較大温圆;
2. 在一個進程內也需要并行執(zhí)行多個程序,實現不同的功能孩革。
3. 進程有時候性能比較低岁歉。
引入線程有以下三個方面的考慮
- 應用的需要。比如打開一個瀏覽器膝蜈,我想一邊瀏覽網頁锅移,一邊下載文件,一邊播放音樂饱搏。如果一個瀏覽器是一個進程非剃,那么這樣的需求需要線程機制。
- 開銷的考慮窍帝。在進程內創(chuàng)建努潘、終止線程比創(chuàng)建、終止進程要快坤学。同一進程內的線程間切換比進程間的切換要快,尤其是用戶級線程間的切換疯坤。線程之間相互通信無須通過內核(同一進程內的線程共享內存和文件)
- 性能的考慮。多個線程中深浮,任務功能不同(有的負責計算压怠,有的負責I/O),如果有多個處理器,一個進程就可以有很多的任務同時在執(zhí)行飞苇。
4菌瘫、線程的屬性
線程
- 有標識符ID
- 有狀態(tài)及狀態(tài)轉換,所以需要提供一些狀態(tài)轉換操作
- 不運行時需要保存上下文環(huán)境布卡,所以需要程序計數器等寄存器
- 有自己的棧和棧指針
- 共享所在進程的地址空間和其它資源
5雨让、進程與線程區(qū)別
- 定義方面:進程是程序在某個數據集合上的一次運行活動;線程是進程中的一個執(zhí)行路徑忿等。(進程可以創(chuàng)建多個線程)
- 角色方面:在支持線程機制的系統(tǒng)中栖忠,進程是系統(tǒng)資源分配的單位,線程是CPU調度的單位贸街。
- 資源共享方面:進程之間不能共享資源庵寞,而線程共享所在進程的地址空間和其它資源。同時線程還有自己的棧和棧指針薛匪,程序計數器等寄存器捐川。
- 獨立性方面:進程有自己獨立的地址空間,而線程沒有逸尖,線程必須依賴于進程而存在古沥。
- 開銷方面瘸右。進程切換的開銷較大。線程相對較小渐白。(前面也提到過尊浓,引入線程也出于了開銷的考慮。)
6纯衍、Read more
Difference between Process and Thread
what is different between thread and process
7栋齿、Android中的進程和線程
關于這方面內容,筆者參考了
以及《Android技術內幕.系統(tǒng)卷》
在此感謝襟诸。
Android 系統(tǒng)在啟動時首先會啟動 Linux 基礎系統(tǒng)瓦堵,然后引導加載 Linux kernel 并啟動初始化進程(Init),如圖。
接著歌亲,啟動 Linux
守護進程(daemons)菇用。這個過程需要啟動以下內容。
啟動USB守護進程(usbd)來管理USB連接陷揪。
啟動Android Debug Bridge 守護進程(adbd)來管理ADB連接惋鸥。
啟動Debug 守護進程(debuggerd)來管理調試進程的請求(包括內存轉換等)。
啟動無限接口守護進程(rild)來管理無線通信悍缠。
在啟動 Linux 守護進程的同時還需要啟動 Zygote 進程卦绣。他主要包括以下需要啟動和注冊的內容。
初始化一個Dalvik虛擬機實例飞蚓。
裝載 Socket 請求所需的類和監(jiān)聽滤港。
創(chuàng)建虛擬機實例來管理應用程序的進程。
再接著趴拧,需要初始化 runtime 進程溅漾,這個過程需要處理的操作:
- 初始化服務管理器
- 注冊服務管理器,以它作為默認 Binder 服務的 Context 管理器著榴。
runtime 進程初始化之后添履, runtime 進程將發(fā)送一個請求到 Zygote ,開始啟動系統(tǒng)服務脑又,這時 Zygote 將為系統(tǒng)服務進程建立一個虛擬機實例暮胧,并啟動系統(tǒng)服務,如圖挂谍。
緊接者,系統(tǒng)服務將啟動原生系統(tǒng)服務瞎饲,主要包括 Surface Flinger 和 Audio Flinger口叙。這些本地系統(tǒng)服務將注冊到服務管理器 (Service Manager) 作為 IPC 服務的目標。
系統(tǒng)服務將啟動 Android 管理服務嗅战, Android 管理服務將都被注冊到服務管理器上妄田。
最后俺亮,當系統(tǒng)加載完所有的服務之后會處于等待狀態(tài),等待程序運行疟呐。但是脚曾,每一個程序都將啟動一個單獨的進程。如圖启具。系統(tǒng)啟動一個 Home 進程 和一個 Contracts 進程本讥。
在Android系統(tǒng)中,每一個App都是一個Linux用戶鲁冯。一般情況下拷沸,每個App都是運行在一個進程的一個線程中,這個線程習慣稱為主線程(Main Thread).
Zygote是一個虛擬機進程薯演,同時也是一個虛擬機實例的孵化器撞芍,每當系統(tǒng)要求執(zhí)行一個 Android應用程序,Zygote就會FORK出一個子進程來執(zhí)行該應用程序跨扮。
這樣做的好處顯而易見:Zygote進程是在系統(tǒng)啟動時產生的序无,它會完成虛擬機的初始化峦筒,庫的加載亿虽,預置類庫的加載和初始化等等操作,而在系統(tǒng)需要一個新的虛擬機實例時浮定,Zygote通過復制自身钧汹,最快速的提供個系統(tǒng)丈探。
另外,對于一些只讀的系統(tǒng)庫拔莱,所有虛擬機實例都和Zygote共享一塊內存區(qū)域碗降,大大節(jié)省了內存開銷。
8塘秦、Android 進程模型
Linux通過調用start_kernel函數來啟動內核讼渊,當內核啟動模塊啟動完成后,將啟動用戶空間的第一個進程——Init進程尊剔,下圖為Android系統(tǒng)的進程模型圖:
從上圖可以看出爪幻,Linux內核在啟動過程中,創(chuàng)建一個名為Kthreadd的內核進程须误,PID=2挨稿,用于創(chuàng)建內核空間的其他進程;同時創(chuàng)建第一個用戶空間Init進程京痢,該進程PID = 1奶甘,用于啟動一些本地進程,比如Zygote進程祭椰,而Zygote進程也是一個專門用于孵化Java進程的本地進程臭家,上圖清晰地描述了整個Android系統(tǒng)的進程模型
9疲陕、Zygote進程孵化新進程
下面來對Zygote進程孵化新進程的過程做進一步了解:
- Zygote進程調用fork()函數創(chuàng)建出Zygote’ 子進程
- 子進程Zygote’ 共享父進程Zygote的代碼區(qū)與連接信息
Fork()橙色箭頭左邊是Zygote進程,右邊是創(chuàng)建出的Zygote‘子進程钉赁;然后Zygote’ 子進程將執(zhí)行流程交給應用程序A蹄殃,Android程序開始運行。
新生成的應用程序A會使用已有Zygote父進程的庫與資源的連接信息你踩,所以運行速度很快诅岩。
另外,對于上圖姓蜂,Zygote啟動后按厘,初始并運行DVM,而后將需要的類與資源加載到內存中钱慢。隨后調用fork()創(chuàng)建出Zygote’ 子進程逮京,接著子進程動態(tài)加載并運行應用程序A。
運行的應用程序A會使用Zygote已經初始化并啟動運行的DVM代碼束莫,通過使用已加載至內存中的類與資源來加快運行速度懒棉。