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內核》