system call
Főnév
system call (tsz. system calls)
A modern számítógépes rendszerek egyik alapvető építőeleme a system call, vagy magyarul rendszerhívás. Ez az a mechanizmus, amely lehetővé teszi, hogy a felhasználói programok (user space) kommunikáljanak az operációs rendszer (kernel space) szolgáltatásaival. A rendszerhívásokon keresztül történik például fájlok megnyitása, memóriafoglalás, folyamatok létrehozása vagy hálózati kommunikáció.
Mi az a system call?
A system call az operációs rendszer által biztosított funkciók elérésének szabványos módja. Mivel a felhasználói programok nem férhetnek hozzá közvetlenül a hardverhez vagy az operációs rendszer magjához (kernel), egy közvetett, ellenőrzött útra van szükség: ezt biztosítja a system call.
Például ha egy program egy fájlt akar megnyitni, akkor nem nyúlhat közvetlenül a fájlrendszerhez, hanem egy rendszerhívással kéri meg az operációs rendszert, hogy végezze el a feladatot.
A működés lépései
- A program rendszerhívást kér – meghív egy függvényt (pl.
open(),read()). - A rendszerhívás belép a kernel módba – CPU vált user módról kernel módra.
- Az operációs rendszer végrehajtja a kérést.
- Az eredményt visszaadja a felhasználói programnak.
Ez a folyamat garantálja, hogy a rendszer biztonságos, stabil és ellenőrzött módon működjön.
Példák rendszerhívásokra
Az alábbiakban néhány tipikus rendszerhívást mutatunk be a Linux operációs rendszer kontextusában (a C nyelvű POSIX API-n keresztül):
1. Fájlműveletek
open()– fájl megnyitásaread()– olvasás fájlbólwrite()– írás fájlbaclose()– fájl lezárása
int fd = open("adat.txt", O_RDONLY);
char buffer[100];
read(fd, buffer, 100);
close(fd);
2. Folyamatkezelés
fork()– új folyamat létrehozásaexec()– másik program indításawait()– gyermekfolyamat befejeződésére vár
pid_t pid = fork();
if (pid == 0) {
execl("/bin/ls", "ls", NULL);
} else {
wait(NULL);
}
3. Memóriakezelés
mmap()– memória leképezésebrk()/sbrk()– heap memória kezelése
4. Hálózati kommunikáció
socket()– hálózati socket létrehozásaconnect(),bind(),accept(),send(),recv()– socket műveletek
User space vs. kernel space
A számítógépes rendszerek biztonsága és stabilitása érdekében megkülönböztetünk:
- User space: ahol a felhasználói alkalmazások futnak, korlátozott hozzáféréssel.
- Kernel space: ahol az operációs rendszer fut, teljes hozzáféréssel a hardverhez.
A rendszerhívások a két világ közötti „kapuk”, amelyek szabályozzák az információáramlást.
Rendszerhívások implementálása
A rendszerhívások nem közvetlenül C-függvények, hanem általában egy wrapper függvény hívja meg őket (pl. a C szabványkönyvtár glibc biztosítja ezeket). A háttérben a kernelhívás rendszerregisztereken és megszakításokon (interrupt) keresztül történik.
Például Linuxon a read() függvény valójában a sys_read kernelhívást aktiválja egy int 0x80 vagy syscall gépi utasítással.
Miért szükséges a rendszerhívás?
- Védelem: megakadályozza, hogy a programok közvetlenül manipulálják a hardvert.
- Hozzáférés biztosítása: lehetővé teszi a jogosultságon alapuló hozzáférést a rendszererőforrásokhoz.
- Erőforrás-kezelés: az operációs rendszer kontrollálja a fájlokat, folyamatokat, memóriát stb.
- Konzisztencia: egységes, szabványosított módja a műveletek végrehajtásának.
System call táblázat
Minden operációs rendszer system call táblázatot használ, amely minden rendszerhívást egyedi azonosítóval lát el. Például Linuxon az open() rendszerhívás azonosítója 2 lehet, míg a read() az 0.
Ezeket az azonosítókat a kernel használja a megfelelő rendszerhívás végrehajtására.
Rendszerhívások hibakezelése
A rendszerhívások általában hibakóddal térnek vissza (pl. -1), és a errno globális változó segítségével megmondható, hogy pontosan mi volt a hiba oka. A fejlesztőknek mindig ellenőrizniük kell a visszatérési értékeket.
int fd = open("nincsilyen.txt", O_RDONLY);
if (fd == -1) {
perror("Hiba a fájl megnyitásakor");
}
Teljesítmény és biztonság
- A rendszerhívások lassabbak, mint a sima függvényhívások, mivel a user-kernel váltás CPU-szinten történik.
- Viszont nélkülözhetetlenek a rendszer erőforrásainak védelme és kontrollált használata szempontjából.
Platformspecifikus megjegyzések
- Linux:
stracesegédprogrammal lehet követni a rendszerhívásokat. - Windows: hasonló mechanizmus, de más API-kon keresztül, pl.
CreateFile,ReadFile. - macOS: szintén POSIX-szabványokat követ, de saját rendszerhívás-rendszerrel.
Rendszerhívások és API
A system call az alacsony szintű interfész a kernel felé, míg a felhasználói API (pl. a C standard könyvtár) magasabb szintű, barátságosabb interfészt biztosít.
Például:
fopen()→ belsőleg meghívja azopen()rendszerhívást.fprintf()→ írás közbenwrite()rendszerhívást használ.
Összefoglalás
A system call a modern operációs rendszerek egyik alapvető fogalma. Segítségével a felhasználói alkalmazások vezérelhetik a hardvert és az operációs rendszer szolgáltatásait, miközben az erőforrásokhoz való hozzáférés szabályozott és biztonságos marad. Bár a rendszerhívások technikaiak és alacsony szintűek, minden modern alkalmazás működése mögött ott vannak, akár közvetlenül, akár közvetve.
- system call - Szótár.net (en-hu)
- system call - Sztaki (en-hu)
- system call - Merriam–Webster
- system call - Cambridge
- system call - WordNet
- system call - Яндекс (en-ru)
- system call - Google (en-hu)
- system call - Wikidata
- system call - Wikipédia (angol)