多線程學習1

因爲項目需要學習多線程,從最基本的概念學起:
進程:就是正在運行的應用程序;抽象的講,進程是一些所有權的集合,擁有自己的內存、CPU運行時間等一系列資源,爲線程運行提供必要環境。每個進程都有自己的地址空間和動態分配的內存以及文件、線程和其他一些模塊。進程是正在運行程序的抽象。一個進程的狀態有如下幾種:
1.運行
2.就緒(當前能夠運行但由於系統正在運行其他進程而需要等待)
3.堵塞(由於得不到所需要的資源或者其他原因,當前進程不能進行,需要等待外部事件的發生)

進程只是表達了所有權概念,線程纔是程序的最小執行單位。線程就是程序的一條執行路徑,是操作系統分配CPU時間的基本實體。一個進程以一個主線程開始,如果需要還可以創建更多線程。一個進程中多個線程共享進程內的公共資源,同一進程所有線程共享同樣的虛擬地址空間、全局變量。
程序:一個靜態的指令序列;
進程:爲執行程序指令的線程而保留的一系列資源的集合;
線程:操作系統分配調度的最小單位

win2000 進程包含如下幾個部分:
1)一個可執行指令的集合;
2)一個私有的虛擬地址空間,即一系列該進程可用的虛擬內存地址的集合;
3)系統資源,包括信號量、通信端口、文件等;
4)至少有一個線程執行
5)進程ID號

線程包含:
1)表示處理器狀態寄存器;
2)兩個堆棧,一個在線程處於核心模式使用,另一個在線程處於用戶模式時使用;
3)一個由子系統、運行時間庫和動態鏈接庫使用的私有存儲區域;
4)一個線程ID號

單線程和多線程:
傳統計算機,只能執行完一個任務後再去執行另外一個;即使在多進程共享很多資源時,也要爲每個進程單獨分配資源,實際上很難做到資源共享。

多線程:提高工作效率和資源有效利用,採用多線程的思想;在多線程環境中,一個進程的多個線程可同時運行,多個線程共享進程資源;

線程同步問題:
由於多線程,存在相互協調和同步的問題;
線程通過“休眠”(sleeping,暫停所有並執行等待)的方法,來做到與進程中的其他線程同步。在線程休眠前,必須告訴windows,該線程將等待某一事件的發生。當該事件發生時,windows喚醒該線程,使得線程繼續執行;
即線程和事件一起被同步,也可以用特殊的對象來進行線程的同步。這些同步對象包括:
1.臨界段:臨界段對象通過提供所有線程必須共享的對象來控制線程,只有擁有臨界段對象的線程纔可以訪問保護的資源(臨界區操作)。在另一個線程可以訪問該資源之前,前一個線程必須先釋放臨界段對象,以便於後一個線程可以獲得對臨界段對象的訪問權;臨界段對象也可用來阻值兩個及以上線程同時訪問共享的資源如文件等;

2.互斥量:互斥量工作方式和臨界段非常相似;區別在於互斥量不僅保護一個進程中的資源共享,而且還保護系統中進程之間的資源共享。它通過爲互斥量提供一個“互斥量名”來進行進程間資源共享協調的;
3.事件:事件對象用於給線程傳遞信號,指示線程中特定的操作可以開始或結束。除非線程收到該事件,否則被掛起,當事件對象進入其信號狀態時,正在等待該事件的線程就可以開始執行。

4.信號量:與互斥量相似,但是互斥量只允許在同一時刻,一個線程訪問它的數據,而信號量允許多個線程在同一時刻訪問它的數據;

內核對象:在開發win32應用中經常需要創建、打開並操作一個內核對象,內核對象一般是指由操作系統創建和管理的對象。
常見的對象有下面幾種:
**Event Objects:事件對象;
File_Mapping Objects:文件映射對象;
File Objects:文件對象;
MailSlot Objects:郵槽對象;
Mutex Objects:互斥對象;
Pipe Objects:管道對象;
Process Objects:進程對象
Semaphore Objects:信號量對象;
Thread Objects:線程對象**;

這些內核對象的創建都是調用不同win32函數生成的,內核對象實際上是由系統內核分配的一塊內存,而且只能由內核來訪問,這個內存塊是一個數據結構,其成員包括了該對象的信息。一定要記住:
內核對象的數據結構只能由內核訪問,應用程序不能再內存中定位這些數據結構,也不可直接改變他們的內容,只能通過win32API函數來操作這些內核對象及其對應的數據結構。當調用創建內核對象的API函數,返回一個用於代表該對象的句柄,它可以被進程中所有的線程使用

可通過如下機制使得多個進程共享某個內核對象:
1.對象句柄繼承。當進程之間存在父子關係時,可以使用對象的句柄繼承方法來讓子進程繼承父進程的句柄;
2.使用命名對象,
3.複製對象句柄;

虛擬內存:現在的windows採用32位尋址,每個進程都被分配4G虛擬地址空間,一個32位的地址代表了內存中的一個地址,系統將32位地址轉換到4G的虛擬地址空間。在一般系統中,系統將2G分配給操作系統內部使用,另一半分配給進程,作爲進程的私有存儲。

對象和句柄:
對象:指一個靜態定義的對象類型(類)的一個運行實例。
句柄:在系統創建對象後返回的用來代表該對象的一個值。通過句柄用戶就可以對對象進行訪問,他代表對對象的引用。至於句柄的值具體是多少,不需要關心,我們只需要知道這個句柄值對應該對象,查找句柄從而找到該對象,就比如你的身份證ID號對應你的人一樣。

安全屬性:內核對象被一個安全描述符保護,安全描述符是針對內核對象而言,每個內核在創建都可以指定安全描述符。但用戶對象或其他對象都不能指定安全描述符。對象的安全描述符描述了誰創建了該對象、誰能訪問、誰不能訪問一系列安全屬性。

發佈了3 篇原創文章 · 獲贊 0 · 訪問量 7417
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章