㈠ 轉載 同一進程中的線程究竟共享哪些資源
線程共享的環境包括:進程代碼段、進程的公有數據(利用這些共享的數據,線程很容易的實現相互之間的通訊)、進程打開的文件描述符、信號的處理器、進程的當前目錄和進程用戶ID與進程組ID。
進程擁有這許多共性的同時,還擁有自己的個性。有了這些個性,線程才能實現並發性。這些個性包括:
1.線程ID
每個線程都有自己的線程ID,這個ID在本進程中是唯一的。進程用此來標
識線程。
2.寄存器組的值
由於線程間是並發運行的,每個線程有自己不同的運行線索,當從一個線
程切換到另一個線程上時,必須將原有的線程的寄存器集合的狀態保存,以便
將來該線程在被重新切換到時能得以恢復。
3.線程的堆棧
堆棧是保證線程獨立運行所必須的。
線程函數可以調用函數,而被調用函數中又是可以層層嵌套的,所以線程
必須擁有自己的函數堆棧,使得函數調用可以正常執行,不受其他線程的影
響。
4.錯誤返回碼
由於同一個進程中有很多個線程在同時運行,可能某個線程進行系統調用
後設置了errno值,而在該線程還沒有處理這個錯誤,另外一個線程就在此時
被調度器投入運行,這樣錯誤值就有可能被修改。
所以,不同的線程應該擁有自己的錯誤返回碼變數。
5.線程的信號屏蔽碼
由於每個線程所感興趣的信號不同,所以線程的信號屏蔽碼應該由線程自
己管理。但所有的線程都共享同樣的信號處理器。
6.線程的優先順序
由於線程需要像進程那樣能夠被調度,那麼就必須要有可供調度使用的參
數,這個參數就是線程的優先順序。
涉及多線程程序涉及的時候經常會出現一些令人難以思議的事情,用堆和棧分配一個變數可能在以後的執行中產生意想不到的結果,而這個結果的表現就是內存的非法被訪問,導致內存的內容被更改。
㈡ 進程和線程關系與區別
進程
進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.
線程
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.
㈢ 線程之間會共享什麼 會共享下面之中的哪些
Program counter:不共享,網上搜了一下,說的應該就是EIP,線程當前執行的指令
stack:不共享,每個線程都有自己的棧
Registers:不共享,每個線程都有自己的上下文(context)
Global variables:共享,全局變數這個誰都可以訪問不用解釋了吧
Heap:不清楚,如果這里說的是內存中的堆的概念的話,是可以共享的,這個線程new的內存(new申請內存是從堆重申請),在那個線程也可以訪問。
㈣ 同一進程的各個線程可以共享哪些內容
一般情況下埠是進程的,線程不負責連接,只負責處理,也就是進程有一個埠,進程每次接受到一個連接就會啟動一個線程,用線程來處理,等線程處理完後會把結果給進程,進程再把它發送出去
㈤ 線程的特徵
在多線程OS中,通常是在一個進程中包括多個線程,每個線程都是作為利用CPU的基本單位,是花費最小開銷的實體。線程具有以下屬性。
1)輕型實體
線程中的實體基本上不擁有系統資源,只是有一點必不可少的、能保證獨立運行的資源。
線程的實體包括程序、數據和TCB。線程是動態概念,它的動態特性由線程式控制制塊TCB(Thread Control Block)描述。TCB包括以下信息:
(1)線程狀態。
(2)當線程不運行時,被保存的現場資源。
(3)一組執行堆棧。
(4)存放每個線程的局部變數主存區。
(5)訪問同一個進程中的主存和其它資源。
用於指示被執行指令序列的程序計數器、保留局部變數、少數狀態參數和返回地址等的一組寄存器和堆棧。
2)獨立調度和分派的基本單位。
在多線程OS中,線程是能獨立運行的基本單位,因而也是獨立調度和分派的基本單位。由於線程很「輕」,故線程的切換非常迅速且開銷小(在同一進程中的)。
3)可並發執行。
在一個進程中的多個線程之間,可以並發執行,甚至允許在一個進程中所有線程都能並發執行;同樣,不同進程中的線程也能並發執行,充分利用和發揮了處理機與外圍設備並行工作的能力。
4)共享進程資源。
在同一進程中的各個線程,都可以共享該進程所擁有的資源,這首先表現在:所有線程都具有相同的地址空間(進程的地址空間),這意味著,線程可以訪問該地址空間的每一個虛地址;此外,還可以訪問進程所擁有的已打開文件、定時器、信號量機構等。由於同一個進程內的線程共享內存和文件,所以線程之間互相通信不必調用內核。
㈥ 同一進程的各個線程可以共享哪些內容
線程,有時被稱為輕量級進程(Lightweight Process,LWP),
是程序執行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),
寄存器集合和堆棧組成。另外,線程是進程中的一個實體,
是被系統獨立調度和分派的基本單位,線程自己不擁有系
㈦ 線程間通信有哪些方式
線程間通信方式有:
1、volatile
volatile有兩大特性,一是可見性,二是有序性,禁止指令重排序,其中可見性就是可以讓線程之間進行通信。volatile語義保證線程可見性有兩個原則保證:
(1)所有volatile修飾的變數一旦被某個線程更改,必須立即刷新到主內存。
(2)所有volatile修飾的變數在使用之前必須重新讀取主內存的值。
2、等待/通知機制
等待通知機制是基於wait和notify方法來實現的,在一個線程內調用該線程鎖對象的wait方法,線程將進入等待隊列進行等待直到被通知或者被喚醒。
3、join方式
join其實合理理解成是線程合並,當在一個線程調用另一個線程的join方法時,當前線程阻塞等待被調用join方法的線程執行完畢才能繼續執行,所以join的好處能夠保證線程的執行順序。
但是如果調用線程的join方法其實已經失去了並行的意義,雖然存在多個線程,但是本質上還是串列的,最後join的實現其實是基於等待通知機制的。
4、threadLocal
threadLocal方式的線程通信,不像以上三種方式是多個線程之間的通信,它更像是一個線程內部的通信,將當前線程和一個map綁定,在當前線程內可以任意存取數據,減省了方法調用間參數的傳遞。
線程特點:
1、輕型實體
線程中的實體基本上不擁有系統資源,只是有一點必不可少的、能保證獨立運行的資源。線程的實體包括程序、數據和TCB。線程是動態概念,它的動態特性由線程式控制制塊TCB(Thread Control Block)描述。
2、獨立調度和分派的基本單位
在多線程OS中,線程是能獨立運行的基本單位,因而也是獨立調度和分派的基本單位。由於線程很「輕」,故線程的切換非常迅速且開銷小(在同一進程中的)。
3、可並發執行
在一個進程中的多個線程之間,可以並發執行,甚至允許在一個進程中所有線程都能並發執行;同樣,不同進程中的線程也能並發執行,充分利用和發揮了處理機與外圍設備並行工作的能力。
4、共享進程資源
在同一進程中的各個線程,都可以共享該進程所擁有的資源,這首先表現在:所有線程都具有相同的地址空間(進程的地址空間),這意味著,線程可以訪問該地址空間的每一個虛地址。
此外,還可以訪問進程所擁有的已打開文件、定時器、信號量機構等。由於同一個進程內的線程共享內存和文件,所以線程之間互相通信不必調用內核。
㈧ 如何在兩個線程間共享數據
ps:由於最近的面試很多問題都涉及多線程,自己感覺以前學的還是太淺,再展開學學吧。
今天先從考的比較頻繁的「多線程共享數據」開始。
一.目標
談到多線程共享數據,理想情況下我們希望做到「同步」和「互斥」。這是目標我們暫且把它先放到這。
二.分類
多線程共享數據通常的場景有一下兩種:
場景一:
賣票,我們都買過火車票。要買火車票我們可以去車站,也可以通過代售點(或網購),但不管有多少種方式火車票的總數是一定的。
場景抽象:
對於賣票系統每個線程的核心執行的代碼都相同(就是票數--)。
解決方法:
只需創建一個Runnable,這個Runnable里有那個共享數據。
代碼模擬:
Java代碼
package 多線程共享數據;
public class Ticket implements Runnable{
private int ticket = 10;
public void run() {
while(ticket>0){
ticket--;
System.out.println("當前票數為:"+ticket);
}
}
}
㈨ 同一個進程的各個線程可以共享哪些內容
進程代碼段、進程的公有數據(利用這些共享的數據,線程很容易的實現相互之間的通訊)、進程打開的文件描述符、信號的處理器、進程的當前目錄和進程用戶ID與進程組ID。同一個進程的各個線程可以共享哪些內容
㈩ 如何在兩個線程之間共享數據
【死記硬背】
【答案解析】
將數據抽象成一個類,並將對這個數據的操作作為這個類的方法,這么設計可以和容易做到同步,只要在方法上加「synchronized」。
將 Runnable 對象作為一個類的內部類,共享數據作為這個類的成員變數,每個線程對共享數據的操作方法也封裝在外部類,以便實現對數據的各個操作的同步和互斥,作為內部類的各個 Runnable 對象調用外部類的這些方法。
【溫馨提示】