Anda sedang offline saat ini, menunggu internet Anda untuk menyambung kembali

Asinkron Disk I/O muncul sebagai sinkron di Windows

PENTING: Artikel ini diterjemahkan oleh perangkat lunak penerjemahan mesin Microsoft, dan mungkin telah diedit oleh Masyarakat Microsoft melalui teknologi CTF dan bukan oleh seorang penerjemah profesional. Microsoft menawarkan baik artikel yang diterjemahkan oleh manusia maupun artikel hasil editan terjemahan oleh mesin/komunitas, sehingga Anda dapat mengakses semua artikel di Sentra Pengetahuan yang kami miliki dalam berbagai bahasa. Namun artikel hasil editan mesin atau bahkan komunitas tidak selalu sempurna. Artikel ini dapat mengandung kesalahan dalam hal kosa kata, sintaksis atau tatabahasa, sangat mirip dengan penutur asing yang membuat kekeliruan ketika berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab atas ketidakakuratan, kesalahan atau kerugian apa pun akibat dari kekeliruan dalam penerjemahan isi atau penggunaannya oleh pelanggan kami. Microsoft juga akan senantiasa memperbarui perangkat lunak penerjemahan mesin dan alat untuk menyempurnakan Editan Hasil Penerjemahan Mesin.

Klik disini untuk melihat versi Inggris dari artikel ini: 156932
Ringkasan
I/O berkas pada Microsoft Windows dapat sinkron atau asinkron. Perilaku default untuk I/O sinkron, di mana fungsi I/O disebut dan gulung balik saat I/O selesai. I/O asinkron memungkinkan I/O fungsi untuk kembali eksekusi ke pemanggil segera, tetapi I/O tidak dianggap selesai hingga beberapa waktu mendatang. sistem operasi memberitahu pemanggil saat I/O selesai. Selain itu, pemanggil dapat menentukan status pengoperasian I/O biasa dengan menggunakan layanan sistem operasi.

Keuntungan dari asinkron I/O adalah bahwa pemanggil memiliki waktu untuk melakukan pekerjaan lainnya atau masalah lain permintaan saat operasi I/O selesai. Istilah tumpang tindih saya / Ois sering digunakan untuk I/O asinkron dan I/O tumpang tindih tidak sinkron I/O. Artikel ini menggunakan istilah Asynchronous dan sinkron untuk pengoperasian I/O. Artikel ini mengasumsikan pembaca memiliki keakraban dengan fungsi I/O berkas seperti CreateFile, ReadFile, WriteFile.

Seringkali, operasi I/O asinkron berperilaku hanya sinkron I/O. kondisi tertentu yang dibahas di artikel ini dalam bagian kemudian membuat pengoperasian I/O selesai serentak. Pemanggil tidak memiliki waktu untuk latar belakang bekerja karena fungsi I/O tidak gulung balik sampai I/O selesai.

Beberapa fungsi yang terkait dengan I/O sinkron dan asinkron. Artikel ini menggunakan ReadFile dan WriteFile sebagai contoh; alternatif yang baik akan ReadFileEx dan WriteFileEx. Meskipun artikel ini membahas hanya disk I/O secara khusus, banyak prinsip yang dapat diterapkan untuk jenis I/O, seperti serial I/O atau jaringan I/O lainnya.
Informasi lebih lanjut

Menata I/O asinkron

Bendera FILE_FLAG_OVERLAPPED harus ditetapkan di CreateFile ketika berkas dibuka. Bendera ini memungkinkan pengoperasian I/O pada berkas yang akan dilakukan asinkron. Berikut adalah contoh:
   HANDLE hFile;   hFile = CreateFile(szFileName,                      GENERIC_READ,                      0,                      NULL,                      OPEN_EXISTING,                      FILE_FLAG_NORMAL | FILE_FLAG_OVERLAPPED,                      NULL);   if (hFile == INVALID_HANDLE_VALUE)      ErrorOpeningFile();				
Hati-hati saat coding asinkron I/O karena sistem cadangan kanan-atas untuk melakukan operasi sinkron jika perlu. Oleh karena itu, terbaik jika Anda menulis program dengan benar menangani operasi I/O yang dapat diselesaikan serentak atau asinkron. Kode sampel menunjukkan pertimbangan ini.

Ada banyak hal program dapat sementara menunggu asynchronousoperations untuk menyelesaikan, seperti antrian operasi tambahan, atau doingbackground bekerja. Sebagai contoh, kode berikut dengan benar handlesoverlapped dan non-tumpang tindih menyelesaikan operasi baca. It doesnothing lebih dari menunggu I/O biasa untuk menyelesaikan:
   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);				
Perhatikan bahwa & NumberOfBytesRead disampaikan ke ReadFile berbeda dari & NumberOfBytesTransferred disampaikan ke GetOverlappedResult. Jika operationhas telah dibuat asinkron, maka GetOverlappedResult digunakan untuk determinethe jumlah aktual byte yang ditransfer dalam operasi setelah hascompleted. & NumberOfBytesRead disampaikan ke ReadFile tidak berarti.

Jika, di sisi lain, operasi selesai segera, maka & NumberOfBytesRead disampaikan ke ReadFile ini berlaku untuk jumlah byte membaca. Dalam hal ini, mengabaikan struktur tumpang TINDIH yang disampaikan ke ReadFile; Jangan gunakan GetOverlappedResult atau WaitForSingleObject.

Peringatan lain dengan operasi asinkron adalah bahwa Anda tidak harus menggunakan struktur tumpang TINDIH hingga operasi ditangguhkan selesai. Dalam dengan kata lain, jika Anda memiliki tiga pengoperasian I/O biasa, Anda harus menggunakan tiga struktur tumpang TINDIH. Jika Anda menggunakan struktur tumpang TINDIH, Anda akan menerima hasil yang tak terduga di pengoperasian I/O dan Anda akan mengalami kerusakan data. Selain itu, sebelum Anda dapat menggunakan struktur tumpang TINDIH untuk yang pertama kalinya, atau sebelum Anda kembali setelah operasi yang terdahulu selesai, Anda harus benar menginisialisasi ini sehingga tidak ada data kiri atas mempengaruhi operasi baru.

Jenis yang sama pembatasan berlaku untuk buffer data yang digunakan dalam anoperation. Buffer data yang harus tidak membaca atau menulis sampai itscorresponding I/O operasi selesai; membaca atau menulis buffermay menyebabkan kesalahan dan data yang rusak.

Asinkron I/O masih sepertinya sinkron

Jika Anda mengikuti petunjuk sebelumnya dalam artikel ini, namun, Semua pengoperasian I/O masih biasanya menyelesaikan serentak dalam urutan menurun yang dikeluarkan, dan tidak ada operasi ReadFile kembali palsu dengan GetLastError() kembali ERROR_IO_PENDING, ini berarti Anda memiliki waktu untuk tugas latar belakang. Mengapa hal ini terjadi?

Ada beberapa alasan mengapa pengoperasian I/O lengkap synchronouslyeven jika Anda memiliki kode untuk operasi asinkron:

Kompresi

Satu penyumbatan operasi asinkron adalah NTFS kompresi. Driver sistem berkas tidak akan mengakses file yang dikompresi asinkron; Alih-alih alloperations hanya dibuat sinkron. Hal ini tidak sahih untuk file yang arecompressed dengan utilitas mirip KOMPRES atau PKZIP.

Enkripsi NTFS

Mirip dengan kompresi, berkas enkripsi menyebabkan pengandar sistem untuk mengubah asinkron I/O sinkron. Jika berkas didekripsi, permintaan I/O akan asinkron.

Memperluas berkas

Alasan lain pengoperasian I/O selesai serentak adalah operasi sendiri. Pada Windows NT, setiap menulis operasi untuk file yang panjang akan sinkron.

Catatan: aplikasi dapat membuat operasi tulis disebutkan sebelumnya asinkron dengan mengubah Valid Data Length berkas dengan menggunakan fungsi SetFileValidData, dan kemudian mengeluarkan WriteFile.

Menggunakan SetFileValidData (yang tersedia pada Windows XP dan versi yang lebih baru), aplikasi dapat efisien memperpanjang berkas tanpa menimbulkan penalti kinerja nol-mengisi mereka.

Karena sistem berkas NTFS tidak nol mengisi data hingga panjang data yang valid (VDL) yang ditetapkan oleh SetFileValidData, fungsi ini akan berdampak keamanan di mana berkas akan ditetapkan kluster yang sebelumnya diduduki oleh berkas lainnya. Oleh karena itu, SetFileValidData mengharuskan pemanggil memiliki SeManageVolumePrivilege baru yang diaktifkan (secara asali, ini ditujukan hanya untuk administrator). Microsoft menganjurkan bahwa ISV dengan hati-hati mempertimbangkan implikasinya menggunakan fungsi ini.

Cache

Sebagian besar driver I/O (disk, komunikasi, dan lain-lain) memiliki kode kasus khusus di mana, jika permintaan I/O dapat diselesaikan "segera", operasi akan diselesaikan dan fungsi ReadFile atau WriteFile akan gulung balik TRUE. Cara semua jenis operasi tampaknya sinkron. Untuk diskdevice, biasanya, permintaan I/O dapat diselesaikan "segera" ketika data disembunyikan di kehabisan memori.

Data tidak ada di Cache

Skema cache dapat bekerja melawan Anda, namun, jika data tidak di thecache. Windows NT cache diterapkan secara internal menggunakan file pemetaan. Manajer kehabisan memori pada Windows NT tidak menyediakan mekanisme asinkron pagefault untuk mengelola pemetaan berkas yang digunakan oleh Manajer cache. Manajer Thecache dapat, namun, memverifikasi apakah halaman yang diminta dalam kehabisan memori, sehingga apabila Anda mengeluarkan asinkron Baca cache, dan halaman yang tidak dalam kehabisan memori, pengandar sistem berkas mengasumsikan bahwa Anda tidak ingin Anda utas diblokir dan permintaan akan ditangani oleh kumpulan terbatas alur kerja. Kontrol kembali ke program Anda setelah Anda ReadFile panggilan dengan membaca masih tertunda.

Ini bekerja dengan baik untuk beberapa permintaan, namun karena pool thread pekerja terbatas (saat ini tiga pada sistem 16MB), maka akan tetap hanya beberapa permintaan antri untuk pengandar disk pada waktu tertentu. Jika Anda mengeluarkan banyak pengoperasian I/O untuk data yang tidak ada di cache, Manajer kehabisan memori cache dan menjadi jenuh dan permintaan Anda dibuat sinkron.

Perilaku manajer cache juga dapat mempengaruhi berdasarkan whetheryou akses berkas secara berurutan atau secara acak. Manfaat cache yang seenmost saat mengakses berkas secara berurutan. Flagin FILE_FLAG_SEQUENTIAL_SCAN CreateFile panggilan akan mengoptimalkan tembolok untuk jenis akses. Namun, jika Anda mengakses berkas dalam mode acak, menggunakan bendera theFILE_FLAG_RANDOM_ACCESS di CreateFile memerintahkan cache manajer tooptimize perilaku untuk akses acak.

Jangan menggunakan Cache

Bendera FILE_FLAG_NO_BUFFERING berpengaruh sebagian besar pada perilaku thefile sistem operasi asinkron. Ini adalah cara terbaik untuk guaranteethat I/O permintaan sebenarnya asinkron. Ini memerintahkan berkas systemto tidak menggunakan mekanisme cache sama sekali.

Peringatan: ada beberapa pembatasan untuk menggunakan bendera ini yang harus dilakukan dengan data buffer perataan dan ukuran sektor peranti penangkap tersebut. Lihat referensi fungsi pada dokumentasi untuk fungsi CreateFile untuk informasi lebih lanjut tentang menggunakan bendera ini dengan benar.

Hasil uji dunia nyata

Berikut adalah beberapa hasil uji dari kode contoh. Besarnya thenumbers tidak penting di sini dan bervariasi dari komputer ke komputer, namun hubungan nomor dibandingkan saling mempengaruhi thegeneral menerangi bendera kinerja.

Anda dapat melihat hasil yang serupa dengan berikut ini:
  • Uji 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.						
    Uji ini menunjukkan bahwa program yang telah disebutkan sebelumnya diterbitkan 500 permintaan I/O cepat dan memiliki banyak waktu untuk melakukan pekerjaan lainnya atau masalah lain permintaan.
  • Uji 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.						
    Uji ini menunjukkan bahwa program ini menghabiskan 4.495880 detik menelepon ReadFile untuk menyelesaikan operasi, sedangkan tes 1 menghabiskan hanya 0.224264 detik untuk mengeluarkan permintaan yang sama. Dalam tes 2, tidak ada waktu "tambahan" untuk program untuk melakukan pekerjaan latar belakang.
  • Uji 3
    Asynchronous, buffered I/O: asynchio /f*.dat   Operations completed in the order issued.   500 requests issued and completed in 0.251670 seconds.						
    Uji ini menunjukkan sifat sinkron cache. Semua pembacaan dikeluarkan dan diselesaikan dalam 0.251670 detik. Dengan kata lain, permintaan asinkron diselesaikan serentak. Uji ini menunjukkan kinerja tinggi manajer cache apabila data di tembolok.
  • Uji 4
    Synchronous, buffered I/O: asynchio /f*.dat /s   Operations completed in the order issued.   500 requests and completed in 0.217011 seconds.						
    Uji ini menunjukkan hasil yang sama seperti tes 3. Catatan sinkron dibaca dari tembolok menyelesaikan sedikit lebih cepat daripada asinkron dibaca dari cache. Uji ini menunjukkan kinerja tinggi manajer cache apabila data di tembolok.

KESIMPULAN

Anda dapat memutuskan metode mana terbaik karena semua tergantung pada jenis dan ukuran jumlah operasi yang menjalankan program Anda.

Akses berkas standar tanpa menentukan apa pun bendera khusus untuk CreateFileis operasi sinkron dan tembolok.

Catatan: Anda mendapatkan beberapa perilaku asinkron otomatis dalam mode ini karena pengandar sistem berkas tidak input asinkron Baca-depan dan asinkron malas menulis data yang dimodifikasi. Meskipun ini tidak membuat aplikasi I/O asinkron, hal ini terjadi ideal untuk sebagian besar aplikasi sederhana.

Jika, di sisi lain, aplikasi tidak sederhana, Anda mungkin harus dosome profil dan pemantauan kinerja untuk menentukan metode terbaik, sama dengan pengujian digambarkan sebelumnya dalam artikel ini. Profil waktu dihabiskan di theReadFile atau fungsi WriteFile dan kemudian membandingkan saat ini dengan cara lama takesfor pengoperasian I/O sebenarnya untuk menyelesaikan sangat bermanfaat. Jika majorityof waktu dalam benar-benar mengeluarkan I/O, maka Anda I/O beingcompleted serentak. Namun, jika waktu penerbit I/O permintaan isrelatively kecil dibandingkan untuk waktu yang dibutuhkan untuk I/O operasi tocomplete, maka operasi Anda sedang diperlakukan asinkron. Samplecode disebutkan sebelumnya dalam artikel ini menggunakan fungsi QueryPerformanceCounter melakukan profil owninternal.

Pemantauan kinerja dapat membantu menentukan bagaimana efisien isusing program Anda disk dan tembolok. Pelacakan salah satu penghitung kinerja untuk objek Cache akan menunjukkan kinerja manajer cache. Pelacakan penghitung kinerja Disk fisik atau Diskobjects logis akan menunjukkan kinerja sistem disk.

Ada beberapa utilitas yang membantu dalam pemantauan kinerja; PerfMon DiskPerf yang sangat berguna. Untuk sistem untuk mengumpulkan data kinerja sistem disk, Anda harus terlebih dulu masalah diskperf -y perintah. Setelah Anda mengeluarkan perintah, Anda harus memulai ulang sistem untuk memulai pengumpulan data.
Referensi
Lihat dokumentasi MSDN pada I/O sinkron dan asinkron untuk informasi lebih lanjut.

Asynczip ReadFile ReadFileEx WriteFile kbdss kbfile WriteFileEx GetOverlappedResult asinkron sinkron tumpang tindih Non-tumpang tindih

Peringatan: Artikel ini telah diterjemahkan secara otomatis

Properti

ID Artikel: 156932 - Tinjauan Terakhir: 06/25/2015 21:32:00 - Revisi: 4.0

Microsoft Win32 Application Programming Interface

  • kbapi kbfileio kbinfo kbkernbase kbmt KB156932 KbMtid
Tanggapan
/html>