Android系統開發(8)——linx進程基本概念,androidlinx
一、proc檔案系統傳統意義上的檔案系統是用於塊裝置上資訊的儲存,/proc這個目錄是一個虛擬檔案系統,它放置的資料都是在記憶體當中,所以這個目錄本身不佔用任何硬碟空間。主要包含如下系統資訊:記憶體管理系統進程特徵資料檔案系統裝置驅動程式系統匯流排電源管理終端系統控制參數
使用者和應用程式可以通過proc得到系統的資訊,並可以改變核心的某些參數。由於系統的資訊,如進程,是動態改變的,所以使用者或應用程式讀取proc檔案時,proc檔案系統是動態從系統核心讀出所需資訊並提交的。下面列出的這些檔案或子檔案夾,並不是都是在你的系統中存在,這取決於你的核心配置和裝載的模組。另外,在/proc下還有三個很重要的目錄:net,scsi和sys。 Sys目錄是可寫的,可以通過它來訪問或修改核心的參數,而net和scsi則依賴於核心配置。例如,如果系統不支援scsi,則scsi 目錄不存在。
除了以上介紹的這些,還有的是一些以數字命名的目錄,它們是進程目錄。系統中當前啟動並執行每一個進程都有對應的一個目錄在/proc下,以進程的 PID號為目錄名,它們是讀取進程資訊的介面。而self目錄則是讀取進程本身的資訊介面,是一個link。
二、什麼是進程進程通常被定義為一個正在啟動並執行程式執行個體,它由兩個部分組成:一個組成部分是作業系統用來管理程式的核心對象。核心對象是系統用來存放關於進程統計資訊的地方。另一個組成部分是地址空間,它包含所有可執行模組或DLL模組的代碼和資料。它還包含動態記憶體分配的空間。如線程堆棧和堆棧分配空間。進程運行過程,其實就是把磁碟的二進位檔案載入(映射)到記憶體空間中,並且指引CPU去記憶體中定址,然後計算,並且返回(I/O)的過程。可以思考這樣一個問題,現在我們硬碟上有三個檔案xxx.exe,xxx.apk,xxx,作業系統是如何知道哪些檔案是可執行檔呢?作業系統識別可執行檔的方式有兩種,一種是在系統核心進行識別(比如linux和windows),另一種是在系統內庫層使用虛擬機器來實現。使用虛擬機器就非常方便,我們可以在不修改核心的情況下修改和擴充虛擬機器就可以實現跨平台。三、進程的運行過程1、將程式裝載到記憶體(程式的執行個體化)32位二進位系統最大定址能力是 2^32 = 2^10 * 2^2 = 1G * 4 = 4G,所以我們的實體記憶體最大可以使用4G.假如我們現在同時開了100個進程播放電影,照樣可以正常播放,這是為什麼呢?事實上除了實體記憶體外,還有一個虛擬記憶體
虛擬儲存空間是一個抽象的概念,它為每一個進程提供了一個假象,每個進程都在獨佔使用主存(硬碟) 虛擬位址空間如下:(註:圖摘自《深入理解電腦系統》)
地址空間最底部存放使用者進程定義的代碼和資料,對於所有的進程來說,代碼是從同一個固定地址開始。接著就是全域變數和對應的資料位元置,堆、共用庫、棧。最上面是核心虛擬儲存空間,核心總是駐留在記憶體中,是作業系統的一部分,地址空間頂部的地區是為核心保留的,不允許應用程式讀寫這個地區的內容或者直接調用核心代碼定義的函數。
2、讀取記憶體中的程式段內容,給變數分配空間,在調用的時候定址操作進程運行過程其實就是把磁碟的二進位檔案映射到記憶體空間中並且指引CPU去記憶體中定址,然後計算並且返回(I/O)的過程。
#include <sys/types.h>#include <unistd.h>#include <stdio.h>int main(){ printf("hello PID:%d\n", getpid()); printf("hello ppid:%d\n", getppid()); char *p; scanf("%s", p); return 0;}啟動這個程式(進程)
可以看到這個進程的ID是1634,進程的父ID是1617,下面我們使用命令ps -aux來查看一下當前的進程,該進程的父進程是shell進程。首先二進位程式getpid被linux系統識別,將該二進位檔案放到記憶體中,處理器定址並給變數分配記憶體空間(將函數和變數放到不同的地區),最後將結果輸出。四、進程運行過程中的兩個特點1、多任務,多進程“並發我們的linux是多任務,分時的,一個獨立的邏輯控制流程,好像我們的程式獨佔的使用處理器,下面是CPU的進程調度圖。
進程1,2,3,4,5,6......在運行過程中由CPU分配時間片段,的處理器就像轉盤一樣,當指向某個進程後就給該進程分配時間片,開始執行該進程,如此反覆。2、彼此獨立、所處的記憶體隔絕使用虛擬記憶體,每個進程都有一個私人的地址空間,好像我們的程式獨佔和使用記憶體。五、進程的生命週期對程式而言,進程有三大狀態:運行、掛起、消亡。 1、建立任務(建立進程)2、準備運行(等待CPU分配時間片)3、正在運行(在實際的運行狀態中,如果沒有分配到cpu實際片,繼續等待)4、掛起(分為可打擾的和不可打擾的),比如scanf等待使用者輸入就是可打擾中斷。5、消亡(當任務終止,或者被父進程回收)
Android dvm的進程與Linux的進程, 應用程式的進程是否為同一個概念
DVM指dalivk的虛擬機器。每一個Android應用程式都在它自己的進程中運行,都擁有一個獨立的Dalvik虛擬機器執行個體。而每一個DVM都是在Linux 中的一個進程,所以說可以認為是同一個概念。
什麼是android DVM:Dalvik是Google公司自己設計用於Android平台的Java虛擬機器,每一個Dalvik 應用作為一個獨立的Linux 進程執行。獨立的進程可以防止在虛擬機器崩潰的時候所有程式都被關閉。
Dalvik和Java運行環境的區別 [
1:Dalvik主要是完成對象生命週期管理,堆棧管理,線程管理,安全和異常管理,以及記憶體回收等等重要功能。
2:Dalvik負責進程隔離和線程管理,每一個Android應用在底層都會對應一個獨立的Dalvik虛擬機器執行個體,其代碼在虛擬機器的解釋下得以執行。
3:不同於Java虛擬機器運行java位元組碼,Dalvik虛擬機器啟動並執行是其專有的檔案格式Dex 4:dex檔案格式可以減少整體檔案尺寸,提高I/o操作的類尋找速度。
5:odex是為了在運行過程中進一步提高效能,對dex檔案的進一步最佳化。
6:所有的Android應用的線程都對應一個Linux線程,虛擬機器因而可以更多的依賴作業系統的線程調度和管理機制
7:有一個特殊的虛擬機器進程Zygote,他是虛擬機器執行個體的孵化器。它在系統啟動的時候就會產生,它會完成虛擬機器的初始化,庫的載入,預製類庫和初始化的操作。如果系統需要一個新的虛擬機器執行個體,它會迅速複製自身,以最快的資料提供給系統。對於一些唯讀系統庫,所有虛擬機器執行個體都和Zygote共用一塊記憶體地區。
問android系統中的進程,任務,服務三者的不同與聯絡?
進程是總稱,包括第三方應用和系統應用以及系統底層模組。任務是你安裝的第三方應用進程。而服務是系統模組進程。