İşletim Sistemleri İşletim Sistemleri Dr. Binnur Kurt binnur.kurt@gmail.com Omega Eğitim ve Danışmanlık http://www.omegaegitim.com Bölüm 1 İşletim Sistemi 1|Sayfa İşletim Sistemleri İÇİNDEKİLER 1. İşletim Sistemi 2. Kabuk 3. Prosesler 4. İplikler 5. İplikler Arası Eş Zamanlama 6. Prosesler Arası İletişim 7. İş Sıralama 8. Prosesler Arası Eş zamanlama 9. Bellek Yönetimi 10. Dosya Sistemi 11. Soket Haberleşme Bölüm 1 İşletim Sistemi 2|Sayfa İşletim Sistemleri BÖLÜM 1 İşletim Sistemi Bölümün Amacı Bölüm sonunda aşağıdaki konular öğrenilmiş olacaktır: ► İşletim sistemi ile ilgili temel kavramlar ve tanımlar ► İşletim sistemlerinin özellikleri ► İşletim sistemi mimarileri Bölüm 1 İşletim Sistemi 3|Sayfa İşletim Sistemleri 1.1 Giriş Bilgisayar mühendisliği açısından temel olarak iki sistemden söz edebiliriz: İş Sistemleri ve Bilişim Sistemleri (Şekil-1.1). İş sistemleri iş süreçlerinden oluşur. Bu süreçler şirkete para kazandıran, borsadaki değerini arttıran faaliyetler olarak düşünülebilir. İş süreçlerinin sahibi, bu süreçleri şirketin verimliliğini, servis kalitesini, kaynak ve kapasite kullanımını arttıracak şekilde ya değiştirmek ya da yenilerini eklemek ister. Bilişim sistemlerinin görevi iş süreçlerinde dolaşan verileri alıp işleyerek, karar verme süreçlerine destek olmak, maliyetleri düşürerek verimliliği artırmak ya da işlerin insan etkileşimi olmaksızın akışını sağlayarak otomasyonu sağlamak olabilir. İş Bilişim Sistemleri Sistemleri Şekil-1.1 İş ve Bilişim Sistemleri Bilişim sistemleri donanım ve yazılım alt sistemlerinden oluşmaktadır (Şekil-1.2). Donanım alt sisteminde fiziksel olarak dokunabileceğimiz, Merkezi İşlem Birimi (MİB), Bellek, Ekran Kartı, Disk, Giriş/Çıkış cihazları gibi bileşenler yer alır. MİB uygulamaların çalışabilir kodlarının işletildiği yerdir. Günümüz modern işlemcileri uygulamaları hızlı çalıştırmak için birçok teknik kullanır. Bu tekniklere örnek olarak, sıra-düzensiz çalıştırma, dallanma kestirimi, birden fazla hesaplama birimi bulundurma gibi yöntemler verilebilir. Bellek uygulamanın durumunun geçici olarak saklandığı alandır. Verilerin işlenebilmesi için MİB içindeki saklayıcılara taşınması gerekir. Bellek MİB içindeki saklayıcılara göre bin kat daha yavaş erişime sahiptir. Bu yavaşlığı gizlemek için işlemciler, cep bellek olarak adlandırılan yapılar içerir. Katmanlı bir yapıya sahip cep belleklerden L1 ve L2 olarak adlandırılan iki adet seviyede bellek bulunur. L2 bellek kapasite olarak L1’den büyüktür. Buna karşılık olarak L1 bellekler L2 belleklere göre çok daha hızlıdır. Genel ilke olarak, MİB’deki saklayıcılardan belleğe doğru ilerledikçe kapasite artar, buna karşılık olarak erişim süreleri ise uzar (Şekil-1.3). Bölüm 1 İşletim Sistemi 4|Sayfa İşletim Sistemleri K1 K2 Kn Uygulamalar İşletim Sistemi (İş sıralayıcı, Bellek Yönetimi, Kullanıcı Yönetimi, G/Ç Yönetimi) Donanım (MİB, Bellek, Ekran Kartı, Disk, G/Ç Cihazları) Şekil-1.2 Donanım-Yazılım Sistemleri Hız Saklayıcı Kapasite L1, L2 Ana Bellek swap (Disk) Şekil-1.3 Bellek Hiyerarşisi Yazılım alt sistemi ise donanım üzerine kuruludur ve farklı mimarilerde tasarlanmış olabilir. Yazılım alt sisteminin en önemli parçasını işletim sistemi oluşturur. İşletim sisteminin temel görevi sistem kaynaklarını kullanıcılar ve uygulamalar arasında paylaştırmaktır (Şekil-1.4). Sistem kaynaklarından en önemlisi işlemcidir. İşletim sisteminde çalışan uygulamaları proses olarak adlandırıyoruz. İşletim sistemi işlemciyi prosesler arasında zamanda paylaştırır. İşletim sisteminin en önemli bileşeni çekirdektir. Çekirdek çok sayıda servisten oluşur: İş sıralayıcı, bellek yöneticisi, kullanıcı yöneticisi, giriş/çıkış yöneticisi. İş sıralayıcının görevi işlemciyi prosesler arasında zamanda paylaştırmaktır. Farklı makinalarda farklı kapasitelerde fiziksel bellek bulunabilir ve bu fiziksel bellekler farklı bölmelere yerleştirilmiş olabilir. Bellek yöneticisinin görevi, sanki tüm bellek bölmeleri doluymuş gibi bir sanal bellek uzayı oluşturmak ve uygulamaların bu sanal belleği kullanmalarını sağlamaktır. Uygulamaların adres yoluna çıkardıkları sanal adresleri fiziksel adreslere donanımdan destek alarak dönüştürmekten yine bellek yöneticisi sorumludur. Kullanıcı için, örneğin, e-posta gönderip almak için doğrudan donanıma erişmek çok karmaşıktır. Çekirdek donanımı çevreleyerek, bu karmaşıklığı bir ölçüde gizler. Ancak hala e-posta gönderip almak için çekirdek karmaşıktır. Uygulamalar çekirdekle sistem çağrıları aracılığı ile konuşur. Sıradan kullanıcı için sistem çağrıları oldukça karmaşıktır. Bu karmaşıklığı kullanıcıdan gizlemek için çekirdeği çevreleyen kabuk olarak adlandırılan Bölüm 1 İşletim Sistemi 5|Sayfa İşletim Sistemleri bir katman yer alır. Kabuğun görevi kullanıcıdan aldığı komutları çekirdeğin anlayacağı bir dizi sistem çağrısına dönüştürmektir. Çok sayıda kabuk yazılımı bulunur: Sh (Bourne Shell), Bash (Bourne Again Shell), Csh (C Shell), Tcsh (TC Shell), Zsh (Z Shell), Ksh (Korn Shell). Bunlar arasında hız, güvenlik seviyesi, programlama yetenekleri gibi farklılıklar bulunur. Ama sıradan bir kullanıcı için bile e-posta alıp göndermek için bile kabuk çok karmaşıktır. Kabuğu da çevreleyen bir uygulama katmanı bulunur. Uygulama katmanında örneğin e-posta alıp göndermek için e-posta istemcisi (örneğin Thunderbird) bulunur. Kullanıcı bu programı kullanarak e-posta işlemlerini gerçekleştirir. Şekil-1.4 İşletim Sisteminin Katmanlı Mimarisi 1.2 İşletim Sistemi Türleri Farklı donanım platformları bulunur. Bu platformlar üzerinde çalışan uygulamaların gereksinimleri biri birinden farklılık gösterir. Bu farklı ihtiyaçlara cevap verebilmek için işletim sistemleri özelleşmiştir: Anaçatı işletim sistemleri Sunucu işletim sistemleri Çok işlemcili işletim sistemleri Kişisel bilgisayar işletim sistemleri Gerçek zamanlı işletim sistemleri Gömülü işletim sistemleri Akıllı-kart işletim sistemleri 1.2.1 Anaçatı İşletim Sistemleri Yoğun Giriş/Çıkış işlemi gerektiren çok sayıda görev çalıştırmaya yönelik tasarlanmış işletim sistemleridir. Üç tür temel hizmeti yerine getirirler: 1. Yığın işlem çalıştırma kipi Bölüm 1 İşletim Sistemi 6|Sayfa İşletim Sistemleri Yığın işlemler etkileşim gerektirmeyen, çoğu zaman periyodik olarak gerçekleştirilen işlemleri kapsar. Örnek olarak bir sigorta şirketindeki sigorta tazminatı isteklerinin işlenmesi verilebilir. 2. Atomik (transaction) İşlemler Çoğu zaman bir iş sürecini oluşturulan adımların tamamının başarılı olmasını ya da adımlardan biri başarısız olursa hiçbir adımın çalıştırılmamasını isteriz. Bu işlemlerin süresinin kısa olması istenir. Örneğin; seyahat organizasyonu sürecinde otel rezervasyonu, uçak bileti rezervasyonu ve araç kiralama adımlarının atomik olması istenir. Bu adımlardan herhangi biri başarısız olursa uçak bileti ve otel rezervasyonun ve araç kiralama işlemlerinin hiçbirinin yürütülmemesi istenir. 3. Zaman paylaşımlı çalışma Burada birden fazla uzaktan bağlanan kullanıcının sistemde iş çalıştırmasına izin veren sistemlerdir. Örneğin; IBM System z9 sistemi. 1.2.2 Sunucu İşletim Sistemleri Bu tür sistemler sunucu makinalar üzerinde çalışır. Bu tür sunucuların çekirdek sayıları ve bellek kapasiteleri yüksektir. Bilgisayar ağı üzerinden çok sayıda kullanıcıya hizmet verebilir. Hem donanımı hem de yazılımı paylaştırma yeteneğine sahiptir. Yazıcı hizmeti, dosya paylaştırma, web erişimini örnek olarak verebilir. Bu tür işletim sistemlerine Windows Server 2012, Red Hat Enterprise Linux, AIX, Solaris işletim sistemleri örnek olarak verebiliriz. 1.2.3 Çok İşlemcili İşletim Sistemleri Birden fazla işlemcili bilgisayar sistemleridir. Amaç bilgi işleme gücünü arttırmaktır. İşlemcilerin bağlantı türüne göre farklı isimler alabilirler: a. Paralel Sistemler: Biri birine bağlı, birden fazla bilgisayardan oluşan sistemlerdir. Bu bilgisayarlar, biri birleri ile özel yüksek bant genişliğine sahip ara bağlaşım sistemleri üzerinden konuşurlar. b. Çok İşlemcili Sistemler: Aynı anakarta bağlı birden fazla işlemcinin olduğu sistemlerdir. Temel olarak sunucu işletim sistemlerine benzer tasarım hedeflerine sahip olsalar da işlemciler arası bağlaşım ve iletişim için ek özelliklere ihtiyaç duyarlar. 1.2.4 Kişisel Bilgisayar İşletim Sistemleri Kullanıcıya etkin ve kolay kullanılır bir arayüz sunmayı amaçlayan ve genellikle ofis uygulamalarına yönelik olarak kullanılan işletim sistemleridir. Windows 7, Fedora, MacOS’i örnek olarak verebiliriz. 1.2.5 Gerçek Zamanlı İşletim Sistemleri Gerçek zamanlı işletim sistemlerinde görevlerin tamamlanması üzerinde bir zaman kısıtı bulunur. Örneğin endüstriyel kontrol sistemlerinde, görevin belirli bir sürenin sonunda tamamlanması gerekir, bu sürenin sonunda tamamlanmasının bir değeri yoktur. Yine endüstriyel kontrol sistemlerinde ya da askeri sistemlerde toplanan verilerin sisteme verilerek en kısa sürede bir yanıt üretilmesi istenir. Gerçek zaman Bölüm 1 İşletim Sistemi 7|Sayfa İşletim Sistemleri işletim sistemlerine örnek olarak VxWorks (http://www.windriver.com/products/vxworks) ve QNX Neutrino (http://www.qnx.com/products/neutrino-rtos/neutrino-rtos.html) ve GİS (http://bilgem.tubitak.gov.tr/en/icerik/gis-real-time-operating-system) verilebilir. İki tür gerçek zamanlı sistem bulunur: i. Katı-gerçek-zamanlı (=Hard real-time) Zaman kısıtlarına uyulması zorunludur. Araba üretim bandındaki üretim robotları buna örnek olarak verilebilir. ii. Gevşek-gerçek-zamanlı (=Soft real-time) Bazı zaman kısıtlarına uyulmaması kabul edilebilir. Örnek olarak çoğul ortam sistemleri verilebilir. 1.2.6 Gömülü İşletim Sistemleri Kısıtlı işlemci ve bellek kapasitesine sahip cihazlar için geliştirilmiş işletim sistemleridir. Akıllı televizyon, otomobiller, tıbbi görüntüleme cihazları, tüketici elektroniğinde yoğun olarak kullanılır. Kullanılan cihaza bağımlı olarak basit ya da karmaşık işlevlere sahip olabilir. 1.2.7 Akıllı Kart İşletim Sistemleri En küçük işletim sistemi türüdür. Kredi kartı boyutlarında, üzerinde işlemci olan kartlar üzerinde çalışır. Çok sıkı işlemci ve bellek kısıtları vardır. Bazıları tek işleve (örneğin, elektronik ödeme sistemleri) yönelik olarak, bazıları ise birden fazla işlev içerebilecek şekilde tasarlanmışlardır. Çoğunlukla özel firmalar tarafından geliştirilen özel sistemlerdir. Java Card ise java tabanlı bir çözüm sunar (Şekil-1.5). Applet olarak adlandırılan bir tür Java uygulaması yüklenerek çalıştırılırlar. Bazı kartlar birden fazla Applet çalıştırabilir. Java Card Sanal Makinası çoklu-programlama, iş sıralama, kaynak yönetimi ve koruması sağlar. Applet Applet Applet Applet Üretici Eklentileri Java Card Çatısı ve API Java Card Sanal Makinası Kart İşletim Sistemi Şekil-1.5 Java Card platformu Bölüm 1 İşletim Sistemi 8|Sayfa İşletim Sistemleri 1.3 İşletim Sistemleri Yapıları Günümüz modern işletim sistemlerine gelinceye kadar işletim sistemleri farklı mimarilerde tasarlanmışlardır. Şimdi bu mimarilere bir göz atacağız: Monolitik Çekirdek Mimarisi Mikro Çekirdek Mimarisi Katmanlı Çekirdek Mimarisi Sanal Makina Mimarisi Nesneye Dayalı Mimari 1.3.1 Monolitik İşletim Sistemleri Genel bir yapıları yoktur. İşlevlerin tamamı işletim sistemi içinde tamamı çekirdek modunda çalışan birer proses tarafından gerçeklenir (Şekil-1.6). Cihaz sürücüleri modüler olarak olabilir. Bu nedenle büyük bir çekirdeğe sahiptirler. İşlevleri gerçekleyen tüm prosedürler aynı seviyededir ve birbirleri ile etkileşimli çalışabilirler. Uygulamalar kullanıcı modunda çalışır ve çekirdeğin verdiği servislere bir arayüz ya da sistem çağrıları üzerinden erişirler. Bu mimariye sahip işletim sistemlerine örnek olarak FreeBSD, Solaris, AIX, HP-UX işletim sistemleri verilebilir. Günümüz modern monolitik işletim sistemleri modülerdir. Bu servisler birer modül olarak çalışma zamanında yüklenebilir ya da kaldırılabilir. Böylelikle ihtiyaca göre çekirdeği oluşturan modüller seçilebilir ve daha küçük bir çekirdek oluşturulabilir. Linux’da modüllerin bir listesini almak için lsmod komutu kullanılır: [student@server1 ~]$ lsmod Module Size ip6table_filter 1671 ip6_tables 19281 ebtable_nat 2047 ebtables 27161 ipt_MASQUERADE 2440 iptable_nat 3755 ipt_REJECT 2392 xt_CHECKSUM 1309 iptable_mangle 1775 iptable_filter 1730 . . . . . . . . . . . . . . . cdrom 40900 mptspi 16069 mptscsih 45921 mptbase 99360 scsi_transport_spi 25481 floppy 65361 pata_acpi 3782 ata_generic 3758 ata_piix 26525 vmwgfx 128627 ttm 80595 drm 274036 Bölüm 1 İşletim Sistemi Used by 0 1 ip6table_filter 0 1 ebtable_nat 3 1 2 1 1 1 . . . . . . . 1 sr_mod 2 1 mptspi 2 mptspi,mptscsih 1 mptspi 0 0 0 0 0 1 vmwgfx 2 vmwgfx,ttm 9|Sayfa İşletim Sistemleri i2c_core dm_mirror dm_region_hash dm_log dm_mod 31228 14208 11094 9681 84786 2 i2c_piix4,drm 0 1 dm_mirror 2 dm_mirror,dm_region_hash 11 dm_mirror,dm_log Burada, ilk sütun modülün adını, ikinci sütun modülün bellekte kapladığı alanın boyutunu ve son sütun ise hangi modüller tarafından kullanıldığını gösterir. Modüllerin bilgisi /proc/modules dosyasında yer alır. /proc dizini bellekte oluşturulan ve çekirdeğin doğrudan eriştiği özel bir dizindir. lsmod komutu bu dosyadaki bilgileri düzenli ve formatlı bir şekilde ekranda listeler. Modinfo komutunu kullanarak herhangi bir modül hakkında detaylı bilgi edinebiliriz: [root@server1 etc]# modinfo cdrom filename: /lib/modules/3.8.1316.2.1.el6uek.x86_64/kernel/drivers/cdrom/cdrom.ko license: GPL srcversion: B5F2D59440347DFFB175E71 depends: intree: Y vermagic: 3.8.13-16.2.1.el6uek.x86_64 SMP mod_unload modversions parm: debug:bool parm: autoclose:bool parm: autoeject:bool parm: lockdoor:bool parm: check_media_type:bool parm: mrw_format_restart:bool Normalde, çekirdek bir modülü gerektiğinde otomatik olarak yükler. Ancak biz de komut satırından modüllerin yüklenmesini ve kaldırılmasını sağlayabiliriz: [root@server1 [root@server1 [root@server1 nfs fscache lockd sunrpc [root@server1 [root@server1 [root@server1 ~]# lsmod | grep nfs ~]# modprobe nfs ~]# lsmod | grep nfs 184416 0 52962 1 nfs 84481 1 nfs 267672 3 nfs,lockd ~]# modprobe -r nfs ~]# lsmod | grep nfs ~]# Modülü yüklemek için modprobe komutunu kullanıyoruz. Kaldırmak için ise yine aynı komutu bu sefer –r seçeneği ile çalıştırıyoruz. Her iki durumda da komutu parametre olarak yüklenecek ya da kaldırılacak modülün adını veriyoruz. Yukarıdaki örnekte nfs modülü elle eklenmiş ve daha sonra kaldırılmıştır. Yeni bir çekirdek modülü kurmak için ise insmod komutu kullanılır. Bu şekilde eklenmiş bir modülü kaldırmak için rmmod komutu kullanılır. Bölüm 1 İşletim Sistemi 10 | S a y f a İşletim Sistemleri Kullanıcı Modu Uygulamalar Çekirdek Modu Sanal Dosya Sistemi, Kullanıcı Yöneticisi İş Sıralayıcı, Prosesler Arası Haberleşme Sanal Bellek Yöneticisi, Cihaz Sürücüleri, . . . Donanım Şekil-1.6 Monolitik Çekirdek Mimarisi 1.3.2 Mikro Çekirdek İşletim Sistemleri Temel hizmetleri veren küçük bir çekirdeğe sahiptir (Şekil-1.7). Örneğin Minix işletim sistemi bu tür bir mimariye sahiptir ve 6,000 satır koddan oluşur. Bu hizmetleri veren prosesler çekirdek modunda çalışırlar. Diğer işlevleri gerçekleyen prosedürler kullanıcı modunda çalışırlar. Uygulamalar Kullanıcı Modu Cihaz Sürücüleri Çekirdek Modu Sanal Dosya Sistemi Prosesler Arası Haberleşme İş Sıralayıcı, Sanal Bellek Yöneticisi, Temel Proses Haberleşme Hizmeti Donanım Şekil-1.7 Mikro Çekirdek Mimarisi 1.3.3 Katmanlı İşletim Sistemleri İşletim sistemi çekirdeği katmanlı bir yapıya sahiptir (Şekil-1.8). Her katman bir üst katmana hizmet verirken bir alt katmandan hizmet alır. Bu tür mimarinin en önemli kazanımı hata ayıklamanın kolay olmasıdır. Bu mimariye sahip örnek işletim sistemi olarak VAX/VMS ve Multics işletim sistemleri verebilir. Bölüm 1 İşletim Sistemi 11 | S a y f a İşletim Sistemleri Uygulamalar Kullanıcı Modu Çekirdek Modu Sistem Servisleri Dosya Sistemi Bellek ve G/Ç Yöneticisi İş Sıralayıcı Donanım Şekil-1.8 Katmanlı Çekirdek Mimarisi 1.3.4 Sanal Makina İşletim Sistemleri Her sanal makine donanım üzerinde koşar. İşletim sistemi birden fazla sanal makina sunabilir. Sanal makinaların her biri donanımın birebir kopyasıdır. Her sanal makinada farklı işletim sistemi olabilir. Örnek olarak, IBM S/370 ve Java Sanal Makinası verilebilir. Java denince genellikle akla ilk olarak Java programlama dili gelmektedir. Bu çok da yanlış sayılmaz. Ancak Java öncelikli olarak bir platformun adıdır. Bu platform bize Java programlama dilini kullanarak uygulama geliştirmek, geliştirdiğimiz bu uygulamayı dağıtmak ve en sonunda bu uygulamayı çalıştırmak için bir ortam sağlar. Üstelik bu platform tek de değildir. Java Standard Edition (SE), Java Enterprise Edition (EE), Java Micro Edition (ME), Gömülü Java, Java Card, Java TV gibi biri biriyle ilintili ama farklı platformlar/API’ler bulunmaktadır. Java platformunun en güçlü bileşeni ise Java uygulamalarını çalıştıran Java Sanal Makinasıdır (JSM). Java uygulamaları JSM üzerinde çalışır. JSM satın alabileceğiniz, üretebileceğiniz bir işlemci tanımlar. Bu işlemcinin bir komut kümesi, yığın temelli adresleme kipleri, saklayıcı kümesi, yığın göstergesi, program sayacı ve bir bellek modeli vardır. JSM içinde uygulamamızın yürütme zamanındaki başarımını belirleyen iki önemli parça yer alır: JIT (Just-in-Time) Derleyici ve Çöp Toplayıcı (Garbage Collector). JIT derleyici bytecode’ları JSM’nin üzerinde çalıştığı platformun anlayacağı, örneğin Intel x86 kodlarına dönüştürür. Üstelik bunu yaparken devingen en iyileme de yapar. Bunun için uygulamanın basit bir kesitini (=profiling) alır. Bu kesit bilgisine göre onlarca en iyileme tekniğinden hangilerini uygulayacağına karar verir. Java geliştiricisi açık ve yalın kod yazmaktan sorumludur, bu kodun en yüksek başarımla çalıştırılmasından ise JIT derleyici sorumludur. JSM doğrudan işletim sistemi üzerinde koşabileceği gibi (Şekil-1.9 (a), (b) ve (c)), doğrudan donanım üzerinde de koşabilir (Şekil-1.9 (d)). Bölüm 1 İşletim Sistemi 12 | S a y f a İşletim Sistemleri Java EE Application Java SE Application Java EE AS (GF, JBoss, WLS, WSphere, …) JVM (HotSpot, JRockit, Zing, J9, …) JVM (HotSpot, JRockit, Zing, J9, …) OS (Windows, Linux, Solaris,…) OS (Windows, Linux, Solaris,…) HW (CPU,GPU,Memory,HD,…) HW (CPU,GPU,Memory,HD,…) (a) (b) JRockit VE – Virtual Edition WebSphere HE – Hypervisor Edition Java SE App. Java SE App. JVM JVM Java SE App Java SE App OS OS JVM JVM VM #n VM #1 VM #1 ... ... VM #n Virtualization (Baremetal) Virtualization (Baremetal) HW (CPU,GPU,Memory,HD,…) HW (CPU,GPU,Memory,HD,…) (c) (d) Şekil-1.9 Java Sanal Makinası 1.3.5 Nesneye Dayalı İşletim Sistemleri Nesneye dayalı işletim sistemlerinde, işletim sistemi tasarımında, cihaz sürücülerinin, dosya sistemlerinin ve kullanıcı arayüzünün gerçeklenmesinde nesneye dayalı programlama yaklaşımındaki kullanılan tekniklerden yararlanılır. Nesneye dayalı programlamada paketleme, sınıf, nesne, kalıtım ve çok şekillilik mekanizmaları kullanılır. Çekirdeği oluşturan servisler birer nesne olarak çalışır. Uygulamalar bu nesnelere erişerek çekirdekten hizmet alırlar. Bu mimariye sahip örnek işletim sistemi olarak Windows ve IBM AS400 işletim sistemleri verebilir. Bölüm 1 İşletim Sistemi 13 | S a y f a