日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

I/O完成端口

發布時間:2025/3/20 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 I/O完成端口 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

I/O完成端口存在5個數據結構
1.設備列表?存放:設備句柄和I/O key
2.I/O完成隊列 存放:I/O完成記錄 先進先出
3.等待線程隊列?存放:等待處理I/O完成記錄?后進先出
4.已釋放線程列表 存放:正在處理I/O完成記錄的線程
5.已暫停線程列表 存放:掛起的線程

系統將異步I/O請求函數中請求完成后放入2中,檢查4中正在運行的線程數是否低于并行數,是則喚醒3中線程。
PostQueuedCompletionStatus 用來將一個已完成的I/O通知追加到I/O完成端口的隊列中。

如2中最初放入W1,W2,W3,W4 4個I/O完成記錄
3中調用GetQueuedCompletionStatus?3中線程為T1,T2? 取出W1,W2? 處理方式是Readfile,T2->W1,T1->W2,處理完2中變為W3,W4,R1,R2?3中變為T1,T2 //如果CreateIoCompletionPort中最后并行數設為2
3中調用GetQueuedCompletionStatus?取出W3,W4? 處理方式是Readfile,T2->W3,T1->W4 處理完2中變為R1,R2,R3,R4 3中變為T2,T1?//哪個線程先等待則先進入3中
3中調用GetQueuedCompletionStatus?取出R1,R2? 處理方式是Writefile,T1->R1,T2->R2 處理完2中變為R3,R4,W5,W6 3中變為T2,T1
....

?

//EnsureCleanup.h /****************************************************************************** Module: EnsureCleanup.h Notices: Copyright (c) 2007 Jeffrey Richter & Christophe Nasarre Purpose: These classes ensure object cleanup when an object goes out of scope.See Appendix A. ******************************************************************************/#pragma once // Include this header file once per compilation unit///#include <Windows.h>///// Data type representing the address of the object's cleanup function. // I used UINT_PTR so that this class works properly in 64-bit Windows. typedef VOID (WINAPI* PFNENSURECLEANUP)(UINT_PTR);///// Each template instantiation requires a data type, address of cleanup // function, and a value that indicates an invalid value. template<class TYPE, PFNENSURECLEANUP pfn, UINT_PTR tInvalid = NULL> class CEnsureCleanup { public:// Default constructor assumes an invalid value (nothing to cleanup)CEnsureCleanup() { m_t = tInvalid; }// This constructor sets the value to the specified valueCEnsureCleanup(TYPE t) : m_t((UINT_PTR) t) { }// The destructor performs the cleanup.~CEnsureCleanup() { Cleanup(); }// Helper methods to tell if the value represents a valid object or not..BOOL IsValid() { return(m_t != tInvalid); }BOOL IsInvalid() { return(!IsValid()); }// Re-assigning the object forces the current object to be cleaned-up.TYPE operator=(TYPE t) { Cleanup(); m_t = (UINT_PTR) t;return(*this); }// Returns the value (supports both 32-bit and 64-bit Windows).operator TYPE() { return (TYPE) m_t;}// Cleanup the object if the value represents a valid objectvoid Cleanup() { if (IsValid()) {// In 64-bit Windows, all parameters are 64-bits, // so no casting is requiredpfn(m_t); // Close the object.m_t = tInvalid; // We no longer represent a valid object.}}private:UINT_PTR m_t; // The member representing the object };///// Macros to make it easier to declare instances of the template // class for specific data types.#define MakeCleanupClass(className, tData, pfnCleanup) \typedef CEnsureCleanup<tData, (PFNENSURECLEANUP) pfnCleanup> className;#define MakeCleanupClassX(className, tData, pfnCleanup, tInvalid) \typedef CEnsureCleanup<tData, (PFNENSURECLEANUP) pfnCleanup, \(INT_PTR) tInvalid> className;///// Instances of the template C++ class for common data types. MakeCleanupClass(CEnsureCloseHandle, HANDLE, CloseHandle); MakeCleanupClassX(CEnsureCloseFile, HANDLE, CloseHandle, INVALID_HANDLE_VALUE); MakeCleanupClass(CEnsureLocalFree, HLOCAL, LocalFree); MakeCleanupClass(CEnsureGlobalFree, HGLOBAL, GlobalFree); MakeCleanupClass(CEnsureRegCloseKey, HKEY, RegCloseKey); MakeCleanupClass(CEnsureCloseServiceHandle, SC_HANDLE, CloseServiceHandle); MakeCleanupClass(CEnsureCloseWindowStation, HWINSTA, CloseWindowStation); MakeCleanupClass(CEnsureCloseDesktop, HDESK, CloseDesktop); MakeCleanupClass(CEnsureUnmapViewOfFile, PVOID, UnmapViewOfFile); MakeCleanupClass(CEnsureFreeLibrary, HMODULE, FreeLibrary);///// Special class for releasing a reserved region. // Special class is required because VirtualFree requires 3 parameters class CEnsureReleaseRegion { public:CEnsureReleaseRegion(PVOID pv = NULL) : m_pv(pv) { }~CEnsureReleaseRegion() { Cleanup(); }PVOID operator=(PVOID pv) { Cleanup(); m_pv = pv; return(m_pv); }operator PVOID() { return(m_pv); }void Cleanup() { if (m_pv != NULL) { VirtualFree(m_pv, 0, MEM_RELEASE); m_pv = NULL; } }private:PVOID m_pv; };///// Special class for freeing a block from a heap // Special class is required because HeapFree requires 3 parameters class CEnsureHeapFree { public:CEnsureHeapFree(PVOID pv = NULL, HANDLE hHeap = GetProcessHeap()) : m_pv(pv), m_hHeap(hHeap) { }~CEnsureHeapFree() { Cleanup(); }PVOID operator=(PVOID pv) { Cleanup(); m_pv = pv; return(m_pv); }operator PVOID() { return(m_pv); }void Cleanup() { if (m_pv != NULL) { HeapFree(m_hHeap, 0, m_pv); m_pv = NULL; } }private:HANDLE m_hHeap;PVOID m_pv; };template <class TV, class TM> inline TV chROUNDDOWN(TV Value, TM Multiple) {return((Value / Multiple) * Multiple); }// This inline function rounds a value down to the nearest multiple template <class TV, class TM> inline TV chROUNDUP(TV Value, TM Multiple) {return(chROUNDDOWN(Value, Multiple) + (((Value % Multiple) > 0) ? Multiple : 0)); } / End of File /


?

//IoCompletionPort.h /****************************************************************************** Module: IOCP.h Notices: Copyright (c) 2007 Jeffrey Richter & Christophe Nasarre Purpose: This class wraps an I/O Completion Port.See Appendix B. ******************************************************************************/#pragma once // Include this header file once per compilation unit///#include <Windows.h>#define chVERIFY #define chASSERT///class CIOCP { public:CIOCP(int nMaxConcurrency = -1) { m_hIOCP = NULL; if (nMaxConcurrency != -1)(void) Create(nMaxConcurrency);}~CIOCP() { if (m_hIOCP != NULL) chVERIFY(CloseHandle(m_hIOCP)); }BOOL Close() {BOOL bResult = CloseHandle(m_hIOCP);m_hIOCP = NULL;return(bResult);}BOOL Create(int nMaxConcurrency = 0) {m_hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, nMaxConcurrency);chASSERT(m_hIOCP != NULL);return(m_hIOCP != NULL);}BOOL AssociateDevice(HANDLE hDevice, ULONG_PTR CompKey) {BOOL fOk = (CreateIoCompletionPort(hDevice, m_hIOCP, CompKey, 0) == m_hIOCP);chASSERT(fOk);return(fOk);}BOOL AssociateSocket(SOCKET hSocket, ULONG_PTR CompKey) {return(AssociateDevice((HANDLE) hSocket, CompKey));}BOOL PostStatus(ULONG_PTR CompKey, DWORD dwNumBytes = 0, OVERLAPPED* po = NULL) {BOOL fOk = PostQueuedCompletionStatus(m_hIOCP, dwNumBytes, CompKey, po);chASSERT(fOk);return(fOk);}BOOL GetStatus(ULONG_PTR* pCompKey, PDWORD pdwNumBytes,OVERLAPPED** ppo, DWORD dwMilliseconds = INFINITE) {return(GetQueuedCompletionStatus(m_hIOCP, pdwNumBytes, pCompKey, ppo, dwMilliseconds));}private:HANDLE m_hIOCP; };/ End of File /


?

//main.cpp /****************************************************************************** Module: FileCopy.cpp Notices: Copyright (c) 2008 Jeffrey Richter & Christophe Nasarre ******************************************************************************/#include "IOCompletionPort.h" // See Appendix A. #include "EnsureCleanup.h" // See Appendix A.#include <WindowsX.h>// C RunTime Header Files #include <stdlib.h> #include <malloc.h> #include <memory.h> #include <tchar.h> #include <string>///// Each I/O Request needs an OVERLAPPED structure and a data buffer class CIOReq : public OVERLAPPED { public:CIOReq() {Internal = InternalHigh = 0; Offset = OffsetHigh = 0; hEvent = NULL;m_nBuffSize = 0;m_pvData = NULL;}~CIOReq() {if (m_pvData != NULL)VirtualFree(m_pvData, 0, MEM_RELEASE);}BOOL AllocBuffer(SIZE_T nBuffSize) {m_nBuffSize = nBuffSize;m_pvData = VirtualAlloc(NULL, m_nBuffSize, MEM_COMMIT, PAGE_READWRITE);return(m_pvData != NULL);}BOOL Read(HANDLE hDevice, PLARGE_INTEGER pliOffset = NULL) {if (pliOffset != NULL) {Offset = pliOffset->LowPart;OffsetHigh = pliOffset->HighPart;}return(::ReadFile(hDevice, m_pvData, m_nBuffSize, NULL, this));}BOOL Write(HANDLE hDevice, PLARGE_INTEGER pliOffset = NULL) {if (pliOffset != NULL) {Offset = pliOffset->LowPart;OffsetHigh = pliOffset->HighPart;}return(::WriteFile(hDevice, m_pvData, m_nBuffSize, NULL, this));}private:SIZE_T m_nBuffSize;PVOID m_pvData; };/////#define BUFFSIZE (64 * 1024) // The size of an I/O buffer DWORD BUFFSIZE = 0; #define MAX_PENDING_IO_REQS 4 // The maximum # of I/Os// The completion key values indicate the type of completed I/O. #define CK_READ 1 #define CK_WRITE 2///BOOL FileCopy(PCTSTR pszFileSrc, PCTSTR pszFileDst) {BOOL bOk = FALSE; // Assume file copy failsLARGE_INTEGER liFileSizeSrc = { 0 }, liFileSizeDst;try {{// Open the source file without buffering & get its sizeCEnsureCloseFile hFileSrc = CreateFile(pszFileSrc, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED, NULL);if (hFileSrc.IsInvalid()) goto leave;// Get the file's sizeGetFileSizeEx(hFileSrc, &liFileSizeSrc);// Nonbuffered I/O requires sector-sized transfers.// I'll use buffer-size transfers since it's easier to calculate.liFileSizeDst.QuadPart = chROUNDUP(liFileSizeSrc.QuadPart, BUFFSIZE);// Open the destination file without buffering & set its sizeCEnsureCloseFile hFileDst = CreateFile(pszFileDst, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED, hFileSrc);if (hFileDst.IsInvalid()) goto leave;// File systems extend files synchronously. Extend the destination file // now so that I/Os execute asynchronously improving performance.SetFilePointerEx(hFileDst, liFileSizeDst, NULL, FILE_BEGIN);SetEndOfFile(hFileDst);// Create an I/O completion port and associate the files with it.CIOCP iocp(2); //并行數iocp.AssociateDevice(hFileSrc, CK_READ); // Read from source fileiocp.AssociateDevice(hFileDst, CK_WRITE); // Write to destination file// Initialize record-keeping variablesCIOReq ior[MAX_PENDING_IO_REQS];LARGE_INTEGER liNextReadOffset = { 0 };int nReadsInProgress = 0;int nWritesInProgress = 0;// Prime the file copy engine by simulating that writes have completed.// This causes read operations to be issued.for (int nIOReq = 0; nIOReq < _countof(ior); nIOReq++) {// Each I/O request requires a data buffer for transferschVERIFY(ior[nIOReq].AllocBuffer(BUFFSIZE));nWritesInProgress++;iocp.PostStatus(CK_WRITE, 0, &ior[nIOReq]);}BOOL bResult = FALSE;// Loop while outstanding I/O requests still existwhile ((nReadsInProgress > 0) || (nWritesInProgress > 0)) {// Suspend the thread until an I/O completesULONG_PTR CompletionKey;DWORD dwNumBytes;CIOReq* pior;bResult = iocp.GetStatus(&CompletionKey, &dwNumBytes, (OVERLAPPED**) &pior, INFINITE);switch (CompletionKey) {case CK_READ: // Read completed, write to destinationnReadsInProgress--;bResult = pior->Write(hFileDst); // Write to same offset read from sourcenWritesInProgress++;break;case CK_WRITE: // Write completed, read from sourcenWritesInProgress--;if (liNextReadOffset.QuadPart < liFileSizeDst.QuadPart) {// Not EOF, read the next block of data from the source file.bResult = pior->Read(hFileSrc, &liNextReadOffset);nReadsInProgress++;liNextReadOffset.QuadPart += BUFFSIZE; // Advance source offset}break;}}bOk = TRUE;}leave:;}catch (...) {}if (bOk) {// The destination file size is a multiple of the page size. Open the// file WITH buffering to shrink its size to the source file's size.CEnsureCloseFile hFileDst = CreateFile(pszFileDst, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);if (hFileDst.IsValid()) {SetFilePointerEx(hFileDst, liFileSizeSrc, NULL, FILE_BEGIN);SetEndOfFile(hFileDst);}}return(bOk); }int wmain(int argc,wchar_t **argv) {GetDiskFreeSpaceW(NULL,NULL,&BUFFSIZE,NULL,NULL); //cache bytes of per sector for support FILE_FLAG_NO_BUFFERING flag.if(argc < 3) return -1;FileCopy(argv[1],argv[2]);return(0); }End of File //


?

總結

以上是生活随笔為你收集整理的I/O完成端口的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲另类网站 | 国产成人精品国内自产拍免费看 | 国产精品不卡一区二区三区 | 九九热这里有精品视频 | 久久久精品久久 | 女同互舔视频 | 久草精品在线观看视频 | 久色成人 | 一级大片网站 | 欧美一级黄色片视频 | 国产叼嘿视频 | 1769国产精品视频 | av日韩国产 | 91视频看片 | a天堂最新地址 | 中国a级黄色片 | 国产xxxx裸体xxx免费 | 最新日韩精品 | www.在线播放| 久久福利小视频 | bangbros性欧美18| 国产视频aaa | 久久婷婷色综合 | av在线一区二区 | 亚洲色成人www永久网站 | 久久一级视频 | 一级空姐毛片 | 九九在线精品视频 | 欧美群交射精内射颜射潮喷 | 久久无码专区国产精品s | 国产一区二区三区免费看 | 诱惑の诱惑筱田优在线播放 | 91嫩草网| 中文字幕精品一二三四五六七八 | 美女张开腿露出尿口 | 人妻丰满熟妇无码区免费 | 性欧美又大又长又硬 | 亚洲天堂免费观看 | 国产精品久久免费视频 | 亚洲精品久久久久久 | 性色免费视频 | 免费在线观看日韩av | 免费看av的网址 | 亚洲综合在线五月 | 麻豆av免费在线观看 | 69日本xxxxxxxx96 | 国产偷v国产偷v亚洲高清 | 九九热这里只有 | 在线成人黄色 | av福利在线看| 永久视频| 成人国产精品一区 | 少妇人妻真实偷人精品视频 | 九九九九久久久久 | 涩涩涩涩涩涩涩涩涩 | 亚洲少妇xxx | 国产精品久久免费视频 | 日韩人妻无码精品久久久不卡 | 91网站大全| 思思99精品视频在线观看 | 91精品国产乱码在线观看 | 亚洲精品www | 国产情侣免费视频 | 免费av一区二区三区 | 好邻居韩国剧在线观看 | 国内黄色一级片 | 久久涩 | 亚洲精品电影在线观看 | 爱爱视频网站 | 伊人久久97 | 欧美高清在线一区 | 男人天堂视频在线 | 刘亦菲一区二区三区免费看 | 国产精品白虎 | 九热精品| 国产精品白丝喷水在线观看 | 18成人免费观看视频 | 欧美 日韩 中文字幕 | 香港三级日本三级韩国三级 | 久久婷色 | 国产视频最新 | 鲁丝av| 依依成人在线 | 男人天堂怡红院 | 成人在线观看小视频 | 三年中文在线观看中文版 | 欧美日韩不卡一区 | 一区二区三区四区在线视频 | 在线不卡的av | 久久爱综合 | 爱的天堂 | 伊人久在线 | 熟妇女人妻丰满少妇中文字幕 | 日本免费电影一区二区三区 | av男人的天堂在线 | 免费毛片小视频 | 亚洲精品9| 好男人网站 | 亚洲欧美在线一区二区 |