Không đồng bộ đĩa vào/ra xuất hiện như đồng bộ trên Windows

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch thuật của Microsoft và có thể được Cộng đồng Microsoft chỉnh sửa lại thông qua công nghệ CTF thay vì một biên dịch viên chuyên nghiệp. Microsoft cung cấp các bài viết được cả biên dịch viên và phần mềm dịch thuật thực hiện và cộng đồng chỉnh sửa lại để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng nhiều ngôn ngữ Tuy nhiên, bài viết do máy dịch hoặc thậm chí cộng đồng chỉnh sửa sau không phải lúc nào cũng hoàn hảo. Các bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này: 156932
Tóm tắt
Tệp I/O trên Microsoft Windows có thể đồng bộ hoặc không đồng bộ. Hành vi mặc định cho I/O được đồng bộ, một chức năng I/O là và trả lại khi I/O hoàn tất. I/O không đồng bộ cho phép một chức năng I/O trở về thực thi người gọi ngay lập tức, nhưng I/O không được coi là hoàn thành đến thời gian trong tương lai. hệ điều hành thông báo cho người gọi khi I/O hoàn tất. Ngoài ra, người gọi có thể xác định trạm đậu hoạt động I/O nổi bật bằng cách sử dụng bản ghi dịch vụ của hệ điều hành.

I/O không đồng bộ có ưu điểm là người gọi có thời gian để làm vấn đề nhiều yêu cầu khi thao tác I/O được hoàn tất. Thuật ngữ chồng chéo tôi / Ois thường sử dụng để vào/ra không đồng bộ và không chồng chéo I/O đồng bộ vào/ra. Bài viết này sử dụng Asynchronous và xoay I/O hoạt động. Bài viết này giả định người đọc đã quen với các chức năng vào/ra tệp như CreateFile, ReadFile, WriteFile.

Thông thường, không đồng bộ I/O hoạt động hoạt động chỉ là đồng I/O. các điều kiện mà bài viết này thảo luận trong các phần ghi I/O thao tác hoàn tất đồng bộ. Người gọi không có thời gian cho công việc nền vì chức năng I/O trả lại cho đến khi I/O xong.

Một số chức năng liên quan đến I/O đồng bộ và không đồng bộ. Bài viết này sử dụng ReadFile và WriteFile làm ví dụ; lựa chọn tốt sẽ ReadFileEx và WriteFileEx. Mặc dù bài viết này thảo luận chỉ đĩa i/o cụ thể, nhiều người trong số các nguyên tắc có thể được áp dụng cho các loại I/O, chẳng hạn như nối I/O hoặc mạng I/O.
Thông tin thêm

cài đặt chuyên biệt vào/ra không đồng bộ

Cờ FILE_FLAG_OVERLAPPED phải được xác định trong CreateFile khi mở tệp. dấu kiểm hiệu này cho phép I/O thao tác nhất định trên tệp được thực hiện không đồng bộ. Đây là một ví dụ:
   HANDLE hFile;   hFile = CreateFile(szFileName,                      GENERIC_READ,                      0,                      NULL,                      OPEN_EXISTING,                      FILE_FLAG_NORMAL | FILE_FLAG_OVERLAPPED,                      NULL);   if (hFile == INVALID_HANDLE_VALUE)      ErrorOpeningFile();				
Cẩn thận khi mã hóa cho không đồng bộ I/O do hệ thống có theright để thực hiện thao tác đồng bộ nếu nó cần. Do đó, nó là tốt nhất nếu bạn viết trình đúng cách xử lý I/O hoạt động có thể được hoàn tất đồng bộ hoặc không đồng bộ. Mã mẫu trình bày này xem xét.

Có nhiều yếu tố chương trình có thể trong khi đợi asynchronousoperations để hoàn thành, chẳng hạn như xếp hàng hoạt động bổ sung, hoặc làm việc doingbackground. Ví dụ: sau mã đúng handlesoverlapped và không chồng chéo hoàn thành việc đọc. Nó doesnothing hơn đợi I/O nổi bật để hoàn thành:
   if (!ReadFile(hFile,                 pDataBuf,                 dwSizeOfBuffer,                 &NumberOfBytesRead,                 &osReadOperation )   {      if (GetLastError() != ERROR_IO_PENDING)      {         // Some other error occurred while reading the file.         ErrorReadingFile();         ExitProcess(0);      }      else         // Operation has been queued and         // will complete in the future.         fOverlapped = TRUE;   }   else      // Operation has completed immediately.      fOverlapped = FALSE;   if (fOverlapped)   {      // Wait for the operation to complete before continuing.      // You could do some background work if you wanted to.      if (GetOverlappedResult( hFile,                               &osReadOperation,                               &NumberOfBytesTransferred,                               TRUE))         ReadHasCompleted(NumberOfBytesTransferred);      else         // Operation has completed, but it failed.         ErrorReadingFile();   }   else      ReadHasCompleted(NumberOfBytesRead);				
Xin lưu ý rằng & NumberOfBytesRead chuyển thành ReadFile là khác nhau từ & NumberOfBytesTransferred chuyển thành GetOverlappedResult. Nếu một operationhas đã không đồng bộ, sau đó GetOverlappedResult sử dụng số byte chuyển hoạt động sau khi thực tế determinethe hascompleted. Các & NumberOfBytesRead chuyển thành ReadFile là vô nghĩa.

Nếu, mặt khác, thao tác hoàn thành ngay lập tức, sau đó & NumberOfBytesRead chuyển thành ReadFile là giá trị số byte đọc. Trong trường hợp này, bỏ qua cấu trúc OVERLAPPED chuyển thành ReadFile; không sử dụng với GetOverlappedResult hoặc WaitForSingleObject.

Một caveat hoạt động không đồng bộ là rằng bạn không phải sử dụng một cấu trúc OVERLAPPED cho đến khi hoàn tất các hoạt động đang chờ xử lý. Trong otherwords, có ba nổi bật I/O hoạt động, bạn phải sử dụng ba OVERLAPPED cấu trúc. Nếu bạn tái sử dụng một cấu trúc OVERLAPPED, bạn sẽ nhận được kết quả không dự đoán I/O hoạt động và bạn có thể gặp phải sự cố hỏng dữ liệu. Ngoài ra, trước khi bạn có thể sử dụng một cấu trúc OVERLAPPED lần đầu tiên hoặc trước khi bạn sử dụng lại nó sau khi hoàn tất một hoạt động trước đó, bạn phải khởi chạy bình thường nó để dữ liệu trái trên không ảnh hưởng đến các hoạt động mới.

Cùng một loại hạn chế áp dụng cho bộ đệm dữ liệu sử dụng trong anoperation. Bộ đệm dữ liệu không phải đọc hoặc ghi cho đến khi hoàn tất thao tác I/O itscorresponding; đọc hoặc ghi buffermay gây ra lỗi và dữ liệu bị hỏng.

Không đồng bộ vào/ra vẫn có vẻ xoay

Nếu bạn làm theo các hướng dẫn trước đó trong bài viết này, Tuy nhiên, tất cả các hoạt động I/O vẫn thường hoàn tất đồng bộ để thực hiện, và không hoạt động ReadFile trở lại sai với GetLastError() về ERROR_IO_PENDING, điều này có nghĩa là bạn không có thời gian cho bất kỳ công việc nền. Điều này xảy ra sao?

Có một số lý do tại sao I/O thao tác hoàn tất synchronouslyeven nếu bạn có mã hoá cho các hoạt động không đồng bộ:

Nén

Một cản trở hoạt động không đồng bộ là nén NTFS. Trình điều khiển hệ thống tệp sẽ không truy cập vào tệp nén không đồng bộ; thay vào đó alloperations chỉ thực hiện đồng bộ. Điều này không áp dụng cho tệp đó arecompressed với tiện ích tương tự như nén hay PKZIP.

NTFS mã hoá

Tương tự như nén, mã hóa tệp gây ra điều khiển hệ thống để chuyển đổi I/O không đồng bộ để đồng bộ. Nếu các tệp được giải mã, các yêu cầu I/O sẽ không đồng bộ.

Mở rộng tệp

Lý do một thao tác I/O đã hoàn thành đồng bộ là hoạt động của mình. Windows NT, bất kỳ ghi hoạt động vào một tập tin mở rộng chiều dài sẽ được đồng bộ.

Lưu ý: ứng dụng có thể thực hiện thao tác đã đề cập ghi không đồng bộ bằng cách thay đổi độ dài dữ liệu hợp lệ của các tập tin bằng cách sử dụng chức năng SetFileValidData, sau đó phát hành một WriteFile.

Sử dụng SetFileValidData (trong đó có sẵn trên Windows XP và các phiên bản), ứng dụng có hiệu quả mở rộng tệp không phát sinh hình hoạt động để tự động điền vào chúng.

Bởi vì hệ thống tệp NTFS không tự động điền dữ liệu đến độ dài dữ liệu hợp lệ (VDL) được xác định bởi SetFileValidData, chức năng này có tác động an ninh nơi tệp có thể được gán cụm đã chiếm bởi các tập tin. Do đó, SetFileValidData yêu cầu người gọi có SeManageVolumePrivilege mới cho phép (theo mặc định, điều này được chỉ để quản trị viên). Microsoft khuyến cáo ISV cẩn thận xem xét tác động của việc sử dụng chức năng này.

Bộ đệm ẩn

Hầu hết các điều khiển I/O (đĩa, thông tin và những người khác) có mã số trường hợp đặc biệt, nếu một yêu cầu I/O có thể được hoàn thành "ngay lập tức", thao tác này sẽ được hoàn thành và ReadFile hoặc WriteFile chức năng sẽ trở lại đúng. Tất cả các cách, các loại hoạt động dường như được đồng bộ. Đối với diskdevice, thông thường, cầu I/O có thể được hoàn thành "ngay" khi dữ liệu được lưu trữ trong bộ nhớ.

Dữ liệu không có trong bộ nhớ Cache

sơ đồ sàn bộ đệm ẩn có thể làm việc với bạn, Tuy nhiên, nếu dữ liệu không phải là thecache. Bộ đệm ẩn của Windows NT được thực hiện bằng cách sử dụng nội bộ ánh xạ tập tin. Quản lý bộ nhớ trong Windows NT cung cấp một cơ chế pagefault dị bộ quản lý ánh xạ tập tin sử dụng trình quản lý bộ nhớ cache. Trình quản lý Thecache Tuy nhiên, có thể kiểm tra số xem theo trang yêu cầu có trong bộ nhớ, do đó, nếu bạn đưa một đọc không đồng bộ đệm ẩn và không có các trang trong bộ nhớ, điều khiển hệ thống tệp giả định rằng bạn không chủ đề của bạn bị chặn và yêu cầu sẽ được xử lý bởi một nhóm giới hạn chủ đề riêng biệt. Điều khiển được trả về chương trình của bạn sau khi bạn gọi ReadFile với đọc vẫn đang chờ xử lý.

Này hoạt động tốt đối với một số yêu cầu, nhưng do nhóm chủ đề riêng biệt giới hạn (hiện ba hệ thống 16MB), có sẽ vẫn được chỉ yêu cầu một số xếp hàng vào ổ đĩa tại một thời gian cụ thể. Nếu bạn phát hành nhiều thao tác I/O dữ liệu không có trong bộ nhớ cache, bộ nhớ cache quản lý và quản lý bộ nhớ bị bão hòa và yêu cầu được thực hiện đồng bộ.

Hành vi của trình quản lý bộ nhớ cache cũng có thể bị ảnh hưởng dựa vào whetheryou tập tin tuần tự hoặc ngẫu nhiên. Lợi ích của bộ nhớ cache là seenmost khi truy cập vào tệp tuần tự. FILE_FLAG_SEQUENTIAL_SCAN flagin CreateFile gọi sẽ tối ưu hóa bộ đệm ẩn cho loại truy cập. Tuy nhiên, nếu bạn truy cập các tập tin một cách ngẫu nhiên, sử dụng cờ theFILE_FLAG_RANDOM_ACCESS trong CreateFile hướng dẫn tooptimize quản lý bộ nhớ cache của hành vi truy cập ngẫu nhiên.

Không Sử dụng Bộ nhớ Cache

Cờ FILE_FLAG_NO_BUFFERING có hiệu quả nhất về hành vi của hệ thống thefile hoạt động không đồng bộ. Đây là cách tốt nhất để guaranteethat I/O yêu cầu được thực sự không đồng bộ. Nó hướng dẫn tập tin systemto không sử dụng bất kỳ cơ chế bộ đệm ẩn tất cả.

Cảnh báo: có một số hạn chế sử dụng cờ này phải căn chỉnh bộ đệm dữ liệu và kích thước cung của thiết bị. Hãy xem chức năng trong tài liệu về chức năng CreateFile để biết thêm thông tin về cách sử dụng cờ này đúng cách.

Kết quả thực thế giới

Dưới đây là một số kết quả kiểm tra mã mẫu. Độ thenumbers không quan trọng ở đây và thay đổi từ máy tính đến máy tính, nhưng mối quan hệ số so với nhau chiếu sáng thegeneral ảnh hưởng đến các cờ hiệu suất.

Bạn có thể thấy kết quả tương tự như sau:
  • Kiểm tra 1
    Asynchronous, unbuffered I/O:  asynchio /f*.dat /n   Operations completed out of the order in which they were requested.   500 requests queued in 0.224264 seconds.   500 requests completed in 4.982481 seconds.						
    Kiểm tra này trình bày các chương trình được đề cập trước đó cung cấp 500 I/O yêu cầu một cách nhanh chóng và có rất nhiều thời gian để làm vấn đề nhiều yêu cầu.
  • Kiểm tra 2
    Synchronous, unbuffered I/O: asynchio /f*.dat /s /n   Operations completed in the order issued.   500 requests queued and completed in 4.495806 seconds.						
    Kiểm tra này cho thấy rằng chương trình này đã 4.495880 giây gọi ReadFile để hoàn thành các hoạt động, trong khi thử nghiệm 1 dành chỉ 0.224264 giây để phát hành các yêu cầu tương tự. Trong thử nghiệm 2, không có thời gian "thêm" cho chương trình để thực hiện bất kỳ công việc nền.
  • Kiểm tra 3
    Asynchronous, buffered I/O: asynchio /f*.dat   Operations completed in the order issued.   500 requests issued and completed in 0.251670 seconds.						
    Kiểm tra này thể hiện sự đồng bộ đệm ẩn. Tất cả đọc được phát hành và hoàn thành trong 0.251670 giây. Nói cách khác, không đồng bộ yêu cầu hoàn tất đồng bộ. Kiểm tra này cũng chứng tỏ hiệu suất cao của trình quản lý bộ nhớ cache khi dữ liệu trong bộ đệm ẩn.
  • Kiểm tra 4
    Synchronous, buffered I/O: asynchio /f*.dat /s   Operations completed in the order issued.   500 requests and completed in 0.217011 seconds.						
    Kiểm tra này trình bày kết quả tương tự như kiểm tra 3. Lưu ý rằng đồng bộ đọc khỏi bộ đệm ẩn hoàn thành nhanh hơn một chút so với không đồng bộ đọc khỏi bộ đệm ẩn. Kiểm tra này cũng chứng tỏ hiệu suất cao của trình quản lý bộ nhớ cache khi dữ liệu trong bộ đệm ẩn.

KẾT THÚC

Bạn có thể quyết định phương pháp tốt nhất vì tất cả phụ thuộc vào loại, kích thước và số lượng hoạt động chương trình của bạn thực hiện.

Truy cập tệp mặc định không chỉ định bất kỳ cờ đặc biệt để CreateFileis hoạt động đồng bộ và lưu trữ.

Lưu ý: bạn có một số hành vi không đồng bộ tự động trong chế độ này bởi vì trình điều khiển hệ thống tệp không nhập không đồng bộ không đồng bộ và đọc trước vội ghi sửa đổi dữ liệu. Mặc dù điều này không làm cho các ứng dụng I/O không đồng bộ, đó là trường hợp lý tưởng cho phần lớn các ứng dụng đơn giản.

Nếu, mặt khác, ứng dụng của bạn không phải là đơn giản, bạn có thể phải dosome hồ sơ và giám sát hiệu suất để xác định cách tốt nhất, tương tự như kiểm tra minh hoạ trước đó trong bài viết này. Hồ sơ đó khoảng theReadFile hoặc chức năng WriteFile và sau đó so sánh thời gian này để làm thế nào lâu nó takesfor thực I/O hoạt động để hoàn thành rất hữu ích. Nếu majorityof đó khoảng thực sự phát hành I/O, sau đó bạn I/O beingcompleted đồng bộ. Tuy nhiên, nếu thời gian phát hành I/O yêu cầu isrelatively nhỏ so với thời gian cần cho thao tác I/O tocomplete, sau đó hoạt động của bạn đang được xử lý không đồng bộ. Samplecode được đề cập trước đó trong bài viết này sử dụng chức năng QueryPerformanceCounter làm owninternal hồ sơ của mình.

Giám sát hiệu suất có thể giúp xác định cách hiệu quả của chương trình isusing đĩa và bộ nhớ cache. Theo dõi những bộ đếm hiệu suất cho bộ nhớ Cache sẽ cho biết hiệu suất của trình quản lý bộ nhớ cache. Theo dõi hiệu suất quầy đĩa vật lý hoặc logic Diskobjects sẽ cho biết hiệu suất của hệ thống đĩa.

Có một số tiện ích hữu ích giám sát hiệu suất; PerfMon và DiskPerf là đặc biệt hữu ích. Hệ thống thu thập dữ liệu hiệu suất của hệ thống đĩa, bạn phải đầu tiên lệnh diskperf -y. Sau khi bạn lệnh, bạn phải khởi động lại hệ thống khởi động thu thập dữ liệu.
Tham khảo
Tham khảo tài liệu MSDN trên Đồng bộ và không đồng bộ vào/ra để biết thêm thông tin.

Asynczip ReadFile ReadFileEx WriteFile kbdss kbfile WriteFileEx GetOverlappedResult không đồng bộ đồng chồng chéo không chồng chéo

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 156932 - Xem lại Lần cuối: 06/27/2015 02:24:00 - Bản sửa đổi: 4.0

Microsoft Win32 Application Programming Interface

  • kbapi kbfileio kbinfo kbkernbase kbmt KB156932 KbMtvi
Phản hồi