windows程式設計筆記

2021-07-06 11:26:05 字數 3513 閱讀 6967

在複習socket通訊時遇到了i/o復用技術這個問題,由這個問題引申出了select模型,i/o通訊模型的問題,在windows下對其進行了實現。但是很多概念性的東西不是很明白,於是檢視了《windows核心程式設計》這本書,不得不說這本書對windows的很多東西講的很透徹,因為時間的原因,只專門看了其中的幾章,下面是一些筆記,不得不說作業系統的很多東西都需要記憶,不然今天看懂的東西明天就忘記了。千萬不要覺得記憶是可恥的!!!同時也發現碰到問題了再看這本書時會好理解很多,下次再看這本書時一定要寫一些demo。下面是看這本書之前寫的一些demo。

socket通訊之一:tcp/ip模型與socket

socket通訊之二:實現乙個基本的客戶/伺服器模型

socke通訊之三:阻塞版本的客戶/伺服器模型

socket通訊之四:多執行緒版本的客戶/伺服器模型

socket通訊之五:select多路復用的客戶/伺服器模型

socket通訊之八:完成埠模型實現的客戶/伺服器模型

socket通訊之九:使用完成埠實現的乙個聊天室

系統會建立和處理幾種型別的核心物件,比如說訪問令牌物件,事件物件,檔案物件,檔案對映物件,i/o完成埠物件,作業物件,郵件槽物件,互斥量物件,管道物件,程序物件,訊號量物件,執行緒物件,可等待的計時器物件,執行緒池工廠物件。

每個核心物件都只是乙個記憶體塊,它由作業系統核心分配,並只能由作業系統核心訪問。這個記憶體塊是乙個資料結構,其成員維護著與物件相關的資訊。

呼叫乙個會建立核心物件的函式後,函式會返回乙個控制代碼(handle),它標示了所建立的物件。

控制代碼值是與程序相關的(為了增強系統的可靠性)。

核心物件的所有者是作業系統核心,而非程序,通過引用計數來實現。

程序核心物件控制代碼表

乙個程序在初始化時,系統將為它分配乙個控制代碼表(handle table)。這個控制代碼表僅供核心物件使用,不適用於使用者物件或gdi物件。

程序的核心物件控制代碼表結構:

索引指向核心物件記憶體塊的指標

訪問掩碼標誌1

0x???

0x???

0x??

20x???

0x???

0x??

30x???

0x???

0x??

40x???

0x???

0x??

程序終止時,系統自動掃瞄該程序的控制代碼表,如果這個表中有任何有效的記錄項,作業系統會為我們關閉這些物件控制代碼。只要這些物件中有乙個的使用計數為0,核心就會銷毀該物件。

跨程序邊界共享核心物件

1. 使用物件控制代碼繼承

2. 為物件命名

3. 複製物件控制代碼

核心物件的內容被儲存在核心位址空間—-系統上執行的所有程序都共享這個空間。

虛擬位址空間的分割槽:

- 空指標賦值分割槽 0x00000000~0x0000ffff

- 使用者模式分割槽 0x00010000~0x7ffeffff

- 64kb禁入分割槽

- 核心模式分割槽

核心模式分割槽

系統需要這一空間來存放核心**,裝置驅動**,裝置輸入/輸出快取記憶體,非分頁緩衝池分配表,程序頁面表。

這一分割槽是作業系統**的駐地,與執行緒排程,記憶體管理,檔案系統支援,網路支援以及裝置驅動相關的**都載入到該分割槽,駐留在這一分區內的任何東西為所有程序共有,雖然這一分割槽就在每個程序中使用者模式分割槽的上方,但該分割槽中所有**和資料都被完全保護起來。

當今作業系統能讓磁碟空間看起來像記憶體一樣,磁碟上的檔案一般被稱為頁交換檔案,其中包含虛擬記憶體。

事件的觸發表示乙個操作已經完成,有兩種不同型別的事件物件,手動重置事件自動重置事件,當乙個手動重置事件被觸發時,正在等待該事件的所有執行緒都將變成可排程狀態,而當乙個自動重置事件被觸發的時候,只有乙個正在等待該事件的執行緒會變成可排程狀態。

ms為自動重置事件定義了乙個等待成功所引起的***:當執行緒成功等到自動重置事件物件的時候,物件會自動重置為未觸發狀態,這也正是自動重置物件名字的由來。

當執行緒正在等待的物件處於未觸發狀態的時候,它們是不可排程的,一旦物件被觸發,執行緒就會變成可排程狀態。

非同步裝置i/o(asynchronous device i/o)允許執行緒開始讀取操作或寫入操作,但不必等待讀取操作或寫入操作完成。

裝置物件是可同步的核心物件,這意味著我們可以呼叫waitforsingleobject,並傳入檔案控制代碼,套接字,通訊埠等等。當系統執行非同步i/o的時候,裝置物件處於未觸發的狀態,一旦操作完成,系統會將物件變成觸發狀態。這樣執行緒就已知操作已經完成了。

當使用者在用滑鼠和鍵盤進行輸入的時候,視窗訊息會被新增到相應的訊息佇列中去,這個訊息隸屬於建立視窗的執行緒。如果執行緒由於正在等待createfile返回而被阻塞,那麼視窗訊息將無法得到處理,該執行緒建立的所有視窗都會停滯在**。應用程式停止響應的最常見原因,就是因為要等待同步i/o操作完成而被阻塞住。

用來接收i/o完成通知的方法:

1.觸發裝置核心物件:當向乙個裝置同時發出多個i/o請求的時候,這個方法沒什麼用,它允許乙個執行緒發出i/o請求,另乙個執行緒對結構進行處理。

2.觸發事件核心物件:這種方法允許我們向乙個裝置同時發出多個i/o請求,它允許乙個執行緒發出i/o請求,另乙個執行緒對結果進行處理。

3.使用可提醒i/o:這種方法允許我們向乙個裝置同時發出多個i/o請求,發出i/o請求的執行緒必須對結果進行處理。

4.使用i/o完成埠:這種方法允許我們向乙個裝置同時發出多個i/o請求,它允許乙個執行緒發出i/o請求,另乙個執行緒對結果進行處理,這項技術具有高度的伸縮性和最佳的靈活性。

關於i/o操作的例子可以參考下面一些文章:

socket通訊之八:完成埠模型實現的客戶/伺服器模型

當系統建立乙個執行緒的時候,會同時建立乙個與執行緒相關聯的佇列。這個佇列被稱為非同步過程呼叫(apc)佇列。當發出乙個i/o請求的時候,我們可以告訴裝置驅動程式在呼叫執行緒的apc佇列中新增一項。

i/o完成埠關聯的資料結構:

- 裝置列表

- i/o完成佇列(先進先出)

- 等待執行緒佇列(後進先出)

- 已釋放執行緒佇列

- 已暫停執行緒佇列

windows程式設計筆記3

1.imouse getsystemmetrics sm mousepresent 檢查滑鼠是否安裝 cbuttons getsystemmetrics sm cmousebuttons 檢查滑鼠鍵個數 wdnclass.hcursor loadcursor null,idc arrow 指定視窗的...

Windows程式設計筆記2

1.關於hdc hdc hdc hdc getdc hwnd for int i 0 i 20 i releasedc hwnd,hdc getdc 與releasedc 一起使用。不能用於beginpain hdc beginpaint hwnd,ps textout hdc,0,0,paintd...

windows程式設計 筆記1

windows.h 中包含了 許多其他的標頭檔案 主要是 winuser.h使用者介面 winbase.h kernel函式 windef.h 一些型別的define winnt.h 支援 unicode形態定義 wingdi.h 包含圖形介面函式 應用程式的入口函式 int winapi winm...