„Operációs rendszerek kidolgozott beugrókérdések vizsgára ABC-sorrendben” változatai közötti eltérés
Nincs szerkesztési összefoglaló |
a →fork(): Mire szolgál a fork() rendszerhívás?: kilógott a válasz az oldalról |
||
840. sor: | 840. sor: | ||
====fork(): Mire szolgál a fork() rendszerhívás?==== | ====fork(): Mire szolgál a fork() rendszerhívás?==== | ||
TODO: rövidíteni. | TODO: rövidíteni. | ||
Új folyamat létrehozására. A fork() hívásakor az aktuális folyamat, amely kiadta a rendszerhívást, megduplázódik (minden adata, verme, memórialapja, stb.), onnantól két példányban fog továbbélni, amelyek egymással szinte tökéletesen megegyeznek, kvázi klónozva van a folyamat, néhány apró különbség van csupán. De valójában a memóriaszervezés ügyes trükkje: semmit nem csinál azonkívül, hogy bizonyos adminisztratív adatokat megdupláz, ténylegesen nem másol semmit (memórialapokat)! Az így megduplázott folyamat memórialapjaihoz hozzárendel még egy folyamatot, és megjegyzi azt, hogy amíg ezek a folyamatok békésen tudnak egymás mellett dolgozni, addig dolgozzanak ugyanazon, de ha konfliktus van, akkor majd lemásoljuk ezeket a memórialapokat. | Új folyamat létrehozására. A fork() hívásakor az aktuális folyamat, amely kiadta a rendszerhívást, megduplázódik (minden adata, verme, memórialapja, stb.), onnantól két példányban fog továbbélni, amelyek egymással szinte tökéletesen megegyeznek, kvázi klónozva van a folyamat, néhány apró különbség van csupán. De valójában a memóriaszervezés ügyes trükkje: semmit nem csinál azonkívül, hogy bizonyos adminisztratív adatokat megdupláz, ténylegesen nem másol semmit (memórialapokat)! Az így megduplázott folyamat memórialapjaihoz hozzárendel még egy folyamatot, és megjegyzi azt, hogy amíg ezek a folyamatok békésen tudnak egymás mellett dolgozni, addig dolgozzanak ugyanazon, de ha konfliktus van, akkor majd lemásoljuk ezeket a memórialapokat. | ||
Ha a fork() hívás 0-val tér vissza: a gyerek folyamat kódja fut tovább. Ha egy negatív számmal tér vissza, fork() hiba történt, nem tudtuk létrehozni az új folyamatot, le kell kezelni. Ha pozitív számot adott vissza, akkor az eredményben a gyerekfolyamat azonosítója található, itt a szülőfolyamat fut tovább. | |||
Gyerek folyamat fut: az exec() az aktuális folyamat helyére betölt egy másik binárist. Az exec()-et meghívó folyamatnak az exec() kitörli a saját kontextusát, stb., betölt egy új programkódot, amit elkezd végrehajtani. (Kvázi mintha elindítana egy új folyamatot, de a folyamat már fut.) Ha nem sikerült betölteni a binárist (pl. nincs ilyen fájl), akkor hiba, visszatér az exec() is, egyébként nem: az új programkód utasításait hajtjuk végre. | |||
Tehát folyamat létrehozása UNIX-ban két lépésben: | |||
# fork() rendszerhívás = folyamatduplázás, majd | |||
# a gyerekfolyamat helyére az új programkód betöltése exec() hívással. | |||
Modern UNIX-okban fork() már nem igazán (más rendszerhívásokat használ). | |||
====fork(): Miért van szükség a fork() rendszerhívásnál a folyamat megduplázására?==== | ====fork(): Miért van szükség a fork() rendszerhívásnál a folyamat megduplázására?==== |