gramm (sm. [SVID 85]). Odnako dejstvie etih funkcij poho- zhe. 158 sohranennyj v rezul'tate raboty algoritma setjmp, ono ispolnit algoritm longjmp, kotoryj vosstanavlivaet kontekst iz prostranstva processa i imeet, kak i setjmp, kod zaversheniya, ravnyj 1. 6.4.5 Kopirovanie dannyh mezhdu adresnym prostranstvom sis- temy i adresnym prostranstvom zadachi Do sih por rech' shla o tom, chto process vypolnyaetsya v rezhime yadra ili v rezhime zadachi bez kakih-libo perekrytij (peresechenij) mezhdu rezhimami. Odna- ko, pri vypolnenii bol'shinstva sistemnyh funkcij, rassmotrennyh v poslednej glave, mezhdu prostranstvom yadra i prostranstvom zadachi osushchestvlyaetsya pere- sylka dannyh, naprimer, kogda idet kopirovanie parametrov vyzyvaemoj funkcii iz prostranstva zadachi v prostranstvo yadra ili kogda proizvoditsya peredacha dannyh iz buferov vvoda-vyvoda v processe vypolneniya funkcii read. Na mnogih mashinah yadro sistemy mozhet neposredstvenno ssylat'sya na adresa, prinadlezha- shchie adresnomu prostranstvu zadachi. YAdro dolzhno ubedit'sya v tom, chto adres, po kotoromu proizvoditsya zapis' ili schityvanie, dostupen, kak budto by rabo- ta vedetsya v rezhime zadachi; v protivnom sluchae proizoshlo by narushenie stan- dartnyh metodov zashchity i yadro, pust' neumyshlenno, stalo by obrashchat'sya k ad- resam, kotorye nahodyatsya za predelami adresnogo prostranstva zadachi (i, voz- mozhno, prinadlezhat strukturam dannyh yadra). Poetomu peredacha dannyh mezhdu prostranstvom yadra i prostranstvom zadachi yavlyaetsya "dorogim predpriyatiem", trebuyushchim dlya svoej realizacii neskol'kih komand. +--------------------------------------------------------+ | fubyte: # peresylka bajta iz | | # prostranstva zadachi | | prober $3,$1,*4(ap) # bajt dostupen ? | | beql eret # net | | movzbl *4(ap),r0 | | ret | | eret: | | mnegl $1,r0 # vozvrat oshibki (-1) | | ret | +--------------------------------------------------------+ Risunok 6.17. Peresylka dannyh iz prostranstva zadachi v prostranstvo yadra v sisteme VAX Na Risunke 6.17 pokazan primer realizovannoj v sisteme VAX programmy pe- resylki simvola iz adresnogo prostranstva zadachi v adresnoe prostranstvo yad- ra. Komanda prober proveryaet, mozhet li bajt po adresu, ravnomu (registr uka- zatelya argumenta + 4), byt' schitan v rezhime zadachi (rezhime 3), i esli net, yadro peredaet upravlenie po adresu eret, sohranyaet v nulevom registre -1 i vyhodit iz programmy; pri etom peresylki simvola ne proishodit. V protivnom sluchae yadro peresylaet odin bajt, nahodyashchijsya po ukazannomu adresu, v re- gistr 0 i vozvrashchaet ego v vyzyvayushchuyu programmu. Peresylka 1 simvola potre- bovala pyati komand (vklyuchaya vyzov funkcii s imenem fubyte). 6.5 UPRAVLENIE ADRESNYM PROSTRANSTVOM PROCESSA V etoj glave my poka govorili o tom, kakim obrazom osushchestvlyaetsya perek- lyuchenie konteksta mezhdu processami i kak kontekstnye urovni zapominayutsya v steke i vybirayutsya iz steka, predstavlyaya kontekst pol'zovatel'skogo urovnya kak staticheskij ob容kt, ne preterpevayushchij izmenenij pri vosstanovlenii kon- teksta processa. Odnako, s virtual'nym adresnym prostranstvom processa rabo- 159 tayut razlichnye sistemnye funkcii i, kak budet pokazano v sleduyushchej glave, vypolnyayut pri etom operacii nad oblastyami. V etom razdele rassmatrivaetsya informacionnaya struktura oblasti; sistemnye funkcii, realizuyushchie operacii nad oblastyami, budut rassmotreny v sleduyushchej glave. Zapis' tablicy oblastej soderzhit informaciyu, neobhodimuyu dlya opisaniya oblasti. V chastnosti, ona vklyuchaet v sebya sleduyushchie polya: * Ukazatel' na indeks fajla, soderzhimoe kotorogo bylo pervonachal'no zagru- zheno v oblast' * Tip oblasti (oblast' komand, razdelyaemaya pamyat', oblast' chastnyh dannyh ili steka) * Razmer oblasti * Mestopolozhenie oblasti v fizicheskoj pamyati * Status (sostoyanie) oblasti, predstavlyayushchij soboj kombinaciyu iz sleduyushchih priznakov: - zablokirovana - zaproshena - idet process ee zagruzki v pamyat' - gotova, zagruzhena v pamyat' * Schetchik ssylok, v kotorom hranitsya kolichestvo processov, ssylayushchihsya na dannuyu oblast'. K operaciyam raboty s oblastyami otnosyatsya: blokirovka oblasti, snyatie blokirovki s oblasti, vydelenie oblasti, prisoedinenie oblasti k prostranst- vu pamyati processa, izmenenie razmera oblasti, zagruzka oblasti iz fajla v prostranstvo pamyati processa, osvobozhdenie oblasti, otsoedinenie oblasti ot prostranstva pamyati processa i kopirovanie soderzhimogo oblasti. Naprimer, sistemnaya funkciya exec, v kotoroj soderzhimoe ispolnyaemogo fajla nakladyvaet- sya na adresnoe prostranstvo zadachi, otsoedinyaet starye oblasti, osvobozhdaet ih v tom sluchae, esli oni ne yavlyayutsya razdelyaemymi, vydelyaet novye oblasti, prisoedinyaet ih i zagruzhaet soderzhimym fajla. V ostal'noj chasti razdela ope- racii nad oblastyami opisyvayutsya bolee detal'no s orientaciej na model' up- ravleniya pamyat'yu, rassmotrennuyu ranee (s tablicami stranic i gruppami appa- ratnyh registrov), i s orientaciej na algoritmy naznacheniya stranic fiziches- koj pamyati i tablic stranic (glava 9). 6.5.1 Blokirovka oblasti i snyatie blokirovki Operacii blokirovki i snyatiya blokirovki dlya oblasti vypolnyayutsya nezavi- simo ot operacij vydeleniya i osvobozhdeniya oblasti, podobno tomu, kak opera- cii blokirovaniya-razblokirovaniya indeksa v fajlovoj sisteme vypolnyayutsya ne- zavisimo ot operacij naznacheniya-osvobozhdeniya indeksa (algoritmy iget i iput). Takim obrazom, yadro mozhet zablokirovat' i vydelit' oblast', a potom snyat' blokirovku, ne osvobozhdaya oblasti. Tochno takzhe, kogda yadru ponadobitsya obratit'sya k vydelennoj oblasti, ono smozhet zablokirovat' oblast', chtoby zapretit' dostup k nej so storony drugih processov, i pozdnee snyat' bloki- rovku. 6.5.2 Vydelenie oblasti YAdro vydelyaet novuyu oblast' (po algoritmu allocreg, Risunok 6.18) vo vremya vypolneniya sistemnyh funkcij fork, exec i shmget (poluchit' razdelyaemuyu pamyat'). YAdro podderzhivaet tablicu oblastej, zapisyam kotoroj sootvetstvuyut tochki vhoda libo v spiske svobodnyh oblastej, libo v spiske aktivnyh oblas- tej. Pri vydelenii zapisi v tablice oblastej yadro vybiraet iz spiska svobod- nyh oblastej pervuyu dostupnuyu zapis', vklyuchaet ee v spisok aktivnyh oblas- tej, blokiruet oblast' i delaet pometku o ee tipe (razdelyaemaya ili chastnaya). Za nekotorym isklyucheniem kazhdyj process associiruetsya s ispolnyaemym fajlom 160 (posle togo, kak byla vypolnena komanda exec), i v algoritme allocreg pole indeksa v zapisi tablicy oblastej ustanavlivaetsya takim obrazom, chtoby ono ukazyvalo na indeks ispolnyaemogo fajla. Indeks identificiruet oblast' dlya yadra, poetomu drugie processy mogut pri zhelanii razdelyat' oblast'. YAdro uve- lichivaet znachenie schetchika ssylok na indeks, chtoby pomeshat' drugim processam udalyat' soderzhimoe fajla pri vypolnenii funkcii unlink, ob etom eshche budet idti rech' v razdele 7.5. Rezul'tatom algoritma allocreg yavlyaetsya naznachenie i blokirovka oblasti. +------------------------------------------------------------+ | algoritm allocreg /* razmestit' informacionnuyu strukturu | | oblasti */ | | vhodnaya informaciya: (1) ukazatel' indeksa | | (2) tip oblasti | | vyhodnaya informaciya: zablokirovannaya oblast' | | { | | vybrat' oblast' iz spiska svobodnyh oblastej; | | naznachit' oblasti tip; | | prisvoit' znachenie ukazatelyu indeksa; | | esli (ukazatel' indeksa imeet nenulevoe znachenie) | | uvelichit' znachenie schetchika ssylok na indeks; | | vklyuchit' oblast' v spisok aktivnyh oblastej; | | vozvratit' (zablokirovannuyu oblast'); | | } | +------------------------------------------------------------+ Risunok 6.18. Algoritm vydeleniya oblasti 6.5.3 Prisoedinenie oblasti k processu YAdro prisoedinyaet oblast' k adresnomu prostranstvu processa vo vremya vy- polneniya sistemnyh funkcij fork, exec i shmat (algoritm attachreg, Risunok 6.19). Oblast' mozhet byt' vnov' naznachaemoj ili uzhe sushchestvuyushchej, kotoruyu process budet ispol'zovat' sovmestno s drugimi processami. YAdro vybiraet svobodnuyu zapis' v chastnoj tablice oblastej processa, ustanavlivaet v nej pole tipa takim obrazom, chtoby ono ukazyvalo na oblast' komand, dannyh, raz- delyaemuyu pamyat' ili oblast' steka, i zapisyvaet virtual'nyj adres, po koto- romu oblast' budet razmeshchat'sya v adresnom prostranstve processa. Process ne dolzhen vyhodit' za predel ustanovlennogo sistemoj ogranicheniya na maksimal'- nyj virtual'nyj adres, a virtual'nye adresa novoj oblasti ne dolzhny perese- kat'sya s adresami sushchestvuyushchih uzhe oblastej. Naprimer, esli sistema ograni- chila maksimal'no-dopustimoe znachenie virtual'nogo adresa processa 8 megabaj- tami, to privyazat' oblast' razmerom 1 megabajt k virtual'nomu adresu 7.5M ne udastsya. Esli zhe prisoedinenie oblasti dopustimo, yadro uvelichivaet znachenie polya, opisyvayushchego razmer oblasti processa v zapisi tablicy processov, na velichinu prisoedinyaemoj oblasti, a takzhe uvelichivaet znachenie schetchika ssy- lok na oblast'. Krome togo, v algoritme attachreg ustanavlivayutsya nachal'nye znacheniya gruppy registrov upravleniya pamyat'yu, vydelennyh processu. Esli oblast' ranee ne prisoedinyalas' k kakomu-libo processu, yadro s pomoshch'yu funkcii growreg (sm. sleduyushchij razdel) zavodit dlya oblasti novye tablicy stranic; v protiv- nom sluchae ispol'zuyutsya uzhe sushchestvuyushchie tablicy stranic. Algoritm zavershaet rabotu, vozvrashchaya ukazatel' na tochku vhoda v chastnuyu tablicu oblastej pro- cessa, sootvetstvuyushchuyu vnov' prisoedinennoj oblasti. Dopustim, naprimer, chto yadru nuzhno podklyuchit' k processu po virtual'nomu adresu 0 sushchestvuyushchuyu (raz- delyaemuyu) oblast', imeyushchuyu razmer 7 Kbajt (Risunok 6.20). Ono vydelyaet novuyu 161 +------------------------------------------------------------+ | algoritm attachreg /* prisoedinenie oblasti k processu */ | | vhodnaya informaciya: (1) ukazatel' na prisoedinyaemuyu ob- | | last' (zablokirovannuyu) | | (2) process, k kotoromu prisoedinyaetsya| | oblast' | | (3) virtual'nyj adres vnutri processa,| | po kotoromu budet prisoedinena ob-| | last' | | (4) tip oblasti | | vyhodnaya informaciya: tochka vhoda v chastnuyu tablicu oblastej| | processa | | { | | vydelit' novuyu zapis' v chastnoj tablice oblastej pro- | | cessa; | | proinicializirovat' znacheniya polej zapisi: | | ustanovit' ukazatel' na prisoedinyaemuyu oblast'; | | ustanovit' tip oblasti; | | ustanovit' virtual'nyj adres oblasti; | | proverit' pravil'nost' ukazaniya virtual'nogo adresa i | | razmera oblasti; | | uvelichit' znachenie schetchika ssylok na oblast'; | | uvelichit' razmer processa s uchetom prisoedineniya oblas-| | ti; | | zapisat' nachal'nye znacheniya v novuyu gruppu apparatnyh | | registrov; | | vozvratit' (tochku vhoda v chastnuyu tablicu oblastej pro-| | cessa); | | } | +------------------------------------------------------------+ Risunok 6.19. Algoritm prisoedineniya oblasti gruppu registrov upravleniya pamyat'yu i zanosit v nih adres tablicy stranic oblasti, virtual'nyj adres oblasti v prostranstve processa (0) i razmer tab- licy stranic (9 zapisej). 6.5.4 Izmenenie razmera oblasti Process mozhet rasshiryat' ili suzhat' svoe virtual'noe adresnoe prostranst- vo s pomoshch'yu funkcii sbrk. Tochno tak zhe i stek processa rasshiryaetsya avtoma- ticheski (to est' dlya etogo processu ne nuzhno yavno obrashchat'sya k opredelennoj funkcii) v sootvetstvii s glubinoj vlozhennosti obrashchenij k podprogrammam. Izmenenie razmera oblasti proizvoditsya vnutri yadra po algoritmu growreg (Ri- sunok 6.21). Pri rasshirenii oblasti yadro proveryaet, ne budut li virtual'nye adresa rasshiryaemoj oblasti peresekat'sya s adresami kakoj-nibud' drugoj ob- lasti i ne povlechet li rasshirenie oblasti za soboj vyhod processa za predely maksimal'no-dopustimogo virtual'nogo prostranstva pamyati. YAdro nikogda ne ispol'zuet algoritm growreg dlya uvelicheniya razmera razdelyaemoj oblasti, uzhe prisoedinennoj k neskol'kim processam; poetomu ono ne bespokoitsya o tom, ne privedet li uvelichenie razmera oblasti dlya odnogo processa k prevyshe- niyu drugim processom sistemnogo ogranicheniya, nakladyvaemogo na razmer pro- cessa. Pri rabote s sushchestvuyushchej oblast'yu yadro ispol'zuet algoritm growreg v dvuh sluchayah: vypolnyaya funkciyu sbrk po otnosheniyu k oblasti dannyh processa i realizuya avtomaticheskoe uvelichenie steka zadachi. Obe eti oblasti (dannyh i steka) chastnogo tipa. Oblasti komand i razdelyaemoj pamyati posle inicializa- 162 CHastnaya tablica oblastej processa +---------+-------------+--------+ | Adres | Virtual'nyj | Razmer | | tablicy | adres v pro-| i | | stranic | stranstve | zashchita | | | processa | | +---------+-------------+--------+ Tochka vhoda | | 0 | 9 | dlya oblasti +----+----+-------------+--------+ komand +----+ v +-------------+ | pusto | +-------------+ | pusto | +-------------+ | 846K | +-------------+ | 752K | +-------------+ | 341K | +-------------+ | 484K | +-------------+ | 976K | +-------------+ | 342K | +-------------+ | 779K | +-------------+ Risunok 6.20. Primer prisoedineniya sushchestvuyushchej oblasti komand cii ne mogut rasshiryat'sya. |tot moment budet poyasnen v sleduyushchej glave. CHtoby razmestit' rasshirennuyu pamyat', yadro vydelyaet novye tablicy stranic (ili rasshiryaet sushchestvuyushchie) ili otvodit dopolnitel'nuyu fizicheskuyu pamyat' v teh sistemah, gde ne podderzhivaetsya podkachka stranic po obrashcheniyu. Pri vyde- lenii dopolnitel'noj fizicheskoj pamyati yadro proveryaet ee nalichie pered vy- polneniem algoritma growreg; esli zhe pamyati bol'she net, yadro pribegaet k drugim sredstvam uvelicheniya razmera oblasti (sm. glavu 9). Esli process sok- rashchaet razmer oblasti, yadro prosto osvobozhdaet pamyat', otvedennuyu pod ob- last'. Vo vseh etih sluchayah yadro pereopredelyaet razmery processa i oblasti i pereustanavlivaet znacheniya polej zapisi chastnoj tablicy oblastej processa i registrov upravleniya pamyat'yu (tak, chtoby oni soglasovalis' s novym otobrazhe- niem pamyati). Predpolozhim, naprimer, chto oblast' steka processa nachinaetsya s virtual'- nogo adresa 128K i imeet razmer 6 Kbajt i chto yadru nuzhno rasshirit' etu ob- last' na 1 Kbajt (1 stranicu). Esli razmer processa pozvolyaet eto delat' i esli virtual'nye adresa v diapa- zone ot 134K do 135K - 1 ne prinadlezhat kakoj-libo oblasti, ranee prisoedi- nennoj k processu, yadro uvelichivaet razmer steka. Pri etom yadro rasshiryaet tablicu stranic, vydelyaet novuyu stranicu pamyati i inicializiruet novuyu za- pis' tablicy. |tot sluchaj proillyustrirovan s pomoshch'yu Risunka 6.22. 6.5.5 Zagruzka oblasti V sisteme, gde podderzhivaetsya podkachka stranic po obrashcheniyu, yadro mozhet 163 +------------------------------------------------------------+ | algoritm growreg /* izmenenie razmera oblasti */ | | vhodnaya informaciya: (1) ukazatel' na tochku vhoda v chastnoj| | tablice oblastej processa | | (2) velichina, na kotoruyu nuzhno izme- | | nit' razmer oblasti (mozhet byt' | | kak polozhitel'noj, tak i otrica- | | tel'noj) | | vyhodnaya informaciya: otsutstvuet | | { | | esli (razmer oblasti uvelichivaetsya) | | { | | proverit' dopustimost' novogo razmera oblasti; | | vydelit' vspomogatel'nye tablicy (stranic); | | esli (v sisteme ne podderzhivaetsya zameshchenie stranic | | po obrashcheniyu) | | { | | vydelit' dopolnitel'nuyu pamyat'; | | proinicializirovat' pri neobhodimosti znacheniya | | polej v dopolnitel'nyh tablicah; | | } | | } | | v protivnom sluchae /* razmer oblasti umen'shaetsya */ | | { | | osvobodit' fizicheskuyu pamyat'; | | osvobodit' vspomogatel'nye tablicy; | | } | | | | provesti v sluchae neobhodimosti inicializaciyu drugih | | vspomogatel'nyh tablic; | | pereustanovit' znachenie polya razmera v tablice proces- | | sov; | | } | +------------------------------------------------------------+ Risunok 6.21. Algoritm izmeneniya razmera oblasti "otobrazhat'" fajl v adresnoe prostranstvo processa vo vremya vypolneniya funk- cii exec, podgotavlivaya posleduyushchee chtenie po zaprosu otdel'nyh fizicheskih stranic (sm. glavu 9). Esli zhe podkachka stranic po obrashcheniyu ne podderzhiva- etsya, yadru prihoditsya kopirovat' ispolnyaemyj fajl v pamyat', zagruzhaya oblasti processa po ukazannym v fajle virtual'nym adresam. YAdro mozhet prisoedinit' oblast' k raznym virtual'nym adresam, po kotorym budet zagruzhat'sya soderzhi- moe fajla, sozdavaya takim obrazom "razryv" v tablice stranic (vspomnim Risu- nok 6.20). |ta vozmozhnost' mozhet prigodit'sya, naprimer, kogda trebuetsya pro- yavlyat' oshibku pamyati (memory fault) v sluchae obrashcheniya pol'zovatel'skih programm k nulevomu adresu (esli poslednee zapreshcheno). Peremennye ukazateli v programmah inogda zadayutsya neverno (otsutstvuet proverka ih znachenij na ravenstvo 0) i v rezul'tate ne mogut ispol'zovat'sya v kachestve ukazatelej adresov. Esli stranicu s nulevym adresom sootvetstvuyushchim obrazom zashchitit', processy, sluchajno obrativshiesya k etomu adresu, natolknutsya na oshibku i budut avarijno zaversheny, i eto uskorit obnaruzhenie podobnyh oshibok v programmah. Pri zagruzke fajla v oblast' algoritm loadreg (Risunok 6.23) proveryaet razryv mezhdu virtual'nym adresom, po kotoromu oblast' prisoedinyaetsya k pro- cessu, i virtual'nym adresom, s kotorogo raspolagayutsya dannye oblasti, i rasshiryaet oblast' v sootvetstvii s trebuemym ob容mom pamyati. Zatem oblast' 164 CHastnaya tablica oblastej CHastnaya tablica oblastej processa processa +-------+----------+------+ +-------+----------+------+ | Adres | Virtual'-| Raz- | | Adres | Virtual'-| Raz- | | tabli-| nyj adres| mer | | tabli-| nyj adres| mer | | cy | v prost- | i | | cy | v prost- | i | | stra- | ranstve | zashchi-| | stra- | ranstve | zashchi-| | nic | processa | ta | | nic | processa | ta | +-------+----------+------+ +-------+----------+------+ | | | | | | | | +-------+----------+------+ +-------+----------+------+ | | | | | | | | Tochka+-------+----------+------+ Tochka+-------+----------+------+ vhoda| | 128K | 6K | vhoda| | 128K | 7K | dlya +---+---+----------+------+ dlya +---+---+----------+------+ steka +--+ steka +--+ v v +-------------+ +-------------+ | 342K | | 342K | +-------------+ +-------------+ | 779K | | 779K | +-------------+ +-------------+ | 846K | | 846K | +-------------+ +-------------+ | 752K | | 752K | +-------------+ +-------------+ | 341K | | 341K | +-------------+ +-------------+ | 484K | | 484K | +-------------+ NOVAYA +-------------+ | | STRANICA-->| 976K | +-------------+ +-------------+ | | | | +-------------+ +-------------+ | | | | +-------------+ +-------------+ Do uvelicheniya steka Posle uvelicheniya steka Risunok 6.22. Uvelichenie oblasti steka na 1 Kbajt perevoditsya v sostoyanie "zagruzki v pamyat'", pri kotorom dannye dlya oblasti schityvayutsya iz fajla v pamyat' s pomoshch'yu vstroennoj modifikacii algoritma sistemnoj funkcii read. Esli yadro zagruzhaet oblast' komand, kotoraya mozhet razdelyat'sya neskol'ki- mi processami, vozmozhna situaciya, kogda process popytaetsya vospol'zovat'sya oblast'yu do togo, kak ee soderzhimoe budet polnost'yu zagruzheno, tak kak pro- cess zagruzki mozhet priostano- vit'sya vo vremya chteniya fajla. Podrobno o tom, kak eto proishodit i pochemu pri etom nel'zya ispol'zovat' blokirovki, my pogovorim, kogda budem vesti rech' o funkcii exec v sleduyushchej glave i v glave 9. CHtoby ustranit' etu prob- lemu, yadro proveryaet status oblasti i ne razreshaet k nej dostup do teh por, poka zagruzka oblasti ne budet zakonchena. Po zavershenii realizacii algoritma loadreg yadro vozobnovlyaet vypolnenie vseh processov, ozhidayushchih okonchaniya zagruzki oblasti, i izmenyaet status oblasti ("gotova, zagruzhena v pamyat'"). Predpolozhim, naprimer, chto yadru nuzhno zagruzit' tekst razmerom 7K v ob- last', prisoedinennuyu k processu po virtual'nomu adresu 0, no pri etom osta- vit' promezhutok razmerom 1 Kbajt ot nachala oblasti (Risunok 6.24). K etomu 165 +------------------------------------------------------------+ | algoritm loadreg /* zagruzka chasti fajla v oblast' */ | | vhodnaya informaciya: (1) ukazatel' na tochku vhoda v chastnuyu| | tablicu oblastej processa | | (2) virtual'nyj adres zagruzki | | (3) ukazatel' indeksa fajla | | (4) smeshchenie v bajtah do nachala schity-| | vaemoj chasti fajla | | (5) ob容m zagruzhaemyh dannyh v bajtah | | vyhodnaya informaciya: otsutstvuet | | { | | uvelichit' razmer oblasti do trebuemoj velichiny (algoritm| | growreg); | | zapisat' status oblasti kak "zagruzhaemoj v pamyat'"; | | snyat' blokirovku s oblasti; | | ustanovit' v prostranstve processa znacheniya parametrov | | chteniya iz fajla: | | virtual'nyj adres, po kotoromu budut razmeshcheny schi-| | tyvaemye dannye; | | smeshchenie do nachala schityvaemoj chasti fajla; | | ob容m dannyh, schityvaemyh iz fajla, v bajtah; | | zagruzit' fajl v oblast' (vstroennaya modifikaciya algo- | | ritma read); | | zablokirovat' oblast'; | | zapisat' status oblasti kak "polnost'yu zagruzhennoj v pa-| | myat'"; | | vozobnovit' vypolnenie vseh processov, ozhidayushchih okoncha-| | niya zagruzki oblasti; | | } | +------------------------------------------------------------+ Risunok 6.23. Algoritm zagruzki dannyh oblasti iz fajla vremeni yadro uzhe vydelilo zapis' v tablice oblastej i prisoedinilo oblast' po adresu 0 s pomoshch'yu algoritmov allocreg i attachreg. Teper' zhe yadro zapus- kaet algoritm loadreg, v kotorom dejstviya algoritma growreg vypolnyayutsya dvazhdy - vo-pervyh, pri vydelenii v nachale oblasti promezhutka v 1 Kbajt, i vo-vtoryh, pri vydelenii mesta dlya soderzhimogo oblasti - i algoritm growreg naznachaet dlya oblasti tablicu stranic. Zatem yadro zanosit v sootvetstvuyushchie polya prostranstva processa ustanovochnye znacheniya dlya chteniya dannyh iz fajla: schityvayutsya 7 Kbajt, nachinaya s adresa, ukazannogo v vide smeshcheniya vnutri fajla (parametr algoritma), i zapisyvayutsya v virtual'noe prostranstvo pro- cessa po adresu 1K. CHastnaya tablica oblastej CHastnaya tablica oblastej processa processa +-------+----------+------+ +-------+----------+------+ | Adres | Virtual'-| Raz- | | Adres | Virtual'-| Raz- | | tabli-| nyj adres| mer | | tabli-| nyj adres| mer | | cy | v prost- | i | | cy | v prost- | i | | stra- | ranstve | zashchi-| | stra- | ranstve | zashchi-| | nic | processa | ta | | nic | processa | ta | +-------+----------+------+ +-------+----------+------+ Tekst| --- | | 0 | | | 0 | 8 | +-------+----------+------+ +---+---+----------+------+ (a) Zapis' tablicy v pervo- +--+ nachal'nom vide | v 166 +-------------+ | pusto | CHastnaya tablica oblastej +-------------+ processa | 779K | +-------+----------+------+ +-------------+ | Adres | Virtual'-| Raz- | | 846K | | tabli-| nyj adres| mer | +-------------+ | cy | v prost- | i | | 752K | | stra- | ranstve | zashchi-| +-------------+ | nic | processa | ta | | 341K | +-------+----------+------+ +-------------+ | | 0 | 1 | | 484K | +---+---+----------+------+ +-------------+ +--+ | 976K | | +-------------+ v | 794K | +-------------+ +-------------+ | pusto | | | +-------------+ +-------------+ (b) Zapis', ukazyvayushchaya na (v) Posle vtorogo vypolne- promezhutok v nachale ob- niya algoritma growreg lasti (posle pervogo vypolneniya algoritma growreg) Risunok 6.24. Zagruzka oblasti komand (teksta) +------------------------------------------------------------+ | algoritm freereg /* osvobozhdenie vydelennoj oblasti */| | vhodnaya informaciya: ukazatel' na (zablokirovannuyu) oblast'| | vyhodnaya informaciya: otsutstvuet | | { | | esli (schetchik ssylok na oblast' imeet nenulevoe znache- | | nie) | | { | | /* oblast' vse eshche ispol'zuetsya odnim iz processov */| | snyat' blokirovku s oblasti; | | esli (oblast' associirovana s indeksom) | | snyat' blokirovku s indeksa; | | vozvratit' upravlenie; | | } | | esli (oblast' associirovana s indeksom) | | osvobodit' indeks (algoritm iput); | | osvobodit' svyazannuyu s oblast'yu fizicheskuyu pamyat'; | | osvobodit' svyazannye s oblast'yu vspomogatel'nye tablicy;| | ochistit' polya oblasti; | | vklyuchit' oblast' v spisok svobodnyh oblastej; | | snyat' blokirovku s oblasti; | | } | +------------------------------------------------------------+ Risunok 6.25. Algoritm osvobozhdeniya oblasti 167 6.5.6 Osvobozhdenie oblasti Esli oblast' ne prisoedinena uzhe ni k kakomu processu, ona mozhet byt' osvobozhdena yadrom i vozvrashchena v spisok svobodnyh oblastej (Risunok 6.25). Esli oblast' svyazana s indeksom, yadro osvobozhdaet i indeks s pomoshch'yu algo- ritma iput, uchityvaya znachenie schetchika ssylok na indeks, ustanovlennoe v al- goritme allocreg. YAdro osvobozhdaet vse svyazannye s oblast'yu fizicheskie re- sursy, takie kak tablicy stranic i sobstvenno stranicy fizicheskoj pamyati. Predpolozhim, naprimer, chto yadru nuzhno osvobodit' oblast' steka, opisannuyu na Risunke 6.22. Esli schetchik ssylok na oblast' imeet nulevoe znachenie, yadro osvobodit 7 stranic fizicheskoj pamyati vmeste s tablicej stranic. +------------------------------------------------------------+ | algoritm detachreg /* otsoedinit' oblast' ot processa */ | | vhodnaya informaciya: ukazatel' na tochku vhoda v chastnoj | | tablice oblastej processa | | vyhodnaya informaciya: otsutstvuet | | { | | obratit'sya k vspomogatel'nym tablicam processa, imeyushchim | | otnoshenie k raspredeleniyu pamyati, | | osvobodit' te iz nih, kotorye svyazany s oblast'yu; | | umen'shit' razmer processa; | | umen'shit' znachenie schetchika ssylok na oblast'; | | esli (znachenie schetchika stalo nulevym i oblast' ne yavlya-| | etsya neot容mlemoj chast'yu processa) | | osvobodit' oblast' (algoritm freereg); | | v protivnom sluchae /* libo znachenie schetchika otlichno | | ot 0, libo oblast' yavlyaetsya ne- | | ot容mlemoj chast'yu processa */ | | { | | snyat' blokirovku s indeksa (associirovannogo s ob- | | last'yu); | | snyat' blokirovku s oblasti; | | } | | } | +------------------------------------------------------------+ Risunok 6.26. Algoritm otsoedineniya oblasti 6.5.7 Otsoedinenie oblasti ot processa YAdro otsoedinyaet oblasti pri vypolnenii sistemnyh funkcij exec, exit i shmdt (otsoedinit' razdelyaemuyu pamyat'). Pri etom yadro korrektiruet sootvets- tvuyushchuyu zapis' i raz容dinyaet svyaz' s fizicheskoj pamyat'yu, delaya nedejstvi- tel'nymi svyazannye s oblast'yu registry upravleniya pamyat'yu (algoritm detachreg, Risunok 6.26). Mehanizm preobrazovaniya adresov posle etogo budet otnosit'sya uzhe k processu, a ne k oblasti (kak v algoritme freereg). YAdro umen'shaet znachenie schetchika ssylok na oblast' i znachenie polya, opisyvayushchego razmer processa v zapisi tablicy processov, v sootvetstvii s razmerom oblas- ti. Esli znachenie schetchika stanovitsya ravnym 0 i esli net prichiny ostavlyat' oblast' bez izmenenij (oblast' ne yavlyaetsya oblast'yu razdelyaemoj pamyati ili oblast'yu komand s priznakami neot容mlemoj chasti processa, o chem budet idti rech' v razdele 7.5), yadro osvobozhdaet oblast' po algoritmu freereg. V pro- tivnom sluchae yadro snimaet s indeksa i s oblasti blokirovku, ustanovlennuyu dlya togo, chtoby predotvratit' konkurenciyu mezhdu parallel'no vypolnyayushchimisya processami (sm. razdel 7.5), no ostavlyaet oblast' i ee resursy bez izmene- nij. 168 CHastnye tablicy oblastej processov Oblasti +--------------+ +-------------+ Komandy | +-------------->| Razdelyaemaya | +--------------+ +------->+-------------+ Dannye | +----+ | +--------------+ | | +-------------+ Stek | +--+ +-|------->| CHastnaya +-+ +--------------+ | | +-------------+ | Kopi- Process A | | | rova- | | +-------------+ | nie +---|------->| CHastnaya +-|-+ dan- +--------------+ | +-------------+ | | nyh Komandy | +------+ | | +--------------+ +-------------+ | | Dannye | +-------------->| CHastnaya |<+ | +--------------+ +-------------+ | Stek | +------+ | +--------------+ | +-------------+ | Process B +------->| CHastnaya |<--+ +-------------+ Risunok 6.27. Kopirovanie soderzhimogo oblasti +------------------------------------------------------------+ | algoritm dupreg /* kopirovanie soderzhimogo sushchestvuyushchej | | oblasti */ | | vhodnaya informaciya: ukazatel' na tochku vhoda v tablice ob-| | lastej | | vyhodnaya informaciya: ukazatel' na oblast', yavlyayushchuyusya toch- | | noj kopiej sushchestvuyushchej oblasti | | { | | esli (oblast' razdelyaemaya) | | /* v vyzyvayushchej programme schetchik ssylok na ob- | | last' budet uvelichen, posle chego budet ispol- | | nen algoritm attachreg */ | | vozvratit' (ukazatel' na ishodnuyu oblast'); | | vydelit' novuyu oblast' (algoritm allocreg); | | ustanovit' znacheniya vspomogatel'nyh struktur upravleniya| | pamyat'yu v tochnom sootvetstvii so znacheniyami sushchestvuyu-| | shchih struktur ishodnoj oblasti; | | vydelit' dlya soderzhimogo oblasti fizicheskuyu pamyat'; | | "skopirovat'" soderzhimoe ishodnoj oblasti vo vnov' soz-| | dannuyu oblast'; | | vozvratit' (ukazatel' na vydelennuyu oblast'); | | } | +------------------------------------------------------------+ Risunok 6.28. Algoritm kopirovaniya soderzhimogo sushchestvuyushchej oblasti 6.5.8 Kopirovanie soderzhimogo oblasti Sistemnaya funkciya fork trebuet, chtoby yadro skopirovalo soderzhimoe oblas- tej processa. Esli zhe oblast' razdelyaemaya (razdelyaemyj tekst komand ili raz- delyaemaya pamyat'), yadru net nadobnosti kopirovat' oblast' fizicheski; vmesto etogo ono uvelichivaet znachenie schetchika ssylok na oblast', pozvolyaya rodi- tel'skomu i porozhdennomu processam ispol'zovat' oblast' sovmestno. Esli ob- last' ne yavlyaetsya razdelyaemoj i yadru nuzhno fizicheski kopirovat' ee soderzhi- moe, ono vydelyaet novuyu zapis' v tablice oblastej, novuyu tablicu stranic i 169 otvodit pod sozdavaemuyu oblast' fizicheskuyu pamyat'. V kachestve primera rass- motrim Risunok 6.27, gde process A porozhdaet s pomoshch'yu funkcii fork process B i kopiruet oblasti roditel'skogo processa. Oblast' komand processa A yavlya- etsya razdelyaemoj, poetomu process B mozhet ispol'zovat' etu oblast' sovmestno s processom A. Odnako oblasti dannyh i steka roditel'skogo processa yavlyayutsya ego lichnoj prinadlezhnost'yu (imeyut chastnyj tip), poetomu processu B nuzhno skopirovat' ih soderzhimoe vo vnov' vydelennye oblasti. Pri etom dazhe dlya ob- lastej chastnogo tipa fizicheskoe kopirovanie oblasti ne vsegda neobhodimo, v chem my ubedimsya pozzhe (glava 9). Na Risunke 6.28 priveden algoritm kopirova- niya soderzhimogo oblasti (dupreg). 6.6 PRIOSTANOVKA VYPOLNENIYA K nastoyashchemu momentu my rassmotreli vse funkcii raboty s vnutrennimi strukturami processa, vypolnyayushchiesya na nizhnem urovne vzaimodejstviya s pro- cessom i obespechivayushchie perehod v sostoyanie "vypolneniya v rezhime yadra" i vy- hod iz etogo sostoyaniya v drugie sostoyaniya, za isklyucheniem funkcij, perevodya- shchih process v sostoyanie "priostanova vypolneniya". Teper' perejdem k rassmot- reniyu algoritmov, s pomoshch'yu kotoryh process perevoditsya iz sostoyaniya "vypol- neniya v rezhime yadra" v sostoyanie "priostanova v pamyati" i iz sostoyaniya pri- ostanova v sostoyaniya "gotovnosti k zapusku" s vygruzkoj i bez vygruzki iz pamyati. +-------------------------------+ | Kontekstnyj uroven' yadra 2 | | Ispolnit' programmu pere- | | klyucheniya konteksta | | | | Sohranit' registrovyj kon- | | tekst obrashcheniya k sistemnoj | | funkcii | Zapusk algoritma priostanova -+-------------------------------+ ^ | Kontekstnyj uroven' yadra 1 | | | Ispolnit' obrashchenie k sis- | | | temnoj funkcii | | |