版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Thread Synchronization with Kernel object,井民全,為何要使用 Kernel Object 來做同步?,User Mode Synchronization的好處 速度快 User Mode 的限制是 只能處理單一 Process 內(nèi)的 threads之間同步 在單一CPU情況下, 你不能設(shè)定等待時間 Interlocked 家族函式不能讓 thread 進(jìn)入 wait 狀態(tài),不能處理 其他 Process 之間的同步,EnerCriticalSection() 飢餓狀態(tài),讓 CPU 空轉(zhuǎn),Kernel Object 的性質(zhì),每一個核心物件都有紀(jì)錄狀態(tài) P
2、rocess object 被建立 process handle non-signal 當(dāng) Process 終止時 process handle signal 希望等待某個 Process terminated, 怎麼辦? 只要檢查該P(yáng)rocess是否 signal 即可,等待的過程中,你的 thread 不會佔住 CPU time,有哪些 Wait functions 呢?,DWORD WaitForSingleObject( HANDLE hObject, DWORD dwMilliseconds);,DWORD WaitForMultipleObjects( DWORD dwCount,
3、 CONST HANDLE* phObjects, BOOL fWaitAll, DWORD dwMilliseconds);,等待某一個 kernel object signal,等待時間限制: 一般 INFINITE,Object 陣列,數(shù)量,把要等待的 Object 放到CONST HANDLE陣列中,OS 會幫你監(jiān)控 Kernel Object 的狀態(tài), 在 Signal 之前. 你的 Thread 不會被安排進(jìn)入排程,等待時間設(shè)定為 INFINITE是危險的,若等待的 Object 永遠(yuǎn)不會 Signal 則會造成 dead-lock (永遠(yuǎn)不會醒來),比較好的策略是這樣,如果我要等
4、待多個物件怎麼辦?,使用 WaitForMultiObject() 最多只能等待 64 個物件,DWORD WaitForMultipleObjects( DWORD dwCount, CONST HANDLE* phObjects, BOOL fWaitAll, DWORD dwMilliseconds);,TRUE 必須等待所有的 object 都 signal FALSE 只要有一個 object signal 即可,如何得知是那一個 Object Signal ?,HANDLE h3; h0 = hProcess1; h1 = hProcess2; h2 = hProcess3; DW
5、ORD dw = WaitForMultipleObject(3,h, FALSE, 5000); switch (dw) case WAIT_TIMEOUT: break; case WAIT_FAILED: / Bad call to function (invalid handle?) break; case WAIT_OBJECT_0 + 0: break; case WAIT_OBJECT_0 + 1: break; case WAIT_OBJECT_0 + 2: break; ,h0 terminated,h1 terminated,由 WAIT_OBJECT_0 決定,h2 te
6、rminated,一個簡單的範(fàn)例,現(xiàn)在設(shè)定為只要一個 Object signal 就跳離,有哪些 Kernel Object 支援 signal?,Processes Thread Jobs Files Console input File change notifications Events Waitable timers Semaphores Mutexes,現(xiàn)在來討論 多個 Threads 同時 Wait 一個 object 的情況,當(dāng)成功的呼叫 WaitForSingleObject 等functions 通常會改變 kernel object 的狀態(tài) Side effect 不同的
7、object 有不同的 Side effect Auto-reset object 建立 non-signal Terminated signal 通知其他等待的thread 當(dāng)有人成功的呼叫 Wait function 自動設(shè)回 non-signal,有些 Wait function不會改變 這些 object 的狀態(tài) 例如: Thread , Process Object 就沒有 Side effect,考慮下面的情況,HANDLE h2; h0 = hAutoResetEvent1; h1 = hAutoResetEvent2; WaitForMultipleObjects(2, h,
8、TRUE, INFINITE);,等待的是兩個 Auto-reset objects,若有兩條threads, 同時執(zhí)行下面的程式碼,兩個 Object 必須都是 signal 才會跳出來,利用 Event Object 作行程間的同步,策略是 主程式建立 Event Object Child Process 等待該 Event Signal 後才做事,HANDLE CreateEvent( PSECURITY_ATTRIBUTES psa, BOOL fManualReset, BOOL fInitialState, PCTSTR pszName);,HANDLE OpenEvent( DW
9、ORD fdwAccess, BOOL fInherit, PCTSTR pszName);,建立一個 Global 等級 Event,另外的 Process 則用 OpenEvent 開啟,TRUE: 設(shè)定為必須手動,才會 Reset False: Auto-reset,TRUE: 剛建立時,這個 Object 就是 signal 狀態(tài) False: non-signal 狀態(tài),你想要對該 Object 的動作 目前我們使用 SYNCHRONIZE,決定你的 childe process 是否可以存取這個 Object,簡單同步範(fàn)例,建立一個 Global 等級 Event,建立兩個 Chi
10、ldProcess,等待工頭的命令,CreateEventDemo,Process A,Process B,HANDLE hEvent=CreateEvent(NULL,TRUE,FALSE,Fired); if(hEvent = NULL) ErrorExit( 建立 Event 發(fā)生錯誤 );,設(shè)定為手動reset,如果: Manual 設(shè)定為 TRUE, 則當(dāng)有人 SetEvent hEvent 時, hEvent 會 Signal 造成 Process A 與 Process B 成功的 wait 到這項訊號,如果: Manual 設(shè)定為 FALSE, 則當(dāng)有人 SetEvent hE
11、vent 時, hEvent 會 Signal 造成 Process A 或 Process B 只有一個會成功的 wait 到這項訊號,因為其中一個 成功 wait hEvent 後, hEvent 會自動設(shè)定為 non-signal 造成另一個 process 繼續(xù)的等待,補(bǔ)充,我們現(xiàn)在討論 Waitable Timer 來做同步化的動作,固定時間啟動工作 週期的啟動工作,最簡單的範(fàn)例: CreateWaitableTimer,HANDLE hTimer; hTimer = CreateWaitableTimer(NULL, FALSE, MyControlTimer); const in
12、t nTimerUnitsPerSecond = 10000000; LARGE_INTEGER li; li.QuadPart= -1 * (10 * nTimerUnitsPerSecond); SetWaitableTimer(hTimer, ,/ 1 秒 = 10,000,000 (100 nanosecond ),TRUE: 當(dāng) signal 後, 將系統(tǒng)從 suspended power conservation restore 回來,負(fù)數(shù)表示 相對啟動時間,主控程式,我們的Timer 名稱,設(shè)定 10 秒鐘後,這個 object 會 signal,不使用 complete rou
13、tine,complete routine 參數(shù),Auto-reset,最簡單的範(fàn)例: OpenWaitableTimer,HANDLE hTimer=NULL; while(hTimer=NULL) hTimer=OpenWaitableTimer(SYNCHRONIZE, FALSE, MyControlTimer); / 當(dāng) Timer signal才能執(zhí)行工作 WaitForSingleObject(hTimer,INFINITE);,當(dāng) Timer Signal 才會執(zhí)行的 Process,注意: Timer 一定要先建立,也就是說,主控程式要先執(zhí)行,這個Timer不希望能被繼承,這
14、個Timer指能用在 wait function,我們等待的Timer 名稱,最簡單的範(fàn)例: 程式架構(gòu),啟動時,就直接 Create Timer 物件,設(shè)定 Timer 啟動時間,五秒後,啟動 拉動 slider 功能,WaitableTimerDemo,那麼要如何設(shè)定時間呢?,我希望能在西元2005年1月1日下午1時整,然後每隔6小時啟動一次信號,SetWaitableTimer(hTimer,我該如何指定啟動時間?,週期?,我們使用 SYSTEMTIME 指定年月日,SYSTEMTIME st; st.wYear = 2005; / Year st.wMonth = 1; / Januar
15、y st.wDayOfWeek = 0; / Ignored st.wDay = 1; / The first of the month st.wHour = 13; / 1PM st.wMinute = 0; / 0 minutes into the hour st.wSecond = 0; / 0 seconds into the minute st.wMilliseconds = 0; / 0 milliseconds into the second,西元2005年1月1日下午1時整,FileTime LARGE_INTEGER 表示式,將 Local FileTime Coordina
16、ted Universal Time(英國格林威治當(dāng)?shù)啬壳皶r間),將 System Time 轉(zhuǎn)成適當(dāng)?shù)膮?shù),將SystemTime轉(zhuǎn)成以100 ns為單位 Local FileTime,FILETIME ftLocal, ftUTC; SystemTimeToFileTime(,前面算出來的 SystemTime,1,2,LocalFileTimeToFileTime(,3,LARGE_INTEGER liUTC; liUTC.LowPart = ftUTC.dwLowDateTime; liUTC.HighPart = ftUTC.dwHighDateTime;,SetWaitableTi
17、mer(hTimer,設(shè)定時間,FILETIME(從 1601年 1 月 1 號 12:00 AM 到現(xiàn)在經(jīng)過多少100 ns單位),要求使用 UTC-Based absolute time,週期為 6 hours = 6*60*60*1000 milliseconds,主要是處理位址對齊的問題 LARGE_INTEGER 是一個 union 可以把 LowPart 與 HiPart 組合成一個 64-bit 大數(shù),Windows 中的 Time 觀念,人看的懂得,機(jī)器看的,因為 System Time 可以往前或往後 更改, 所以若要記錄計算時間可以使用 Windows Time,本地時間
18、(相對於 UTC),MS-DOS 16-bit 應(yīng)用程式記錄時間的格式,若使用 GetFileTime 讀取 MS-DOS 應(yīng)用程式建立的檔案時間, 則系統(tǒng)會自動幫你把 MS-DOS Time 轉(zhuǎn)換成 UTC-based FileTime 傳回來,FileTime 基本觀念,The system records file times whenever applications create, access, and write to files 例外: NT FAT create time , write time and access time 使用不同的 time resolution N
19、TFS access time 的 resolution = 1 hour 如何取得指定檔案的 file time ? 呼叫 GetFileTime 函式: 他會將資料複製到 FILETIME 的結(jié)構(gòu)中 FindFirstFile , FindNextFile: 會將資料複製到 WIN32_FIND_DATA 結(jié)構(gòu)中,補(bǔ)充,FileTime 基本觀念,設(shè)定 file time? 呼叫 SetFileTime 函式 比較不同檔案的 time? 呼叫 CompareFileTime 函式,注意事項: 呼叫前,應(yīng)該使用 SystemTimeToFileTime 先把日期等 SystemTime 資訊
20、轉(zhuǎn)成 FileTime * 當(dāng)然, 你也可以呼叫 FileTimeToSystemTime 將 FileTime 資料轉(zhuǎn)成看的懂得 SystemFile,傳回 0 表示時間一樣,補(bǔ)充,然後把 FileTime 餵給 SetFileTime,日光節(jié)約時間概念(Daylight Saving Time ),也叫做夏令時(Summer Time ) 將標(biāo)準(zhǔn)時撥快一小時,分秒不變,恢復(fù)時再撥慢一小時。 首先提倡者1908年英國議會,參考資料: .tw/docs/V3.0/astronomy/calendar/summert.htm,理由為:若將時刻改早,則
21、學(xué)校工廠機(jī)關(guān)同樣提早上課上班,而一般人民勢必早睡早起,早睡可節(jié)省燈火. 早起可呼吸新鮮空氣,而且接觸日光機(jī)會較多,足以增進(jìn)一般國民的健康。 當(dāng)時英國學(xué)者多數(shù)反對,因而英國國會未通過此議案 西元1916年歐戰(zhàn)期問,德國因經(jīng)濟(jì)上關(guān)係,首先實行經(jīng)濟(jì)時,也就是所謂日光節(jié)約時,而奧地利、荷蘭、丹麥相繼採用。英國自感驚異,不久亦採用。 我國民國六十九年因民間對於日光節(jié)約時反應(yīng)不佳,停止使用,補(bǔ)充,夏天時天亮的比較早,Data Alignment 觀念,當(dāng)你要存取的資料所在位址與資料大小相除餘數(shù) != 0,就會出現(xiàn)這個問題! char 型態(tài)絕不會出現(xiàn) data alignment 問題 考慮下面 DWORD
22、 情況,x0000,x0001,x0002,x0003,x0004,x0005,x0006,x0007,資料發(fā)生 Alignment,DWORD data; data=*(DWORD*)(char*) Buffer+1),Buffer,x0000,x0001,x0002,x0003,x0004,x0005,x0006,x0007,DWORD 以4個 byte 為單位,會產(chǎn)生 alignment 的程式片段,Data Alignment 觀念,如 32-bit CPU 一次讀資料從位址 0 3 到暫存器中, 下次讀資料從位址 47 絕不會一次由位址25 把資料放到暫存器中, 因為 byte 25
23、 分別在兩個 word 中 如果要讀位址 25 的資料,必須 讀取 0 3 與 37 並且做 shift 與 extract 的動作,讀取位址 0 3 的資料,取出位址 2 3 的資料,讀取位址 4 7 的資料,組合 23 與 45 2 5 資料,Data Alignment 所造成的問題,CPU必須進(jìn)行數(shù)次記憶體存取 程式效能降低 移植程式時會遇到問題 X86 會自動修正這個問題, Alpha CPU 會丟出 INT 17h 中斷通知 OS,EXCEPTION_ DATATYPE_MISALIGNMENT 例外,DWORD data; data=*(UNALIGNED DWORD*)(cha
24、r*) Buffer+1),利用 Compiler 修正 Data Alignment的問題,DWORD data; data=*(DWORD*)(char*) Buffer+1),討論資源的問題,當(dāng)我們可存取的資源有限時,有甚麼好方法進(jìn)行個 thread 間的管理呢?,我們可以使用 Semaphore管理資源,HANDLE CreateSemaphore( PSECURITY_ATTRIBUTE psa, LONG lInitialCount, LONG lMaximumCount, PCTSTR pszName);,目前可用的資源數(shù)目,設(shè)定最大資源數(shù)目,程式設(shè)計的流程,設(shè)定目前資源總數(shù),可
25、用資源,接受 Request,判斷資源是否足夠,通知使用者,建立新的 thread 處理 request,釋放資源,/ 目前有2個名額,總共有2個資源 hsem = CreateSemaphore(NULL, 2, 2, NULL);,DWORD dwWaitResult; dwWaitResult=WaitForSingleObject(hsem,0);,ReleaseSemaphore(hsem,1,NULL ),目前可用的資源數(shù)目,設(shè)定最大資源數(shù)目,不需要傳回 previous count,視窗架構(gòu),資源不足,ReleaseSemaphore(hsem,1,NULL ),釋放一筆資源,傳
26、回上一次的 可用資源數(shù)目,WaitForSingleObject(hsem,0),等待時間 = 0,SemaphoreDemo,Mutex Kernel Object,Introduction to Mutex,保證只有一條 thread 可以獨佔資源 具有擁有性 (thread ownership ) Mutex 物件會紀(jì)錄擁有者的 thread ID 當(dāng)正在等待的 mutex 已經(jīng)擁有了,則會直接遞增 recursion counter,並繼續(xù)執(zhí)行 V.S. CriticalSection object Mutex 比較慢 (因為 mutex 是 kernel object) 內(nèi)容:,Us
27、age counter Thread ID Recursion counter,Mutex 的資料內(nèi)容,?,Kernel Object 被索引的次數(shù),擁有者的 thread id,擁有者擁有目前物件的次數(shù),最簡單的 Mutex 範(fàn)例,123 123 123,Writer,連續(xù)寫入資料,連續(xù)讀取資料,Reader,SimpleMutex,Mutex VS Event Mutex s thread ownership,HANDLE hMutex=CreateMutex(NULL, FALSE, NULL); WaitForSingleObject(hMutex, INFINITE); / 再次進(jìn)入 WaitForSingleObject(hMutex,INFINITE); cout Mutex 使用次數(shù)遞增 endl; RelaseMutex(hMutex); ReleaseMutex(hMutex);,1,2,對於已經(jīng)擁有的 Mutex 可以立即的進(jìn)入 schedulable 階段,使用時機(jī): 1. 所以當(dāng)你的程式要求資料寫完後,必須立即 讀取,則請使用 Event. 2. 當(dāng)你希望, Reader 與 Writer 能夠獨立楚 理, 則你可以使用 Mutex,請看 Mutex_VS_Even
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 維修電工中級題庫+答案(附解析)
- 公司人事任免制度
- 老年人個人隱私保護(hù)制度
- 酒店客房布草清洗與消毒規(guī)范制度
- 沖壓模具工崗后考核試卷含答案
- 花卉種苗工操作管理模擬考核試卷含答案
- 高壓試驗工安全生產(chǎn)規(guī)范強(qiáng)化考核試卷含答案
- 聚酯增粘裝置操作工達(dá)標(biāo)強(qiáng)化考核試卷含答案
- 機(jī)械加工材料切割工崗前崗位安全責(zé)任制考核試卷含答案
- 生物農(nóng)藥生產(chǎn)工安全教育測試考核試卷含答案
- 食品安全管理制度打印版
- 多聯(lián)機(jī)安裝施工方案
- 煤礦副斜井維修安全技術(shù)措施
- 公共視頻監(jiān)控系統(tǒng)運(yùn)營維護(hù)要求
- 河南省職工養(yǎng)老保險參保人員關(guān)鍵信息變更核準(zhǔn)表
- 四川大學(xué)宣傳介紹PPT
- 小學(xué)數(shù)學(xué)人教版六年級上冊全冊電子教案
- 液氨儲罐區(qū)風(fēng)險評估與安全設(shè)計
- 阿司匹林在一級預(yù)防中應(yīng)用回顧
- 2023年福海縣政務(wù)中心綜合窗口人員招聘筆試模擬試題及答案解析
- GB/T 4103.10-2000鉛及鉛合金化學(xué)分析方法銀量的測定
評論
0/150
提交評論