Dalvik虛擬機運行在linux操作系統之上。Linux操作系統并沒有純粹的線程概念,只要兩個進程共享一個地址空間,那么就可以認為它們是同一個進程的兩個線程。Linux系統提供了兩個fork和clone調用,其中,前者是用來創建進程的,而后者是用來創建線程的。
一般來說,虛擬機的進程和線程都是和目標機器本地操作系統的進程和線程一一對應的,這樣的好處是可以使本地操作系統來調度進程和線程。
每個Android應用程序進程都有一個Dalvik虛擬機實例。這樣做得好處是Android應用程序進程之間不會互相影響,也就是說,一個Android應用程序進程的意外終止,不會影響到其他的應用程序進程的正常運行。
每個Android應用程序進程都是由一種稱為Zygote的進程fork出來的。Zygote進程是由init進程啟動起來的,也就是在系統啟動的時候啟動的。Zygnote進程在啟動的時候,會創建一個虛擬機實例,并且在這個虛擬機實例將所有的java核心庫都加載起來。每當Zygote進程需要創建一個Android應用程序進程的時候,它就通過復制自身來實現,也就是通過fork系統調用來實現。這些被fork出來的Android應用程序進程,一方面是復制了Zygote進程中的虛擬機實例,另外一方面是與Zygote進程共享了同一套Java核心庫。這樣不僅Android程序進程的創建很快,而且所有的應用程序都共享同一套Java核心庫而節省了內存空間。
新聞熱點
疑難解答