360 likes | 508 Views
Thread 執行緒. Program ,Process ,Thread. • Program( 程式 )– 儲存於硬碟中的可執行檔稱為 Program • Process( 行程 )– 載入記憶體中的可執行檔稱為 Process • Thread( 執行緒 )– Process 中的一段程式碼執行軌跡稱為 Thread ,是電腦中最小的執行單位。. Multithread. Shared Memory Model. 所有的 threads 都能存取全域變數的資料 當然 threads 也能有自己的區域變數.
E N D
Program ,Process ,Thread • • Program(程式)– 儲存於硬碟中的可執行檔稱為 Program • • Process(行程)– 載入記憶體中的可執行檔稱為 Process • • Thread(執行緒)– Process 中的一段程式碼執行軌跡稱為 Thread,是電腦中最小的執行單位。
Shared Memory Model • 所有的threads 都能存取全域變數的資料 • 當然threads也能有自己的區域變數
Threads in the same process share: • – Most data • – open files (descriptors) • – current working directory • – User and group id
執行緒是 CPU使用時的一個基本單位,它是由一個程式計數器、一組暫存器,以及一個堆疊空間所組成。
• Each thread has a unique: • – Thread ID • – set of registers, stack pointer • – stack for local variables, return addresses • – signal mask • – priority
動 機 • 許多在桌上型PC執行的套裝軟體都是多執行緒。應用程式通常都製作成有許多執行緒控制的個別行程。網頁瀏覽器可能有一個執行緒顯示影像或文字,而另一執行緒則從網路擷取資料。文書處理器可能有一個執行緒在顯示圖形,另一個執行緒從使用者讀入按鍵,而第三個執行緒在背景下執行拼字和文法校正。
好處 撰寫多執行緒程式的好處可以分成四個主要類別: • 應答:將交談式的應用程式多執行緒化,可以在一個程式某一部份被暫停,或程式在執行冗長操作時,依然桂續執行,因此增加了對使用者的應答。 • 資源分享:執行緒間將共用它們所屬行程的記憶體和資源。程式碼和資料共用的好處是讓應用程式有數個不同的執行緒在同一位址空間活動。
經濟:對於行程產生所配置的記憶體和資源耗費很大。反之,因為執行緒共用它們所屬行程的資源,所以執行緒的產生和內容交換就比較經濟。憑經驗去測量出產生和維護行程比執行緒多出多少時間可能很困難,但通常產生和維護行程會比執行緒更費時。經濟:對於行程產生所配置的記憶體和資源耗費很大。反之,因為執行緒共用它們所屬行程的資源,所以執行緒的產生和內容交換就比較經濟。憑經驗去測量出產生和維護行程比執行緒多出多少時間可能很困難,但通常產生和維護行程會比執行緒更費時。 • 使用多處理器架構:在多處理器的架構下,多執行緒的利益可以大幅提升,因為每一執行緒可以並行地在不同的處理器上執行。不論有多少CPU可以使用,單一執行緒只能在一個CPU上執行。多處理器上並行增加多執行緒。
執行緒程式庫 (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下執行。
POSIX • 可移植作業系統介面(Portable Operating System Interface),是IEEE為要在各種UNIX作業系統上執行的軟體,而定義API的一系列互相關聯的標準的總稱,其正式稱呼為IEEE 1003,而國際標準名稱為ISO/IEC9945。 • 此標準源於一個大約開始於1985年的專案。POSIX這個名稱是由”理察·斯托曼”應IEEE的要求而提議的一個易於記憶的名稱。Linux基本上逐步實作了POSIX相容,但並沒有參加正式的POSIX認證。 • 微軟的Windows NT聲稱部分實作了POSIX標準。
執行緒的事項 fork()和exec()等系統呼叫 • 如果程式中的一個執行緒呼叫fork(),則新的行程複製所有的執行緒,或是新的行程是單執行緒呢?有些UNIX系統選擇了擁有兩種版本的fork(),一個是複製所有的執行緒,另一個則是只複製呼叫系統呼叫fork()的那一個執行緒。 • 如果一個執行緒呼叫了系統呼叫exec()之後,exec()參數所指定的程式將取代整個行程(包括所有的執行緒)。
Linux 執行緒 • Linux提供一個fork()系統",它擁有傳統的複製行程功能。Linux也提供clone()系統呼叫來產生執行緒。然而Linux無法區分行程與執行緒。事實上,當在程式內一連串控制時。Linux通常使用任務而不是行程或執行緒。當啟動。clone(),它傳遞一組旗標,決定有多少共用發生在父任務與于任務之間。下列是這些旗標當中的一部份。
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 等等)。
int pthread_create( • pthread_t *restrict tidp, • const pthread_attr_t *restrict attr, • void *(*start_rtn)(void), • void *restrict arg • )
pthread_join{ • pthread_t thread, • void **value_ptr • }
Create a Thread • void run() • void start() • boolean isAlive() • static void sleep(long millis) • void join()
Create a Thread(cont.) public void run() { try { while(true) { … } } catch(IOException ioe) { … } }
SOCKET • SOCKET是一組具體的UNIX系統呼叫,是 80 年代美國的研究單位,研究在UNIX中接納TCP/IP軟體的問題,並使其亦適應於其它場合。所以研究者們創造一種新的通訊介面,盡可能使用現有的UNIX系統呼叫,然後為支援那些不易被整合於現有函式庫的TCP/IP函數,新定義了一些系統呼叫函數,這便是承接口介面(SOCKET INTERFACE)至今已被廣泛的認可與應用,成為一種標準了。
SOCKET PAIR • 所謂 socket 就是一個”IP 位址”加上一個”TCP/UDP Port”,代表了一個連線與哪台機器(IP 位址),及與機器上哪一支程式(Port) 相連的。一個連線必須有兩個端點:來源地和目的地,換句話說,我們一個連線就是與一對 socket 相連著,分別是 Source Socket(Source Address , Source Port)與 Destination Socket(Destination Address , Destination Port),合起來我們稱之為 Socket Pair。
主從式架構模型(Client/Server model) • 每個網路應用程式都有一個通訊端點,一種端點是用戶端,另一種是伺服器。根據定義,用戶端會先送出第一個封包,由一個伺服器接收。在初步接觸後,用戶端和伺服器均能開始收送資料。 • 依據socket所提供的服務來將它分類,然而在用戶端和伺服器上的這兩個sockets必須是同一類才能互相通訊,也就是說,他們必須都是stream(TCP)或都是datagram(UDP)。
主從式架構模型(Client/Server model) • 用戶端的應用程式必須要能找到並識別伺服器的socket,而伺服器會將它的socket命名以讓用戶端識別,就TCP/IP而言,一個socket name包括了IP位址、連結埠編號、以及協定本身。用戶端可用Windows Sockets的名稱伺服函式來查到標準伺服器的連結埠編號,而如果知道伺服器的主機名,則可以Windows Sockets的主機名稱分析函式,來查得伺服器的IP。
主從式架構模型(Client/Server model) • 當用戶端socket成功地聯繫上伺服器端之socket後,這兩者便形成一個”結合”(association)。在此時,每個socket都可以由它的名字及對方的名字所形成的組合加以識別。這個結合包括五個要素:所用的協定、用戶端IP位址、用戶端連結埠號碼、伺服器端IP位址、伺服器端連結埠號碼。這個”結合”的觀念並不只是Windows Sockets程式設計的基礎,它也是一般網路通訊的重要觀念。在結合中的資訊可識別及引導封包通過網路,從這一端的程式傳至另一端。
SOCKET連線 所有的網路應用程式皆可分為五個步驟 • 開啟一個socket • 為socket命名 • 與另一個socket結合 • 在sockets間收送資料 • 關閉socket