Dalvik/ART(ANDROID)中的多线程机制(4)
在java中創(chuàng)建一個(gè)線程, new Thread對(duì)象, 并調(diào)用它的start()方法, 這是每一個(gè)java程序員都知道的事.在linux C中創(chuàng)建一個(gè)線程, 使用pthread_create(&thread, NULL, thread_get_str, NULL)函數(shù), 這是每一個(gè)linux C程序員都知道的事.我們不禁要問,在android中, java線程和c線程到底有沒有關(guān)系,如果有,到底是怎么樣的?下面開始神秘的dalvik線程創(chuàng)建之旅:
Thread thread = new Thread(); thread.start();//Thread.java package java.lang; public class Thread implements Runnable {...public synchronized void start() {checkNotStarted();hasBeenStarted = true;VMThread.create(this, stackSize);}...}//VMThread.java package java.lang; class VMThread {...native static void create(Thread t, long stackSize);... }下面進(jìn)入VMThread.java通過JNI對(duì)應(yīng)的C++文件, java_lang_VMThread.cpp
https://android.googlesource.com/platform/dalvik.git/+/android-4.2.2_r1/vm/native/java_lang_VMThread.cpp
進(jìn)入http://osxr.org/android/source/dalvik/vm/Thread.cpp
//Thread.cpp bool dvmCreateInterpThread(Object* threadObj, int reqStackSize) {...int cc = pthread_create(&threadHandle, &threadAttr, interpThreadStart, newThread);... }到這里我們就可以清晰的得出結(jié)論, android dalvik其實(shí)就是通過Linux C的pthread_create實(shí)現(xiàn)的線程創(chuàng)建.
linux 線程: 線程是一種輕量級(jí)的進(jìn)程。 進(jìn)程的通信機(jī)制主要包括無名管道、有名管道、消息隊(duì)列、信號(hào)量、共享內(nèi)存以及信號(hào)等。這些機(jī)制都是由linux內(nèi)核來維護(hù)的,實(shí)現(xiàn)起來都比較復(fù)雜,而且占用大量的系統(tǒng)資源。 線程間的通信機(jī)制實(shí)現(xiàn)起來則相對(duì)簡單,主要包括互斥鎖、條件變量、讀寫鎖和線程信號(hào)等。? ?消息隊(duì)列是消息的鏈接表,存放在內(nèi)核中。其實(shí)質(zhì)上就是一個(gè)內(nèi)核鏈表,消息隊(duì)列提供了一種從一個(gè)進(jìn)程向另一個(gè)進(jìn)程發(fā)送一個(gè)數(shù)據(jù)塊的方法。Linux用宏MSGMAX和MSGMNB來限制一條消息的最大長度和一個(gè)隊(duì)列的最大長度。對(duì)消息隊(duì)列有寫權(quán)限的進(jìn)程可以按照一定的規(guī)則添加新消息;對(duì)消息隊(duì)列有讀權(quán)限的進(jìn)程則可以從消息隊(duì)列中讀出消息。消息隊(duì)列是隨內(nèi)核持續(xù)的并和進(jìn)程相關(guān),?系統(tǒng)中記錄消息隊(duì)列的數(shù)據(jù)結(jié)構(gòu) (struct ipc_ids msg_ids)位于內(nèi)核中,系統(tǒng)中的所有消息隊(duì)列都可以在結(jié)構(gòu)msg_ids中中找到訪問入口。只有在內(nèi)核重起或者顯示刪除一個(gè)消息隊(duì)列時(shí),該消息隊(duì)列才會(huì)真正被刪除。
? ?linux內(nèi)核中的消息隊(duì)列本質(zhì)上是進(jìn)程通信的方式,在內(nèi)核中,每一個(gè)線程如果試用了消息隊(duì)列通信,那么本質(zhì)上被看作輕量級(jí)進(jìn)程。
? ? ? ?所以對(duì)diavik / ARP中,其線程機(jī)制就是調(diào)用linux的線程機(jī)制(消息列隊(duì)通信) ,hotspot jvm則是在jvm層面上有自己的線程機(jī)制,(以N-M映射到linux 內(nèi)核中的線程)這一層沒有了消息隊(duì)列這一概念。所以 這也是hotspot與diavik的 很大的不同。
總結(jié)
以上是生活随笔為你收集整理的Dalvik/ART(ANDROID)中的多线程机制(4)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 被曝经常旷工接私活 格力回应网传孟羽童被
- 下一篇: 索尼 98 英寸 4K BRAVIA 商