Senkron ve asenkron Girdi/Çıktı

Ayrıca bkz. G/Ç ile ilgili örnek uygulamalar .

İki tür giriş/çıkış (G/Ç) eşitlemesi vardır: zaman uyumlu G/Ç ve zaman uyumsuz G/Ç. Zaman uyumsuz G/Ç, çakışan G/Ç olarak da adlandırılır.

zaman uyumlu dosya G/Çbir iş parçacığı G/Ç işlemini başlatır ve G/Ç isteği tamamlanana kadar hemen bekleme durumuna girer. Zaman uyumsuz dosya G/Ç gerçekleştiren bir iş parçacığı, uygun bir işlevi çağırarak çekirdekte bir G/Ç isteği gönderir. İstek çekirdek tarafından kabul edilirse, çağıran iş parçacığı, çekirdek iş parçacığına G/Ç işleminin tamamlandığını belirtene kadar başka bir işi işlemeye devam eder. Ardından geçerli işini kesintiye uğratır ve G/Ç işleminden verileri gerektiği gibi işler.

İki eşitleme türü aşağıdaki şekilde gösterilmiştir.

Zaman uyumlu ve zaman uyumsuz girdi/çıktıyı gösteren bir diyagramın ekran görüntüsü.

G/Ç isteğinin büyük bir veritabanını yenileme veya yedekleme ya da yavaş iletişim bağlantısı gibi çok uzun sürmesi beklenen durumlarda, zaman uyumsuz G/Ç genellikle işlem verimliliğini iyileştirmek için iyi bir yoldur. Ancak, nispeten hızlı G/Ç işlemleri için, çekirdek G/Ç isteklerini ve çekirdek sinyallerini işleme yükü, özellikle de birçok hızlı G/Ç işleminin yapılması gerektiğinde zaman uyumsuz G/Ç'yi daha az yararlı hale getirebilir. Bu durumda, zaman uyumlu G/Ç daha iyi olacaktır. Bu görevlerin nasıl yerine getirildiğini gösteren mekanizmalar ve uygulama ayrıntıları, kullanılan cihaz tanıtıcısının türüne ve uygulamanın belirli gereksinimlerine bağlı olarak değişir. Başka bir deyişle, sorunu çözmenin genellikle birden çok yolu vardır.

Zaman Uyumlu ve Zaman Uyumsuz G/Ç Konuları

Bir dosya veya cihaz zaman uyumlu G/Ç için açılırsa ( yani FILE_FLAG_OVERLAPPED belirtilmezse), WriteFile gibi işlevlere yapılan sonraki çağrılar, aşağıdaki olaylardan biri gerçekleşene kadar çağıran iş parçacığının yürütülmesini engelleyebilir:

  • G/Ç işlemi tamamlar (bu örnekte bir veri yazma).
  • G/Ç hatası oluşur. (Örneğin, boru diğer ucundan kapatılır.)
  • Çağrının kendisinde bir hata oluştu (örneğin, bir veya daha fazla parametre geçerli değil).
  • İşlemdeki başka bir iş parçacığı, engellenen iş parçacığının iş parçacığı tanıtıcısını kullanarak CancelSynchronousIo işlevini çağırır; bu, o iş parçacığı için G/Ç'yi sonlandırarak G/Ç işleminin başarısız olmasına neden olur.
  • Engellenen iş parçacığı sistem tarafından sonlandırılır; örneğin, işlemin kendisi sonlandırılır veya başka bir iş parçacığı engellenen iş parçacığının tutamacını kullanarak TerminateThread işlevini çağırır. (Bu genellikle son çare olarak kabul edilir ve iyi bir uygulama tasarımı değildir.)

Bazı durumlarda, bu gecikme uygulamanın tasarımı ve amacı açısından kabul edilemez olabilir, bu nedenle uygulama tasarımcıları G/Ç tamamlama bağlantı noktaları gibi uygun iş parçacığı eşitleme nesneleriyle zaman uyumsuz G/Ç kullanmayı düşünmelidir. İş parçacığı eşitlemesi hakkında daha fazla bilgi için bkz. Eşitleme hakkında .

İşlem, dwFlagsAndAttributes parametresinde FILE_FLAG_OVERLAPPED bayrağını belirterek CreateFile çağrısında zaman uyumsuz G/Ç için bir dosya açar. FILE_FLAG_OVERLAPPED belirtilmezse, dosya zaman uyumlu G/Ç için açılır. Dosya zaman uyumsuz G/Ç için açıldığında, OVERLAPPED yapısına yönelik bir işaretçi, ReadFile ve WriteFile çağrısına geçirilir. Zaman uyumlu G/Ç gerçekleştirirken, ReadFile ve WriteFileçağrılarında bu yapı gerekli değildir.

Not

Bir dosya veya cihaz zaman uyumsuz G/Ç için açılırsa, bu tanıtıcıyı kullanan WriteFile gibi işlevlere yapılan sonraki çağrılar genellikle hemen döndürülebilir, ancak engellenen yürütmeyle ilgili olarak da zaman uyumlu şekilde davranabilir. Daha fazla bilgi için bkz. Zaman uyumsuz disk G/Ç, Windowszaman uyumlu olarak görünür.

Dosyaları, disk birimlerini, anonim kanalları ve diğer benzer cihazları açmak için kullanılacak en yaygın işlev CreateFile olsa da, Girdi/Çıktı işlemleri, socket veya accept işlevleri tarafından oluşturulan bir soket gibi diğer sistem nesnelerinden alınan handle tür dönüştürme kullanılarak da gerçekleştirilebilir.

Dizin nesnelerinin tanıtıcıları, CreateFile işlevi FILE_FLAG_BACKUP_SEMANTICS özniteliğiyle çağrılarak elde edilir. Dizin tanıtıcıları neredeyse hiç kullanılmaz; yedekleme uygulamaları genellikle bunları kullanacak birkaç uygulamadan biridir.

Zaman uyumsuz G/Ç için dosya nesnesini açtıktan sonra, bir OVERLAPPED yapısı düzgün bir şekilde oluşturulmalı, başlatılmalı ve ReadFile ve WriteFile gibi işlevlere yapılacak her çağrıda iletilmelidir. Asenkron okuma ve yazma işlemlerinde OVERLAPPED yapısını kullanırken aşağıdaki hususları göz önünde bulundurun:

  • Dosya nesnesine yönelik tüm zaman uyumsuz G/Ç işlemleri tamamlanana kadar OVERLAPPED yapısını veya veri arabelleğini serbest bırakmayın veya değiştirmeyin.
  • OVERLAPPED yapısına işaretçinizi yerel değişken olarak bildirirseniz, dosya nesnesine yönelik tüm asenkron I/O işlemleri tamamlanana kadar yerel işlevden çıkmayın. Yerel işlevden erken çıkılırsa, OVERLAPPED yapısı kapsamın dışına çıkar ve bu yapıya, işlevin dışında, karşılaşılan herhangi bir ReadFile veya WriteFile işlevi tarafından erişilemez.

Ayrıca bir olay oluşturabilir ve saplamayı Overlapped yapısına yerleştirebilirsiniz; daha sonra bekleme işlevleri, olay tanıtıcısını bekleyerek G/Ç işleminin tamamlanmasını sağlamak için kullanılabilir.

Daha önce de belirtildiği gibi, zaman uyumsuz bir tanıtıcıyla çalışırken, uygulamalar bu tanıtıcıda belirtilen G/Ç işlemiyle ilişkili kaynakların ne zaman serbest bırakılırken karar verirken dikkatli olmalıdır. İşleyici erken serbest bırakılırsa, ReadFile veya WriteFile G/Ç işleminin tamamlandığını yanlış bir şekilde bildirebilir. Ayrıca, WriteFile işlevi bazen zaman uyumsuz bir tanıtıcı kullanıyor olsa bile, ERROR_SUCCESS değeri ile TRUE döndürebilir. Bu durum, aynı zamanda ERROR_IO_PENDING ile FALSE döndürmesini de mümkün kılar. Zaman uyumlu G/Ç tasarımına alışkın olan programcılar genellikle bu noktada veri arabelleği kaynaklarını serbest bırakır çünkü TRUE ve ERROR_SUCCESS işlemin tamamlandığına işaret eder. Ancak G/Ç tamamlama bağlantı noktaları bu zaman uyumsuz tanıtıcıyla kullanılıyorsa G/Ç işlemi hemen tamamlansa bile bir tamamlama paketi de gönderilir. Başka bir deyişle, uygulama WriteFile sonra kaynakları boşaltırsa, G/Ç tamamlama bağlantı noktası yordamına ek olarak ERROR_SUCCESSTRUE döndürürse, çift boş hata koşulu olur. Bu örnekte, tamamlama bağlantı noktası yordamının bu tür kaynaklar için tüm boşaltma işlemlerinde tek başına sorumlu olmasını sağlamak önerilebilir.

Sistem, dosya işaretçilerini destekleyen dosyalara ve cihazlara eşzamanlı olmayan tanıtıcılar üzerinde tutmaz (yani, konumlanabilir cihazlar), bu nedenle dosya konumu, OVERLAPPED yapısının ilgili ofset veri üyelerindeki okuma ve yazma işlevlerine geçirilmelidir. Daha fazla bilgi için bkz. WriteFile ve ReadFile.

Senkron tanıtıcı için dosya işaretçisi konumu, veriler okundukça veya yazıldıkça sistem tarafından korunur ve SetFilePointer veya SetFilePointerEx işlevi kullanılarak da güncelleştirilebilir.

Bir uygulama, G/Ç işleminin tamamlanmasını eşitlemek için dosya tutamacını da bekleyebilir, ancak bunu yapmak için çok dikkatli olmanız gerekir. Bir G/Ç işlemi her başlatıldığında, işletim sistemi dosya tanıtıcısını imzasız duruma ayarlar. Bir G/Ç işlemi her tamamlandığında, işletim sistemi dosya tutamacını sinyal verilen duruma ayarlar. Bu nedenle, bir uygulama iki G/Ç işlemi başlatır ve dosya tanıtıcısında beklerse, tanıtıcı sinyal durumuna ayarlandığında hangi işlemin tamamlandığını belirlemenin bir yolu yoktur. Bir uygulamanın tek bir dosya üzerinde birden çok zaman uyumsuz G/Ç işlemi gerçekleştirmesi gerekiyorsa, her G/Ç işlemi için belirli OVERLAPPED yapıdaki olay tanıtıcısında beklemesi gerekir, ortak dosya tanıtıcısında değil.

G/Ç İşlemlerini İptal Etme

Bekleyen tüm zaman uyumsuz G/Ç işlemlerini iptal etmek için aşağıdakilerden birini kullanın:

  • CancelIo: Bu işlev yalnızca belirtilen dosya tanıtıcısı için çağıran iş parçacığı tarafından verilen işlemleri iptal eder.
  • CancelIoEx: Bu işlev, belirtilen dosya tanıtıcısı için iş parçacıkları tarafından verilen tüm işlemleri iptal eder.

Bekleyen eşzamanlı G/Ç işlemlerini iptal etmek için CancelSynchronousIo kullanın.

ReadFileEx ve WriteFileEx işlevleri, bir uygulamanın zaman uyumsuz G/Ç isteği tamamlandığında yürütülecek bir yordam belirtmesini sağlar (bkz. FileIOCompletionRoutine).

Dosya Yaz

Dosyayı Oku