System Call
Sistem Çağrısı
- Okunuşu
- sistım kol
Kısaca
System call, bir programın işletim sistemi kernel'ından bir dosyayı okumak ya da process başlatmak gibi ayrıcalıklı bir işlem yapmasını istediği çağrıdır.
System call (sistem çağrısı) nedir?
Çoğu zaman syscall diye kısaltılan system call, bir uygulama ile kernel arasındaki resmî kapıdır. Programlar kısıtlı bir kullanıcı modunda çalışır ve donanıma ya da diğer programların belleğine doğrudan dokunamaz; bu yüzden bir dosyayı açmaları, ağ üzerinden veri göndermeleri, bir process başlatmaları veya daha fazla bellek almaları gerektiğinde bir system call yapar ve işi kernel'a bırakırlar.
Bir system call yapmak için program, bir syscall numarasını ve argümanlarını CPU yazmaçlarına koyar ve CPU'yu kernel moduna geçiren, x86-64'te syscall gibi özel bir komut çalıştırır. Kernel isteği doğrular, işlemi gerçekleştirir ve kullanıcı moduna geri dönmeden önce bir sonuç ya da hata kodu döndürür. Unix benzeri sistemlerdeki yaygın system call'lar arasında open, read, write, fork, execve ve mmap vardır.
Bir banka gişesini düşünün. Müşteriler kasaya giremez ama isteklerini gişe görevlisine verebilir; görevli onu kontrol eder ve parayı onlar adına ele alır. Çoğu geliştirici system call'ları nadiren elle yazar; C'deki printf, Python'daki open() ya da Node.js'teki fs.readFile gibi fonksiyonlar bunları sizin için arka planda yapar.
System call, normal bir fonksiyon çağrısı ya da kütüphane API'siyle aynı şey değildir. Normal bir fonksiyon çağrısı kullanıcı modunda programınızın içinde kalır; system call ise kernel'a geçer ve bu onu belirgin biçimde yavaşlatır. Kütüphanelerin çoğu zaman veriyi tamponlayıp çok sayıda küçük çağrı yerine daha az sayıda, daha büyük system call yapmasının nedeni bu maliyettir.
Önemli noktalar
- System call, kullanıcı modundaki bir programın kernel'dan ayrıcalıklı bir hizmet istemesinin yoludur.
- Her system call CPU'yu kullanıcı modundan kernel moduna ve geri geçirir.
- Örnekler arasında
open,read,write,forkvemmapvardır. - Standart kütüphaneler system call'ları sarmalar; bu yüzden geliştiriciler onları nadiren doğrudan çağırır.
- System call'lar normal fonksiyon çağrılarından pahalıdır; bu yüzden programlar onları toplu yapmaya çalışır.
Örnek
import os
# os.open, os.write and os.close are thin wrappers
# around the open, write and close system calls
fd = os.open("hello.txt", os.O_WRONLY | os.O_CREAT, 0o644)
os.write(fd, b"Hello from a system call\n")
os.close(fd)
# Ask the kernel for this process's ID (the getpid system call)
print(os.getpid())Sık sorulan sorular
System call ile API arasındaki fark nedir?
API, yazılımı kullanmak için tanımlanmış herhangi bir arayüzdür; system call ise kernel'ın sağladığı belirli alt düzey arayüzdür. C standart kütüphanesi gibi kütüphane API'leri system call'ları sarmalayarak onları kullanmayı daha kolay ve taşınabilir kılar.
Bir programın hangi system call'ları yaptığını nasıl görebilirim?
Linux'ta bir programı strace altında, örneğin strace ls ile çalıştırarak yaptığı her system call'ı argümanları ve sonuçlarıyla birlikte yazdırabilirsiniz. Diğer işletim sistemleri de benzer izleme araçları sunar.
System call'lar neden yavaştır?
Her system call CPU'yu kullanıcı modundan kernel moduna ve geri geçirir ve kernel isteği doğrulamak zorundadır. Bu ek yük tek bir çağrı için çok küçüktür, ancak bir program milyonlarca küçük çağrı yaptığında birikir.
İlgili sayfalar
- Kernelİşletim Sistemleri, s. 17Kernel, işletim sisteminin CPU'yu, belleği ve donanım aygıtlarını yöneten ve programların bu kaynaklara nasıl eriştiğini denetleyen çekirdek bölümüdür.
- Processİşletim Sistemleri, s. 23Process, bir programın çalışan örneğidir; işletim sistemi tarafından yönetilen kendi bellek alanına, kaynaklarına ve en az bir yürütme iş parçacığına sahiptir.
- Dosya Sistemiİşletim Sistemleri, s. 10Dosya sistemi, işletim sisteminin bir depolama aygıtındaki veriyi dosya ve klasörlere düzenleyen ve her parçanın nerede saklandığını izleyen bölümüdür.
- Shellİşletim Sistemleri, s. 28Shell, kullanıcının yazdığı ya da bir betikte yazılı komutları okuyup işletim sisteminden çalıştırmasını isteyen, genellikle metin arayüzlü bir programdır.
- APIBackend ve API'ler, s. 2API, bir yazılımın başka bir yazılımdan veri ya da işlem talep etmesini sağlayan, belgelenmiş ve öngörülebilir kurallar bütünüdür.
- LinuxDevOps ve Bulut, s. 31Linux, çoğu sunucuyu, bulutu, konteyneri ve Android telefonu çalıştıran, genellikle dağıtım olarak paketlenen açık kaynaklı bir işletim sistemi çekirdeğidir.
- Kernel Modeİşletim Sistemleri, s. 18Kernel mode (çekirdek kipi), çekirdeğin donanıma ve belleğe tam erişebildiği ayrıcalıklı CPU durumudur; sıradan programlar kısıtlı kullanıcı kipinde çalışır.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin