İşletim Sistemleri: Üç Kolay Parça. Bölüm 1: Giriş (çeviri)

İşletim Sistemlerine Giriş

Merhaba Habr! Bana göre ilginç olan bir literatürün - OSTEP - bir dizi makale-çevirisini dikkatinize sunmak istiyorum. Bu materyal, unix benzeri işletim sistemlerinin çalışmasını, yani modern bir işletim sistemini oluşturan süreçler, çeşitli zamanlayıcılar, bellek ve diğer benzer bileşenlerle çalışmayı oldukça derinlemesine inceliyor. Tüm malzemelerin orjinalini burada görebilirsiniz burada. Lütfen çevirinin profesyonelce yapılmadığını (oldukça özgürce) unutmayın, ancak umarım genel anlamı korumuşumdur.

Bu konudaki laboratuvar çalışmasına buradan ulaşabilirsiniz:
- orijinal: sayfalar.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
- orijinal: github.com/remzi-arpacidusseau/ostep-code
- kişisel uyarlamam: github.com/bykvaadm/OS/tree/master/ostep

kanalıma da bakabilirsin telgraf =)

Programın çalışması

Bir program çalışırken ne olur? Çalışan bir program basit bir şey yapar - talimatları yürütür. İşlemci her saniye milyonlarca ve hatta muhtemelen milyarlarca talimatı RAM'den alır, ardından bunların kodunu çözer (örneğin, bu talimatların hangi tipe ait olduğunu tanır) ve yürütür. Bu, iki sayı toplamak, belleğe erişmek, bir koşulu kontrol etmek, bir işleve atlamak vb. olabilir. Bir talimatın yürütülmesinden sonra, işlemci diğerinin yürütülmesine geçer. Ve böylece talimat üstüne talimat, program bitene kadar yürütülürler.
Bu örnek doğal olarak basitleştirilmiş olarak kabul edilir - aslında, işlemciyi hızlandırmak için modern donanım, talimatları sıra dışı yürütmenize, olası sonuçları hesaplamanıza, talimatları aynı anda yürütmenize ve benzer hilelere izin verir.

Von Neumann hesaplama modeli

Tarafımızdan açıklanan basitleştirilmiş çalışma biçimi, Von Neumann hesaplama modeline benzer. Von Neumann, bilgisayar sistemlerinin öncülerinden biridir, aynı zamanda oyun teorisinin yazarlarından biridir.. Program çalışırken, asıl amacı sistemin başlatılmasını, çalıştırılmasını ve bakımını basitleştirmek olan bir dizi başka olay gerçekleşir, diğer birçok işlem ve üçüncü taraf mantığı çalışır.
Programların çalıştırılmasını kolaylaştırmaktan (hatta birden fazla programın aynı anda çalışmasına izin vermekten), programların aynı belleği paylaşmasına ve farklı cihazlarla iletişim kurmasına izin vermekten sorumlu bir dizi yazılım vardır. Bu tür bir yazılım (yazılım) kümesine esas olarak işletim sistemi denir ve görevleri arasında sistemin doğru ve verimli çalıştığının izlenmesi ve bu sistemin yönetim kolaylığının sağlanması yer alır.

İşletim sistemi

OS olarak kısaltılan bir işletim sistemi, bilgisayar kaynaklarını yönetmek ve bir bilgisayarla kullanıcı etkileşimini düzenlemek için tasarlanmış birbiriyle ilişkili bir dizi programdır..
İşletim sistemi etkinliğini ilk etapta en önemli teknik olan teknik aracılığıyla elde eder. sanallaştırma. İşletim sistemi fiziksel bir kaynakla (işlemci, bellek, disk vb.) etkileşime girer ve onu kendisinin daha genel, daha güçlü ve kullanımı daha kolay bir biçimine dönüştürür. Bu nedenle, genel bir anlayış için, işletim sistemini bir sanal makine ile çok kabaca karşılaştırabilirsiniz.
Kullanıcıların işletim sistemine komutlar vermesine ve böylece sanal makinenin yeteneklerini (program çalıştırma, bellek ayırma, dosyaya erişim vb.) API (uygulama programlama arayüzü) ve çağrı yapabileceğiniz (arama). Tipik bir işletim sistemi, yüzlerce sistem çağrısının yapılmasına izin verir.
Son olarak, sanallaştırma, birden çok programın çalışmasına (böylece CPU'yu paylaşmasına) ve aynı anda bunların yönergelerine ve verilerine erişmesine (böylece belleği paylaşmasına) ve disklere erişmesine (böylece G/Ç aygıtlarını paylaşmasına) izin verdiği için, işletim sistemine aynı zamanda bir işletim sistemi de denir. kaynak Yöneticisi. Her işlemci, disk ve bellek sistemin bir kaynağıdır ve bu nedenle işletim sisteminin rollerinden biri, bu işletim sisteminin hangi göreve bağlı olarak verimli, dürüst veya tam tersi şekilde bu kaynakları yönetme görevi haline gelir. tasarlanmıştır.

CPU sanallaştırma

Aşağıdaki programı göz önünde bulundurun:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

İşletim Sistemleri: Üç Kolay Parça. Bölüm 1: Giriş (çeviri)

Herhangi bir özel eylem gerçekleştirmez, aslında tek yaptığı bir işlev çağırmak döndürmek(), görevi zaman kontrolünden geçmek ve bir saniye geçtikten sonra geri dönmek olan. Böylece, kullanıcının argüman olarak ilettiği dizgiyi süresiz olarak tekrarlar.
Bu programı çalıştıralım ve argüman olarak "A" karakterini iletelim. Sonuç özellikle ilginç değil - sistem, "A" karakterini periyodik olarak görüntüleyen bir programı yürütür.
Şimdi, aynı programın birçok örneği çalışırken, ancak daha net hale getirmek için farklı harfler çıktı alırken seçeneği deneyelim. Bu durumda, sonuç biraz farklı olacaktır. Bir işlemcimiz olmasına rağmen, program aynı anda yürütülür. Nasıl olur? Ancak işletim sisteminin donanım yeteneklerinin yardımı olmadan bir yanılsama yarattığı ortaya çıktı. Sistemin birden fazla sanal işlemciye sahip olduğu, tek bir fiziksel işlemciyi teorik olarak sonsuz bir sayıya dönüştürdüğü ve böylece görünüşte programların aynı anda çalışmasına izin verdiği yanılsaması. Bu yanılsama denir CPU sanallaştırma.
Bu resim pek çok soruyu gündeme getiriyor, örneğin, birkaç program aynı anda çalışmak isterse hangisi başlatılacak? Bu sorudan işletim sisteminin "politikaları" sorumludur. İlkeler işletim sisteminin birçok yerinde kullanılır ve bunun gibi soruları yanıtlar ve işletim sisteminin uyguladığı temel mekanizmalardır. Dolayısıyla işletim sisteminin bir kaynak yöneticisi olarak rolü.

Bellek sanallaştırma

Şimdi hafızaya bakalım. Modern sistemlerde belleğin fiziksel modeli bir bayt dizisi olarak temsil edilir.. Bellekten okumak için belirtmeniz gerekir hücre adresierişmek için. Veri yazmak veya güncellemek için, veriyi ve yazılacağı hücrenin adresini de belirtmeniz gerekir.
Programın yürütülmesi sırasında belleğe sürekli olarak erişilir. Bir program, tüm veri yapısını bellekte saklar ve çeşitli yönergeleri yürüterek ona erişir. Bu arada talimatlar da bellekte saklanır, böylece bir sonraki talimat için her istekte de erişilir.

malloc() çağrısı

Çağrıyı kullanarak bir bellek bölgesi tahsis eden aşağıdaki programı göz önünde bulundurun. malloc () (https://youtu.be/jnlKRnoT1m0):

İşletim Sistemleri: Üç Kolay Parça. Bölüm 1: Giriş (çeviri)

Program birkaç şey yapar. Önce bir miktar bellek ayırır (7. satır), ardından ayrılan hücrenin adresini yazdırır (9. satır), ayrılan belleğin ilk yuvasına sıfır yazar. Daha sonra program, "p" değişkenindeki adreste bellekte depolanan değeri artırdığı bir döngüye girer. Ayrıca kendi işlem kimliğini de yazdırır. İşlem kimliği, çalışan her işlem için benzersizdir. Birkaç kopya yayınladıktan sonra ilginç bir sonuçla karşılaşacağız: İlk durumda, hiçbir şey yapmazsanız ve yalnızca birkaç kopya çalıştırırsanız, o zaman adresler farklı olacaktır. Ama bu bizim teorimizin kapsamına girmiyor! Doğru, çünkü modern dağıtımlarda bellek rasgele seçimi varsayılan olarak etkindir. Devre dışı bırakılırsa, beklenen sonucu alırız - aynı anda çalışan iki programın bellek adresleri eşleşecektir.

İşletim Sistemleri: Üç Kolay Parça. Bölüm 1: Giriş (çeviri)

Sonuç olarak, iki bağımsız programın kendi özel adres alanlarıyla çalıştığı ve bunların da işletim sistemi tarafından fiziksel bellekte eşlendiği ortaya çıktı.. Bu nedenle, bir program içinde bellek adreslerinin kullanılması diğerlerini hiçbir şekilde etkilemeyecektir ve her programa, tamamen kendisine verilen kendi fiziksel belleği varmış gibi görünmektedir. Ancak gerçek şu ki, fiziksel bellek, işletim sistemi tarafından yönetilen paylaşılan bir kaynaktır.

Tutarlılık

İşletim sistemleri içindeki önemli konulardan bir diğeri de - tutarlılık. Bu terim, aynı program içinde aynı anda birçok şeyle çalışırken oluşabilecek sistemdeki sorunlardan bahsederken kullanılır. Tutarlılık sorunları, işletim sisteminin kendisinde bile ortaya çıkar. Önceki bellek ve işlemci sanallaştırma örneklerinde, işletim sisteminin birçok şeyi aynı anda yönettiğini fark ettik - ilk işlemi başlatır, ardından ikinci işlemi vb. Anlaşıldığı üzere, bu davranış bazı sorunlara yol açabilir. Örneğin, modern çok iş parçacıklı programlar bu tür zorluklar yaşar.

Aşağıdaki programı göz önünde bulundurun:

İşletim Sistemleri: Üç Kolay Parça. Bölüm 1: Giriş (çeviri)

Ana işlevdeki program, çağrıyı kullanarak iki iş parçacığı oluşturur. pthread_create(). Bu örnekte, bir iş parçacığı, diğer işlevlerin yanı sıra aynı bellek alanında çalışan ve açıkça birden fazla işlevin aynı anda çalıştığı bir işlev olarak düşünülebilir. Bu örnekte, her iş parçacığı işlevi başlatır ve yürütür işçi () bu da değişkeni basitçe artırır,.

Bu programı 1000 argümanı ile çalıştıralım. Tahmin edebileceğiniz gibi sonuç 2000 olmalı çünkü her iş parçacığı değişkeni 1000 kat artırıyordu. Ancak, her şey o kadar basit değil. Programı daha fazla tekrarla çalıştırmayı deneyelim.

İşletim Sistemleri: Üç Kolay Parça. Bölüm 1: Giriş (çeviri)

Bir sayı girerek, örneğin 100000, çıktının 200000 olarak çıkmasını bekliyoruz. Ancak 100000 sayısını birkaç kez çalıştırırsak, sadece doğru cevabı görmeyeceğiz, aynı zamanda farklı yanlış cevaplar da alacağız. Cevap, sayıyı artırmak için üç işlemin gerekli olduğu gerçeğinde yatmaktadır - sayıyı bellekten çıkarmak, artırmak ve ardından sayıyı geri yazmak. Tüm bu talimatlar atomik olarak yürütülmediğinden (hepsi aynı anda), bunun gibi garip şeyler olabilir. Bu soruna programlama denir yarış kondisyonu. Bilinmeyen bir andaki bilinmeyen kuvvetler operasyonlarınızdan herhangi birinin performansını etkileyebilir.

Kaynak: habr.com

Yorum ekle