internet pencereler Android

Terimler: Veri giriş-çıkış senkron ve asenkron. Senkron ve asenkron G/Ç Asenkron G/Ç

Birden çok iş parçacığı kullanan eşzamansız G/Ç

Örtüşen ve genişletilmiş G/Ç, tek bir iş parçacığı içinde eşzamansız G/Ç'ye izin verir, ancak işletim sistemi bu işlevi desteklemek için kendi iş parçacıklarını oluşturur. Şu ya da bu biçimde, bu tür yöntemler çoğu kez, tek iş parçacıklı sistemlerde zaman uyumsuz işlemleri gerçekleştirmenin sınırlı biçimlerini desteklemek için birçok erken işletim sisteminde kullanılır.

Ancak, Windows çoklu iş parçacığı desteği sağlar, bu nedenle bağımsız olarak yürütülen birden çok iş parçacığı üzerinde eşzamanlı G/Ç işlemleri gerçekleştirerek aynı etkiyi elde etmek mümkündür. Bu yetenekler, çok iş parçacıklı sunucular ve grepMT programı ile daha önce gösterilmişti (Bölüm 7). Ek olarak, iş parçacıkları, asenkron G/Ç gerçekleştirmek için kavramsal olarak sıralı ve iddiaya göre çok daha basit bir yol sağlar. Program 14.1 ve 14.2'de kullanılan yöntemlere bir alternatif olarak, her iş parçacığına kendi dosya tanıtıcısı verilebilir ve ardından her iş parçacığı her dört kaydı eşzamanlı olarak işleyebilir.

Akışların bu şekilde kullanılması, kitapta yer almayan ancak Web sitesinde yayınlanan materyalde yer alan atouMT programında gösterilmiştir. atouMT yalnızca Windows'un herhangi bir sürümünde çalışmakla kalmaz, aynı zamanda iki eşzamansız G/Ç programından daha basittir çünkü kaynak kullanımının hesaplanması daha az karmaşıktır. Her iş parçacığı basitçe kendi arabelleklerini kendi yığınında tutar ve bir döngüde bir dizi eşzamanlı okuma, dönüştürme ve yazma gerçekleştirir. Aynı zamanda, programın performansı oldukça yüksek bir seviyede kalmaktadır.

Not

Web sitesindeki atouMT.c programı, birden çok iş parçacığının aynı dosyaya aynı anda erişmesine izin verirken karşılaşabileceğiniz birkaç olası "tuzak" hakkında yorum yapar. Özellikle, tüm bağımsız dosya tanıtıcıları DuplicateHandle işlevi değil, CreateHandle işlevi kullanılarak oluşturulmalıdır.

Şahsen, eşzamansız G/Ç yerine çok iş parçacıklı dosya işlemeyi kullanmayı tercih ederim. Akışların programlanması daha kolaydır ve çoğu durumda daha iyi performans sağlar.

Bu genel kuralın iki istisnası vardır. Bunlardan ilki, bu bölümde daha önce gösterildiği gibi, yalnızca bir bekleyen işlemin olabileceği ve senkronizasyon amacıyla bir dosya tanıtıcısının kullanılabileceği durumlarla ilgilidir. İkinci, daha önemli istisna, bu bölümün sonunda ele alınacak olan asenkron G/Ç tamamlama portları durumunda ortaya çıkar.

Kitaptan Derleyici Yapalım! Crenshaw Jack tarafından

Prolog Programlama kitabından tarafından Kloxin W.

C# 2005 Programlama Dili ve .NET 2.0 Platformu kitabından. yazar Troelsen Andrew

Informix Veritabanı Yönetici Kılavuzu'ndan. yazar Kustov Viktor

Microsoft Visual C++ ve MFC kitabından. Windows 95 ve Windows NT için Programlama yazar Frolov Alexander Vyacheslavovich

2.2.3.2 Eşzamansız G/Ç G/Ç işlemlerini hızlandırmak için, sunucu kendi eşzamansız G/Ç (AIO) paketini veya varsa çekirdek eşzamansız G/Ç (KAIO) paketini kullanır. Kullanıcı G/Ç istekleri eşzamansız olarak işlenir,

Nesneye Yönelik Programlamanın Temelleri kitabından tarafından Meyer Bertrand

G/Ç Bildiğiniz gibi operatörler<< и >> sayısal değeri belirtilen sayıda bit kadar sola ve sağa kaydırın. Bu kitaptaki programlar da klavye girişi ve ekran çıkışı için bu operatörleri kullanır.

Windows Ortamında Sistem Programlama kitabından yazar Hart Johnson M

Girdi ve Çıktı KERNEL kitaplığındaki iki sınıf, temel girdi ve çıktı araçlarını sağlar: FILE ve STD_FILES Bir FILE nesnesi f üzerinde tanımlanan işlemler arasında şunlar bulunur: create f.make ("name") -- f adlı dosya ile ilişkilendirir. f.open_write -- f yazmak için aç f.open_read -- f için aç

Ruby Dilinde Programlama kitabından [Dil İdeolojisi, Teorisi ve Uygulama Pratiği] yazar Fulton Hal

BÖLÜM 14 Eşzamansız G/Ç ve Tamamlama Bağlantı Noktaları G/Ç işlemleri, diğer işleme türlerinden doğal olarak daha yavaştır. Bu yavaşlamadan aşağıdaki faktörler sorumludur: Arama için harcanan zamandan kaynaklanan gecikmeler

Yapay Zeka için Prolog'da Programlama kitabından yazar Bratko Ivan

10.1.7. Basit G/Ç Çekirdek modülündeki bazı G/Ç yöntemlerine zaten aşinasınız; arayan belirtmeden onları aradık. Bunlar, get ve puts işlevlerinin yanı sıra print, printf ve p'yi içerir (ikincisi, anlayabileceğimiz bir şekilde yazdırmak için nesnenin inspect yöntemini çağırır.

Kişisel Bilgisayar için C Programlama Dili kitabından yazar Bochkov S.O.

Örneklerle Linux Programlama kitabından yazar Robbins Arnold

Bölüm 6 Girdi ve Çıktı Bu bölümde, bir dosyaya veri yazmak ve bir dosyadan veri okumak için bazı yerleşik olanaklara bakacağız. Bu tür kolaylıklar, dış temsillerinin istenen biçimini elde etmek için program veri nesnelerini biçimlendirmek için de kullanılabilir.

Java Programlamanın Temelleri kitabından yazar Sukhov S.A.

Giriş ve çıkış C standart kitaplığındaki giriş ve çıkış işlevleri, dosyalardan veri okumanıza veya giriş cihazlarından (klavye gibi) veri almanıza ve dosyalara veri yazmanıza veya çeşitli cihazlara (bir yazıcı gibi) çıktı vermenize olanak tanır. çıktı

QT 4: C++'da GUI Programlama kitabından tarafından Blanchette Jasmine

4.4. G/Ç Tüm Linux G/Ç işlemleri dosya tanımlayıcıları aracılığıyla yapılır. Bu bölümde dosya tanımlayıcılar tanıtılmakta, bunların nasıl edinilip serbest bırakılacağı ve nasıl gerçekleştirileceği anlatılmaktadır.

İdeal Programcı kitabından. Nasıl Yazılım Geliştirme Uzmanı Olunur? yazar Martin Robert S.

Yazarın kitabından

Bölüm 12 G/Ç Hemen hemen her uygulamanın dosyaları okuması veya yazması veya diğer G/Ç işlemlerini gerçekleştirmesi gerekir. Qt, okuma ve yazma yeteneğine sahip "cihazların" güçlü bir soyutlaması olan QIODevice ile mükemmel G/Ç desteği sağlar

Yazarın kitabından

Girdi ve çıktı Sonuçlarımın uygun "girdi" ile beslenmesi de bana çok önemli görünüyor. Kod yazmak yaratıcı bir iştir. Genellikle yaratıcılığım en üst düzeyde, yaratıcı bir şeyle karşı karşıya kaldığımda olur.

Giriş ve çıkış işlemleri, doğal olarak diğer işleme türlerinden daha yavaştır. Bu yavaşlama aşağıdaki faktörlerden kaynaklanmaktadır:

Rastgele erişim cihazlarında (diskler, CD'ler) istenen parçaları ve sektörleri aramak için harcanan zamandan kaynaklanan gecikmeler.

Fiziksel cihazlar ve sistem belleği arasındaki nispeten yavaş veri aktarım hızlarından kaynaklanan gecikme.

Dosya, sunucular, veri depoları vb. kullanılarak ağ üzerinden veri aktarımındaki gecikmeler.

Önceki tüm örneklerde, G/Ç işlemleri gerçekleştirilir akış ile senkronize böylece tüm iş parçacığı tamamlanana kadar boşta kalmaya zorlanır.

Bu bölüm, bir iş parçacığının G/Ç'nin tamamlanmasını beklemeden yürütülmeye devam etmesini nasıl düzenleyebileceğinizi gösterir; bu, iş parçacığı oluşturma ile aynı olacaktır. asenkron giriş çıkış. Windows'ta bulunan çeşitli teknikler örneklerle gösterilmiştir.

Bu tekniklerden bazıları, yine bu bölümde açıklanan bekleme zamanlayıcılarında kullanılır.

Son olarak ve en önemlisi, standart asenkron G/Ç'yi öğrenerek, G/Ç Tamamlama Bağlantı Noktaları, Bu, her biri için ayrı bir iş parçacığı oluşturmadan çok sayıda istemciyi destekleyebilen ölçeklenebilir sunucular oluştururken son derece kullanışlıdır. Program 14.4, önceden geliştirilmiş sunucunun G/Ç tamamlama bağlantı noktalarının kullanımına izin veren değiştirilmiş bir sürümüdür.

Windows Eşzamansız G/Ç Yöntemlerine Genel Bakış

Windows'ta eşzamansız G/Ç üç şekilde işlenir.

Çok iş parçacıklı giriş/çıkış (Çok iş parçacıklı G/Ç). Bir süreç veya süreç kümesi içindeki iş parçacıklarının her biri, normal eşzamanlı G/Ç gerçekleştirirken, diğer iş parçacıkları yürütmeye devam edebilir.

Örtüşen G/Ç. Bir okuma, yazma veya başka bir G/Ç işlemi başlattıktan sonra iş parçacığı yürütmeye devam eder. Bir iş parçacığının yürütmeye devam etmesi için G/Ç sonuçlarına ihtiyacı varsa, uygun tanıtıcı kullanılabilir duruma gelene veya belirtilen olay gerçekleşene kadar bekler. Windows 9x'te çakışan G/Ç, yalnızca adlandırılmış kanallar gibi seri aygıtlar için desteklenir.

Tamamlama rutinleri (genişletilmiş G/Ç) G/Ç işlemleri tamamlandığında sistem özel bir çağrı yapar. tamamlama prosedürü, bir iş parçacığının içinde koşuyor. Disk dosyaları için genişletilmiş G/Ç, Windows 9x'te desteklenmez.

Adlandırılmış kanallar kullanan çok iş parçacıklı G/Ç, Bölüm 11'de açıklanan çok iş parçacıklı sunucuda uygulanır. GrepMT programı (Program 7.1), birden çok dosya içeren paralel G/Ç işlemlerini yönetir. Bu nedenle, çok iş parçacıklı G/Ç gerçekleştiren ve böylece bir tür asenkron G/Ç sağlayan bir dizi programa sahibiz.

Örtüşen G/Ç sonraki bölümün konusudur ve bu bölümdeki dosya dönüştürme örnekleri (ASCII'den UNICODE'a), sıralı dosya işleme yeteneklerini göstermek için bu tekniği kullanır. Bu amaçla, program 2.4'ün değiştirilmiş bir versiyonu kullanılır. Örtüşen G/Ç'yi takiben, tamamlama rutinlerini kullanan genişletilmiş G/Ç dikkate alınır.

Not

Örtüşen ve genişletilmiş G/Ç yöntemlerinin uygulanması genellikle zordur, nadiren herhangi bir performans avantajı sağlar, hatta bazen performans düşüşüne neden olur ve dosya G/Ç durumunda yalnızca Windows NT altında çalışabilir. Bu problemler thread yardımı ile aşılır, pek çok okuyucu muhtemelen bekleme zamanlayıcıları ve I/O tamamlama portları ile ilgili bölümlere atlamak isteyecektir, gerektiğinde bu bölüme geri dönülür. Öte yandan, asenkron G/Ç öğeleri hem eski hem de yeni teknolojilerde mevcuttur ve bu nedenle bu yöntemler hala keşfedilmeye değerdir.

Örneğin, NT5 platformundaki COM teknolojisi, eşzamansız yöntem çağırmayı destekler, bu nedenle bu teknik, COM teknolojisini kullanan veya kullanmayı planlayan birçok okuyucu için faydalı olabilir. Ayrıca, asenkron prosedür çağrısı işlemlerinin (Bölüm 10) genişletilmiş G/Ç ile pek çok ortak noktası vardır ve kişisel olarak iş parçacıkları kullanmayı tercih etsem de, diğerleri bu mekanizmayı tercih edebilir.

Örtüşen G/Ç

Asenkron G/Ç'yi organize etmek için yapılacak ilk şey, ister örtüşen ister genişletilmiş olsun, bir dosyada veya başka bir tanımlayıcıda çakışan özniteliği ayarlamaktır. Bunu yapmak için CreateFile veya bir dosya, adlandırılmış kanal veya başka bir tanıtıcı oluşturulmasıyla sonuçlanan başka bir işlev çağrılırken, FILE_FLAG_OVERLAPPED bayrağı belirtilmelidir.

Soketler (Bölüm 12) durumunda, ister soket kullanılarak yaratılsın ister kabul edilsin, geçersiz kılma özniteliği Winsock 1.1'de varsayılan olarak ayarlanır, ancak Winsock 2.0'da açıkça ayarlanmalıdır. Çakışan yuvalar, Windows'un tüm sürümlerinde eşzamansız olarak kullanılabilir.

Bu noktaya kadar, OVERLAPPED yapıları LockFileEx işleviyle bağlantılı olarak ve SetFilePointer işlevinin kullanılmasına bir alternatif olarak kullanılmıştır (Bölüm 3), ancak bunlar aynı zamanda örtüşen G/Ç'nin temel bir öğesidir. Bu yapılar, aşağıdaki dört işlevi çağırırken, işlemler tamamlandığında engelleyebilecek isteğe bağlı parametreler olarak işlev görür.

FILE_FLAG_OVERLAPPED bayrağını dwAttrsAndFlags parametresinin (CreateFile işlevi olması durumunda) veya dwOpen-Mode parametresinin (CreateNamedPipe işlevi olması durumunda) parçası olarak belirttiğinizde, ilgili dosya veya borunun yalnızca çakışan olarak kullanılabileceğini hatırlayın. modu. Anonim borular ile çakışan G/Ç çalışmaz.

Not

CreateFile işlevine ilişkin belgeler, FILE_FLAG_NO_BUFFERING bayrağının kullanılmasının çakışan G/Ç performansını iyileştirdiğinden bahseder. Deneyler yalnızca marjinal bir performans artışı gösteriyor (14.1 programıyla deney yaparak doğrulanabilen yaklaşık %15), ancak ReadFile veya WriteFile işlemi sırasında okunan verilerin toplam boyutunun disk sektörünün katları olduğundan emin olmalısınız. boyut.

örtüşen prizler

Windows Sockets 2.0'daki (Bölüm 12) en önemli yeniliklerden biri, örtüşen G/Ç'nin standartlaştırılmasıdır. Özellikle, soketler artık örtüşen dosya tanımlayıcıları olarak otomatik olarak oluşturulmaz. Soket işlevi, örtüşmeyen bir tutamaç oluşturur. Çakışan bir yuva oluşturmak için, WSASocket işlevinin dwFlags parametresi için WSA_FLAG_OVERLAPPED değerini belirterek açıkça çakışan bir yuva oluşturulmasını talep ederek WSASocket işlevini çağırmalısınız.

SOCKET WSAAPI WSASocket(int iAddressFamily, int iSocketType, int iProtocol, LPWSAPROTOCOL_INFO lpProtocolInfo, GROUP g, DWORD dwFlags);

Bir soket oluşturmak için soket işlevi yerine WSASocket işlevini kullanın. Kabul işlevi tarafından döndürülen herhangi bir soket, argümanla aynı özelliklere sahip olacaktır.

Örtüşen G/Ç kullanmanın sonuçları

Çakışan G/Ç eşzamansız olarak yapılır. Bunun birkaç anlamı var.

Çakışan G/Ç işlemleri engellenmez. ReadFile, WriteFile, TransactNamedPipe ve ConnectNamedPipe işlevleri, G/Ç işleminin tamamlanmasını beklemeden geri döner.

İşlevin dönüş değeri, G / Ç işleminin bu ana kadar tamamlanması için henüz zamana sahip olmadığı için, yürütülmesinin başarısı veya başarısızlığı için bir kriter olarak kullanılamaz. Devam eden G/Ç durumunu belirtmek için başka bir mekanizmanın kullanılması gerekir.

Veri aktarımı tamamen tamamlanmamış olabileceğinden, aktarılan bayt sayısı için döndürülen değer de pek işe yaramaz. Bu tür bilgileri elde etmek için Windows'un başka bir mekanizma sağlaması gerekir.

Bir program, aynı örtüşen dosya tanıtıcısını kullanarak tekrar tekrar okuma veya yazma girişiminde bulunabilir. Bu nedenle, böyle bir tanımlayıcıya karşılık gelen dosya işaretçisinin de önemsiz olduğu ortaya çıkar. Bu nedenle, her okuma veya yazma işlemi için dosyada bir konum sağlamak için ek bir yöntem sağlanmalıdır. Adlandırılmış yöneltmeler söz konusu olduğunda, veri işlemenin doğal sıralı doğası nedeniyle bu bir sorun değildir.

Program, G/Ç'nin tamamlanması için bekleyebilmelidir (senkronize edebilmelidir). Aynı tutamaçla ilişkili birden fazla bekleyen G/Ç işlemi varsa, program hangi işlemlerin zaten tamamlandığını belirleyebilmelidir. G/Ç işlemleri, yürütülmeye başladıkları sırayla tamamlanmak zorunda değildir.

Yukarıda sıralanan son iki zorluğun üstesinden gelmek için OVERLAPPED yapılar kullanılır.

Örtüşen Yapılar

OVERLAPPED yapısını kullanarak (örneğin, ReadFile işlevinin lpOverlapped parametresi tarafından belirtilir), aşağıdaki bilgileri belirtebilirsiniz:

Bölüm 3'te tartışıldığı gibi, okuma veya yazma işleminin başlaması gereken dosyadaki (64 bit) konum.

İlişkili işlem tamamlandığında sinyal verilecek bir olay (manuel olarak temizlenir).

OVERLAPPED yapısının tanımı aşağıdadır.

Bir dosya konumu (işaretçi) belirtmek için hem Offset hem de OffsetHigh alanları kullanılmalıdır, ancak işaretçinin yüksek kısmı (OffsetHigh) çoğu durumda 0'dır.Sistem kullanımı için ayrılmış Internal ve InternalHigh alanları kullanılmamalıdır. Kullanılmış.

hEvent parametresi, olayın tanıtıcısıdır (CreateEvent işleviyle oluşturulur). Bu olay adlandırılmış veya adlandırılmamış olabilir, ancak zorunluçakışan G/Ç için kullanılıyorsa, zorunlu olarak manuel olarak sıfırlanabilir (bkz. bölüm 8); bunun nedenleri birazdan açıklanacaktır. G/Ç işlemi tamamlandığında olay sinyal durumuna geçer.

Başka bir olası kullanım durumunda, hEvent tanıtıcısı NULL'dur; bu durumda program, bir senkronizasyon nesnesi olarak da işlev görebilen bir dosya tanımlayıcısının sinyallenmesini bekleyebilir (aşağıdaki uyarılara bakın). Sistem, hEvent tanımlayıcısı NULL ise, yani dosya tanımlayıcısı bu durumda senkronizasyon nesnesiyse, işlemlerin tamamlandığını izlemek için dosya tanımlayıcısının sinyal durumlarını kullanır.

Not

Kolaylık olması açısından, ReadFile, WriteFile ve benzeri işlevler çağrılırken belirtilen tutamaçlarla ilişkili olarak kullanılan "dosya tanıtıcısı" terimi, adlandırılmış kanal veya aygıt tanıtıcılarından bahsettiğimizde bile bizim tarafımızdan kullanılacaktır. dosya.

Bir G/Ç işlev çağrısı yapıldığında, bu olay sistem tarafından hemen silinir (sinyalsiz duruma ayarlanır). Bir G/Ç işlemi tamamlandığında, olay sinyal durumuna ayarlanır ve başka bir G/Ç işlemi tarafından kullanılana kadar orada kalır. Bir olay, sinyalleşmesini bekleyen birden fazla iş parçacığı varsa (örneklerimizde yalnızca bir iş parçacığı kullanılmasına rağmen) manuel olarak sıfırlanabilir olmalıdır ve işlem tamamlandığında beklemelerine gerek yoktur.

Dosya tanımlayıcı eşzamanlı olsa bile (yani, FILE_FLAG_OVERLAPPED bayrağı olmadan oluşturulmuşsa), OVERLAPPED yapısı, bir dosya konumu belirtmek için SetFilePointer işlevine bir alternatif olarak hizmet edebilir. Bu durumda, G/Ç işlemi tamamlanana kadar ReadFile'a yapılan bir çağrıdan veya başka bir çağrıdan dönüş gerçekleşmez. Bu özelliği Bölüm 3'te zaten kullanmıştık. Ayrıca bekleyen G/Ç işlemlerinin bir dosya tanıtıcı ve ilgili OVERLAPPED yapısının birleşimiyle benzersiz bir şekilde tanımlandığını unutmayın.

Aşağıda, dikkate alınması gereken bazı uyarılar listelenmiştir.

OVERLAPPED yapısını, eğer varsa, ilişkili G/Ç işlemi henüz tamamlanmamışken yeniden kullanmaktan kaçının.

Aynı şekilde, OVERLAPPED yapısında belirtilen olayı yeniden kullanmaktan kaçının.

Aynı çakışan tanıtıcıya başvuran birden çok bekleyen istek varsa, eşitleme için dosya tanıtıcıları yerine olay tanıtıcılarını kullanın.

Bir OVERLAPPED yapısı veya bir olay, bir blok içinde otomatik bir değişken olarak hareket ediyorsa, I/O işlemi ile senkronize edilene kadar bloğun çıkamayacağından emin olun. Ayrıca, kaynakların sızmasını önlemek için, bloktan çıkmadan önce kolu kapatmaya özen gösterilmelidir.

Çakışan G/Ç durumları

ReadFile ve WriteFile işlevleri ile yukarıdaki iki adlandırılmış kanal işlevi, çakışan G/Ç işlemlerini gerçekleştirmek için kullanıldıklarında hemen geri dönerler. Çoğu durumda, G/Ç işlemi bu noktada tamamlanmayacaktır ve okuma/yazma dönüş değeri YANLIŞ olacaktır. GetLastError işlevi bu durumda ERROR_IO_PENDING değerini döndürür.

Eşitleme nesnesinin (bir olay veya belki bir dosya tanımlayıcı) işlemin tamamlandığını bildirmesini bekledikten sonra, kaç bayt aktarıldığını bulmanız gerekir. GetOverlappedResult işlevinin ana amacı budur.

BOOL GetOverlappedResult(HANDLE hFile, LPOVERLAPPED lpOverlapped, LPWORD lpcbTransfer, BOOL bWait)

Belirli bir I/O işleminin göstergesi, tutamaç ve OVERLAPPED yapısının kombinasyonu ile sağlanır. bWait parametre değeri TRUE, GetOverlappedResult işlevinin işlem tamamlanana kadar beklemesi gerektiğini belirtir; aksi takdirde, işlevden geri dönüş anında olmalıdır. Her iki durumda da, bu işlev ancak işlem başarıyla tamamlandıktan sonra TRUE değerini döndürür. GetOverlappedResult işlevinin dönüş değeri FALSE ise, GetLastError işlevi ERROR_IO_INCOMPLETE döndürür ve bu işlevin G/Ç tamamlaması için yoklamaya çağrılmasına olanak tanır.

Aktarılan bayt sayısı *lpcbTransfer değişkeninde saklanır. Örtüşen bir G/Ç işleminde kullanıldığı andan itibaren OVERLAPPED yapısının değişmeden kaldığından daima emin olun.

Örtüşen G/Ç İşlemlerinin İptali

Boole işlevi CancelIO, belirtilen tutamaçla ilişkili bekleyen çakışan G/Ç işlemlerinin yürütülmesini iptal etmenize olanak tanır (bu işlevin yalnızca bir parametresi vardır). Çağıran iş parçacığı tarafından bu tanıtıcı kullanılarak başlatılan tüm işlemler iptal edilir. Diğer iş parçacıkları tarafından başlatılan işlemler bu işlev çağrısından etkilenmez. İptal edilen işlemler, ERROR OPERATION BORTED hatasıyla sona erer.

Örnek: Dosya Tanımlayıcıyı Senkronizasyon Nesnesi Olarak Kullanma

Örtüşen G/Ç, yalnızca bir bekleyen işlemin olabileceği durumlarda uygulanması çok uygun ve kolaydır. Ardından, senkronizasyon amacıyla program bir olay değil, bir dosya tanımlayıcı kullanabilir.

Aşağıdaki kod parçacığı, bir programın bir dosyanın bir bölümünü okumak için bir okuma işlemini nasıl başlatabileceğini, diğer işlemleri gerçekleştirmek için yürütmesine nasıl devam edebileceğini ve ardından dosya tanımlayıcısının sinyal vermesini bekleyen bir duruma nasıl girebileceğini gösterir.

OVERLAPPED ov = ( 0, 0, 0, 0, NULL /* Olaylar kullanılmaz. */ );
hF = CreateFile(…, FILE_FLAG_OVERLAPPED, …);
ReadFile(hF, Buffer, sizeof(Buffer), &nRead, &ov);
/* Diğer işlemleri gerçekleştir. nRead mutlaka geçerli değildir.*/
/* Okuma işleminin tamamlanmasını bekleyin. */
WaitForSingleObject(hF, SONSUZ);
GetOverlappedResult(hF, &ov, &nRead, FALSE);

Örnek: Örtüşen G/Ç ve Çoklu Arabelleğe Alma Kullanarak Dosyaları Dönüştürme

Program 2.4 (atou), dosyayı sırayla işleyerek bir ASCII dosyasını UNICODE'a dönüştürdü ve Bölüm 5, dosya eşleme kullanarak aynı sıralı işlemenin nasıl yapılacağını gösterdi. Program 14.1 (atouOV), çakışan G/Ç ve sabit boyutlu kayıtları tutan çoklu arabellek kullanarak aynı sorunu çözer.

Şekil 14.1, dört sabit boyutlu arabelleğe sahip bir programın organizasyonunu göstermektedir. Program, tampon sayısı bir önişlemci sembolik sabiti kullanılarak belirlenebilecek şekilde uygulanır, ancak aşağıdaki tartışmada dört tampon olduğunu varsayacağız.

İlk olarak program, dosyalardaki olayları ve konumları tanımlayan OVERLAPPED yapılarının tüm öğelerini başlatır. Her giriş ve çıkış tamponu için ayrı bir OVERLAPPED yapısı vardır. Bundan sonra, giriş arabelleklerinin her biri için örtüşen bir okuma işlemi başlatılır. Ardından, WaitForMultipleObjects işlevini kullanarak program, okuma veya yazmanın tamamlandığını gösteren tek bir olayı bekler. Bir okuma işlemi tamamlandığında, giriş arabelleği kopyalanır ve karşılık gelen çıkış arabelleğine dönüştürülür, ardından yazma işlemi başlatılır. Yazma tamamlandığında, bir sonraki okuma işlemi başlatılır. Giriş ve çıkış arabellekleriyle ilişkili olayların, WaitForMultipleObjects işlevi çağrılırken bağımsız değişken olarak kullanılan tek bir diziye yerleştirildiğini unutmayın.

Pirinç. 14.1. Eşzamansız dosya güncelleme modeli


Program 14.1. atouOV: örtüşen G/Ç kullanarak dosya dönüştürme
Örtüşen G/Ç kullanarak bir dosyayı ASCII'den Unicode'a dönüştürme. Program yalnızca Windows NT'de çalışır. */

#define MAX_OVRLP 4 /* Çakışan G/Ç sayısı.*/
#define REC_SIZE 0x8000 /* 32 KB: Kabul edilebilir performans için minimum kayıt boyutu. */

/* Aşağıda tanımlanan değişken dizilerinin her bir elemanı */
/* ve yapılar bekleyen tek bir işlemle eşleşir */
/* çakışan G/Ç. */
DWORD nin, nout, ic, i;
Örtüşmeli Örtüşme, ÖrtüşmeÇıkış;
/* Katı, iki boyutlu bir dizi kullanmamız gerekiyor */
/* WaitForMultipleObjects Fonksiyonu tarafından belirlenir. */
/* İlk dizinin 0 değeri okumaya karşılık gelir, 1 değeri yazmaya karşılık gelir. */
/* Aşağıda tanımlanan iki arabellek dizisinin her birinde, ilk dizin */
/* G/Ç işlemlerini numaralandır. */
LARGE_INTEGER CurPosIn, CurPosOut, FileSize;
/* İşlenecek, hesaplanacak toplam kayıt sayısı */
/* giriş dosyasının boyutuna göre. Sondaki giriş */
/* eksik olabilir. */
için (ic = 0; ic< MAX_OVRLP; ic++) {
/* Her OVERLAPPED yapısı için okuma ve yazma olayları oluşturun.*/
hEvents = OverLapIn.hEvent /* Olayı oku.*/
hEvents = OverLapOut.hEvent /* Olay yaz. */
= CreateEvent(BOŞ, DOĞRU, YANLIŞ, BOŞ);
/* Her OVERLAPPED yapısı için başlangıç ​​dosya konumları. */
/* Bu OVERLAPPED yapısında bir örtüşen okuma işlemi başlat. */
if (CurPosIn.QuadPart< FileSize.QuadPart) ReadFile(hInputFile, AsRec, REC_SIZE, &nin, &OverLapIn);
/* Tüm okuma işlemleri gerçekleştirilir. Etkinliğin tamamlanmasını bekleyin ve hemen sıfırlayın. Okuma ve yazma olayları, olay dizisinde yan yana saklanır. */
iWaits=0; /* Şu ana kadar gerçekleştirilen G/Ç işlemlerinin sayısı. */
while (bekler< 2 * nRecord) {
ic = WaitForMultipleObjects(2 * MAX_OVRLP, hEvents, YANLIŞ, SONSUZ) - WAIT_OBJECT_0;
iWaits++; /* Tamamlanan G/Ç işlemlerinin sayacını artır */
ResetEvent(hEvents);
/* Okuma tamamlandı. */
GetOverlappedResult(hInputFile, &OverLapIn, &nin, FALSE);
için (i = 0; ben< REC_SIZE; i++) UnRec[i] = AsRec[i];
WriteFile(hOutputFile, UnRec, nin * 2, &nout, &OverLapOut);
/* Yukarıda başlatılan yazma işlemi tamamlandıktan sonra başlayacak olan bir sonraki okumaya hazırlanın. */
OverLapIn.Offset = CurPosIn.LowPart;
OverLapIn.OffsetHigh = CurPosIn.HighPart;
) else if (ic< 2 * MAX_OVRLP) { /* Операция записи завершилась. */
/* Okumaya başlamak. */
ic -= MAX_OVRLP; /* Çıktı tamponunun indeksini ayarlayın. */
if (!GetOverlappedResult (hOutputFile, &OverLapOut, &nout, FALSE)) ReportError(_T("Hata okuma."), 0, DOĞRU);
CurPosIn.LowPart = OverLapIn.Offset;
CurPosIn.HighPart = OverLapIn.OffsetHigh;
if (CurPosIn.QuadPart< FileSize.QuadPart) {
/* Yeni bir okuma işlemi başlat. */
ReadFile(hInputFile, AsRec, REC_SIZE, &nin, &OverLapIn);
/* Tüm olayları kapat. */
için (ic = 0; ic< MAX_OVRLP; ic++) {

Program 14.1 yalnızca Windows NT altında çalışabilir. Windows 9x'in eşzamansız G/Ç tesisleri disk dosyalarının kullanımına izin vermez. Ek B, atouOV programının nispeten düşük performansı hakkında sonuçları ve yorumları listeler. Deneyler, kabul edilebilir performans elde etmek için arabellek boyutunun en az 32 KB olması gerektiğini, ancak bu durumda bile normal senkronize G/Ç'nin daha hızlı olduğunu göstermiştir. Ayrıca, bu programın performansı SMP koşullarında da gelişmez, çünkü yalnızca iki dosyayı işleyen bu örnekte CPU kritik bir kaynak değildir.

Tamamlama prosedürünü kullanarak genişletilmiş G/Ç

Senkronizasyon nesnelerini kullanmanın başka bir olası yaklaşımı da vardır. Bir olaydan veya tanıtıcıdan bir sonlandırma sinyali için bir iş parçacığı beklemek yerine, sistem, G/Ç işlemi tamamlanır tamamlanmaz kullanıcı tanımlı bir sonlandırma rutinine bir çağrı başlatabilir. Sonlandırma prosedürü daha sonra bir sonraki G/Ç işlemini başlatabilir ve sistem kaynaklarının kullanımı için gerekli her türlü hesaplamayı yapabilir. Bu dolaylı olarak adlandırılan (geri arama) tamamlama prosedürü, Bölüm 10'da kullanılan eşzamansız prosedür çağrısına benzer ve uyarılabilir bekleme durumlarının kullanılmasını gerektirir.

Bir programda bir sonlandırma prosedürü nasıl belirtilebilir? ReadFile ve WriteFile işlevlerinin parametreleri veya veri yapıları arasında, sonlandırma prosedürünün adresini saklamak için kullanılabilecek hiçbiri kalmadı. Ancak, "Ex" son eki ile gösterilen ve sonlandırma rutininin adresini iletmek için ek bir parametre içeren bir genişletilmiş G/Ç işlevleri ailesi vardır. Okuma ve yazma işlevleri sırasıyla ReadFileEx ve WriteFileEx'tir. Ayrıca aşağıdaki bekleme işlevlerinden biri gereklidir.

Genişletilmiş G/Ç bazen şu şekilde adlandırılır: görev girişi/çıkışı(uyarılabilir G/Ç). Gelişmiş özelliklerin nasıl kullanılacağı aşağıdaki bölümlerde açıklanmaktadır.

Not

Windows 9x altında, genişletilmiş G/Ç, disk dosyaları ve iletişim bağlantı noktaları ile çalışamaz. Aynı zamanda, Windows 9x gelişmiş G/Ç, adlandırılmış kanallar, posta kutuları, yuvalar ve seri aygıtlarla çalışabilir.

ReadFileEx, WriteFileEx işlevleri ve tamamlama prosedürleri

Genişletilmiş okuma ve yazma işlevleri, ilgili nesne FILE_FLAG_OVERLAPPED bayrak seti ile açılmışsa (oluşturulmuşsa) açık dosya, adlandırılmış kanal ve posta kutusu tanıtıcılarıyla birlikte kullanılabilir. Bu bayrağın tutamaç özniteliğini ayarladığını ve çakışan ve genişletilmiş G/Ç farklı olmasına rağmen, aynı bayrağın her iki tür zaman uyumsuz G/Ç tanıtıcısı için geçerli olduğunu unutmayın.

Çakışan yuvalar (Bölüm 12) Windows'un tüm sürümlerinde ReadFileEx ve WriteFileEx işlevleriyle kullanılabilir.

BOOL ReadFileEx(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE lpcr)
BOOL WriteFileEx(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE lpcr)

Her iki işlevi de zaten biliyorsunuz, ancak her birinin tamamlama prosedürünün adresini belirtmenize izin veren ek bir parametresi var.

İşlevlerin her birinin bir OVERLAPPED yapısı sağlaması gerekir, ancak bu yapının hEvent öğesini belirtmeye gerek yoktur; sistem bunu görmezden gelir. Ancak bu öğe, Program 14.2'de gösterildiği gibi, bireysel G/Ç işlemlerini ayırt etmek için kullanılan sıra numarası gibi bilgileri iletmek için çok kullanışlıdır.

ReadFile ve WriteFile işlevleriyle karşılaştırıldığında, genişletilmiş işlevlerin aktarılan bayt sayısını depolamak için parametreler gerektirmediğini görebilirsiniz. Bu bilgi, programa dahil edilmesi gereken sonlandırma işlevine iletilir.

Tamamlama işlevi, OVERLAPPED yapısının bayt sayısı, hata kodu ve adresi için parametreler sağlar. Bu parametrelerin sonuncusu, tamamlama prosedürünün bekleyen işlemlerden hangisinin tamamlandığını belirleyebilmesi için gereklidir. OVERLAPPED yapılarının yeniden kullanılması veya yok edilmesiyle ilgili daha önceki uyarıların, çakışan G/Ç durumunda olduğu kadar burada da geçerli olduğunu unutmayın.

GEÇERSİZ WINAPİ FileIOCompletionRutin(DWORD dwError, DWORD cbTransferred, LPOVERLAPPED lpo)

Bazı işlevlerin adıyla da adlandırılan CreateThread işlevinde olduğu gibi, ad FileIOCompletionRutin sonlandırma prosedürünün gerçek adı değil, bir yer tutucudur.

dwError parametresinin değerleri 0 (başarılı) ve ERROR_HANDLE_EOF (dosya üzerinde sınır dışı okumaya çalışırken) ile sınırlıdır. OVERLAPPED yapısı, ReadFileEx veya WriteFileEx'e yapılan tamamlanmış çağrı tarafından kullanılan yapıdır.

Sistem tarafından fesih prosedürü çağrılmadan önce iki şey gerçekleşmelidir:

1. G/Ç işlemi tamamlanmalıdır.

2. Çağıran iş parçacığı uyku durumunda olmalı ve sıraya alınmış tamamlama yordamını yürütmesi gerektiğini sisteme bildirmelidir.

Bir iş parçacığı bekleme bekleme durumuna nasıl geçer? Bir sonraki bölümde açıklanan watchdog işlevlerinden birine açık bir çağrı yapmalıdır. Böylece iş parçacığı, sonlandırma prosedürünün zamanından önce yürütülmesini imkansız kılan koşullar yaratır. Bir iş parçacığı yalnızca uykulu işlev çağrısı çağrıldığı sürece uyku durumunda olabilir; bu işlev döndükten sonra, iş parçacığı belirtilen durumdan çıkar.

Bu koşulların her ikisi de karşılanırsa, G/Ç işlemlerinin tamamlanması sonucunda sıraya alınan tamamlama rutinleri yürütülür. Tamamlama yordamları, orijinal G/Ç işlev çağrısını yapan ve boşta bekleme durumunda olan aynı iş parçacığı üzerinde çalışır. Bu nedenle, bir iş parçacığı, yalnızca sonlandırma prosedürlerini yürütmek için güvenli koşullar olduğunda bekleme durumuna girmelidir.

Bekleme işlevleri

Toplamda beş bekleme işlevi vardır, ancak aşağıdakiler bunlardan yalnızca üçünün bizi doğrudan ilgilendiren prototipleridir:

DWORD WaitForSingleObjectEx(HANDLE hObject, DWORD dwMillisaniye, BOOL dengelenebilir)
DWORD WaitForMultipleObjectsEx(DWORD cObjects, LPHANDLE lphObjects, BOOL fWaitAll, DWORD dwMilliseconds, BOOL bAlertable)
DWORD SleepEx(DWORD dwMilisaniye, BOOL dengelenebilir)

Watchdog işlevlerinin her birinin, asenkron G/Ç durumunda DOĞRU olarak ayarlanması gereken bir uyarılabilir bayrağı vardır. Yukarıdaki işlevler, aşina olduğunuz Bekleme ve Uyku işlevlerinin uzantılarıdır.

Bekleme aralıklarının süresi, her zamanki gibi milisaniye cinsinden belirtilir. Bu üç işlevin her biri, en kısa sürede geri döner. herhangi aşağıdaki durumlardan:

Tutamaç(lar) sinyallenmiş duruma geçiş(ler)i, böylece iki bekleme fonksiyonunun standart gereksinimlerini karşılar.

Zaman aşımı sona eriyor.

İş parçacığının kuyruğundaki tüm tamamlama prosedürleri yürütmeyi durdurur ve bAlertable, TRUE olarak ayarlanır. Karşılık gelen G/Ç işlemi tamamlandığında tamamlama prosedürü kuyruğa alınır (Şekil 14.2).

ReadFileEx ve WriteFileEx işlevlerinde OVERLAPPED yapıları ile hiçbir olayın ilişkilendirilmediğine dikkat edin, bu nedenle bekleme işlevi çağrıldığında belirtilen tanıtıcıların hiçbiri doğrudan herhangi bir belirli G/Ç işlemiyle ilişkilendirilmez. Aynı zamanda, SleepEx işlevi senkronizasyon nesneleri ile ilişkili değildir ve bu nedenle kullanımı en kolay olanıdır. SleepEx işlevi söz konusu olduğunda, uyku aralığının süresi genellikle SONSUZ olarak ayarlanır, bu nedenle bu işlevden geri dönüş, yalnızca şu anda sırada olan bir veya daha fazla tamamlama prosedürünün yürütülmesini bitirdikten sonra gerçekleşir.

Tamamlama prosedürünü yürütün ve bekleme işlevinden geri dönün

Genişletilmiş bir G/Ç işlemi tamamlandığında, bir OVERLAPPED yapısı, bir bayt sayısı ve bir hata kodu belirten argümanlarıyla ilişkili tamamlama prosedürü yürütme için kuyruğa alınır.

İş parçacığının kuyruğundaki tüm tamamlama rutinleri, iş parçacığı boşta bekleme durumuna girdiğinde yürütülmeye başlar. Birbiri ardına yürütülürler, ancak G/Ç işlemlerinin tamamlandığı sırayla aynı olması gerekmez. Watchdog işlevinden dönüş, yalnızca tamamlama prosedürü geri döndükten sonra gerçekleşir. Bu özellik, çoğu programın doğru çalışmasını sağlamak için önemlidir, çünkü sonlandırma rutinlerinin, OVERLAPPED yapısının bir sonraki kullanımına hazırlanmak ve uyku modundan dönmeden önce programı bilinen bir duruma getirmek için diğer gerekli eylemleri gerçekleştirmek için bir fırsat elde ettiğini varsayar. belirtmek, bildirmek.

SleepEx işlevinden dönüş, bir veya daha fazla sıraya alınmış tamamlama prosedürünün yürütülmesinden kaynaklanıyorsa, işlevin dönüş değeri WAIT_TO_COMPLETION olacaktır ve bekleme işlevlerinden biri tamamlandıktan sonra çağrılan GetLastError işlevi tarafından aynı değer döndürülecektir. iade.

Sonuç olarak, iki noktaya dikkat çekiyoruz:

1. Watchdog işlevlerinden herhangi birini çağırırken, bekleme aralığı parametresinin değeri olarak INFINITE kullanın. Bir zaman aşımı seçeneğinin yokluğunda, fonksiyonlar ancak tüm tamamlama rutinlerinin yürütülmesi bittikten veya tanımlayıcılar sinyal durumuna girdikten sonra geri dönecektir.

2. Bu alan işletim sistemi tarafından yok sayıldığından, tamamlama prosedürüne bilgi iletmek için OVERLAPPED yapısının hEvent veri üyesinin kullanılması yaygındır.

Ana iş parçacığı, tamamlama rutinleri ve bekçi işlevleri arasındaki etkileşim Şekil 2'de gösterilmektedir. 14.2. Bu örnek, ikisi bekleme beklemesi başladığında tamamlanan üç eşzamanlı okuma başlatır.

Pirinç. 14.2. Tamamlama rutinlerini kullanan asenkron G/Ç

Örnek: Genişletilmiş G/Ç Kullanarak Dosyayı Dönüştürme

Program 14.3 (atouEX), program 14.1'in gözden geçirilmiş bir versiyonudur. Bu programlar, iki asenkron G/Ç yöntemi arasındaki farkı gösterir. atouEx, Program 14.1'e benzer, ancak kaynak sıralama kodunun çoğunu sonlandırıcıya taşıdı ve sonlandırıcının bunlara erişebilmesi için birçok değişkeni global hale getirdi. Bununla birlikte, Ek B, performans açısından, atouEx'in dosya eşleme kullanmayan diğer yöntemlerle oldukça rekabetçi olduğunu gösterirken, atouOV daha yavaştır.

Program 14.2. atouEx: genişletilmiş G/Ç kullanarak dosya dönüştürme
GENİŞLETİLMİŞ G/Ç kullanarak bir dosyayı ASCII'den Unicode'a dönüştürme. */
/* atouEX dosya1 dosya2 */

#define REC_SIZE 8096 /* Blok boyutu performans açısından atouOV'de olduğu kadar önemli değil. */
#define UREC_SIZE 2 * REC_SIZE

statik VOID WINAPI ReadDone(DWORD, DWORD, LPOVERLAPPED);
statik VOID WINAPI WriteDone(DWORD, DWORD, LPOVERLAPPED);

/* İlk OVERLAPPED yapısı okuma, ikincisi ise yazma içindir. Yaklaşan her işlem için yapılar ve arabellekler tahsis edilir. */
Örtüşmeli Örtüşme, ÖrtüşmeÇıkış ;
CHAR AsRec;
WCHAR UnRec;
KOLU hInputFile, hOutputFile;

int _tmain(int argc, LPTSTR argv) (
hInputFile = CreateFile(argv, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
hOutputFile = CreateFile(argv, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_OVERLAPPED, NULL);
FileSize.LowPart = GetFileSize(hInputFile, &FileSize.HighPart);
nRecord = FileSize.QuadPart / REC_SIZE;
if ((FileSize.QuadPart % REC_SIZE) != 0) nRecord++;
için (ic = 0; ic< MAX_OVRLP; ic++) {
OverLapIn.hEvent = (HANDLE)ic; /* Etkinliği yeniden yükle. */
OverLapOut.hEvent = (HANDLE)ic; /* Alanlar. */
OverLapIn.Offset = CurPosIn.LowPart;
OverLapIn.OffsetHigh = CurPosIn.HighPart;
if (CurPosIn.QuadPart< FileSize.QuadPart) ReadFileEx(hInputFile, AsRec, REC_SIZE, &OverLapIn , ReadDone);
CurPosIn.QuadPart += (UZUN)REC_SIZE;
/* Tüm okuma işlemleri gerçekleştirilir. Bekleme durumuna girin ve tüm kayıtlar işlenene kadar bu durumda kalın.*/
while (nBitti< 2 * nRecord) SleepEx(INFINITE, TRUE);
_tprintf(_T("ASCII'den Unicode'a dönüştürme tamamlandı.\n"));

statik VOID WINAPI ReadDone(DWORD Kodu, DWORD nBytes, LPOVERLAPPED pOv) (
/* Okuma tamamlandı. Verileri dönüştürün ve yazmayı başlatın. */
LARGE_INTEGER CurPosIn, CurPosOut;
/* Yazmayı işle ve yazma işlemini başlat. */
CurPosIn.LowPart = OverLapIn.Offset;
CurPosIn.HighPart = OverLapIn.OffsetHigh;
CurPosOut.QuadPart = (CurPosIn.QuadPart / REC_SIZE) * UREC_SIZE;
OverLapOut.Offset = CurPosOut.LowPart;
OverLapOut.OffsetHigh = CurPosOut.HighPart;
/* Girişi ASCII'den Unicode'a çevir. */
için (i = 0; ben< nBytes; i++) UnRec[i] = AsRec[i];
WriteFileEx(hOutputFile, UnRec, nBytes*2, &OverLapOut, WriteDone);
/* OVERLAPPED yapısını bir sonraki okuma için hazırla. */
CurPosIn.QuadPart += REC_SIZE * (UZUN)(MAX_OVRLP);
OverLapIn.Offset = CurPosIn.LowPart;
OverLapIn.OffsetHigh = CurPosIn.HighPart;

statik VOID WINAPI WriteDone(DWORD Kodu, DWORD nBytes, LPOVERLAPPED pOv) (
/* Yazma tamamlandı. Sonraki okuma işlemini başlatın. */
CurPosIn.LowPart = OverLapIn.Offset;
CurPosIn.HighPart = OverLapIn.OffsetHigh;
if (CurPosIn.QuadPart< FileSize.QuadPart) {
ReadFileEx(hInputFile, AsRec, REC_SIZE, &OverLapIn, ReadDone);

Birden çok iş parçacığı kullanan eşzamansız G/Ç

Örtüşen ve genişletilmiş G/Ç, tek bir iş parçacığı içinde eşzamansız G/Ç'ye izin verir, ancak işletim sistemi bu işlevi desteklemek için kendi iş parçacıklarını oluşturur. Şu ya da bu biçimde, bu tür yöntemler çoğu kez, tek iş parçacıklı sistemlerde zaman uyumsuz işlemleri gerçekleştirmenin sınırlı biçimlerini desteklemek için birçok erken işletim sisteminde kullanılır.

Ancak, Windows çoklu iş parçacığı desteği sağlar, bu nedenle bağımsız olarak yürütülen birden çok iş parçacığı üzerinde eşzamanlı G/Ç işlemleri gerçekleştirerek aynı etkiyi elde etmek mümkündür. Bu yetenekler, çok iş parçacıklı sunucular ve grepMT programı ile daha önce gösterilmişti (Bölüm 7). Ek olarak, iş parçacıkları, asenkron G/Ç gerçekleştirmek için kavramsal olarak sıralı ve iddiaya göre çok daha basit bir yol sağlar. Program 14.1 ve 14.2'de kullanılan yöntemlere bir alternatif olarak, her iş parçacığına kendi dosya tanıtıcısı verilebilir ve ardından her iş parçacığı her dört kaydı eşzamanlı olarak işleyebilir.

Akışların bu şekilde kullanılması, kitapta yer almayan ancak Web sitesinde yayınlanan materyalde yer alan atouMT programında gösterilmiştir. atouMT yalnızca Windows'un herhangi bir sürümünde çalışmakla kalmaz, aynı zamanda iki eşzamansız G/Ç programından daha basittir çünkü kaynak kullanımının hesaplanması daha az karmaşıktır. Her iş parçacığı basitçe kendi arabelleklerini kendi yığınında tutar ve bir döngüde bir dizi eşzamanlı okuma, dönüştürme ve yazma gerçekleştirir. Aynı zamanda, programın performansı oldukça yüksek bir seviyede kalmaktadır.

Not

Web sitesindeki atouMT.c programı, birden çok iş parçacığının aynı dosyaya aynı anda erişmesine izin verirken karşılaşabileceğiniz birkaç olası "tuzak" hakkında yorum yapar. Özellikle, tüm bağımsız dosya tanıtıcıları DuplicateHandle işlevi değil, CreateHandle işlevi kullanılarak oluşturulmalıdır.

Şahsen, eşzamansız G/Ç yerine çok iş parçacıklı dosya işlemeyi kullanmayı tercih ederim. Akışların programlanması daha kolaydır ve çoğu durumda daha iyi performans sağlar.

Bu genel kuralın iki istisnası vardır. Bunlardan ilki, bu bölümde daha önce gösterildiği gibi, yalnızca bir bekleyen işlemin olabileceği ve senkronizasyon amacıyla bir dosya tanıtıcısının kullanılabileceği durumlarla ilgilidir. İkinci, daha önemli istisna, bu bölümün sonunda ele alınacak olan asenkron G/Ç tamamlama portları durumunda ortaya çıkar.

Bekleme Zamanlayıcıları

Windows NT, bir bekleme gerçekleştiren bir çekirdek nesnesi türü olan beklenebilir zamanlayıcıları destekler.

Uyku işlevi çağrıldıktan sonra uyandırma olayını ayarlayan bir saat dizisi oluşturarak her zaman kendi saat sinyalinizi oluşturabilirsiniz. serverNP programında (Program 11.3), sunucu ayrıca kanal adını periyodik olarak yayınlamak için saat akışını kullanır. Bu nedenle, bekleme zamanlayıcıları, görevleri periyodik olarak veya belirli bir zamanlamaya göre çalışacak şekilde organize etmek için biraz gereksiz ama kullanışlı bir yol sağlar. Özellikle, bekleme zamanlayıcısı, sinyal kesin olarak tanımlanmış bir zamanda üretilecek şekilde konfigüre edilebilir.

Bekleme zamanlayıcısı, bir senkronizasyon zamanlayıcısı veya bir manuel sıfırlama bildirim zamanlayıcısı olabilir. Senkronizasyon zamanlayıcısı, genişletilmiş G/Ç tamamlama prosedürüne benzer bir dolaylı çağrı işleviyle ilişkilendirilirken, manuel olarak sıfırlanan bir bildirim zamanlayıcısında senkronizasyon için bir bekleme işlevi kullanılır.

Öncelikle CreateWaitableTimer işlevini kullanarak bir zamanlayıcı tanıtıcısı oluşturmanız gerekir.

KOLU CreateWaitableTimer(LPSECURITY_ATTRIBUTES lpTimerAttributes, BOOL bManualReset, LPCTSTR lpTimerName);

İkinci parametre olan bManualReset, oluşturulacak zamanlayıcı türünün senkronize mi yoksa bildirim mi olduğunu belirler. Program 14.3 bir senkronizasyon zamanlayıcısı kullanır, ancak yorumları ve parametre ayarını değiştirerek bunu kolayca bir bildirim zamanlayıcısına dönüştürebilirsiniz. Üçüncü bağımsız değişken tarafından sağlanan isteğe bağlı adı kullanabilen bir OpenWaitableTimer işlevi de bulunduğunu unutmayın.

Başlangıçta zamanlayıcı etkin olmayan bir durumda oluşturulur, ancak SetWaitableTimer işlevini kullanarak onu etkinleştirebilir ve ilk zaman gecikmesini ve ayrıca periyodik olarak oluşturulan sinyaller arasındaki zaman aralığının süresini belirleyebilirsiniz.

BOOL SetWaitableTimer(HANDLE hTimer, const LARGE_INTEGER *pDueTime, LONG IPPerod, PTIMERAPCROUTINE pfnCompletionRoutine, LPVOID lpArgToCompletionRoutine, BOOL fResume);

hTimer, CreateWaitableTimer işlevi kullanılarak oluşturulan zamanlayıcı için geçerli bir tanıtıcıdır.

pDueTime işaretçisi tarafından işaret edilen ikinci parametre, 100 nanosaniyelik zaman birimlerinde ifade edilen gerçek değerler ve FILETIME yapısı tarafından açıklanan biçimleriyle, mutlak zamana karşılık gelen pozitif değerler veya göreceli zamana karşılık gelen negatif değerler alabilir. . FILETIME türündeki değişkenler Bölüm 3'te tanıtılmıştı ve zaten Bölüm 6'da timep programında (Program 6.2) kullanılmıştı.

Üçüncü parametrede belirtilen sinyaller arasındaki aralığın değeri milisaniye cinsinden ifade edilir. Bu değer 0 olarak ayarlanırsa zamanlayıcı sadece bir kez sinyal verir. Bu parametre pozitifse, zamanlayıcı periyodiktir ve CancelWaitableTimer işlevi çağrılarak eylemi sonlandırılana kadar periyodik olarak çalışır. Belirtilen aralık için negatif değerlere izin verilmez.

Dördüncü parametre, pfnCompletionRoutine, bir senkronizasyon zamanlayıcısı durumunda kullanılır ve zamanlayıcı sinyallendiğinde çağrılan tamamlama rutininin adresini belirtir. ve sağlanan iş parçacığı boşta bekleme durumuna girer. Bu prosedür çağrıldığında, beşinci parametre olan plArgToComplretionRoutine tarafından belirtilen işaretçi argümanlardan biri olarak kullanılır.

Bir senkronizasyon zamanlayıcısı ayarlayarak, sonlandırma prosedürünün çağrılabilmesini sağlamak için SleepEx işlevini çağırarak ipliği uyku durumuna getirebilirsiniz. Bildirim zamanlayıcısının manuel olarak sıfırlanması durumunda, zamanlayıcı tutamacının sinyallenmesini beklemelisiniz. Tutamaç, SetWaitableTimer işlevine yapılan bir sonraki çağrıya kadar sinyal durumunda kalacaktır. Web sitesinde bulunan 14.3 programının tam sürümü, bir sonlandırma rutini ile birlikte veya zamanlayıcı tutamacının sinyal vermesini bekleyerek, seçtiğiniz bir zamanlayıcı kullanarak kendi deneylerinizi yürütmenize izin vererek dört farklı kombinasyonla sonuçlanır.

Son parametre olan fResume, güç tasarrufu modlarıyla ilgilidir. Bu konu hakkında daha fazla bilgi için lütfen yardım belgelerine bakın.

CancelWaitableTimer işlevi, önceden çağrılan SetWaitableTimer işlevini iptal etmek için kullanılır, ancak zamanlayıcının sinyal verilen durumunu değiştirmez. Bunun için SetWaitableTimer fonksiyonunu tekrar çağırmanız gerekmektedir.

Örnek: Bekleme Zamanlayıcısı Kullanma

Program 14.3, periyodik sinyaller üretmek için bir uyku zamanlayıcısının kullanımını gösterir.

Program 14.3. TimeBeep: periyodik sinyallerin üretilmesi
/* Bölüm 14. TimeBeep.p. Periyodik sesli bildirim. */
/* Kullanım: TimeBeep periyodu (milisaniye olarak). */

statik BOOL WINAPI İşleyicisi(DWORD CntrlEvent);
statik VOID APIENTRY Beeper(LPVOID, DWORD, DWORD);
uçucu statik BOOL Çıkış = YANLIŞ;

int _tmain(int argc, LPTSTR argv) (
/* Tuş vuruşlarını engelle işlemi sonlandırmak için. 4. bölüme bakın */
SetConsoleCtrlHandler(İşleyici, DOĞRU);
DueTime.QuadPart = -(UZUN)Periyot * 10000;
/* DueTime parametresi ilk zaman aşımı süresi için negatiftir ve geçerli zamana göredir. Zaman aşımı süresi ms (10 -3 s) cinsinden ölçülürken DueTime, FILETIME türüyle tutarlı olması için 100 ns (10 -7 s) cinsinden ölçülür. */
hTimer = CreateWaitableTimer(BOŞ, YANLIŞ /* "Senkronizasyon Zamanlayıcı" */, BOŞ);
SetWaitableTimer(hTimer, &DueTime, Dönem, Beeper, &Count, DOĞRU);
_tprintf(_T("Sayı = %d\n"), Sayı);
/* Sayaç değeri, zamanlayıcı prosedüründe artırılır. */
/* Bekleme durumunu girin. */
_tprintf(_T("Tamamlama. Sayaç = %d"), Sayı);

statik VOID APIENTRY Beeper(LPVOID lpCount, DWORD dwTimerLowValue, DWORD dwTimerHighValue) (
*(LPDWORD)lpCount = *(LPDWORD)lpCount + 1;
_tprintf(_T("Sinyal numarası oluştur: %d\n"), *(LPDWORD) lpCount);
Fan(1000 /* Frekans. */, 250 /* Süre (ms). */);

BOOL WINAPI İşleyicisi(DWORD CntrlEvent) (
_tprintf(_T("Kapatılıyor\n"));

G/Ç işlemi için talepte bulunan görev, süpervizör tarafından sipariş edilen işlemin tamamlanmasını bekleme durumuna aktarılır. Süpervizör, tamamlama bölümünden işlemin tamamlandığına dair bir mesaj aldığında, görevi çalıştırmaya hazır duruma getirir ve çalışmasına devam eder. Bu durum, senkron G/Ç'ye karşılık gelir. Senkron G/Ç çoğu işletim sisteminde standarttır. Uygulama yürütme hızını artırmak için gerekirse asenkron G / Ç kullanılması önerildi.

Asenkron çıkışın en basit çeşidi, uygulamadan gelen verilerin doğrudan G / Ç cihazına değil, özel bir sistem arabelleğine aktarıldığı harici bir cihaza arabelleğe alınmış çıkıştır. Bu durumda mantıksal olarak uygulama için çıktı işlemi hemen tamamlanmış sayılır ve görevin cihaza fiili veri aktarım işleminin bitmesini beklemesi gerekmez. Sistem arabelleğinden fiilen veri çıkışı süreci, G/Ç süpervizörü tarafından gerçekleştirilir. Doğal olarak, G/Ç süpervizörü yönünde sistem bellek alanından bir arabellek tahsis etmek için özel bir sistem süreci devreye girer. Bu nedenle, ele alınan durum için, ilk olarak, G / Ç isteği veri arabelleğe alma ihtiyacını belirtiyorsa ve ikinci olarak, G / Ç cihazı bu tür asenkron işlemlere izin veriyorsa ve bu UCB'de not edilirse, çıkış asenkron olacaktır. Düzenleyebilir ve asenkron veri girişi yapabilirsiniz. Ancak bunun için yalnızca cihazdan okunan verilerin geçici olarak depolanması için bir bellek alanı tahsis etmek ve tahsis edilen arabelleği işlemi emreden görevle ilişkilendirmek değil, aynı zamanda I/O işlemi için talebi bölmek gerekir. iki parça (iki istek halinde). İlk istek, senkronize G/Ç ile yapılana benzer şekilde, verileri okumak için bir işlemi belirtir. Ancak, isteğin türü (kodu) farklı şekilde kullanılır ve istek en az bir ek parametre belirtir - görevin isteğe yanıt olarak aldığı ve tahsis edilen arabelleği tanımlayan sistem nesnesinin adı (kodu). Tamponun adını aldıktan sonra (bu sistem nesnesini koşullu olarak bu şekilde arayacağız, ancak çeşitli işletim sistemlerinde onu belirtmek için başka terimler, örneğin bir sınıf kullanılmasına rağmen), görev çalışmaya devam ediyor. Burada asenkron bir giriş talebi sonucunda görevin G/Ç süpervizörü tarafından G/Ç işleminin tamamlanmasını bekleme durumuna aktarılmadığını, ancak çalışır durumda kaldığını veya yürütmeye hazır durumda. Bir süre sonra, programcı tarafından tanımlanan gerekli kodu yürüttükten sonra görev, G/Ç işlemini tamamlamak için ikinci bir istek gönderir. Elbette farklı bir koda (veya istek adına) sahip olan aynı cihaza yapılan bu ikinci istekte, görev sistem nesnesinin adını (eşzamansız veri girişi için arabellek) ve verilerin başarılı bir şekilde tamamlanması durumunda belirtir. okuma işlemi, bunları hemen sistem ara belleğinden alır. Veriler henüz harici cihazdan sistem arabelleğine tamamen yeniden yazılmamışsa, G / Ç süpervizörü görevi G / Ç işleminin tamamlanmasını bekleme durumuna sokar ve ardından her şey normal bir senkronize veri girişini andırır. .

Tipik olarak, çoğu çok programlı işletim sisteminde, özellikle işletim sistemi iş parçacığı mekanizması aracılığıyla çoklu görevi destekliyorsa, asenkron G/Ç sağlanır. Ancak, asenkron G/Ç açıkça mevcut değilse, veri çıkışı için bağımsız bir iş parçacığı düzenleyerek fikirlerini kendiniz uygulayabilirsiniz.

G/Ç donanımı bir koleksiyon olarak görülebilir donanım işlemcileri merkezi işlem birimi (işlemciler) ile olduğu kadar birbirine göre paralel olarak çalışabilen . Bu tür "işlemciler" üzerinde sözde dış süreçler.Örneğin, bir harici aygıt (bir giriş/çıkış aygıtı) için, bir harici işlem, yazıcı kafasını hareket ettiren, kağıdı bir konum ilerleten, mürekkebin rengini değiştiren veya bazı karakterleri yazdıran bir dizi işlem olabilir. G / Ç ekipmanı kullanan harici işlemler, hem birbirleriyle hem de merkezi işlemcide çalışan sıradan "yazılım" işlemleriyle etkileşime girer. Bu durumda önemli olan, harici işlemlerin yürütme hızının, sıradan (" yerel”) süreçleri. Normal çalışması için harici ve dahili süreçler senkronize edilmelidir. Dahili ve harici süreçler arasındaki güçlü hız uyumsuzluğunun etkisini yumuşatmak için yukarıda bahsedilen tamponlama kullanılır. Bu nedenle, paralel etkileşimli süreçler sisteminden söz edebiliriz (bkz. Bölüm 6).

Tamponlar, paralel gelişimleri sırasında bilgisel olarak etkileşime giren dahili (yazılım) ve harici süreçlerle ilgili kritik bir kaynaktır. Tampon (tamponlar) aracılığıyla, veriler ya bir süreçten adreslenen harici olana gönderilir (harici bir cihaza veri çıkışı işlemi) veya harici bir süreçten bazı yazılım süreçlerine aktarılır (veri okuma işlemi). Bir bilgi etkileşimi aracı olarak arabelleğe almanın tanıtılması, işletim sisteminin denetleyici kısmı aracılığıyla çözülen bu sistem arabelleklerini yönetme sorununu ortaya koymaktadır. Aynı zamanda süpervizör sadece sistem hafıza alanında tamponları tahsis etmek ve serbest bırakmakla değil, aynı zamanda tamponların doldurulması veya serbest bırakılması için işlemlerin durumuna göre senkronizasyon işlemleri ve yoksa onları beklemekle de görevlendirilir. kullanılabilir boş arabellekler ve giriş/çıkış için bir istek arabelleğe almayı gerektirir. Genellikle, G/Ç süpervizörü, yukarıdaki görevleri çözmek için verilen işletim sisteminde benimsenen standart senkronizasyon araçlarını kullanır. Bu nedenle, işletim sistemi, etkileşimli uygulamaların ve görevlerin paralel yürütülmesi sorunlarını çözmek için araçlar geliştirdiyse, kural olarak, aynı zamanda eşzamansız G/Ç'yi de uygular.

Veri girişi/çıkışı

Önceki makalelerin çoğu, bilgi işlem performansının optimizasyonuna ayrılmıştır. Çöp toplama, döngü ve özyinelemeli algoritmaları özelleştirmeye ve hatta çalışma zamanı ek yükünü azaltmak için algoritmaları optimize etmeye ilişkin birçok örnek gördük.

Bazı uygulamalar için, hesaplama yönlerinin optimizasyonu, yalnızca küçük bir performans kazancı sağlar, çünkü içlerindeki darboğaz, bir ağ üzerinden veri aktarımı veya disk erişimi gibi G / Ç işlemleridir. Tecrübelerimize göre, performans sorunlarının önemli bir bölümünün optimal olmayan algoritmaların kullanılması veya işlemciye aşırı yüklenme ile değil, I/O cihazlarının verimsiz kullanımı ile ilgili olduğunu söyleyebiliriz. G/Ç optimizasyonunun genel performansı iyileştirebileceği iki duruma bakalım:

    Bir uygulama, ek yükü artıran verimsiz G/Ç işlemleri nedeniyle ciddi hesaplama aşırı yüklemesi yaşayabilir. Daha da kötüsü, aşırı yük o kadar büyük olabilir ki, G/Ç aygıt bant genişliğinin maksimum kullanımını engelleyen sınırlayıcı bir faktör haline gelebilir.

    Bir G/Ç cihazı tam olarak kullanılamayabilir veya küçük parçalar halinde büyük miktarda veri göndermek veya tüm bant genişliğini kullanmamak gibi verimsiz programlama kalıpları nedeniyle yetenekleri boşa gidebilir.

Bu makale, genel G/Ç kavramlarını açıklar ve her tür G/Ç'nin performansını iyileştirmeye yönelik öneriler sunar. Bu öneriler, ağ uygulamaları, disk yoğun işlemler ve hatta standart dışı, yüksek performanslı donanım aygıtlarına erişen programlar için de geçerlidir.

Senkron ve asenkron G/Ç

Eşzamanlı modda yürütüldüğünde, Win32 API G/Ç işlevleri (ReadFile, WriteFile veya DeviceloControl gibi), işlem tamamlanana kadar programın yürütülmesini engeller. Bu modelin kullanımı çok uygun olmasına rağmen çok verimli değildir. Ardışık G/Ç isteklerinin yürütülmesi arasındaki zaman aralıklarında cihaz boşta kalabilir, yani tam olarak kullanılmayabilir.

Eşzamanlı modla ilgili diğer bir sorun, yürütme iş parçacığının herhangi bir eşzamanlı G/Ç işleminde zaman kaybetmesidir. Örneğin, aynı anda birçok istemciye hizmet veren bir sunucu uygulamasında, her oturum için ayrı bir yürütme dizisi oluşturmak mümkün olabilir. Çoğu zaman boşta olan bu threadler hafızayı boşa harcar ve durumlar oluşturabilir. iplik atma, birçok yürütme iş parçacığı aynı anda G / Ç tamamlandıktan sonra çalışmaya devam ettiğinde ve işlemci zamanı için savaşmaya başladığında, bu da birim zaman başına bağlam anahtarlarında bir artışa ve ölçeklenebilirlikte bir azalmaya yol açar.

Windows G/Ç alt sistemi (aygıt sürücüleri dahil) dahili olarak eşzamansız modda çalışır - bir program G/Ç işlemiyle aynı anda yürütülmeye devam edebilir. Hemen hemen tüm modern donanım aygıtları doğası gereği eşzamansızdır ve verileri aktarmak veya bir G/Ç işleminin ne zaman tamamlandığını belirlemek için sürekli yoklama gerektirmez.

Çoğu cihaz yeteneği destekler doğrudan bellek erişimi (Direct Memory Access, DMA) işlemcinin işleme katılımını gerektirmeden cihaz ile bilgisayarın RAM'i arasında veri aktarımı yapmak ve veri aktarımı tamamlandığında bir kesinti oluşturmak. Dahili olarak eşzamansız olan eşzamanlı G/Ç, yalnızca Windows uygulama katmanında desteklenir.

Win32'de asenkron G/Ç çağrılır. örtüşen giriş/çıkış (örtüşen G/Ç), senkron ve örtüşen G/Ç modlarının karşılaştırması aşağıdaki şekilde gösterilmektedir:

Bir uygulama bir G/Ç işlemi gerçekleştirmek için eşzamansız bir istekte bulunduğunda, Windows işlemi hemen gerçekleştirir veya işlemin beklemede olduğunu belirten bir durum kodu döndürür. İş parçacığı daha sonra diğer G/Ç işlemlerini başlatabilir veya bazı hesaplamalar yapabilir. Programcının, G / Ç işlemlerinin tamamlanmasıyla ilgili bildirimlerin alınmasını organize etmenin birkaç yolu vardır:

    Win32 olayı: Bu olayı bekleyen işlem, G/Ç tamamlandığında yürütülür.

    Bir Mekanizma ile Kullanıcı Tanımlı Bir Fonksiyonu Çağırmak Asenkron Prosedür Çağrısı (APC): Yürütme iş parçacığı uyarılabilir bekleme durumunda olmalıdır.

    Şununla bildirim alın: G/Ç Tamamlama Bağlantı Noktaları (IOCP): Bu genellikle en verimli mekanizmadır. Daha ayrıntılı olarak inceleyeceğiz.

Bazı G/Ç aygıtları (örneğin, arabelleğe alınmamış modda açılan bir dosya), uygulama az sayıda bekleyen G/Ç isteğinin her zaman mevcut olmasını sağlayabilirse ek faydalar sağlayabilir. Bunu yapmak için önce I/O işlemlerini gerçekleştirmek için birkaç istekte bulunulması ve yürütülen her istek için yeni bir istek üretilmesi önerilir. Bu, uygulamanın bir sonraki isteği yapmasını beklemeden aygıt sürücüsünün bir sonraki işlemi mümkün olan en kısa sürede başlatmasını sağlayacaktır. Ancak aktarılan veri miktarıyla aşırıya kaçmayın, çünkü bu sınırlı çekirdek bellek kaynaklarını tüketecektir.

G/Ç Tamamlama Bağlantı Noktaları

Windows, G/Ç Tamamlama Bağlantı Noktaları (IOCP) adı verilen eşzamansız G/Ç işlemlerinin tamamlandığını bildirmek için etkili bir mekanizmayı destekler. .NET uygulamalarında, yöntem aracılığıyla kullanılabilir. ThreadPool.BindHandle(). Bu mekanizma, .NET'te G/Ç işlemlerini gerçekleştiren birkaç tür tarafından dahili olarak kullanılır: FileStream, Socket, SerialPort, HttpListener, PipeStream ve bazı .NET Remoting kanalları.

Yukarıdaki şekilde gösterilen IOCP mekanizması, eşzamansız olarak ve belirli bir yürütme dizisiyle açık olan birden çok G/Ç tanıtıcısı (soketler, dosyalar ve özel aygıt sürücüsü nesneleri) ile iletişim kurar. Böyle bir tanıtıcıyla ilişkili G/Ç işlemi tamamlandıktan sonra, Windows uygun IOCP bağlantı noktasına bir bildirim ekler ve bunu işleme için ilişkili yürütme iş parçacığına iletir.

Bildirimlere hizmet etmek ve eşzamansız G/Ç işlemlerini başlatan iş parçacıklarının yürütülmesine devam etmek için bir iş parçacığı havuzu kullanmak, birim zaman başına bağlam anahtarlarının sayısını azaltır ve CPU kullanımını artırır. Şaşırtıcı olmayan bir şekilde, Microsoft SQL Server gibi yüksek performanslı sunucular G/Ç tamamlama bağlantı noktalarını kullanır.

Tamamlama bağlantı noktası, Win32 API işlevi çağrılarak oluşturulur. CreateIoCompletionPort G/Ç nesnesine maksimum eşzamanlılık değeri (iş parçacığı sayısı), tamamlama anahtarı ve isteğe bağlı bir tanıtıcı geçirilen . Tamamlama anahtarı, çeşitli G/Ç tutamaçlarını tanımlamak için kullanılan kullanıcı tanımlı bir değerdir. CreateIoCompletionPort işlevini art arda çağırarak ve var olan bir tamamlama bağlantı noktasına bir tanıtıcı geçirerek aynı IOCP bağlantı noktasına birden çok tanıtıcı bağlayabilirsiniz.

Belirtilen IOCP bağlantı noktasıyla bağlantı kurmak için, kullanıcı iş parçacıkları işlevi çağırır. GetCompletionStatus ve tamamlanmasını bekleyin. Bir yürütme dizisi, aynı anda yalnızca bir IOCP bağlantı noktasıyla ilişkilendirilebilir.

işlev çağrısı GetQueuedCompletionStatus bildirilinceye (veya zaman aşımına uğrayana kadar) iş parçacığının yürütülmesini engeller ve ardından aktarılan bayt sayısı, tamamlama anahtarı ve eşzamansız G/Ç işleminin yapısı gibi tamamlanmış G/Ç işlemi hakkında bilgi verir. . Bildirim sırasında G/Ç bağlantı noktasıyla ilişkili tüm iş parçacıkları meşgulse (yani GetQueuedCompletionStatus çağrısında bekleyen iş parçacığı yoksa), IOCP mekanizması maksimum eşzamanlılık değerine kadar yeni bir yürütme iş parçacığı oluşturur. . GetQueuedCompletionStatus adlı bir iş parçacığı ve bildirim sırası boş değilse, işlev, iş parçacığını işletim sistemi çekirdeğinde engellemeden hemen döner.

IOCP mekanizması, bazı "meşgul" iş parçacıklarının aslında eşzamanlı G/Ç yaptığını ve muhtemelen maksimum eşzamanlılık değerini aşan ek bir iş parçacığı başlattığını algılayabilir. Bildirimler, I/O yapılmadan, işlev çağrılarak manuel olarak da gönderilebilir. PostQueuedCompletionStatus.

Aşağıdaki kod, bir Win32 dosya tanıtıcısıyla ThreadPool.BindHandle() kullanımına bir örnek gösterir:

Sistemi Kullanmak; System.Threading kullanarak; Microsoft.Win32.SafeHandles'ı kullanarak; System.Runtime.InteropServices'i kullanarak; public class Uzantıları (iç statik extern SafeFileHandle CreateFile (string lpFileName, EFileAccess dwDesiredAccess, EFileShare dwShareMode, ıntptr lpSecurityAttributes, ECreationDisposition dwCreationDisposition, EFileAttributes DwFlagsAndAttributes, ıntptr hTemplateFile); statik güvensiz extern bool WriteFile (SafeFileHandle hFile, doğrulamasını bayt, uint nNumberOfBytesToWrite, dışarı uint lpNumberOfBytesWritten , System.Threading.NativeOverlapped* lpOverlapped); enum EFileShare: uint ( Yok = 0x00000000, Okuma = 0x00000001, Yazma = 0x00000002, Sil = 0x00000004 ) enum ECreationDisposition: uint ( Yeni = 1, CreateAlways = 2, OpenExisting 4, OpenExisting = 3, OpenExisting = 3 , TruncateExisting = 5) enum EFileAttributes: uint ( // ... Bazı işaretler gösterilmez Normal = 0x00000080, Overlapped = 0x40000000, NoBuffering = 0x20000000, ) enum EFileAccess: uint ( // ... Bazı işaretler gösterilmez GenericRead = 0x80000000 , GenericWrite = 0x40000000, ) statik lo ng_numBytesYazılı; // Yazma akışı için frenleme statik AutoResetEvent _waterMarkFullEvent; statik int _pendingIosCount; const int MaxPendingIos = 10; // G/Ç iş parçacıkları tarafından çağrılan tamamlama yordamı statik güvenli olmayan void WriteComplete(uint errorCode, uint numBytes, NativeOverlapped* pOVERLAP) ( _numBytesWritten += numBytes; Overlapped ovl = Overlapped.Unpack(pOVERLAP); Overlapped.Free /pOVERLAP) / Yazan iş parçacığına, bekleyen G/Ç işlemlerinin sayısının izin verilen sınıra düştüğünü bildirin // if (Interlocked.Decrement(ref _pendingIosCount) = MaxPendingIos) ( _waterMarkFullEvent.WaitOne(); ) ) ) )

Önce TestIOCP yöntemine bakalım. Bu, bir dosya veya aygıtı açmak veya oluşturmak için kullanılan bir P/Invoke mekanizması işlevi olan CreateFile() işlevini çağırır. G/Ç işlemlerini eşzamansız modda gerçekleştirmek için, işleve EFileAttributes.Overlapped bayrağı geçirilmelidir. Başarılı olursa, CreateFile() işlevi, ThreadPool.BindHandle() öğesini çağırarak G/Ç tamamlama bağlantı noktasına bağladığımız bir Win32 dosya tanımlayıcısı döndürür. Ardından, bu tür çok fazla işlem varsa G/Ç işlemini başlatan iş parçacığını geçici olarak engellemek için kullanılan bir olay nesnesi oluşturulur (sınır, MaxPendingIos sabiti tarafından belirlenir).

Ardından asenkron yazma işlemleri döngüsü başlar. Her yinelemede, yazılacak verilerle bir arabellek oluşturulur ve örtüşen yapı dosya içindeki ofseti içeren (bu örnekte, yazma her zaman ofset 0'da yapılır), işlem tamamlandığında gönderilecek bir olay tanıtıcısı (IOCP mekanizması tarafından kullanılmaz) ve isteğe bağlı bir kullanıcı nesnesi IAsyncSonuç Sonlandırıcı işlevine durumu iletmek için kullanılabilen bir.

Ardından, bir sarma işlevini ve bir veri arabelleğini kabul eden Overlapped.Pack() yöntemi çağrılır. Yönetilmeyen bellekte eşdeğer düşük seviyeli G/Ç yapısını oluşturur ve veri arabelleğini sabitler. Düşük seviyeli yapı tarafından işgal edilen yönetilmeyen belleği boşaltmak ve arabelleği ayırmak manuel olarak yapılmalıdır.

Aynı anda devam eden çok fazla G/Ç yoksa, belirtilen düşük seviyeli yapıyı geçirerek WriteFile()'ı çağırırız. Aksi takdirde, bekleyen işlem sayısının üst sınırın altına düştüğünü gösteren bir olay oluşuncaya kadar bekleriz.

WriteComplete tamamlama işlevi, işlem tamamlanır tamamlanmaz G/Ç tamamlama iş parçacığı havuzundaki bir iş parçacığı tarafından çağrılır. Paketinden çıkarılabilen ve yönetilen bir Örtüşen yapıya dönüştürülebilen düşük seviyeli asenkron G/Ç yapısına bir işaretçi iletilir.

Özetle, yüksek performanslı G/Ç aygıtlarıyla çalışırken, doğrudan yönetilmeyen kitaplıkta kendi tamamlama bağlantı noktanızı oluşturup kullanarak veya Win32 tanıtıcılarını .NET'te bir tamamlama bağlantı noktasıyla ilişkilendirerek tamamlama bağlantı noktalarına sahip eşzamansız G/Ç kullanın. ThreadPool.BindHandle() yöntemini kullanarak.

.NET'te iş parçacığı havuzu

.NET'teki iş parçacığı havuzu, her biri farklı türde iş parçacıkları oluşturan çeşitli amaçlar için başarıyla kullanılabilir. Daha önce paralel hesaplamayı tartışırken, hesaplama görevlerini paralelleştirmek için kullandığımız iş parçacığı havuzu API'siyle tanıştık. Ancak, iş parçacığı havuzları başka tür sorunları çözmek için de kullanılabilir:

    Çalışan iş parçacıkları, kullanıcı temsilcilerine (BeginInvoke veya ThreadPool.QueueUserWorkItem gibi) eşzamansız çağrıları işleyebilir.

    G/Ç tamamlama iş parçacıkları, küresel IOCP bağlantı noktasından gelen bildirimlere hizmet verebilir.

    Garson iş parçacıkları, Windows üst sınırına kadar (maksimum bekleme nesneleri = 64), aynı iş parçacığında aynı anda birden çok olayı beklemenize izin vererek (WaitForMultipleObjects kullanarak) kayıtlı olayları bekleyebilir. Olay bekleme alımı, tamamlama bağlantı noktaları kullanılmadan eşzamansız G/Ç'yi düzenlemek için kullanılır.

    Birden çok zamanlayıcının aynı anda süresinin dolmasını bekleyen zamanlayıcı iş parçacıkları.

    Kapı konuları havuzdaki iş parçacıkları tarafından işlemci kullanımını kontrol edin ve ayrıca en yüksek performansı elde etmek için iş parçacığı sayısını (belirlenen sınırlar dahilinde) değiştirin.

Asenkron gibi görünen ancak olmayan G/Ç işlemlerini başlatmak mümkündür. Örneğin, ThreadPool.QueueUserWorkItem temsilcisini çağırmak ve ardından eşzamanlı bir G/Ç işlemi gerçekleştirmek gerçekten zaman uyumsuz bir işlem değildir ve aynı işlemi normal bir yürütme iş parçacığında gerçekleştirmekten daha iyi değildir.

Bellek kopyası

Fiziksel bir G/Ç cihazının, uygulama onu işlemeyi bitirene kadar tekrar tekrar kopyalanan bir veri arabelleği döndürmesi alışılmadık bir durum değildir. Bu tür kopyalama, işlemcinin işlem gücünün önemli bir bölümünü tüketebilir, bu nedenle maksimum verim sağlamak için bundan kaçınılmalıdır. Daha sonra, veri kopyalamanın geleneksel olduğu birkaç duruma bakacağız ve bundan kaçınmak için teknikler hakkında bilgi sahibi olacağız.

yönetilmeyen bellek

.NET'te yönetilmeyen bellekte bir arabellekle çalışmak, yönetilen bir bayt dizisiyle çalışmaktan çok daha zordur, bu nedenle programcılar en kolay yolu bulmak için arabelleği genellikle yönetilen belleğe kopyalar.

Kullandığınız işlevler veya kitaplıklar, bellekte açıkça bir arabellek belirtmenize veya bir arabellek ayırmak için ona geri arama işlevinizi iletmenize izin veriyorsa, yönetilen bir arabellek ayırın ve hem işaretçi hem de yönetilen başvuru tarafından erişilebilmesi için onu belleğe sabitleyin. Tampon yeterince büyükse (> 85.000 bayt), şu anda oluşturulacaktır. büyük nesnelerin yığını (Büyük Nesne Yığını), bu nedenle mevcut arabellekleri yeniden kullanmayı deneyin. Arabellek yeniden kullanımı, bir nesnenin yaşam süresinin belirsizliği nedeniyle karmaşıksa, bellek havuzlarını kullanın.

İşlevlerin veya kitaplıkların arabellekler için bellek ayırdığı (yönetilmeyen) diğer durumlarda, bu belleğe doğrudan işaretçi (güvenli olmayan koddan) veya aşağıdaki gibi sarmalayıcı sınıfları kullanarak erişebilirsiniz. Yönetilmeyen Bellek Akışı Ve Yönetilmeyen BellekErişimci. Ancak, arabelleği yalnızca bayt dizilerinde veya dize nesnelerinde çalışan bazı kodlara geçirmeniz gerekiyorsa, kopyalama kaçınılmaz olabilir.

Bellek kopyalamayı engelleyemeseniz ve verilerinizin bir kısmı veya çoğu erken filtrelenmiş olsa bile, kopyalamadan önce verilerin gerekli olup olmadığını kontrol ederek gereksiz kopyalamayı önleyebilirsiniz.

Tamponun Bir Parçasını Dışa Aktarma

Programcılar bazen bayt dizilerinin yalnızca baştan sona ihtiyaç duydukları verileri içerdiğini varsayarlar ve çağrı kodunu arabelleği kırmaya zorlarlar (yeni bir bayt dizisi için bellek ayırın ve yalnızca gerekli verileri kopyalayın). Bu durum genellikle protokol yığını uygulamalarında görülebilir. Buna karşılık, yönetilmeyen eşdeğer kod, gerçek ara belleğin başlangıcını mı yoksa ortayı mı gösterdiğini bilmeden basit bir işaretçi ve işlenmekte olan verilerin sonunun nerede olduğunu belirlemek için bir arabellek uzunluğu parametresi alabilir.

Gereksiz bellek kopyalamasını önlemek için, bir bayt parametresi aldığınız her yerde kabul edilecek bir ofset ve uzunluk ayarlayın. Dizinin Uzunluk özelliği yerine uzunluk parametresini kullanın ve ofset değerini geçerli dizinlere ekleyin.

Rastgele Okuma ve Birleştirme Yazma

Rastgele Okuma ve Yazma Birleştirme, Windows tarafından bitişik olmayan bölgelere okuma veya bitişik olmayan bölgelerden veri yazma, sanki bitişik bir bellek parçasını işgal ediyormuş gibi destekleyen bir yetenektir. Bu işlevsellik, Win32 API'sinde işlevler olarak sağlanır. Dosya Dağılımı Oku Ve YazDosyaTopla. Windows Sockets Library ayrıca WSASend, WSARecv ve diğerleri gibi kendi işlevlerini sağlayarak rasgele okuma ve birleştirme yazma işlemlerini destekler.

Rastgele okuma ve birleştirme yazma aşağıdaki durumlarda faydalı olabilir:

    Her paket, gerçek verilerden önce gelen sabit boyutlu bir başlığa sahip olduğunda. Rastgele okuma ve birleştirme yazma, bitişik bir arabellek almanız gerektiğinde her zaman üstbilgileri kopyalamak zorunda kalmamanızı sağlar.

    Birden çok arabellekle G/Ç gerçekleştirirken sistem çağrısı çağrılarının ek yükünden kurtulmak istendiğinde.

Her arabelleğin tam olarak bir sayfa boyutunda olmasını ve tanıtıcının eşzamansız ve arabelleksiz olarak açılmasını (daha da büyük bir sınırlama) gerektiren ReadFileScatter ve WriteFileGather ile karşılaştırıldığında, soket tabanlı dağılım okuma ve birleştirme yazma işlevleri daha pratik görünüyor. , çünkü bu kısıtlamalara sahip değiller. .NET Framework, aşırı yüklenmiş yöntemlerle yuvalar için dağılım okuma ve birleştirme yazmayı destekler Socket.Send() Ve Socket.Receive() genel okuma/yazma işlevlerini dışa aktarmadan.

Dağılım okuma ve birleştirme yazma işlevlerini kullanma örneği HttpWebRequest sınıfında bulunabilir. HTTP başlıklarını, depolamak için bitişik bir arabellek oluşturmaya başvurmadan gerçek verilerle birleştirir.

Dosya G/Ç

Tipik olarak, dosya G/Ç, birkaç performans avantajı sunan dosya sistemi önbelleği aracılığıyla gerçekleştirilir: yakın zamanda erişilen verilerin önbelleğe alınması, ileri okuma (diskten önceden okuma verileri), geç yazma (diske eşzamansız yazma) ve küçük veri parçalarını yazar. Windows'a beklenen dosya erişim modeli hakkında bilgi vererek ek bir performans artışı elde edebilirsiniz. Uygulamanız eşzamansız G/Ç yapıyorsa ve arabelleğe alma sorunlarının bazılarını halledebiliyorsa, önbelleğe alma mekanizmasından tamamen kaçınmak daha iyi bir çözüm olabilir.

önbellek yönetimi

Programcılar, dosyaları oluştururken veya açarken, bazıları önbelleğe alma mekanizmasının davranışını etkileyen CreateFile işlevine bayraklar ve nitelikler iletir:

    bayrak FILE_FLAG_SEQUENTIAL_SCAN dosyaya sırayla erişileceğini, muhtemelen bölümleri atlayacağını ve rastgele erişimin olası olmadığını gösterir. Sonuç olarak, önbellek yöneticisi normalden daha ileriye bakarak ileriyi okuyacaktır.

    bayrak FILE_FLAG_RANDOM_ACCESS dosyaya rasgele sırada erişileceğini belirtir. Bu durumda, önbellek yöneticisi, önceden okunan verilere uygulama tarafından gerçekten ihtiyaç duyulması ihtimalinin azalması nedeniyle, okumaları biraz ileride gerçekleştirecektir.

    bayrak FILE_ATTRIBUTE_TEMPORARY dosyanın geçici olduğunu belirtir, bu nedenle fiziksel ortama gerçek yazma işlemleri (veri kaybını önlemek için) ertelenebilir.

.NET'te, bu seçenekler (sonuncusu dışında) bir FileOptions enum türü parametresi alan aşırı yüklenmiş FileStream oluşturucusu kullanılarak desteklenir.

Rastgele erişim, hareketli kafalar gerektirdiğinden, özellikle disk cihazlarıyla çalışırken performans üzerinde olumsuz bir etkiye sahiptir. Teknoloji geliştikçe, disk verimi, gecikmeyi azaltarak değil, yalnızca depolama yoğunluğunu artırarak arttı. Modern diskler, kafaları hareket ettirmek için harcanan toplam süreyi azaltmak için rastgele erişim sorgusu yürütmesini yeniden sıralayabilir. Bu yaklaşım denir donanım komut kuyruğu (Native Command Queuing, NCO). Bu tekniği daha etkili hale getirmek için disk denetleyicisinin aynı anda birkaç G/Ç isteği göndermesi gerekir. Başka bir deyişle, mümkünse, aynı anda bekleyen birden çok eşzamansız G/Ç isteğine sahip olmayı deneyin.

Tamponsuz G/Ç

Arabelleğe alınmamış G/Ç işlemleri her zaman önbellek kullanılmadan gerçekleştirilir. Bu yaklaşımın avantajları ve dezavantajları vardır. Önbellek kontrol hilesinde olduğu gibi, ham G/Ç, dosya oluşturma sırasında "bayraklar ve nitelikler" seçeneği aracılığıyla etkinleştirilir, ancak .NET bu yeteneğe erişim sağlamaz.

    bayrak FILE_FLAG_NO_BUFFERING okuma ve yazmaların önbelleğe alınmasını devre dışı bırakır, ancak disk denetleyicisi tarafından gerçekleştirilen önbelleğe almayı etkilemez. Bu, kopyalamayı (kullanıcının arabelleğinden önbelleğe) ve önbelleği "kirletmeyi" (önbelleği gereksiz verilerle doldurmayı ve gerekli olanları dışarı itmeyi) önler. Ancak, arabelleğe alınmamış okuma ve yazma işlemleri, hizalama gereksinimlerine uymalıdır.

    Aşağıdaki parametreler disk sektör boyutunun bir katına veya buna eşit olmalıdır: bir aktarımın boyutu, dosyadaki ofset ve bellekteki arabelleğin adresi. Tipik olarak, bir disk sektörü 512 bayt boyutundadır. En yeni yüksek kapasiteli disk cihazlarının sektör boyutu 4096 bayttır, ancak uyumluluk modunda çalışabilirler ve 512 bayt sektörleri taklit edebilirler (performans pahasına).

    bayrak FILE_FLAG_WRITE_THROUGHönbellek yöneticisine yazma verilerini önbellekten hemen temizlemesi gerektiğini söyler (FILE_FLAG_NO_BUFFERING bayrağı ayarlanmamışsa) ve disk denetleyicisine, verileri bir ara donanım önbelleğinde saklamadan hemen fiziksel ortama yazması gerektiğini söyler.

İleri okuma, uygulama işlemler arasındaki gecikmelerle eşzamanlı modda okurken bile diski daha iyi kullanarak performansı artırır. Uygulamanın bir sonraki adımda dosyanın hangi bölümünü isteyeceğinin doğru tespiti Windows'a bağlıdır. Arabelleğe almayı devre dışı bırakarak, önceden okumayı da devre dışı bırakırsınız ve çakışan birden çok G/Ç yaparak disk aygıtını meşgul tutmalısınız.

Gecikmeli yazma, diske yazmanın çok hızlı olduğu yanılsamasını vererek, eşzamanlı yazma işlemleri gerçekleştiren uygulamaların performansını da artırır. Uygulama, daha kısa sürelerle bloke ederek CPU kullanımını iyileştirebilecek. Arabelleğe alma devre dışı bırakıldığında, yazma işlemlerinin süresi, verilerin diske yazılması için gereken tam süreye eşit olacaktır. Bu nedenle, arabelleğe almanın devre dışı bırakıldığı asenkron G/Ç modunun kullanılması daha da önemli hale gelir.

G/Ç yönetimi.

blok odaklı cihazlar ve bayt yönelimli

Ana fikir

anahtar ilke cihaz bağımsızlığı

Kesinti işleme,

aygıt sürücüleri,

Çok çeşitli nedenlerle çok çeşitli kesintilerin mümkün olduğu açıktır. Bu nedenle, bir sayı bir kesinti ile ilişkilendirilir - sözde kesinti numarası.

Bu sayı benzersiz bir şekilde belirli bir olaya karşılık gelir. Sistem kesintileri tanıyabilir ve meydana geldiklerinde kesme numarasına karşılık gelen prosedürü başlatır.

Bazı kesintiler (sayısal sıraya göre ilk beş), sıfıra bölme girişimi, taşma vb. gibi herhangi bir özel olay durumunda CPU tarafından kullanılmak üzere ayrılmıştır (bunlar gerçekten J dahili kesmeleridir).

Donanım kesintileri, çalışan programlara göre her zaman zaman uyumsuz olarak gerçekleşir. Ayrıca, aynı anda birkaç kesinti meydana gelebilir!

Hangi kesintinin önce hizmet vereceğine karar verirken sistemin kaybolmaması için özel bir öncelik şeması vardır. Her kesmeye kendi önceliği atanır. Aynı anda birden fazla kesinti meydana gelirse, sistem en yüksek önceliğe öncelik vererek diğer kesintileri bir süre erteler.

Öncelik sistemi, iki Intel 8259 yongası (veya benzeri) üzerinde uygulanmaktadır. Her çip bir kesme kontrolörüdür ve sekize kadar önceliği yönetir. Sistemdeki öncelik seviyelerinin sayısını artırmak için çipler birleştirilebilir (basamaklı).

Öncelik seviyeleri IRQ0 - IRQ15 olarak kısaltılır.


24. Girdi / çıktı yönetimi. Senkron ve asenkron G/Ç.

İşletim sisteminin ana işlevlerinden biri, bilgisayarın tüm giriş / çıkış aygıtlarını yönetmektir. İşletim sistemi cihazlara komutlar göndermeli, kesintileri yakalamalı ve hataları işlemelidir; ayrıca cihazlar ve sistemin geri kalanı arasında bir arayüz sağlamalıdır. Geliştirme amacıyla, arayüz tüm cihaz türleri için aynı olmalıdır (cihaz bağımsızlığı). G/Ç kontrol sorusu 23 hakkında daha fazla bilgi.

Koruma ilkeleri

UNIX işletim sistemi en başından beri çok kullanıcılı bir işletim sistemi olarak tasarlandığından, çeşitli kullanıcıların dosya sisteminin dosyalarına erişimine izin verme sorunu her zaman bununla ilgili olmuştur. Erişim yetkisi ile, kullanıcının erişim haklarına ve dosya için belirlenen erişim kısıtlamalarına bağlı olarak, belirli bir kullanıcının belirli bir dosyaya erişimine izin veren veya bunu reddeden sistem eylemlerini kastediyoruz. UNIX işletim sisteminde kullanılan erişim yetkilendirme şeması o kadar basit ve kullanışlıdır ve aynı zamanda o kadar güçlüdür ki, modern işletim sistemlerinin fiili standardı haline gelmiştir (çok seviyeli korumaya sahip sistemler gibi görünmemektedir).

Dosya Koruması

Çok kullanıcılı bir işletim sisteminde alışıldığı gibi, UNIX, dosyalara ve dosya sistemi dizinlerine erişimi kontrol etmek için tek tip bir mekanizma sağlar. Herhangi bir işlem belirli bir dosyaya ancak ve ancak dosyada açıklanan erişim hakları bu işlemin özelliklerine karşılık geliyorsa erişebilir.

UNIX'te dosyaları yetkisiz erişime karşı korumak, üç gerçeğe dayanmaktadır. İlk olarak, bir dosya (veya dizin) oluşturan herhangi bir işlem, sisteme özgü bazı kullanıcı tanımlayıcılarıyla (UID - Kullanıcı Tanımlayıcı), gelecekte yeni oluşturulan dosyanın sahibinin tanımlayıcısı olarak yorumlanabilir. İkinci olarak, bir dosyaya erişmeye çalışan her işlem, kendisiyle ilişkili bir çift tanımlayıcıya, mevcut kullanıcı ve grup tanımlayıcılarına sahiptir. Üçüncüsü, her dosya benzersiz bir şekilde tanımlayıcısına karşılık gelir - i-node.

Son gerçek, daha ayrıntılı olarak üzerinde durmaya değer. Dosya adlarının ve bu tür dosyaların aynı şey olmadığını anlamak önemlidir. Özellikle, aynı dosyaya birden çok sabit bağlantı olduğunda, birden çok dosya adı aslında aynı dosyayı temsil eder ve aynı i-node ile ilişkilendirilir. Dosya sisteminde kullanılan herhangi bir i-düğüm her zaman benzersiz bir şekilde bir ve yalnızca bir dosyaya karşılık gelir. I-düğüm oldukça fazla farklı bilgi içerir (çoğu stat ve fstat sistem çağrıları yoluyla kullanıcılara sunulur) ve bu bilgiler arasında dosya sisteminin belirli bir işlemin erişim haklarını değerlendirmesini sağlayan bir kısım vardır. gerekli modda belirli bir dosyaya.

Genel koruma ilkeleri, sistemin mevcut tüm varyantları için aynıdır: i-node bilgileri, dosyanın mevcut sahibinin UID'sini ve GID'sini içerir (dosya oluşturulduktan hemen sonra, mevcut sahibinin tanımlayıcıları, dosyanın mevcut sahibinin tanımlayıcıları olarak ayarlanır). oluşturan işlemin ilgili geçerli tanımlayıcısıdır, ancak daha sonra chown ve chgrp sistem çağrıları tarafından değiştirilebilir) . Ek olarak, dosyanın i-düğümü, kullanıcının - sahibinin dosyayla neler yapabileceğini, sahibiyle aynı kullanıcı grubuna ait kullanıcıların dosyayla neler yapabileceğini ve diğerlerinin dosyayla neler yapabileceğini gösteren bir ölçek içerir. dosya kullanıcıları. Sistemin farklı versiyonlarındaki küçük uygulama detayları farklıdır.

28. Windows NT'de dosya erişim denetimi. Erişim hakları listeleri.

Windows NT'deki erişim kontrol sistemi, çok çeşitli erişim konuları ve nesnelerinin yanı sıra erişim işlemlerinin ayrıntı düzeyi aracılığıyla elde edilen yüksek derecede esneklik ile karakterize edilir.

Dosya Erişim Kontrolü

Paylaşılan kaynaklar için Windows NT, izin verilen işlemler kümesi, sahip tanımlayıcısı ve erişim denetim listesi gibi güvenlik özelliklerini içeren ortak bir nesne modeli kullanır.

Windows NT'deki nesneler, dosyalar, dizinler, aygıtlar, bellek bölümleri, işlemler gibi paylaşılmaları veya paylaşılmaları durumunda herhangi bir kaynak için oluşturulur. Windows NT'deki nesnelerin özellikleri iki bölüme ayrılır - bileşimi nesnenin türüne bağlı olmayan genel bir bölüm ve nesne türüne göre belirlenen ayrı bir bölüm.
Tüm nesneler, öğeleri dal nesneleri (dizinler) ve yaprak nesneleri (dosyalar) olan ağaç benzeri hiyerarşik yapılarda depolanır. Dosya sistemi nesneleri için bu ilişki şeması, dizinlerin ve dosyaların hiyerarşisinin doğrudan bir yansımasıdır. Diğer türdeki nesneler için, hiyerarşik ilişki şemasının kendi içeriği vardır, örneğin süreçler için ebeveyn-çocuk ilişkilerini yansıtır ve cihazlar için belirli bir cihaz türüne ait olmayı ve cihazın diğer cihazlarla bağlantısını yansıtır, örneğin, diskleri olan bir SCSI denetleyicisi.

Herhangi bir türdeki nesneler için erişim haklarının kontrolü, ayrıcalıklı modda çalışan Güvenlik Referans İzleyicisi kullanılarak merkezi olarak gerçekleştirilir.

Windows NT güvenlik sistemi, hem bireysel kullanıcılar hem de gruplar olmak üzere çok sayıda farklı önceden tanımlanmış (yerleşik) erişim konusunun varlığı ile karakterize edilir. Bu nedenle, sistemde her zaman Yönetici, Sistem ve Misafir gibi kullanıcılar ve ayrıca Kullanıcılar, Yöneticiler, Hesap Operatörleri, Sunucu Operatörleri, Herkes ve diğerleri grupları vardır. Bu yerleşik kullanıcıların ve grupların amacı, bazı haklara sahip olmalarıdır, bu da yöneticinin etkili bir erişim kontrol sistemi oluşturmasını kolaylaştırır. Yeni bir kullanıcı eklerken, yöneticinin yalnızca bu kullanıcıyı hangi grup veya gruplara atayacağına karar vermesi gerekir. Elbette, yönetici yeni gruplar oluşturabilir ve ayrıca kendi güvenlik politikalarını uygulamak için yerleşik gruplara haklar ekleyebilir, ancak çoğu durumda yerleşik gruplar yeterlidir.

Windows NT, bu işlemlerde yer alan özne ve nesnelerin türüne göre farklılık gösteren üç erişim işlemi sınıfını destekler.

□ İzinler, dosyalar, dizinler, yazıcılar, bellek bölümleri vb. gibi her tür nesneyle ilgili olarak her türden özne için tanımlanabilen bir işlemler dizisidir. İzinler, amaçlarına göre dosya ve dizinlere erişim haklarına karşılık gelir. QC UNIX'te.

□ Haklar (kullanıcı hakları) - sistem saatinin ayarlanması, dosyaların arşivlenmesi, bilgisayarın kapatılması, vb. gibi bazı sistem işlemlerini gerçekleştirmek için grup türündeki konular için tanımlanır. Bu işlemler özel bir erişim nesnesi içerir - bir bütün olarak işletim sistemi .

Yerleşik bir kullanıcı grubunu diğerinden ayıran öncelikle haklardır, izinler değil. Yerleşik bir grubun bazı hakları da yerleşiktir - bu gruptan kaldırılamazlar. Yerleşik grubun kalan hakları kaldırılabilir (veya genel haklar listesinden eklenebilir).

□ Kullanıcı yetenekleri, bireysel kullanıcıların, örneğin ana program menüsünün bileşimini değiştirme, Çalıştır menü öğesini kullanma yeteneği vb. gibi çalışma ortamlarının oluşumu ile ilgili eylemleri gerçekleştirmeleri için tanımlanır. Yetenek setini azaltarak ( varsayılan olarak kullanıcıya açıktır), yönetici, kullanıcıyı yöneticinin en uygun gördüğü işletim ortamıyla çalışmaya zorlayabilir ve kullanıcıyı olası hatalardan korur.

Bir gruba verilen haklar ve izinler, üyelerine otomatik olarak verilir, bu da yöneticinin çok sayıda kullanıcıyı bir hesap bilgisi birimi olarak ele almasına ve eylemlerini en aza indirmesine izin verir.

Bir kullanıcı sisteme giriş yaptığında, onun için kullanıcı kimliğini ve kullanıcının ait olduğu tüm grupların kimliklerini içeren bir erişim belirteci oluşturulur. Belirteç ayrıca şunları içerir: izinlerden oluşan ve süreç tarafından oluşturulan nesnelere uygulanan bir varsayılan erişim kontrol listesi (ACL); sistem eylemlerini gerçekleştirmek için kullanıcı haklarının listesi.

Dosyalar, akışlar, olaylar, hatta erişim belirteçleri dahil tüm nesneler, oluşturulduklarında bir güvenlik tanımlayıcısı ile sağlanır. Güvenlik tanımlayıcısı bir erişim kontrol listesi içerir - ACL.

Dosya tanımlayıcı işlem tarafından açılan dosyaya işletim sistemi tarafından atanan, negatif olmayan bir tamsayıdır.

EKL(İngilizce) Erişim kontrol Listesi- erişim kontrol listesi, İngilizce olarak "ekl" olarak telaffuz edilir - belirli bir nesneye kimin veya neyin erişebileceğini ve bu öznenin nesne üzerinde yapmasına izin verilen veya yasak olan işlemleri belirler.

Erişim kontrol listeleri, seçici erişim kontrol sistemlerinin bel kemiğidir. ( Wiki)

Bir nesnenin sahibi, genellikle onu oluşturan kullanıcı, nesneye erişimi seçmeli olarak kontrol etme hakkına sahiptir ve nesnenin ACL'sini başkalarının nesneye erişmesine izin vermek veya vermemek için değiştirebilir. Windows NT yerleşik yöneticisi, UNIX süper kullanıcısının aksine, bir nesneye erişmek için bazı izinlere sahip olmayabilir. Bu özelliği uygulamak için, yönetici kimlikleri ve yönetici grup kimlikleri, normal kullanıcı kimlikleri gibi bir ACL'ye dahil edilebilir. Bununla birlikte, yönetici her zaman nesnenin sahibi olabileceğinden ve daha sonra sahip olarak tüm izinleri alabileceğinden, herhangi bir nesneyle herhangi bir işlem gerçekleştirme yeteneğine sahiptir. Ancak, yönetici nesnenin önceki sahibine mülkiyeti iade edemez, böylece kullanıcı her zaman yöneticinin kendi dosyası veya yazıcısı ile çalıştığını öğrenebilir.

Bir işlem, Windows NT'de bir nesneye erişmek için bir işlem istediğinde, kontrol her zaman, erişim belirtecindeki kullanıcı ve kullanıcı grubu kimliklerini nesnenin ACL öğelerinde depolanan kimliklerle karşılaştıran güvenlik izleyicisine geçer. UNIX'ten farklı olarak, Windows NT'nin ACL öğeleri, kullanıcı için hem izin verilen işlemler hem de yasaklanmış işlemler listelerini içerebilir.

Windows NT, yeni oluşturulan bir nesneye bir ACL atanmasına ilişkin kuralları açıkça tanımlar. Çağıran kod, nesne oluşturma sırasında, yeni oluşturulan nesneye tüm erişim haklarını açıkça ayarlarsa, güvenlik sistemi bu ACL'yi nesneye atar.

Çağıran kod nesneye bir ACL sağlamıyorsa ancak nesnenin bir adı varsa, izin devralma ilkesi geçerlidir. Güvenlik sistemi, yeni nesnenin adının depolandığı nesne dizininin ACL'sine bakar. Nesne dizini ACL girişlerinden bazıları devralınmış olarak işaretlenebilir. Bu, bu dizinde oluşturulan yeni nesnelere atanabilecekleri anlamına gelir.

İşlemin, oluşturulan nesne için açıkça bir ACL ayarlamadığı ve dizin nesnesinin devralınan ACL öğelerine sahip olmadığı durumda, işlemin erişim belirtecinden gelen varsayılan ACL kullanılır.


29. Java programlama dili. Java sanal makinesi. Java teknolojisi.

Java Sun Microsystems tarafından geliştirilen nesne yönelimli bir programlama dilidir. Java uygulamaları genellikle özel bayt kodunda derlenir, böylece bilgisayar mimarisinden bağımsız olarak herhangi bir Java sanal makinesinde (JVM) çalışabilirler. Java programları, Java sanal makinesi tarafından yürütülen bayt koduna çevrilir ( JVM) - bayt kodunu işleyen ve talimatları bir yorumlayıcı olarak ekipmana ileten bir program, ancak metinden farklı olarak bayt kodunun çok daha hızlı işlenmesi farkıyla.

Programları bu şekilde yürütmenin avantajı, bayt kodunun işletim sisteminden ve donanımdan tamamen bağımsız olmasıdır; bu, Java uygulamalarını karşılık gelen bir sanal makinenin bulunduğu herhangi bir cihazda çalıştırmanıza izin verir. Java teknolojisinin bir diğer önemli özelliği de esnek güvenliktir. program yürütme tamamen sanal makine tarafından kontrol edilir. Programın belirlenen izinlerini aşan herhangi bir işlem (verilere yetkisiz erişime teşebbüs etmek veya başka bir bilgisayara bağlanmak gibi) anında iptale neden olur.

Çoğu zaman, sanal makine kavramının dezavantajları, bir sanal makine tarafından bayt kodunun yürütülmesinin Java dilinde uygulanan programların ve algoritmaların performansını azaltabileceği gerçeğini içerir.

Java Sanal Makinesi(kısaltılmış Java VM, JVM) - Java sanal makinesi - Java Runtime Environment (JRE) olarak adlandırılan Java runtime sisteminin ana kısmı. Java Sanal Makinesi, Java derleyicisi (javac) tarafından önceden Java programı kaynak kodundan oluşturulan Java bayt kodunu yorumlar ve yürütür. JVM, diğer programlama dillerinde yazılmış programları yürütmek için de kullanılabilir. Örneğin, Ada kaynak kodu, daha sonra JVM tarafından çalıştırılabilen Java bayt koduna derlenebilir.

JVM, Java platformunun önemli bir bileşenidir. Java sanal makineleri birçok donanım ve yazılım platformu için mevcut olduğundan, Java hem bir ara katman yazılımı hem de bağımsız bir platform olarak görülebilir, dolayısıyla "bir kez yaz, her yerde çalıştır" ilkesi. Birçok platform için tek bir bayt kodunun kullanılması, Java'nın "bir kez derleyin, herhangi bir yerde çalıştırın" (bir kez derleyin, herhangi bir yerde çalıştırın) olarak tanımlanmasına izin verir.

Çalışma süresi

JVM üzerinde çalıştırılması amaçlanan programlar, genellikle .class dosyaları olarak temsil edilen standartlaştırılmış bir taşınabilir ikili biçimde derlenmelidir. Bir program, farklı dosyalara yerleştirilmiş birçok sınıftan oluşabilir. Büyük programları barındırmayı kolaylaştırmak için, .class dosyalarının bazıları birlikte .jar dosyası adı verilen bir dosyada (Java Arşivi'nin kısaltması) paketlenebilir.

JVM sanal makinesi, Sun mikrosistemlerinden HotSpot gibi bir tam zamanında (JIT) derleyiciyi yorumlayarak veya kullanarak JVM için yazılmış talimatları öykünerek .class veya .jar dosyalarını yürütür. Bu günlerde, daha yüksek hız elde etmek için çoğu JVM'de JIT derlemesi kullanılmaktadır.

Çoğu sanal makine gibi, Java Sanal Makinesi de mikrodenetleyiciler ve mikroişlemciler için ortak olan yığın yönelimli bir mimariye sahiptir.

JRE'nin (Java Runtime Environment) bir örneği olan JVM, Java programları yürütülürken devreye girer. Yürütme tamamlandıktan sonra bu örnek çöp toplayıcı tarafından kaldırılır. JIT, uygulamaların yürütme süresini hızlandırmak için kullanılan Java Sanal Makinesi'nin bir parçasıdır. JIT, bayt kodunun benzer işlevselliğe sahip kısımlarını eşzamanlı olarak derler ve bu nedenle derleme için gereken süreyi azaltır.

j2se (java 2 standart sürümü) - Standart kitaplık şunları içerir:

GUI, NET, Veritabanı…


30. .NET platformu. Temel fikirler ve hükümler. .NET programlama dilleri.

.NET Çerçevesi- Microsoft'tan geleneksel programlar ve web uygulamaları oluşturmak için tasarlanmış yazılım teknolojisi.

Microsoft .NET'in ana fikirlerinden biri, farklı dillerde yazılmış farklı hizmetlerin uyumluluğudur. Örneğin, Microsoft .NET için C++ ile yazılmış bir hizmet, Delphi'de yazılmış bir kitaplıktan bir sınıf yöntemine erişebilir; C#'ta, Visual Basic .NET'te yazılmış bir sınıftan miras alan bir sınıf yazabilirsiniz ve C# ile yazılmış bir yöntemle atılan bir istisna, Delphi'de yakalanıp işlenebilir. .NET'teki her kitaplık (derleme), sürümü hakkında, derlemelerin farklı sürümleri arasındaki olası çakışmaları ortadan kaldırmanıza olanak tanıyan bilgilere sahiptir.

Uygulamalar ayrıca bir metin düzenleyicide geliştirilebilir ve konsol derleyicisini kullanabilir.

Java teknolojisi gibi, .NET geliştirme ortamı da sanal bir makine tarafından yürütülecek bayt kodu oluşturur. Bu makinenin .NET'teki giriş diline MSIL (Microsoft Intermediate Language) veya CIL (Common Intermediate Language, daha sonra) veya basitçe IL denir.

Bayt kodunun kullanımı, derlenmiş bir proje düzeyinde çapraz platform elde etmenize olanak tanır (.NET terimleriyle: toplantı) ve yalnızca kaynak düzeyinde değil, örneğin C'de olduğu gibi. CLR çalışma zamanında derlemeye başlamadan önce, bayt kodu ortama yerleşik JIT derleyicisi tarafından (tam zamanında, anında derleme) dönüştürülür. hedef işlemcinin makine kodları. .NET Framework ile sağlanan NGen.exe yardımcı programını kullanarak bir derlemeyi seçilen platform için yerel kodda derlemek de mümkündür.

Çeviri işlemi sırasında, programın kaynak kodu (SML, C#, Visual Basic, C ++ veya .NET tarafından desteklenen diğer herhangi bir programlama dilinde yazılmış) derleyici tarafından sözde bir derlemeye dönüştürülür ( derleme) ve dinamik olarak bağlantılı bir kitaplık dosyası (Dinamik Bağlantılı Kitaplık, DLL) veya yürütülebilir dosya (Yürütülebilir, EXE) olarak kaydedilir.

Doğal olarak, her derleyici için (ister bir C# dili derleyicisi, csc.exe veya Visual Basic, vbc.exe olsun), çalışma zamanı ortamı, kullanılan türlerin CTS türlerine ve program kodunun da kodun koduna gerekli eşleştirmesini gerçekleştirir. "soyut makine" .NET - MSIL (Microsoft Orta Düzey Dili).

Sonuç olarak, yazılım projesi bir montaj olarak oluşturulur - dağıtım, çoğaltma ve yeniden kullanım için kendi kendine yeterli bir bileşen. Derleme, yazarın dijital imzası ve benzersiz bir sürüm numarası ile tanımlanır.

Yerleşik programlama dilleri (.NET Framework ile birlikte gönderilir):

C#; J#; VB.NET JScript.NET C++/CLI - C++'ın yeni sürümü (Yönetilen).


31. İşletim sisteminin işlevsel bileşenleri. Dosya yönetimi

İşlevsel işletim sistemi bileşenleri:

Bağımsız bir bilgisayarın işletim sisteminin işlevleri genellikle ya işletim sisteminin yönettiği yerel kaynak türlerine göre ya da tüm kaynaklara uygulanan belirli görevlere göre gruplandırılır. Bazen bu tür işlev gruplarına alt sistemler denir. En önemli kaynak yönetimi alt sistemleri süreç, bellek, dosya ve harici cihaz yönetimi alt sistemleridir; tüm kaynaklar için ortak olan alt sistemler ise kullanıcı arabirimi, veri koruma ve yönetim alt sistemleridir.

Dosya yönetimi:

İşletim sisteminin gerçek donanımın karmaşıklıklarını "koruma" yeteneği, işletim sisteminin ana alt sistemlerinden biri olan dosya sisteminde çok açık bir şekilde kendini gösterir.

Dosya sistemi, bir yanda bir depolama ortamını ve diğer yanda dosyalara erişmek için bir API'yi (Uygulama Programlama Arayüzü) birbirine bağlar. Bir uygulama programı bir dosyaya eriştiğinde, bilgilerin belirli bir dosyada nasıl bulunduğu ve ayrıca hangi fiziksel ortam türüne (CD, sabit disk, manyetik bant veya flash bellek birimi) kaydedildiği hakkında hiçbir fikri yoktur. Programın tek bildiği dosyanın adı, boyutu ve nitelikleridir. Bu verileri dosya sistemi sürücüsünden alır. Dosyanın fiziksel ortamda (örneğin bir sabit disk) nereye ve nasıl yazılacağını belirleyen dosya sistemidir.

İşletim sistemi açısından, tüm disk 512 bayt ve üzeri bir küme kümesidir. Dosya sistemi sürücüleri, kümeleri dosyalar ve dizinler (aslında o dizindeki dosyaların listesini içeren dosyalardır) halinde düzenler. Aynı sürücüler, şu anda hangi kümelerin kullanımda olduğunu, hangilerinin ücretsiz olduğunu ve hangilerinin başarısız olarak işaretlendiğini takip eder.

Ancak, dosya sisteminin fiziksel depolama ortamına doğrudan bağlı olması gerekmez. Yalnızca uzak bir bilgisayardaki dosyalara erişmenin bir yolu olan sanal dosya sistemleri ve ağ dosya sistemleri vardır.

En basit durumda, belirli bir diskteki tüm dosyalar tek bir dizinde saklanır. Bu tek düzeyli şema, CP/M'de ve MS-DOS 1.0'ın ilk sürümünde kullanıldı. Yuvalanmış dizinlere sahip hiyerarşik dosya sistemi önce Multics'te, ardından UNIX'te ortaya çıktı.

Farklı disklerdeki dizinler, DOS/Windows'ta olduğu gibi birkaç ayrı ağaç oluşturabilir veya UNIX benzeri sistemlerde olduğu gibi tüm disklerde ortak olan tek bir ağaçta birleştirilebilir.

Aslında DOS/Windows sistemlerinde olduğu gibi UNIX benzeri sistemlerde de iç içe geçmiş dizinlere sahip “c:”, “d:” vb. adlarda bir kök dizin vardır. Sabit disk bölümleri bu dizinlere takılır. Yani, c:\ sadece file:///c:/ bağlantısıdır. Ancak, UNIX benzeri dosya sistemlerinden farklı olarak Windows, kök dizine yazmayı ve içeriğini görüntülemeyi yasaklar.

UNIX'te yalnızca bir kök dizin vardır ve diğer tüm dosyalar ve dizinler bunun içinde yuvalanmıştır. Bir sürücüdeki dosya ve dizinlere erişmek için, o sürücüyü mount komutuyla bağlamanız gerekir. Örneğin, bir CD'deki dosyaları açmak için, basit bir ifadeyle, işletim sistemine şunu söylemeniz gerekir: "Bu CD'deki dosya sistemini alın ve /mnt/cdrom dizininde gösterin." CD'deki tüm dosyalar ve dizinler, bağlama noktası olarak adlandırılan bu /mnt/cdrom dizininde görünecektir. Çoğu UNIX benzeri sistemde, çıkarılabilir diskler (disketler ve CD'ler), flash sürücüler ve diğer harici depolama aygıtları /mnt, /mount veya /media dizinine takılır. Unix ve UNIX benzeri işletim sistemleri, işletim sistemi önyüklendiğinde diskleri otomatik olarak bağlamanıza da olanak tanır.

Windows, UNIX ve UNIX benzeri işletim sistemlerinde eğik çizgi kullanımına dikkat edin (Windows ters eğik çizgi "\" kullanır, UNIX ve UNIX benzeri işletim sistemleri ise basit bir eğik çizgi "/" kullanır)

Ek olarak, yukarıdaki sistemin yalnızca fiziksel aygıtların dosya sistemlerini değil, aynı zamanda bireysel dizinleri (--bind parametresi) veya örneğin bir ISO görüntüsünü (döngü seçeneği) bağlamanıza izin verdiği belirtilmelidir. FUSE gibi eklentiler, örneğin FTP'deki tüm dizini ve çok sayıda farklı kaynağı bağlamanıza da olanak tanır.

NTFS ve HFS'de daha da karmaşık bir yapı kullanılır. Bu dosya sistemlerinde, her dosya bir dizi niteliktir. Nitelikler yalnızca geleneksel salt okunur sistem olarak değil, aynı zamanda dosya adı, boyutu ve hatta içeriği olarak kabul edilir. Bu nedenle, NTFS ve HFS için bir dosyada depolanan şey, onun niteliklerinden sadece biridir.

Bu mantığı izleyerek, tek bir dosya birden fazla içerik varyasyonu içerebilir. Böylece, aynı belgenin birden fazla sürümü ve ek veriler (dosya simgesi, dosyayla ilişkili program) bir dosyada saklanabilir. Bu organizasyon, Macintosh'taki HFS'nin tipik bir örneğidir.


32. İşletim sisteminin işlevsel bileşenleri. Süreç yönetimi.

Süreç yönetimi:

İşletim sisteminin bilgisayarın işleyişini doğrudan etkileyen en önemli parçası süreç kontrol alt sistemidir. Bir süreç (veya başka bir deyişle, bir görev), çalışan bir programı tanımlayan bir soyutlamadır. Bir işletim sistemi için süreç, bir iş birimidir, sistem kaynaklarının tüketimi için bir taleptir.

Çok görevli (çok işlemli) bir sistemde, bir işlem üç temel durumdan birinde olabilir:

ÇALIŞIYOR - sürecin gerekli tüm kaynaklara sahip olduğu ve doğrudan işlemci tarafından yürütüldüğü sürecin aktif durumu;

BEKLEME - işlemin pasif bir durumu, işlem engellendi, kendi iç sebeplerinden dolayı yürütülemez, örneğin bir G / Ç işleminin tamamlanması, başka birinden mesaj alınması gibi bazı olayların gerçekleşmesini bekliyor süreç, ihtiyaç duyduğu bazı kaynakları serbest bırakır;

HAZIR - ayrıca işlemin pasif bir durumudur, ancak bu durumda işlem, harici koşullar nedeniyle bloke edilir: işlem, bunun için gerekli tüm kaynaklara sahiptir, çalışmaya hazırdır, ancak işlemci başka bir işlemi yürütmekle meşguldür.

Yaşam döngüsü boyunca her süreç, bu işletim sisteminde uygulanan süreç çizelgeleme algoritmasına göre bir durumdan diğerine geçer.

CP/M standardı

Mikrobilgisayarlar için işletim sistemlerinin oluşturulmasının başlangıcı OS SR / M tarafından atıldı. 1974'te geliştirildi ve ardından birçok 8 bit makineye kuruldu. Bu işletim sistemi çerçevesinde, BASIC, Pascal, C, Fortran, Cobol, Lisp, Ada ve diğer birçok metinden çevirmenler dahil olmak üzere önemli miktarda yazılım oluşturuldu. Belgeleri bir daktilodan çok daha hızlı ve daha rahat hazırlamanıza olanak tanır.

MSX standardı

Bu standart sadece işletim sistemini değil, aynı zamanda okul bilgisayarları için donanımın özelliklerini de belirledi. MSX standardına göre, makinenin en az 16 K RAM, yerleşik BASIC dil yorumlayıcılı 32 K kalıcı belleğe, 256x192 piksel çözünürlüğe ve 16 renge sahip renkli bir grafik ekrana, üç kanallı bir renkli grafik ekrana sahip olması gerekiyordu. 8 oktav için ses üreteci, bir yazıcıyı bağlamak için bir paralel bağlantı noktası ve harici olarak bağlı bir harici sürücüyü kontrol etmek için bir kontrolör.

Böyle bir makinenin işletim sistemi aşağıdaki özelliklere sahip olmalıdır: gerekli bellek - 16 K'dan fazla değil, sistem çağrıları düzeyinde CP / M ile uyumluluk, disketlere dayalı harici sürücülerdeki dosya biçimleri açısından DOS ile uyumluluk, BASIC, C, Fortran ve Lisp çevirmenleri için destek.

Pi - sistem

Kişisel bilgisayarların geliştirilmesinin ilk döneminde, USCD p-sistem işletim sistemi oluşturuldu. Bu sistemin temeli, varsayımsal bir evrensel bilgisayarı taklit eden bir program olan P-makinesi idi. P-makinesi, P-kodu adı verilen özel talimatları yürüterek işlemcinin, belleğin ve harici aygıtların çalışmasını simüle eder. Pi sisteminin yazılım bileşenleri (derleyiciler dahil) P kodunda derlenir, uygulama programları da P kodunda derlenir. Böylece, sistemin ana ayırt edici özelliği, PC donanımının özelliklerine minimum bağımlılıktı. Pi sisteminin çeşitli makine türlerine taşınabilirliğini sağlayan şey budur. P kodunun kompaktlığı ve uygun şekilde uygulanan sayfalama mekanizması, küçük bir RAM'e sahip bir PC'de nispeten büyük programları çalıştırmayı mümkün kıldı.

G/Ç yönetimi.

G/Ç cihazları iki türe ayrılır: blok odaklı cihazlar ve bayt yönelimli cihazlar. Blok yönelimli cihazlar, bilgileri her biri kendi adresine sahip sabit boyutlu bloklarda depolar. En yaygın blok yönelimli aygıt disktir. Bayt yönelimli cihazlar adreslenebilir değildir ve bir arama işlemine izin vermezler, bir dizi bayt üretir veya tüketirler. Örnekler terminaller, satır yazıcıları, ağ bağdaştırıcılarıdır. Elektronik bileşene aygıt denetleyicisi veya bağdaştırıcı adı verilir. İşletim sistemi denetleyiciyle ilgilenir. Kontrolör basit işlevleri yerine getirir, hataları izler ve düzeltir. Her denetleyicinin, merkezi işlemciyle etkileşimde bulunmak için kullanılan birkaç kaydı vardır. İşletim sistemi, denetleyici kayıtlarına komutlar yazarak G/Ç gerçekleştirir. IBM PC disket denetleyicisi, READ, WRITE, SEEK, FORMAT, vb. gibi 15 komutu kabul eder. Komut alındığında, işlemci denetleyiciden ayrılır ve diğer işleri yapar. Komut tamamlandığında, denetleyici, işlemcinin kontrolünü, işlemin sonuçlarını kontrol etmesi gereken işletim sistemine aktarmak için bir kesme düzenler. İşlemci, denetleyicinin kayıtlarından bilgileri okuyarak cihazın sonuçlarını ve durumunu elde eder.

Ana fikir I/O yazılım organizasyonu alt düzeyler, donanım özelliklerinin üst düzeylerden korunmasını sağlayan ve kullanıcılar için uygun bir arayüz sağlayanlar ile birkaç düzeye bölünmesinden oluşur.

anahtar ilke cihaz bağımsızlığı. Programın biçimi, verileri disketten mi yoksa sabit diskten mi okuduğuna bağlı olmamalıdır. G/Ç yazılımı için bir diğer önemli konu da hata işlemedir. Genel olarak konuşursak, hatalar mümkün olduğunca donanıma yakın olarak ele alınmalıdır. Denetleyici bir okuma hatası algılarsa, düzeltmeye çalışmalıdır. Başarısız olursa, aygıt sürücüsü hataları düzeltmelidir. Ve ancak alt seviye hata ile baş edemezse, hatayı üst seviyeye bildirir.

Diğer bir önemli konu, bloke edici (senkron) ve bloke edici olmayan (asenkron) transferlerin kullanılmasıdır. Çoğu fiziksel G/Ç işlemi eşzamansızdır - işlemci bir aktarım başlatır ve bir kesinti gerçekleşene kadar başka bir işe geçer. G/Ç işlemleri engelleniyor olmalıdır - READ komutundan sonra, veriler program arabelleğine girene kadar program otomatik olarak askıya alınır.

Son sorun, bazı aygıtların paylaşılmasıdır (diskler: diske birkaç kullanıcının aynı anda erişimi sorun değildir), diğerleri ise atanmıştır (yazıcılar: farklı kullanıcılar tarafından yazdırılan satırları karıştıramazsınız).

Ortaya çıkan sorunları çözmek için G/Ç yazılımını dört katmana ayırmanız önerilir (Şekil 2.30):

Kesinti işleme,

aygıt sürücüleri,

İşletim sisteminin cihazdan bağımsız katmanı,

· Özel yazılım katmanı.

Donanım kesintisi kavramı ve işlenmesi.

Asenkron veya harici (donanım) kesintiler - harici kaynaklardan (örneğin, çevresel aygıtlardan) gelen ve herhangi bir zamanda meydana gelebilecek olaylar: bir zamanlayıcıdan, bir ağ kartından veya bir disk sürücüsünden gelen bir sinyal, klavye tuşlarına basmak, fare hareketi; Anında yanıt (işleme) gerektirirler.

Bir bilgisayardaki hemen hemen tüm G/Ç sistemleri kesintiler kullanarak çalışır. Özellikle, tuşlara bastığınızda veya fareyi tıklattığınızda, donanım kesintiler oluşturur. Onlara yanıt olarak, sistem sırasıyla basılan tuşun kodunu okur veya fare imlecinin koordinatlarını hatırlar. Kesintiler, disk denetleyicisi, LAN bağdaştırıcısı, seri bağlantı noktaları, ses bağdaştırıcısı ve diğer aygıtlar tarafından oluşturulur.