999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

一種實時監控系統數據同步問題的改進方法

2011-12-31 00:00:00謝玲郭昭烽
科技創新導報 2011年15期

摘 要:針對實時數據監控系統普遍存在的數據同步問題提出改進方法,利用Windows內核對象的特性編程設計了共享鎖類,并與未使用鎖、使用互斥鎖兩種情況進行時序比較,結果表明共享鎖在同步數據和優先保證寫者效率方面具有明顯的優越性。這些特性使共享鎖在工業控制級別的實時軟件系統中具有重要的現實意義。

關鍵詞:數據同步共享鎖實時數據監控

中圖分類號:TM73文獻標識碼:A文章編號:1674-098X(2011)05(c)-0018-01

1 引言

在工控組態軟件領域,普遍存在一個稱作讀者寫者的問題,即對某些資源的訪問,存在兩種可能的情況,一種訪問必須是排他的,稱作寫操作;另一種訪問可以是共享的,稱為讀操作。對于一個實時數據監控系統來說,由于Windows是一個多任務搶占式的操作系統,在多個線程共同訪問一個數據區的環境下,會產生數據同步的問題。比如:有提供數據的服務程序A和若干界面顯示程序B、C、D等。服務程序和顯示程序共同使用一塊數據內存區E,其中服務程序負責更新內存數據(寫操作),而顯示程序則定時訪問內存區數據(讀操作)。假設數據內存區E中變量的數據結構為:

FILETIMEftTime;//時間

DWORD dwValue;//值

那么,在B剛讀取完某個變量的ftTime值后,插入了A的寫操作,這時候再讀取到的dwValue值就和ftTime不一致了。這種不一致的現象必須通過數據同步來避免。所以,對內存區E的讀寫訪問必須作以下兩個約束:

1)A正在進行寫操作時,B、C、D必須等待該操作完成才能訪問E;約束條件(1)

2)B、C、D正在訪問E時,A 必須等待該操作完成才對E進行寫操作;約束條件(2)

以上約束可以簡單的歸納為:讀寫互斥。

2 一般解決方法

在Windows下,系統提供了事件、互斥量、信號量等核心對象以及一些等待函數來進行多線程同步。單獨使用這些核心對象均能夠實現讀寫的互斥。

但是單純的實現讀寫互斥并不能完全滿足實時監控系統對訪問效率的要求。因為讀操作的并發并不會引起數據的不同步,為了提高效率,必須在之前的兩個約束的基礎上增加讀寫訪問的另一約束,即約束(3):B、C、D能夠同時訪問E。

3 共享鎖

3.1 數據結構

利用Windows內核對象的特性,可以編程實現滿足上述三點約束條件的共享鎖類。

共享鎖的內部數據結構由讀事件、寫事件、互斥對象和讀者計數組成。

其中,讀、寫事件是一對命名的、手動重置的事件,初始化為有信號狀態。事件可以使用Windows Api函數CreateEvent、ResetEvent和SetEvent 來創建、重置和置位。這對事件成員的作用是實現讀寫的互斥。

共享鎖中的互斥對象是一個初始化無所有者的命名互斥量。互斥量可以使用CreateMutex、WaitForSingleObject和ReleaseMutex來創建、進入和離開。互斥對象在共享鎖中的作用有兩個:對寫操作進行保護,保證一個時刻內只有一個線程在進行寫操作;在多個讀線程中保護讀者計數,保證所有讀線程中對讀者計數的操作都是原子操作。

讀者計數實際上是一片命名的內存區,可以用CreateFileMapping和MapViewOfFile來創建和映射該內存區。讀者計數用于對同一時刻內的并發讀操作進行管理。

3.2 讀寫操作流程

3.2.1 寫操作

數據服務A在對數據內存區E進行寫數據操作時,首先重置寫事件。這時候寫事件為無信號狀態,這就意味著B、C、D等讀線程將在“等待 寫”這一步中掛起,不再進行讀操作。接下來A將等待讀事件,如果之前時刻已經有若干線程在進行讀操作,那么A將等到這些操作完成后進入互斥對象。這就意味著A已經獨占了內存區E這塊資源,可以放心地進行寫操作了。

在A完成寫操作后,首先離開互斥對象,釋放之前獨享的這塊資源,再置位寫事件,讓B、C、D等讀線程結束掛起狀態,進行讀操作。

3.2.2 讀操作

假設B線程某一時刻想以讀者的身份訪問數據區,B首先等待寫事件,如果寫操作正在進行,那么B將被掛起直到寫操作完成。接下來B將訪問讀者計數,如果讀者計數為0,B將重置讀事件;否則意味著在前一時刻已經有另外的讀者(C或者D)已經重置了讀事件,B將讀者計數自增后直接進入讀操作。當然,在訪問讀者計數的整個過程中都使用互斥對象對計數進行保護。

在完成讀操作后,B再次訪問讀者計數字,如果發現此時B已經是最后一位讀者(計數=1),B將置位讀事件,計數自減后退出。

4 比較和結果

4.1 實驗平臺的搭建

創建一個寫者線程,三個讀者線程,同時運行。在每個線程內,記錄下每次操作的性質(讀或寫)、操作時間和操作者(線程),保存到日記文件中,是為原始數據。分三次進行實驗:1無數據同步;2使用互斥對象進行數據同步;3使用文中所述共享鎖進行數據同步。

4.2 比較和結果

未使用鎖情況下,由于Windows是搶占式的操作系統,A、B、C、D四個進程將對E資源進行無序的競爭。

使用了互斥鎖情況下,在B、C、D的讀周期內不可能再出現值被A修改的情況。但是這樣的數據同步的缺陷也是明顯的:在B的讀周期內A、C和D都在掛起等待狀態,消耗了不必要的時間;另外,在這樣的數據同步模式下,讀者和寫者的地位是平等的,A作為數據的提供者卻必須要和B、C、D同等的去搶占資源,而且讀者越多負擔越重,是一種很不合理的作法。同樣,在B、C、D的讀周期內數據不會被A改動,解決了數據同步的問題。另外,B、C、D可以并發進行,因為多個讀者訪問不會對資源E造成破壞,避免了A不必要的等待時間,提高了效率。

更重要的是,共享鎖對讀者和寫者的權限進行了區分:寫者優先于讀者訪問共享資源。這是因為任意時刻下A想對資源E進行寫操作時都會重置寫事件,這時試圖進行讀操作的其他讀者就被迫進入等待狀態,A只需要等待前一時刻已經進入讀周期的進程完成操作。這就保證了服務程序A的工作效率,也就是保證數據的實時性。

5 結語

綜上所述,共享鎖具有同步數據和優先保證寫者效率的工作特性。這些獨特的工作使得這樣的共享鎖在工業控制級別的實時軟件系統中具有很重要的現實意義。在實時數據庫、實時監控系統、數據報警系統等領域的軟件開發中具有廣泛的應用前景。

參考文獻

[1]Jeffrey Richter. Windows核心編程[M].北京:機械工業出版社,2008,5.

主站蜘蛛池模板: 91青青草视频| 欧美色伊人| 国产欧美日韩在线一区| 九九免费观看全部免费视频| 中文字幕丝袜一区二区| 在线欧美一区| 四虎影视无码永久免费观看| 最新日韩AV网址在线观看| 亚洲国产精品日韩av专区| 亚洲成人黄色在线观看| 经典三级久久| 波多野结衣在线se| 国产91无码福利在线| 婷婷五月在线| 久久综合亚洲鲁鲁九月天 | 波多野一区| 在线亚洲小视频| 国产亚洲欧美在线视频| 在线观看91精品国产剧情免费| 欧美一级在线| 亚洲一区色| 一本一本大道香蕉久在线播放| 综合天天色| 亚洲无码91视频| 国产视频入口| 91破解版在线亚洲| 欧美性久久久久| 视频二区亚洲精品| 中文字幕日韩视频欧美一区| 久久婷婷色综合老司机| 国产欧美日韩18| 99热这里只有精品5| 四虎在线观看视频高清无码| 国产成人无码综合亚洲日韩不卡| 国产亚洲精品自在线| 久久女人网| 狠狠色狠狠色综合久久第一次| 国产成人乱码一区二区三区在线| 4虎影视国产在线观看精品| 人妻丰满熟妇αv无码| 成人福利免费在线观看| 成人第一页| 国产国产人在线成免费视频狼人色| 小蝌蚪亚洲精品国产| 色视频久久| 狠狠色香婷婷久久亚洲精品| 欧美日韩专区| 国产欧美日韩精品综合在线| 无码精油按摩潮喷在线播放 | 亚洲二区视频| www.亚洲一区二区三区| 五月婷婷导航| 国产精品大白天新婚身材| 欧美亚洲一区二区三区在线| 国产第一页亚洲| 香蕉网久久| 国产一区免费在线观看| 特黄日韩免费一区二区三区| 69av在线| 亚洲无码91视频| 欧美.成人.综合在线 | 色综合五月| 成年免费在线观看| 国产黄在线免费观看| 日本国产精品| 精品国产香蕉伊思人在线| 亚洲综合婷婷激情| 美女国产在线| 日韩精品亚洲人旧成在线| 亚洲精品桃花岛av在线| 91精品伊人久久大香线蕉| 欧美一级专区免费大片| 欧美一区精品| AV不卡无码免费一区二区三区| 国产白浆在线观看| 亚洲性日韩精品一区二区| 女同久久精品国产99国| 国产在线拍偷自揄拍精品| 欧美精品亚洲日韩a| 久久夜色撩人精品国产| 天堂久久久久久中文字幕| 亚洲国产欧美自拍|