C# asenkron giriş çıkışı ikili akışı. Senkron ve asenkron G/Ç. Tamamlama prosedürünü yürütün ve bekleme işlevinden geri dönün

  • 07.03.2020

Çok uzun zamandır bekliyorduk

Beklemekten daha aptalca ne olabilir?

B. Grebenshchikov

Bu ders sırasında öğreneceksiniz

    Select sistem çağrısını kullanma

    Anket sistemi çağrısını kullanma

    Çok iş parçacıklı programlarda seçme/anket kullanmanın bazı yönleri

    Standart Asenkron G/Ç

sistem çağrısını seç

Programınız öncelikle G/Ç ise, select(3C) sistem çağrısını kullanarak tek iş parçacıklı bir programda çoklu iş parçacığı oluşturmanın en önemli avantajlarını elde edebilirsiniz. Çoğu Unix sisteminde, seçim bir sistem çağrısıdır veya en azından sistem kılavuzunun 2. bölümünde (sistem çağrıları) açıklanmıştır, yani. buna select(2) olarak atıfta bulunulmalıdır, ancak Solaris 10'da ilgili sistem kılavuzu sayfası bölüm 3C'dedir (C standart kitaplığı).

G/Ç aygıtları genellikle CPU'dan çok daha yavaştır, bu nedenle CPU'nun genellikle bunlar üzerinde işlem gerçekleştirmesini beklemesi gerekir. Bu nedenle, tüm işletim sistemlerinde, senkronize I/O sistem çağrıları işlemleri engelliyor.

Bu aynı zamanda ağ iletişimi için de geçerlidir - İnternet üzerinden etkileşim yüksek gecikmelerle ilişkilidir ve kural olarak çok geniş olmayan ve / veya aşırı yüklenmiş bir iletişim kanalı aracılığıyla gerçekleşir.

Programınız birden fazla G/Ç cihazı ve/veya ağ bağlantısı ile çalışıyorsa, bu cihazlardan biriyle ilişkili bir işlemi engellemesi kârsızdır, çünkü bu durumda başka bir cihazdan G/Ç yapma fırsatını kaçırabilir. engellemeden. Bu sorun, çeşitli cihazlarla çalışan iş parçacıkları oluşturularak çözülebilir. Önceki derslerde, bu tür programları geliştirmek için ihtiyacınız olan her şeyi öğrendik. Ancak, bu sorunu çözmenin başka yolları da var.

Select(3C) sistem çağrısı, birden fazla aygıtın veya ağ bağlantısının hazır olmasını beklemenize olanak tanır (aslında, bir dosya tanımlayıcı tarafından tanımlanabilen çoğu türden nesneler). Bir veya daha fazla tanımlayıcı veri göndermeye hazır olduğunda, select(3C) kontrolü programa geri verir ve çıktı parametrelerinde hazır tanımlayıcıların listesini iletir.

Select(3C), parametre olarak tanımlayıcı kümelerini (kümelerini) kullanır. Eski Unix sistemlerinde, setler 1024 bit bit maskeleri olarak uygulanıyordu. Modern Unix sistemlerinde ve seçim uygulayan diğer işletim sistemlerinde, kümeler, üzerinde bazı küme teorik işlemlerin tanımlandığı, yani bir kümedeki tanımlayıcı dahil olmak üzere bir kümeyi temizleme, bir kümedeki tanımlayıcıyı hariç tutan opak bir fd_set türü olarak uygulanır. küme ve bir kümede bir tanımlayıcının varlığının kontrol edilmesi. Bu işlemleri gerçekleştirmek için önişlemci yönergeleri, select(3C) kılavuz sayfasında açıklanmıştır.

Solaris de dahil olmak üzere UnixSVR4'ün 32 bit sürümlerinde fd_set hala 1024 bitlik bir maskedir; SVR4'ün 64 bit sürümlerinde bu, 65536 bitlik bir maskedir. Maskenin boyutu, yalnızca kümedeki maksimum dosya tanımlayıcı sayısını değil, aynı zamanda kümedeki maksimum dosya tanımlayıcı sayısını da belirler. Sistem sürümünüzdeki maskenin boyutu, FD_SETSIZE önişlemci sembolünün değeri ile derleme zamanında belirlenebilir. Unix dosya tanımlayıcı numaralandırması 0'dan başlar, bu nedenle maksimum tanımlayıcı numarası FD_SETSIZE-1'dir.

Bu nedenle, eğer select(3C) kullanırsanız, prosesiniz için tutamaçların sayısı konusunda limitler belirlemeniz gerekir. Bu, işlem başlamadan önce ulimit(1) kabuk komutuyla veya işleminiz zaten çalışırken setrlimit(2) sistem çağrısıyla yapılabilir. Elbette, dosya tanımlayıcıları oluşturmaya başlamadan önce setrlimit(2) çağrılmalıdır.

32 bitlik bir programda 1024'ten fazla tanıtıcı kullanmanız gerekiyorsa, Solaris10 bir geçiş API'si sağlar. Kullanmak için tanımlamanız gerekir

dosya dahil edilmeden önce sayısal değeri 1024'ten büyük olan önişlemci sembolü FD_SETSIZE . Ancak dosyada gerekli önişlemci yönergeleri çalışacak ve fd_set tipi büyük bir bit maskesi olarak tanımlanacak ve bu ailenin select ve diğer sistem çağrıları bu boyuttaki maskeleri kullanmak için yeniden tanımlanacak.

Bazı uygulamalarda fd_set, bit maskeleri kullanılmadan başka şekillerde uygulanır. Örneğin, Win32, sözde WinsockAPI'nin bir parçası olarak seçim sağlar. Win32'de fd_set, dosya tanımlayıcı değerlerini içeren dinamik bir dizi olarak uygulanır. Bu nedenle, fd_set türünün iç yapısını bilmeye güvenmemelisiniz.

Her iki durumda da, fd_set bit maskesinin boyutunu veya bu türün dahili temsilini değiştirmek, tüm programların select(3C) kullanılarak yeniden derlenmesini gerektirir. Gelecekte, süreç başına 65536 tanımlayıcının mimari sınırı artırıldığında, fd_set ve select uygulamasının yeni bir sürümü ve programların yeni bir yeniden derlenmesi gerekebilir. Bunu önlemek ve ABI'nin yeni sürümüne geçişi kolaylaştırmak için SunMicrosystems, select(3C)'yi kullanımdan kaldırmanızı ve bunun yerine poll(2) sistem çağrısını kullanmanızı önerir. poll(2) sistem çağrısı bu bölümün ilerleyen kısımlarında ele alınacaktır.

Select(3C) sistem çağrısının beş parametresi vardır.

intnfds, parametre olarak geçirilen tüm kümelerdeki maksimum dosya tanımlayıcı sayısından bir büyük sayıdır.

fd_set*readfds - Bir girdi parametresi, okunabilirlik açısından kontrol edilmesi gereken bir dizi tanımlayıcı. Dosya sonu veya soket kapatma, okumaya hazır olmanın özel bir durumu olarak kabul edilir. Normal dosyalar her zaman okunmaya hazır olarak kabul edilir. Ayrıca, dinleyen bir TCP soketinin kabul etmeye hazır olup olmadığını kontrol etmek istiyorsanız(3SOCKET), bu sete dahil edilmelidir. Ayrıca, çıktı parametresi okunmaya hazır bir dizi tanımlayıcıdır.

fd_set*writefds - Bir giriş parametresi, yazmaya hazır olup olmadığının kontrol edilmesi gereken bir dizi tanımlayıcı. Gecikmeli bir yazma hatası, özel bir yazmaya hazır olma durumu olarak kabul edilir. Normal dosyalar her zaman yazılmaya hazırdır. Ayrıca asenkron bir bağlantı(3SOCKET) işleminin tamamlanıp tamamlanmadığını test etmek isterseniz soket bu sete dahil edilmelidir. Ayrıca çıktı parametresi, yazılmaya hazır bir dizi tanımlayıcıdır.

fd_set*errorfds – Bir giriş parametresi, istisna koşullarını kontrol etmek için bir dizi tanımlayıcı. Bir istisnanın tanımı, dosya tanımlayıcısının türüne bağlıdır. TCP soketleri için, bant dışı veri geldiğinde bir istisna oluşur. Normal dosyalar her zaman istisnai bir durumda kabul edilir. Ayrıca, çıktı parametresi, üzerinde istisnai koşulların meydana geldiği tanımlayıcılar kümesidir.

structtimeval*timeout – zaman aşımı, mikrosaniye hassasiyetle belirtilen zaman aralığı. Bu parametre NULL ise, select(3C) süresiz olarak bekleyecektir; yapının zaman aralığı sıfır ise, select(3C) yoklama modunda çalışır, yani hemen, muhtemelen boş tanımlayıcı kümeleriyle denetimi döndürür.

Tüm fd_set* tipi parametreler yerine bir boş gösterici iletebilirsiniz. Bu, ilgili olay sınıfıyla ilgilenmediğimiz anlamına gelir.select(3C), normal tamamlamada (zaman aşımı tamamlama dahil) tüm kümelerdeki hazır tanımlayıcıların toplam sayısını ve hata durumunda -1'i döndürür.

Örnek 1, verileri bir ağ bağlantısından bir terminale ve bir terminalden bir ağ bağlantısına kopyalamak için select(3C) kullanır. Bu program basitleştirilmiştir, terminale yazmanın ve ağ bağlantısının hiçbir zaman engellenmeyeceğini varsayar. Hem terminal hem de ağ bağlantısı dahili arabelleklere sahip olduğundan, bu genellikle küçük veri akışları için geçerlidir.

Örnek 1: Bir terminal ve bir ağ bağlantısı arasında verilerin iki taraflı kopyalanması. Örnek W.R.'den alınmıştır. Stevens, Unix: Ağ Uygulaması Geliştirme. Standart sistem çağrıları yerine, "unp.h" dosyasında açıklanan "sarmalayıcılar" kullanılır.

#include "unp.h"

void str_cli(DOSYA *fp, int sockfd) (

int maxfdp1, stdineof;

karakter gönderme hattı, recvline;

if (stdineof == 0) FD_SET(fileno(fp), &rset);

FD_SET(sockfd, &rset);

maxfdp1 = max(fileno(fp), sockfd) + 1;

Select(maxfdp1, &rset, NULL, NULL, NULL);

if (FD_ISSET(sockfd, &rset)) ( /* soketi okunabilir */

if (Readline(sockfd, recvline, MAXLINE) == 0) (

if (stdineof == 1) dönüş; /* normal sonlandırma */

else err_quit("str_cli: sunucu zamanından önce sonlandırıldı");

Fputs(geriye doğru, stdout);

if (FD_ISSET(fileno(fp), &rset)) ( /* girişi okunabilir */

if (Fgets(sendline, MAXLINE, fp) == NULL) (

Kapatma(sockfd, SHUT_WR); /* FIN gönder */

FD_CLR(dosya(fp), &rset);

Writen(sockfd, sendline, strlen(sendline));

Örnek 1 programının, select(3C) için her çağrıdan önce tanımlayıcı kümelerini yeniden oluşturduğuna dikkat edin. Bu gereklidir çünkü select(3C) normal olarak çıktığında seçeneklerini değiştirir.

select(3C) MT-Safe olarak kabul edilir, ancak bunu çok iş parçacıklı bir programda kullanırken aşağıdaki nokta akılda tutulmalıdır. Aslında, select(3C) tek başına yerel verileri kullanmaz ve bu nedenle onu birden çok iş parçacığından çağırmak sorunlara yol açmamalıdır. Ancak, çakışan dosya tanımlayıcı kümelerinde birden çok iş parçacığı çalışıyorsa, aşağıdaki senaryo mümkündür:

    İş parçacığı 1 çağrıları, tanıtıcı s'den okunur ve tüm verileri arabelleğinden alır

    İş parçacığı 2 çağrıları tanıtıcı s ve bloklardan okunur.

Bu senaryodan kaçınmak için, bu koşullar altında dosya tanımlayıcılarının işlenmesi, muteksler veya diğer bazı muteks ilkelleri tarafından korunmalıdır. Korunması gerekenin seçim değil, belirli bir dosya tanıtıcısı üzerindeki, seçim için tanımlayıcıyı dahil etmekle başlayan ve bu tanımlayıcıdan veri almakla biten işlem dizisinin, daha doğrusu, vurgulanması önemlidir. bu verileri okuduğunuz arabellekteki işaretçileri güncelleme. Bu yapılmazsa, daha da heyecan verici senaryolar mümkündür, örneğin:

    İş parçacığı 1, set readfds'deki tutamaçları ve seçim çağrılarını içerir.

    iş parçacığı 1'de seç, s'yi okunmaya hazır olarak döndürür

    İş parçacığı 2, set readfds'deki tutamacı içerir ve seçim çağrıları

    iş parçacığı 2'de seç, s'yi okunmaya hazır olarak döndürür

    İş parçacığı 1, tanımlayıcı s'den okunur ve arabelleğinden verilerin yalnızca bir kısmını alır

    İş parçacığı 2 çağrıları s tanımlayıcısından okunur, verileri alır ve iş parçacığı 1 tarafından alınan verilerin üzerine yazar

Ders 10'da, birden çok iş parçacığının ortak bir dosya tanımlayıcı havuzunu paylaştığı bir uygulamanın mimarisine bakacağız - sözde iş parçacığı mimarisi. Bu durumda, iş parçacıkları, elbette, şu anda hangi tanımlayıcılarla çalıştıklarını birbirlerine belirtmelidir.

Çok iş parçacıklı program geliştirme bakış açısından, select(3C)'nin önemli bir dezavantajı - veya belki de POSIXThreadAPI'nin bir dezavantajı - POSIX senkronizasyon ilkellerinin dosya tanımlayıcıları olmaması ve select(3C)'de kullanılamamasıdır. Aynı zamanda, çok iş parçacıklı G/Ç programlarının fiili geliştirilmesinde, dosya tanımlayıcılarının ve kendi işlemin diğer iş parçacıklarının tek bir işlemde hazır olmasını beklemek genellikle yararlı olacaktır.

Bir uygulama programcısı, sistem programlarının cihaz kayıtları ile nasıl çalıştığı gibi şeyler hakkında düşünmek zorunda değildir. Sistem, cihazlarla yapılan düşük seviyeli çalışmaların ayrıntılarını uygulamalardan gizler. Ancak, yoklama ve kesme G/Ç arasındaki fark, belirli bir dereceye kadar sistem işlevleri düzeyinde, senkron ve asenkron G/Ç işlevleri biçiminde yansıtılır.

İşlev yürütme senkron G/Ç bir G/Ç işlemi başlatmayı ve bu işlemin tamamlanmasını beklemeyi içerir. Yalnızca G/Ç tamamlandıktan sonra işlev, kontrolü çağıran programa geri verir.

Senkronize G/Ç, programcıların cihazlarla çalışmasının en tanıdık yoludur. Programlama dillerinin standart giriş/çıkış rutinleri bu şekilde çalışır.

işlev çağrısı asenkron G/Ç yalnızca ilgili işlemin başlangıcı anlamına gelir. Bundan sonra, işlev, işlemin tamamlanmasını beklemeden kontrolü çağıran programa hemen geri verir.

Örneğin, eşzamansız veri girişini düşünün. Programın, girdisinin tamamlandığından emin olana kadar verilere erişemeyeceği açıktır. Ancak programın şimdilik başka işler yapması ve beklenti içinde boş durmaması oldukça olasıdır.

Er ya da geç, program yine de girilen verilerle çalışmaya başlamalıdır, ancak önce eşzamansız işlemin zaten tamamlandığından emin olun. Bunu yapmak için çeşitli işletim sistemleri, üç gruba ayrılabilecek araçlar sağlar.

· Operasyonun tamamlanmasını beklemek. "Eşzamanlı bir işlemin ikinci yarısı" gibi. Program önce işlemi başlatmış, daha sonra bazı dış işlemleri gerçekleştirmiş ve şimdi senkron giriş/çıkışta olduğu gibi işlemin bitmesini bekliyor.

· İşlemin tamamlanıp tamamlanmadığını kontrol etmek. Bu durumda program beklemez, sadece asenkron işlemin durumunu kontrol eder. Giriş/çıkış henüz tamamlanmadıysa, program bir süre daha yürüyüş yapma imkanına sahip olur.

· Fesih prosedürünün atanması. Bu durumda, asenkron bir işlem başlatılırken, kullanıcı programı, işlem tamamlandıktan sonra sistem tarafından çağrılması gereken kullanıcı tanımlı bir prosedürün veya fonksiyonun adresini sisteme bildirir. Programın kendisi artık I/O ilerlemesiyle ilgilenmeyebilir, sistem belirtilen işlevi çağırarak bunu doğru zamanda ona hatırlatacaktır. Bu yöntem en esnek olanıdır, çünkü kullanıcı tamamlama prosedüründe herhangi bir eylem sağlayabilir.

Bir Windows uygulamasında, zaman uyumsuz işlemleri tamamlamak için üç yöntemin tümü kullanılabilir. UNIX'in eşzamansız G/Ç işlevleri yoktur, ancak aynı eşzamansız etki, ek bir işlem çalıştırılarak başka bir yolla elde edilebilir.

Asenkron G/Ç, bazı durumlarda performansı iyileştirebilir ve ek işlevsellik sağlayabilir. “Beklemeden klavye girişi” gibi basit bir asenkron giriş formu olmadan, çok sayıda bilgisayar oyunu ve simülatörü mümkün olmazdı. Aynı zamanda, asenkron işlemleri kullanan bir programın mantığı, senkronize işlemlerden daha karmaşıktır.

Ve önceki paragrafta tartışılan senkron/asenkron işlemler ile G/Ç yöntemleri arasındaki yukarıdaki ilişki nedir? Bu soruyu kendin cevapla.

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ında (veya benzeri) 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 OS, başlangıcından itibaren ç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 OS'de 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ışılmış olduğu 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 uygunsa erişebilir.

UNIX'te dosyaları yetkisiz erişime karşı korumak, üç olguya dayanır. İlk olarak, bir dosya (veya dizin) oluşturan herhangi bir işlem, sisteme özgü bazı kullanıcı tanımlayıcıları (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-node oldukça çeşitli bilgiler 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ğerlendirmesine izin veren 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ı, 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 başkalarının 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 dosyalara erişimi yönetme. 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 ile 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 nesneler (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, ana-çocuk ilişkilerini yansıttığı süreçler için ve belirli bir cihaz türüne ait olduğunu yansıttığı cihazlar ve cihazın diğer cihazlarla bağlantısı için, örneğin, diskleri olan bir SCSI denetleyicisi.

Her tür nesne 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 Konuk 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, kendi güvenlik politikalarını uygulamak için yerleşik gruplara haklar eklemenin yanı sıra yeni gruplar oluşturabilir, 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ür nesne için tanımlanabilen bir dizi işlemdir. İ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 nesnesini içerir - bir bütün olarak işletim sistemi .

Yerleşik bir kullanıcı grubunu diğerinden ayıran öncelikle izinler değil haklardır. 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 ve 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 ACL'ye dahil edilebilir. Bununla birlikte, yönetici her zaman nesnenin sahibi olabileceğinden ve ardından 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 aktarılır. 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ınan 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ı ekipmana yorumlayıcı olarak ileten bir program, ancak metnin aksine bayt kodunun çok daha hızlı işlenmesi farkıyla.

Programları bu şekilde yürütmenin avantajı, bayt kodunun işletim sistemi 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 belirlenmiş 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 aynı bayt kodunu kullanmak, Java'nın "bir kez derle, her yerde çalıştır" olarak tanımlanmasına izin verir.

Çalışma süresi

JVM üzerinde çalışması amaçlanan programlar, genellikle .class dosyaları olarak temsil edilen standartlaştırılmış 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, Sun mikrosistemlerinden HotSpot gibi bir tam zamanında (JIT) derleyicisini yorumlayarak veya kullanarak JVM için yazılmış talimatları taklit ederek .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 Makinesinin bir parçasıdır. JIT, bayt kodunun benzer işlevselliğe sahip bölümlerini 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#'da, 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 oluşturulan 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ılması, 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 (C# dil derleyicisi, csc.exe veya Visual Basic, vbc.exe olsun), çalışma zamanı ortamı, kullanılan türlerin CTS türlerine ve program kodunun koda gerekli eşlemesini 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 özellikleri 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 yandan bir depolama ortamını ve diğer yandan 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 sürücü) 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. Sadece 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ı sürücülerdeki dizinler, DOS/Windows'ta olduğu gibi birkaç ayrı ağaç oluşturabilir veya UNIX benzeri sistemlerde olduğu gibi tüm sürücülerde 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. adında bir kök dizin vardır. Bu dizinlere sabit disk bölümleri monte edilir. 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ı adı verilen 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ü tek bir dosyada ve ek verilerde (dosya simgesi, dosyayla ilişkili program) 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. İş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 üç ana durumdan birinde olabilir:

YÜRÜTME - 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 durumu, işlem bloke edilir, dahili nedenlerle yürütülemez, örneğin bir G / Ç işleminin tamamlanması, başka bir işlemden mesaj alınması gibi bazı olayların gerçekleşmesini bekliyor , ihtiyaç duyduğu bazı kaynakları serbest bırakarak;

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 de dahil olmak üzere önemli miktarda yazılım oluşturuldu. Belgeleri bir daktilodan çok daha hızlı ve daha rahat hazırlamanıza izin verir.

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, makinede 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, disket manyetik disklere dayalı harici sürücülerdeki dosya formatları 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-makinesiydi. 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 denetleyici ile 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ı tespit ederse, düzeltmeye çalışmalıdır. Başarısız olursa, aygıt sürücüsü hataları düzeltmelidir. Ve sadece alt seviye hatayı çözemezse, 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.

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şlemlerin 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 daha önce çok iş parçacıklı sunucular ve grepMT programı ile 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ığı, kendi arabelleklerini kendi yığınında tutar ve bir dizi eşzamanlı okuma, dönüştürme ve yazma işlemi boyunca döngü yapar. 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 tek tek 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 Victor

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 belirli bir bit sayısı kadar sola ve sağa kaydırın. Bu kitaptaki programlarda bu operatörler ayrıca klavyeden bilgi girmek ve ekrana çıktı almak için de kullanılmaktadır.

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

Giriş ve çıkış KERNEL kitaplığındaki iki sınıf, temel giriş ve çıkış 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'yi 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 inceleme 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 yerleşik bazı 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.

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 yürütmeye hazır duruma getirir ve çalışmasına devam eder. Bu durum, senkron G/Ç'ye karşılık gelir. Senkronize 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. Asenkron veri girişini de düzenleyebilirsiniz. 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 G/Ç işlemi talebini bölümlere ayırmak da gereklidir. iki parça (iki istek). İ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 şartlı 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ı, ç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 senkron 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, açık bir asenkron giriş/çıkış yoksa, 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, birbirine göre paralel olarak çalışabilen ve merkezi işlem birimine (işlemcilere) göre. 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şlemci üzerinde ç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, olağan yürütme hızından önemli ölçüde (bazen bir büyüklük veya daha fazla sırayla) farklı olacağıdır (" yerel”) süreçleri. Normal çalışması için harici ve dahili prosesler 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şimlerinde 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ındaki tamponları tahsis etmek ve serbest bırakmakla değil, aynı zamanda tamponları doldurmak veya serbest bırakmak için işlemlerin durumuna göre senkronize etmek 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, o zaman, kural olarak, eşzamansız G/Ç'yi de uygular.