Java多線程——Thread的native底層實現


Java多線程

  • 當我們去閱讀java的Thread類的時候,會發現這個類與大部分的java類庫API有着明顯的差別,它的所有關鍵方法都被聲明為native
  • native本身指代的就是本地方法,而又由於java線程模型采用基於操作系統原生線程模型,這里默認Thread中native方式代指的是Native POSIX Thread Library
  • 線程的實現方式有三種:分別是內核線程實現(1:1實現),使用用戶線程實現(1:N),使用用戶線程加輕量級進程混合實現(N:M實現)。而Java從1.3開始線程模型普遍采用基於操作系統原生線程模型來實現,即1:1。
  • Hotpot自己是不會去干涉線程調度的,可以設置線程優先級給OS提供調度建議。
  • Linux把不同的PID與系統中每個進程或輕量級進程相關聯。另一方面,一個多線程應用程序中的所有線程只有一個相同的PID。
  • 正因為多個線程有相同的PID,所以引入了線程組的概念,而一個線程組中的所有線程使用和該線程組的領先進程相同的PID,也就是該組中第一個輕量級進程的PID,它被存入進程描述符的tgid字段中。
  • 有真正意義上的線程,它的實現是由進程來模擬,所以屬於用戶級線程,位於libpthread共享庫。具體到內存中的數據結構,則是進程描述符數據結構中的一個指針指向thread_info,這個就是線程描述符,存儲區域大小為兩個葉框(2*4K)。

Q&A

  • Q1:在一個程序中,代碼的不同位置創建的fork(),所以這個程序就是多線程的?
  • A:不對,同一個程序創建的fork()創建的程序的多進程的程序,每個fork()之間屬於父子進程的關系(父子進程的通信方式可以只允許父子進程通信的方式管道,而FIFO則是允許非父子間進行通信)。
  • Q2:一個操作系統最多創建多少個進程,一個進程最多創建多少個線程?
  • A:一個操作系統最多創建的進程上線與proc表(linux下/proc)的大小有關,而proc表的大小取決於總線寬度(因為總線寬度決定了指針的個數),比如4G個。
  • Q3:如何查看內核線程?
  • A:ps afx

參考博文:

多線程編程小結:https://blog.csdn.net/skyroben/article/details/72793409
《深入理解Java虛擬機:JVM高級特性與最佳實踐》
《深入理解linux內核》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM