İşletim Sistemleri: Üç Kolay Parça. Bölüm 2: Soyutlama: Süreç (çeviri)

İşletim Sistemlerine Giriş

Ey Habr! Bence ilginç bir literatür olan OSTEP'in 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 tartışıyor. Tüm malzemelerin orijinalini 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:

Diğer parçalar:

kanalıma da bakabilirsin telgraf =)

İşletim sisteminin kullanıcılara sağladığı en temel soyutlamaya bakalım: süreç. Sürecin tanımı oldukça basittir; çalışan program. Programın kendisi diskte bulunan cansız bir şeydir; bir dizi talimattan ve muhtemelen başlatılmayı bekleyen bazı statik verilerden oluşur. Bu baytları alıp çalıştıran ve programı kullanışlı bir şeye dönüştüren işletim sistemidir.
Çoğu zaman kullanıcılar aynı anda birden fazla programı çalıştırmak ister; örneğin, dizüstü bilgisayarınızda bir tarayıcı, oyun, medya oynatıcı, metin düzenleyici ve benzerlerini çalıştırabilirsiniz. Aslında tipik bir sistem aynı anda onlarca veya yüzlerce işlemi çalıştırabilir. Bu gerçek sistemin kullanımını kolaylaştırır; CPU'nun boş olup olmadığı konusunda endişelenmenize gerek kalmaz, yalnızca programları çalıştırırsınız.

Bu da şu soruyu gündeme getiriyor: Çok sayıda CPU yanılsaması nasıl sağlanır? İşletim sistemi, tek bir fiziksel CPU'nuz olsa bile, neredeyse sonsuz sayıda CPU yanılsamasını nasıl yaratabilir?

İşletim sistemi bu yanılsamayı CPU sanallaştırma yoluyla yaratıyor. Bir işlemi başlatıp sonra durdurarak, başka bir işlemi başlatarak vb. işletim sistemi, aslında bir veya daha fazla fiziksel işlemci olacakken, çok sayıda sanal CPU olduğu yanılsamasını koruyabilir. Bu tekniğe denir CPU kaynaklarının zamana göre bölünmesi. Bu teknik, kullanıcıların istedikleri kadar eşzamanlı işlemi çalıştırmasına olanak tanır. Bu çözümün maliyeti performanstır; çünkü CPU birkaç işlem tarafından paylaşılırsa her işlem daha yavaş işlenecektir.
CPU sanallaştırmasını uygulamak ve özellikle de bunu iyi bir şekilde gerçekleştirmek için işletim sisteminin hem düşük seviyeli hem de yüksek seviyeli desteğe ihtiyacı vardır. Düşük seviyeli destek denir mekanizmalar işlevselliğin gerekli kısmını uygulayan düşük seviyeli yöntemler veya protokollerdir. Bu tür işlevselliklerin bir örneği, işletim sistemine bir programı durdurma ve işlemcideki başka bir programı çalıştırma yeteneği veren bağlam değiştirmedir. Bu zaman bölümü tüm modern işletim sistemlerinde uygulanmaktadır.
Bu mekanizmaların üstünde, işletim sistemine yerleşik "politikalar" biçiminde bir mantık vardır. politika işletim sistemi için belirli bir karar verme algoritmasıdır. Örneğin bu tür politikalar, ilk olarak hangi programın (komut listesinden) başlatılması gerektiğine karar verir. Yani örneğin bu sorun şu politikayla çözülecek: zamanlayıcı (zamanlama politikası) ve bir çözüm seçerken, başlatma geçmişi (son dakikalarda hangi programın en uzun süre başlatıldığı), bu sürecin taşıdığı yük (ne tür programların başlatıldığı), performans metrikleri (sistemin etkileşimli etkileşim veya aktarım için optimize edilmiştir) vb.

Soyutlama: süreç

Çalışan bir programın işletim sistemi tarafından yürütülmesine soyutlama diyoruz. süreç. Daha önce de belirtildiği gibi, bir süreç herhangi bir anlık zaman diliminde çalışan bir programdır. Bu programın çalışması sırasında eriştiği veya etkilediği çeşitli sistem kaynaklarından özet bilgi alabileceğimiz bir program.
Sürecin bileşenlerini anlamak için sistemin durumlarını anlamanız gerekir: programın çalışması sırasında neyi okuyabilir veya değiştirebilir. Herhangi bir zamanda programın yürütülmesi için sistemin hangi öğelerinin önemli olduğunu anlamanız gerekir.
Sürecin içerdiği sistemin bariz unsurlarından biri şudur: память. Talimatlar hafızada bulunur. Programın okuduğu veya yazdığı veriler de bellekte bulunur. Bu nedenle, bir sürecin adresleyebileceği bellek (adres alanı olarak adlandırılır) sürecin bir parçasıdır.
Ayrıca sistem durumunun bir kısmı da kayıtlardır. Birçok talimat, yazmaçların değerini değiştirmeyi veya değerlerini okumayı amaçlamaktadır ve bu nedenle kayıtlar da sürecin işleyişinin önemli bir parçası haline gelir.
Makine durumunun da bazı özel kayıtlardan oluşturulduğuna dikkat edilmelidir. Örneğin, IP - talimat işaretçisi — programın o anda yürütmekte olduğu talimatın bir işaretçisi. Ayrıca birde şu var yığın işaretçisi ve bununla ilgili çerçeve işaretçisi, yönetmek için kullanılanlar: işlev parametreleri, yerel değişkenler ve dönüş adresleri.
Son olarak, programlar sıklıkla ROM'a (salt okunur bellek) erişir. Bu “G/Ç” (giriş/çıkış) bilgileri, işlem tarafından o anda açık olan dosyaların bir listesini içermelidir.

İşlem API'si

Sürecin nasıl çalıştığına dair anlayışımızı geliştirmek için herhangi bir işletim sistemi arayüzünde bulunması gereken sistem çağrılarının örneklerini inceleyelim. Bu API'ler herhangi bir işletim sisteminde şu veya bu biçimde mevcuttur.

oluşturmak (oluşturma): İşletim sistemi, yeni işlemler oluşturmanıza olanak tanıyan bazı yöntemler içermelidir. Terminale bir komut girdiğinizde veya bir simgeye çift tıklayarak bir uygulamayı başlattığınızda, yeni bir işlem oluşturmak ve ardından belirtilen programı başlatmak için işletim sistemine bir çağrı gönderilir.
Giderme: Bir işlem oluşturmaya yönelik bir arayüz olduğundan, işletim sistemi aynı zamanda bir işlemin kaldırılmasını zorlama yeteneğini de sağlamalıdır. Çoğu program, çalışırken doğal olarak kendi kendine başlayacak ve sonlandırılacaktır. Aksi takdirde kullanıcı onları öldürebilmek ister ve dolayısıyla süreci durduracak bir arayüz faydalı olacaktır.
Bekleyin (bekliyor): Bazen bir işlemin tamamlanmasını beklemek yararlı olabilir, bu nedenle bekleme olanağı sağlayan bazı arayüzler sağlanır.
Çeşitli Kontroller (çeşitli kontrol): Öldürme ve işlemi beklemenin yanı sıra başka çeşitli kontrol yöntemleri de vardır. Örneğin, çoğu işletim sistemi bir işlemi dondurma (belirli bir süre boyunca yürütülmesini durdurma) ve ardından devam ettirme (yürütmeye devam etme) olanağı sağlar.
Durum (durum): Bir işlemin durumu hakkında, ne kadar süredir çalıştığı veya şu anda hangi durumda olduğu gibi bazı bilgileri elde etmek için çeşitli arayüzler vardır.

İşletim Sistemleri: Üç Kolay Parça. Bölüm 2: Soyutlama: Süreç (çeviri)

Süreç Oluşturma: Ayrıntılar

İlginç olanlardan biri programların tam olarak nasıl süreçlere dönüştürüldüğüdür. Özellikle işletim sisteminin programı nasıl alıp çalıştırdığı. Sürecin tam olarak nasıl oluşturulduğu.
Her şeyden önce, işletim sisteminin program kodunu ve statik verileri belleğe (işlem adres alanına) yüklemesi gerekir. Programlar genellikle bir diskte veya yarıiletken sürücüde yürütülebilir bir biçimde bulunur. Bu nedenle, program ve statik verileri belleğe yükleme işlemi, işletim sisteminin bu baytları diskten okuyabilmesini ve bunları bellekte bir yere yerleştirebilmesini gerektirir.

İlk işletim sistemlerinde yükleme işlemi hızlı bir şekilde yapılıyordu, bu da program başlatılmadan önce kodun tamamının belleğe yüklenmesi anlamına geliyordu. Modern işletim sistemleri bunu tembelce yapar, yani kod parçalarını veya verileri yalnızca programın yürütülmesi sırasında gerektirdiğinde yükler.

Kod ve statik veriler işletim sistemi belleğine yüklendikten sonra, işlemin çalıştırılabilmesi için yapılması gereken birkaç şey daha vardır. Yığın için bir miktar bellek ayrılmalıdır. Programlar yığını yerel değişkenler, işlev parametreleri ve dönüş adresleri için kullanır. İşletim sistemi bu belleği ayırır ve sürece verir. Yığın ayrıca bazı argümanlarla da tahsis edilebilir; özellikle main() fonksiyonunun parametrelerini, örneğin argc ve argv dizisiyle doldurur.

İşletim sistemi ayrıca program yığınına bir miktar bellek ayırabilir. Yığın, programlar tarafından dinamik olarak tahsis edilen verileri açıkça istemek için kullanılır.. Programlar bu alanı işlevi çağırarak talep eder malloc () ve işlevi çağırarak açıkça temizler Bedava(). Yığın, bağlantılı sayfalar, karma tabloları, ağaçlar ve diğerleri gibi veri yapıları için gereklidir. İlk başta yığına küçük bir miktar bellek ayrılır, ancak zamanla program çalıştıkça yığın, kütüphane API çağrısı malloc() aracılığıyla daha fazla bellek talep edebilir. İşletim sistemi, bu çağrıların karşılanmasına yardımcı olmak için daha fazla bellek ayırma sürecine dahil olur.

İşletim sistemi ayrıca, özellikle G/Ç ile ilgili olanlar olmak üzere başlatma görevlerini de gerçekleştirecektir. Örneğin, UNIX sistemlerinde her işlemin varsayılan olarak standart giriş, çıkış ve hata için 3 açık dosya tanımlayıcısı vardır. Bu tutamaçlar, programların terminalden girdi okumasına ve bilgileri ekranda görüntülemesine olanak tanır.

Böylece, kodu ve statik verileri belleğe yükleyerek, yığın oluşturup başlatarak ve G/Ç görevlerini gerçekleştirmeyle ilgili diğer işleri yaparak işletim sistemi, sürecin yürütülmesi için aşamayı hazırlar. Son olarak son bir görev kaldı: programı main() işlevi adı verilen giriş noktasında çalıştırmak. Main() fonksiyonunun çalıştırılmasıyla işletim sistemi CPU kontrolünü yeni oluşturulan prosese aktarır, böylece program çalışmaya başlar.

İşlem durumu

Artık bir sürecin ne olduğu ve nasıl oluşturulduğu hakkında biraz bilgi sahibi olduğumuza göre, içinde bulunabileceği süreç durumlarını listeleyelim. En basit haliyle bir süreç şu durumlardan birinde olabilir:
Koşu. Çalıştırırken, işlem işlemci üzerinde çalışır. Bu, talimatların yürütüldüğü anlamına gelir.
Hazır. Hazır durumda, işlem çalışmaya hazırdır ancak bazı nedenlerden dolayı işletim sistemi işlemi belirtilen zamanda yürütmez.
tıkalı. Engellenmiş durumda, bir işlem, bir olay gerçekleşene kadar yürütmeye hazır olmasını engelleyen bazı işlemler gerçekleştirir. Yaygın bir örnek, bir işlemin bir GÇ işlemini başlatması, başka bir işlemin işlemciyi kullanabilmesi için engellenmesidir.

İşletim Sistemleri: Üç Kolay Parça. Bölüm 2: Soyutlama: Süreç (çeviri)

Bu durumları bir grafik şeklinde hayal edebilirsiniz. Resimde de görebileceğimiz gibi proses durumu, işletim sisteminin takdirine bağlı olarak ÇALIŞIYOR ve HAZIR arasında değişebilir. Bir prosesin durumu HAZIR'dan ÇALIŞIYOR'a değiştiğinde, proses planlanmış demektir. Ters yönde - düzenden kaldırıldı. Bir süreç ENGELLENDİĞİ anda, örneğin bir GÇ işlemi başlattığımda, işletim sistemi onu, örneğin GÇ'nin tamamlanması gibi bir olay gerçekleşene kadar bu durumda tutacaktır. şu anda HAZIR durumuna geçiş ve eğer işletim sistemi buna karar verirse muhtemelen hemen ÇALIŞIYOR durumuna geçiş.
İki sürecin bu durumlardan nasıl geçtiğine dair bir örneğe bakalım. Başlangıç ​​olarak, her iki işlemin de çalıştığını ve her birinin yalnızca CPU kullandığını varsayalım. Bu durumda durumları şu şekilde görünecektir.

İşletim Sistemleri: Üç Kolay Parça. Bölüm 2: Soyutlama: Süreç (çeviri)

Aşağıdaki örnekte, ilk süreç bir süre çalıştıktan sonra IO isteğinde bulunur ve ENGELLENMİŞ duruma girerek başka bir sürecin çalışmasına izin verir (ŞEKİL 1.4). İşletim sistemi, süreç 0'ın CPU'yu kullanmadığını görür ve süreç 1'i başlatır. Süreç 1 çalışırken IO tamamlanır ve süreç 0'ın durumu HAZIR olarak değişir. Son olarak süreç 1 tamamlandı ve süreç 0 tamamlandıktan sonra süreç XNUMX işini başlatır, yürütür ve bitirir.

İşletim Sistemleri: Üç Kolay Parça. Bölüm 2: Soyutlama: Süreç (çeviri)

Veri yapısı

İşletim sisteminin kendisi bir programdır ve tıpkı diğer programlar gibi, ilgili çeşitli bilgi parçalarını takip eden bazı önemli veri yapılarına sahiptir. Her işlemin durumunu izlemek için işletim sistemi bazı işlemleri destekleyecektir. işlem listesi HAZIR durumundaki tüm işlemler için ve şu anda çalışmakta olan işlemleri izlemek için bazı ek bilgiler. Ayrıca işletim sisteminin engellenen işlemleri izlemesi gerekir. GÇ tamamlandıktan sonra işletim sisteminin gerekli işlemi uyandırması ve çalışmaya hazır duruma getirmesi gerekir.

Örneğin, işletim sistemi işlemci kayıtlarının durumunu korumalıdır. İşlem durduğu anda kayıtların durumu işlemin adres alanında saklanır ve işlemin devam ettiği anda kayıtların değerleri geri yüklenir ve böylece bu işlemin yürütülmesine devam edilir.

Hazır, engellendi, çalışıyor durumlarının yanı sıra başka durumlar da var. Bazen, oluşturma sırasında bir süreç INIT durumunda olabilir. Son olarak, bir işlem zaten tamamlanmış ancak bilgileri henüz temizlenmemişse FINAL durumuna yerleştirilebilir. UNIX sistemlerinde bu duruma denir zombi süreci. Bu durum, ana sürecin bir alt sürecin dönüş kodunu bilmek istediği durumlar için kullanışlıdır; örneğin, genellikle 0 bir başarıyı ve 1 bir hatayı işaret eder, ancak programcılar farklı sorunları bildirmek için ek çıkış kodları yayınlayabilir. Ana süreç sona erdiğinde, alt sürecin sona ermesini beklemek için wait () gibi son bir sistem çağrısı yapar ve işletim sistemine sonlandırılan süreçle ilişkili tüm verileri temizleyebileceğinin sinyalini verir.

İşletim Sistemleri: Üç Kolay Parça. Bölüm 2: Soyutlama: Süreç (çeviri)

Dersin önemli noktaları:

Süreç - işletim sisteminde çalışan bir programın ana soyutlaması. Herhangi bir zamanda, bir süreç durumuyla tanımlanabilir: adres alanındaki belleğin içeriği, talimat işaretçisi ve yığın işaretçisi de dahil olmak üzere işlemci kayıtlarının içeriği ve okunan veya yazılan açık dosyalar gibi IO bilgileri.
İşlem API'si programların süreçlere yapabileceği çağrılardan oluşur. Genellikle bunlar oluşturma, silme veya diğer çağrılardır.
● İşlem çalışıyor, hazır, engellenmiş gibi pek çok durumdan birinde. Zamanlama, zamanlamadaki istisnalar veya beklemeler gibi çeşitli olaylar, bir sürecin durumunu birinden diğerine değiştirebilir.
İşlem listesi Sistemdeki tüm süreçlere ilişkin bilgileri içerir. İçindeki her girişe, gerçekte belirli bir süreç hakkında gerekli tüm bilgileri içeren bir yapı olan süreç kontrol bloğu denir. 

Kaynak: habr.com

Yorum ekle