Asynchronous Disk i/o muncul sebagai sinkron pada Windows NT, Windows 2000 dan Windows XP

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 156932 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

Ringkasan

File i/o pada Microsoft Windows NT, Windows 2000 dan Windows XP dapat sinkron atau asinkron. Aktivitas default untuk I/O sinkron: fungsi I/O yang disebut dan kembali ketika I/O selesai. I/o asynchronous, di sisi lain, memungkinkan fungsi I/O untuk kembali eksekusi ke pemanggil segera, tetapi I/O tidak dianggap lengkap hingga beberapa waktu masa depan. sistem operasi akan memberitahu pemanggil bila I/O selesai. Selain itu, pemanggil dapat menentukan status operasi I/O luar biasa dengan menggunakan layanan dari sistem operasi.

Keuntungan dari asynchronous I/O adalah bahwa pemanggil memiliki waktu untuk melakukan lain bekerja atau mengeluarkan lebih banyak permintaan sementara operasi I/O sedang diselesaikan. The istilah tumpang tindih I/O sering digunakan untuk Asynchronous I/O dan tumpang tindih bebas I/o untuk I/O sinkron. Artikel ini menggunakan istilah Asynchronous dan Sinkron untuk operasi I/O di bawah Windows NT. Artikel ini mengasumsikan pembaca memiliki beberapa keakraban dengan fungsi File I/O seperti CreateFile, ReadFile, WriteFile.

Sering, asynchronous operasi I/O berperilaku seperti sinkron I/O. tertentu kondisi yang membahas artikel ini di bagian kemudian membuat I/O operasi lengkap serentak. Pemanggil tidak memiliki waktu untuk latar belakang bekerja karena fungsi I/O tidak kembali sampai I/O selesai.

Beberapa fungsi yang berhubungan 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 khusus, banyak dari prinsip-prinsip dapat diterapkan untuk jenis lain dari I/O, seperti serial I/O atau jaringan I/O.

Catatan: karena Windows 95 tidak mendukung asynchronous I/O pada disk peranti penangkap (meskipun tidak pada jenis I/O Device), perilaku yang tidak tercakup dalam artikel ini.

Informasi lebih lanjut

Mengatur I/O asinkron

Bendera FILE_FLAG_OVERLAPPED harus ditentukan di CreateFile ketika file dibuka. Bendera ini memungkinkan operasi I/O file-file tersebut akan dilakukan asynchronously. 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();
				
Berhati-hati ketika coding untuk asynchronous I/O karena sistem cadangan hak untuk membuat operasi sinkron jika perlu. Oleh karena itu, lebih baik jika Anda menulis program untuk benar menangani operasi I/O yang dapat diselesaikan baik serentak atau asynchronously. Kode contoh menunjukkan pertimbangan ini.

Ada banyak hal yang dapat program sementara menunggu asinkron operasi untuk menyelesaikan, seperti antrian operasi-operasi tambahan, atau melakukan latar belakang pekerjaan. Sebagai contoh, kode berikut benar menangani tumpang tindih dan bebas yang tumpang tindih penyelesaian operasi baca. Itu tidak apa-apa lebih dari menunggu I/O luar 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 melintasi ReadFile berbeda dari & NumberOfBytesTransferred dilewatkan ke dalam GetOverlappedResult. Jika sebuah operasi telah dibuat asynchronous, maka GetOverlappedResult digunakan untuk menentukan sebenarnya jumlah byte yang ditransfer dalam operasi setelah itu telah selesai. & NumberOfBytesRead melintasi ReadFile tidak ada artinya.

Jika, di sisi lain, operasi selesai segera, kemudian & NumberOfBytesRead melintasi ReadFile berlaku untuk jumlah byte yang membaca. Dalam kasus ini, mengabaikan struktur tumpang TINDIH melintasi ReadFile; Jangan gunakan dengan GetOverlappedResult atau WaitForSingleObject.

Peringatan lain dengan operasi asynchronous adalah bahwa Anda tidak harus menggunakan struktur tumpang TINDIH sampai operasi tertunda telah selesai. Di lain-lain kata-kata, jika Anda memiliki tiga operasi I/O luar biasa, Anda harus menggunakan tiga struktur tumpang TINDIH. Jika Anda menggunakan kembali struktur tumpang TINDIH, Anda akan menerima hasil yang tak terduga dalam operasi I/O dan Anda mungkin mengalami korupsi data. Selain itu, sebelum Anda dapat menggunakan struktur tumpang TINDIH untuk pertama kalinya, atau sebelum Anda menggunakannya setelah operasi sebelumnya telah selesai, Anda harus benar menginisialisasi itu sehingga tidak ada data kiri-atas mempengaruhi operasi baru.

Jenis pembatasan yang sama berlaku untuk buffer data yang digunakan dalam operasi. Data buffer harus tidak dibaca atau ditulis sampai dengan sesuai operasi I/O telah menyelesaikan; membaca atau menulis buffer dapat menyebabkan kesalahan dan data rusak.

Asynchronous i/o masih muncul untuk sinkron

Jika Anda mengikuti petunjuk sebelumnya dalam artikel ini, namun, semua operasi I/O Anda masih biasanya menyelesaikan serentak dalam urutan menurun yang dikeluarkan, dan tak satu pun dari operasi ReadFile kembali palsu dengan GetLastError() kembali ERROR_IO_PENDING, ini berarti Anda tidak punya waktu untuk pekerjaan latar belakang. Mengapa ini terjadi?

Ada sejumlah alasan mengapa operasi I/O lengkap serentak bahkan jika Anda telah dikodekan untuk operasi asynchronous:

Kompresi

Satu penghalang kepada operasi asynchronous adalah NTFS kompresi. File driver sistem tidak akan mengakses file terkompresi asynchronously; Sebaliknya semua operasi hanya dibuat sinkron. Ini tidak sahih untuk file yang dikompresi dengan utilitas mirip KOMPRES atau PKZIP.

NTFS enkripsi

Mirip dengan kompresi, enkripsi file menyebabkan driver sistem untuk mengkonversi I/O asinkron ke sinkron. Jika file didekripsi, permintaan I/O akan asynchronous.

Memperluas File

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

Catatan: aplikasi dapat membuat disebutkan sebelumnya menulis operasi asynchronous dengan mengubah panjang Data Valid file dengan menggunakan fungsi SetFileValidData, dan kemudian mengeluarkan WriteFile.

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

Karena sistem berkas NTFS tidak nol-mengisi data sampai dengan data yang valid panjang (VDL) yang didefinisikan oleh SetFileValidData, fungsi ini memiliki implikasi mana file dapat ditetapkan kluster yang sebelumnya diduduki oleh file lainnya. Oleh karena itu, SetFileValidData mengharuskan pemanggil memiliki SeManageVolumePrivilege baru yang diaktifkan (secara default, ini ditetapkan hanya untuk administrator). Microsoft menganjurkan bahwa ISVs hati-hati mempertimbangkan implikasi dari menggunakan fungsi ini.

Cache

Kebanyakan i/o driver (disk, komunikasi, dan lain-lain) memiliki kode kasus khusus di mana, jika permintaan I/O yang dapat diselesaikan "segera", operasi akan selesai dan akan gulung balik fungsi ReadFile atau WriteFile benar. Dalam segala hal, jenis operasi tampaknya sinkron. Untuk disk peranti penangkap, biasanya, permintaan I/O yang dapat diselesaikan "segera" Kapan data cache dalam kehabisan memori.

Data ini tidak dalam Cache

Skema cache dapat bekerja melawan Anda, namun, jika data tidak di cache. Cache Windows NT dilaksanakan secara internal menggunakan file pemetaan. Manajer kehabisan memori pada Windows NT tidak menyediakan sebuah halaman asinkron kesalahan mekanisme untuk mengelola file pemetaan yang digunakan oleh Manajer cache. The cache Manajer dapat, namun, memverifikasi apakah halaman yang diminta dalam kehabisan memori, jadi jika Anda mengeluarkan yang asynchronous dibaca cache, dan halaman tidak dalam kehabisan memori, pada driver sistem berkas mengasumsikan bahwa Anda tidak ingin thread Anda diblokir dan permintaan akan ditangani oleh kolam terbatas thread pekerja. Kontrol kembali ke program Anda setelah panggilan ReadFile dengan membaca masih tertunda.

Ini bekerja baik untuk sejumlah kecil permintaan, tapi karena kolam thread pekerja terbatas (saat ini tiga pada sistem 16MB), tidak akan masih hanya beberapa permintaan antri untuk pengandar disk pada waktu tertentu. Jika Anda mengeluarkan banyak operasi I/O untuk data yang tidak dalam cache, cache kehabisan memori manajer dan menjadi jenuh dan permintaan Anda dibuat sinkron.

Perilaku cache Manajer dapat juga dipengaruhi berdasarkan Apakah Anda mengakses berkas secara berurutan atau secara acak. Manfaat dari cache dilihat Kebanyakan ketika mengakses file secara berurutan. Bendera FILE_FLAG_SEQUENTIAL_SCAN dalam CreateFile panggilan akan mengoptimalkan cache untuk jenis akses. Namun, jika Anda mengakses file dalam mode acak, menggunakan FILE_FLAG_RANDOM_ACCESS bendera di CreateFile memerintahkan manajer cache untuk mengoptimalkan perilaku untuk akses acak.

Jangan menggunakan Cache

Bendera FILE_FLAG_NO_BUFFERING memiliki banyak efek pada perilaku sistem berkas bagi operasi asynchronous. Ini adalah cara terbaik untuk menjamin bahwa permintaan I/O benar-benar asynchronous. Ia memerintahkan sistem berkas untuk tidak menggunakan apapun cache mekanisme sama sekali.

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

Hasil tes dunia nyata

Berikut adalah beberapa hasil tes dari kode contoh. Besarnya angka ini tidak penting di sini dan bervariasi dari satu komputer ke komputer lain, tetapi hubungan antara angka-angka dibandingkan satu sama lain menerangi umum mempengaruhi bendera pada kinerja.

Anda dapat mengharapkan untuk melihat hasil yang mirip dengan berikut:
  • Tes 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.
    						
    Tes ini menunjukkan bahwa program disebutkan sebelumnya dikeluarkan 500 I/O permintaan cepat dan punya banyak waktu untuk melakukan pekerjaan lain atau mengeluarkan lebih banyak permintaan.
  • Test 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.
    						
    Tes ini menunjukkan bahwa program ini menghabiskan 4.495880 detik memanggil 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 apakah latar belakang bekerja.
  • Tes 3
    Asynchronous, buffered I/O: asynchio /f*.dat
    
       Operations completed in the order issued.
       500 requests issued and completed in 0.251670 seconds.
    						
    Tes ini menunjukkan sifat sinkron cache. Semua kali dibaca dikeluarkan dan selesai dalam 0.251670 detik. Dengan kata lain, permintaan asynchronous diselesaikan serentak. Tes ini juga menunjukkan kinerja tinggi manajer cache apabila data cache.
  • Tes 4
    Synchronous, buffered I/O: asynchio /f*.dat /s
    
       Operations completed in the order issued.
       500 requests and completed in 0.217011 seconds.
    						
    Tes ini menunjukkan hasil yang sama seperti dalam tes 3. Perhatikan bahwa sinkron dibaca dari cache menyelesaikan sedikit lebih cepat daripada asynchronous dibaca dari cache. Tes ini juga menunjukkan kinerja tinggi manajer cache ketika data dalam cache.

KESIMPULAN

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

Akses file default tanpa menentukan bendera setiap khusus untuk CreateFile adalah operasi sinkron dan cache.

Catatan: Anda mendapatkan beberapa perilaku tak sinkron otomatis dalam mode ini karena driver sistem berkas tidak prediktif asynchronous dibaca-depan dan asinkron malas menulis diubah data. Meskipun hal ini tidak membuat aplikasi [ASCII 146] s I/O asynchronous, itu adalah kasus ideal untuk sebagian besar aplikasi sederhana.

Jika, di sisi lain, aplikasi Anda tidak sederhana, Anda mungkin harus melakukan beberapa profil dan pemantauan kinerja untuk menentukan metode terbaik, mirip dengan tes digambarkan sebelumnya dalam artikel ini. Profil waktu yang dihabiskan di ReadFile atau WriteFile fungsi dan kemudian membandingkan kali ini ke cara lama dibutuhkan untuk operasi I/O sebenarnya untuk menyelesaikan ini sangat berguna. Jika sebagian besar waktu dihabiskan dalam benar-benar mengeluarkan I/O, maka I/O Anda sedang selesai serentak. Namun, jika waktu yang dihabiskan mengeluarkan permintaan I/O adalah relatif kecil dibandingkan dengan waktu itu diperlukan untuk operasi I/O untuk lengkap, maka operasi Anda sedang diperlakukan asynchronously. Sampel kode yang disebutkan sebelumnya dalam artikel ini menggunakan fungsi QueryPerformanceCounter untuk melakukan sendiri Profil internal.

Pemantauan kinerja dapat membantu menentukan seberapa efisien program Anda menggunakan disk dan cache. Pelacakan salah satu penghitung kinerja untuk Obyek Cache akan menunjukkan kinerja manajer cache. Pelacakan penghitung kinerja untuk Disk fisik atau Disk Logis objek akan menunjukkan kinerja sistem disk.

Ada beberapa utilitas yang membantu dalam pemantauan kinerja; PerfMon dan DiskPerf yang sangat berguna. Untuk sistem untuk mengumpulkan data pada kinerja sistem disk, Anda harus pertama mengeluarkan perintah -y diskperf. Setelah Anda mengeluarkan perintah, Anda harus me-restart sistem untuk memulai pengumpulan data.

Referensi

Untuk informasi lebih lanjut tentang utilitas dan kinerja pemantauan ini, lihat volume "mengoptimalkan Windows NT" di sumber Windows NT Dokumentasi kit.
SQL Server memerlukan sistem untuk mendukung 'jaminan pengiriman stabil media' seperti diuraikan di bawah program Microsoft SQL Server Always-On penyimpanan solusi Tinjauan. FoUntuk informasi lebih lanjut tentang persyaratan input dan output untuk mesin database SQL Server, klik nomor artikel berikut ini untuk melihat artikel di dalam Pangkalan Pengetahuan Microsoft:
967576Microsoft SQL Server Database Engine Input/Output persyaratan

Properti

ID Artikel: 156932 - Kajian Terakhir: 30 Mei 2013 - Revisi: 3.0
Berlaku bagi:
  • Microsoft Win32 Application Programming Interface
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Express
  • Microsoft SQL Server 2008 Standard
Kata kunci: 
kbapi kbfileio kbinfo kbkernbase kbmt KB156932 KbMtid
Penerjemahan Mesin
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

Berikan Masukan

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com