36
Thread 執執執

Thread 執行緒

Embed Size (px)

DESCRIPTION

Thread 執行緒. Program ,Process ,Thread. • Program( 程式 )– 儲存於硬碟中的可執行檔稱為 Program • Process( 行程 )– 載入記憶體中的可執行檔稱為 Process • Thread( 執行緒 )– Process 中的一段程式碼執行軌跡稱為 Thread ,是電腦中最小的執行單位。. Multithread. Shared Memory Model. 所有的 threads 都能存取全域變數的資料 當然 threads 也能有自己的區域變數. - PowerPoint PPT Presentation

Citation preview

Page 1: Thread 執行緒

Thread 執行緒

Page 2: Thread 執行緒

Program ,Process ,Thread

• Program( 程式 )– 儲存於硬碟中的可執行檔稱為 Program

• Process( 行程 )– 載入記憶體中的可執行檔稱為 Process

• Thread( 執行緒 )– Process 中的一段程式碼執行軌跡稱為 Thread ,是電腦中最小的執行單位。

Page 3: Thread 執行緒

Multithread

Page 4: Thread 執行緒

Shared Memory Model

所有的 threads 都能存取全域變數的資料 當然 threads 也能有自己的區域變數

Page 5: Thread 執行緒

Threads in the same process share:

– Most data

– open files (descriptors)

– current working directory

– User and group id

Page 6: Thread 執行緒

執行緒是 CPU使用時的一個基本單位,它是由一個程式計數器、一組暫存器,以及一個堆疊空間所組成。

Page 7: Thread 執行緒

• Each thread has a unique:

– Thread ID

– set of registers, stack pointer

– stack for local variables, return addresses

– signal mask

– priority

Page 8: Thread 執行緒

動 機 許多在桌上型 PC執行的套裝軟體都是多執行緒。應用程式通常都

製作成有許多執行緒控制的個別行程。網頁瀏覽器可能有一個執行緒顯示影像或文字,而另一執行緒則從網路擷取資料。文書處理器可能有一個執行緒在顯示圖形,另一個執行緒從使用者讀入按鍵,而第三個執行緒在背景下執行拼字和文法校正。

Page 9: Thread 執行緒

好處 撰寫多執行緒程式的好處可以分成四個主要類別 :1.應答 : 將交談式的應用程式多執行緒化,可以在一個程式某一部份被暫停,或程式在執行冗長操作時,依然桂續執行,因此增加了對使用者的應答。2.資源分享 : 執行緒間將共用它們所屬行程的記憶體和資源。程式碼和資料共用的好處是讓應用程式有數個不同的執行緒在同一位址空間活動。

Page 10: Thread 執行緒

1.經濟 : 對於行程產生所配置的記憶體和資源耗費很大。反之,因為執行緒共用它們所屬行程的資源,所以執行緒的產生和內容交換就比較經濟。憑經驗去測量出產生和維護行程比執行緒多出多少時間可能很困難,但通常產生和維護行程會比執行緒更費時。

2.使用多處理器架構 : 在多處理器的架構下,多執行緒的利益可以大幅提升,因為每一執行緒可以並行地在不同的處理器上執行。不論有多少 CPU可以使用,單一執行緒只能在一個 CPU上執行。多處理器上並行增加多執行緒。

Page 11: Thread 執行緒

執行緒程式庫 (thread library)

4.3.1 Pthreads Pthreads 依據 POS 以 (IEEE1003.1c) 標準定義執行緒產生

和同步的 API 。 Pthreads 是執行緒行為的規格,而非製作。作業系統設計

者可以用任何他們期望的方式製作此規格。 4.3.2 Win32 執行緒

使用 Win32 執行緒程式庫產生執行的技巧與 Pthreads 技巧,在許多方面很相似。當使用 Win32API 時,必須含有windows . h 的標題檔。

4.3.3 Java 執行緒 執行緒是在 Java 程式、 Java 語言和 JavaAPI 中程式執行

的基本模式, Java 的 API 提供執行緒的產生與管理一組豈富的特性。所有 Java 程式至少包含一個單一執行緒控制,即使只包含一個 main() 方法的 Java 程式也是以一個單一執行緒在 JVM 下執行。

Page 12: Thread 執行緒

POSIX

可移植作業系統介面( Portable Operating System Interface ),是 IEEE 為要在各種 UNIX 作業系統上執行的軟體,而定義 API 的一系列互相關聯的標準的總稱,其正式稱呼為 IEEE 1003 ,而國際標準名稱為ISO/IEC 9945 。

此標準源於一個大約開始於 1985 年的專案。 POSIX這個名稱是由”理察 ·斯托曼”應 IEEE 的要求而提議的一個易於記憶的名稱。 Linux 基本上逐步實作了POSIX 相容,但並沒有參加正式的 POSIX 認證。

微軟的 Windows NT 聲稱部分實作了 POSIX 標準。

Page 13: Thread 執行緒

執行緒的事項

fork() 和 exec() 等系統呼叫 如果程式中的一個執行緒呼叫 fork() ,則新的行程

複製所有的執行緒,或是新的行程是單執行緒呢 ?有些 UNIX 系統選擇了擁有兩種版本的 fork() ,一個是複製所有的執行緒,另一個則是只複製呼叫系統呼叫 fork() 的那一個執行緒。

如果一個執行緒呼叫了系統呼叫 exec() 之後, exec()參數所指定的程式將取代整個行程 ( 包括所有的執行緒 ) 。

Page 14: Thread 執行緒

Linux 執行緒 Linux 提供一個 fork() 系統 " ,它擁有傳統的複製行

程功能。 Linux 也提供 clone() 系統呼叫來產生執行緒。然而 Linux無法區分行程與執行緒。事實上,當在程式內一連串控制時。 Linux 通常使用任務而不是行程或執行緒。當啟動。 clone() ,它傳遞一組旗標,決定有多少共用發生在父任務與于任務之間。下列是這些旗標當中的一部份。

Page 15: Thread 執行緒

DEMO

Page 16: Thread 執行緒

unistd.h

unistd.h  是 C  和 C++  程式語言中提供對 POSIX  作業系統 API  的文件名稱。這個文件由 POSIX.1 標準提出的,故所有遵循該標準的作業系統和編譯器均應提供該文件(如 Unix 的所有官方版本,包括 Mac OS X 、 Linux  等)。對於類 Unix 系統, unistd.h  中所定義的介面通常都是大量針對系統調用的封裝,如 fork 、 pipe  以及各種 I/O 原語( read 、 write 、 close  等等)。

Page 17: Thread 執行緒
Page 18: Thread 執行緒

Pthread

function Functional Group

int pthread_create創建 thread若是成功建立線程返回 0 ,否則返回錯誤的編號 -1 。

void pthread_join 加入 thread

void pthread_exit 退出 thread

pthread_t pthread_self 獲取當前 thread 的 id 

Page 19: Thread 執行緒

int pthread_create(

pthread_t *restrict tidp,

const pthread_attr_t *restrict attr,

void *(*start_rtn)(void),

void *restrict arg

)

Page 20: Thread 執行緒

pthread_join{

pthread_t thread,

void **value_ptr

}

Page 21: Thread 執行緒
Page 22: Thread 執行緒
Page 23: Thread 執行緒
Page 24: Thread 執行緒

Create a Thread

void run()

void start()

boolean isAlive()

static void sleep(long millis)

void join()

Page 25: Thread 執行緒

Create a Thread(cont.)

public void run() {

try {

while(true) {

}

}

catch(IOException ioe) {

}

}

Page 26: Thread 執行緒
Page 27: Thread 執行緒

Thread & socket

Page 28: Thread 執行緒

SOCKET

SOCKET 是一組具體的 UNIX 系統呼叫,是 80 年代美國的研究單位,研究在 UNIX 中接納 TCP/IP 軟體的問題,並使其亦適應於其它場合。所以研究者們創造一種新的通訊介面,盡可能使用現有的 UNIX 系統呼叫,然後為支援那些不易被整合於現有函式庫的 TCP/IP 函數,新定義了一些系統呼叫函數,這便是承接口介面 (SOCKET INTERFACE) 至今已被廣泛的認可與應用,成為一種標準了。

Page 29: Thread 執行緒

SOCKET PAIR

所謂 socket 就是一個” IP 位址”加上一個” TCP/UDP Port” ,代表了一個連線與哪台機器 (IP 位址 ) ,及與機器上哪一支程式(Port) 相連的。一個連線必須有兩個端點:來源地和目的地,換句話說,我們一個連線就是與一對 socket 相連著,分別是 Source Socket (Source Address , Source Port) 與 Destination Socket (Destination Address , Destination Port) ,合起來我們稱之為 Socket Pair 。

Page 30: Thread 執行緒

主從式架構模型(Client/Server model)

Page 31: Thread 執行緒

主從式架構模型(Client/Server model)

每個網路應用程式都有一個通訊端點,一種端點是用戶端,另一種是伺服器。根據定義,用戶端會先送出第一個封包,由一個伺服器接收。在初步接觸後,用戶端和伺服器均能開始收送資料。

依據 socket 所提供的服務來將它分類,然而在用戶端和伺服器上的這兩個 sockets 必須是同一類才能互相通訊,也就是說,他們必須都是 stream(TCP) 或都是 datagram(UDP) 。

Page 32: Thread 執行緒

主從式架構模型(Client/Server model)

用戶端的應用程式必須要能找到並識別伺服器的 socket ,而伺服器會將它的 socket 命名以讓用戶端識別,就 TCP/IP 而言,一個socket name 包括了 IP位址、連結埠編號、以及協定本身。用戶端可用 Windows Sockets 的名稱伺服函式來查到標準伺服器的連結埠編號,而如果知道伺服器的主機名,則可以 Windows Sockets 的主機名稱分析函式,來查得伺服器的 IP 。

Page 33: Thread 執行緒

主從式架構模型(Client/Server model)

當用戶端 socket 成功地聯繫上伺服器端之socket 後,這兩者便形成一個”結合” (association) 。在此時,每個 socket 都可以由它的名字及對方的名字所形成的組合加以識別。這個結合包括五個要素:所用的協定、用戶端 IP位址、用戶端連結埠號碼、伺服器端 IP位址、伺服器端連結埠號碼。這個”結合”的觀念並不只是Windows Sockets 程式設計的基礎,它也是一般網路通訊的重要觀念。在結合中的資訊可識別及引導封包通過網路,從這一端的程式傳至另一端。

Page 34: Thread 執行緒

SOCKET 連線

Page 35: Thread 執行緒

SOCKET連線

所有的網路應用程式皆可分為五個步驟開啟一個 socket為 socket 命名與另一個 socket結合在 sockets間收送資料關閉 socket

Page 36: Thread 執行緒

DEMO