Ocenite etot tekst:


        THE DESIGN OF THE UNIX OPERATING SYSTEM by Maurice J. Bach

                (Perevod s anglijskogo k.t.n. Kryukova A.V.)


        Copyright c 1986  Korporaciya Bell Telephone Laboratories.

        Izdano korporaciej Prentice-Hall.
        Otdelenie Simon & Schuster
        |nglvud Kliffs, N'yu-Dzhersi 07632

        Seriya knig po programmnomu obespecheniyu izdatel'stva Prentice Hall.
        Konsul'tant Brajan V. Kernigan

         Nastoyashchee izdanie prednaznacheno  dlya  rasprostraneniya  v  teh
     stranah, kotorye    poluchili   na   eto   pravo   ot   korporacii
     Prentice-Hall International. Ne podlezhit vyvozu i rasprostraneniyu
     v SSHA, Meksike i Kanade.

         UNIX - zaregistrirovannaya torgovaya marka korporacii AT&T.
         DEC, PDP i VAX - torgovye marki korporacii  Digital Equipment
     Corp. Series   32000   -   torgovaya   marka  korporacii  National
     Semiconductor Corp.  Ada - zaregistrirovannaya torgovaya marka pra-
     vitel'stva SSHA (Ada Joint Program Office). UNIVAC - torgovaya mar-
     ka korporacii Sperry Corp.
         Nastoyashchij dokument  nabran  na  fotonabornom ustrojstve APS-5
     korporacii AUTOLOGIC s pomoshch'yu  formatera  TROFF  v  operacionnoj
     srede UNIX |VM AT&T 3B20.

         V processe  podgotovki knigi ee avtorom i izdatelem bylo pri-
     lozheno nemalo usilij.  |ti usiliya byli svyazany s provedeniem teo-
     reticheskih razrabotok  i  issledovanij i s vsestoronnej proverkoj
     dejstvennosti teoreticheskih vykladok i programm. Avtor i izdatel'
     ne dayut nikakih garantij, kak yasno vyrazhennyh, tak i podrazumeva-
     yushchihsya, otnositel'no vklyuchennyh v knigu programm  i dokumentacii.
     Avtor i  izdatel'  ne otvechayut za sluchajnye ili proizvodnye nepo-
     ladki, voznikayushchie v svyazi ili v rezul'tate ustanovki, vypolneniya
     ili ispol'zovaniya etih programm.

         Vse prava sohranyayutsya.  Zapreshchaetsya vosproizvedenie otdel'nyh
     chastej knigi bez pis'mennogo razresheniya izdatelya.

         Otpechatano v Soedinennyh SHtatah Ameriki.

         10 9 8 7 6 5

         ISBN 0-13-201757-1  025

         Prentice-Hall International (UK) Limited, London
         Prentice-Hall of Australia Pty. Limited, Sidnej
         Prentice-Hall Canada Inc., Toronto
         Prentice-Hall Hispanoamericana, S.A., Mehiko
         Prentice-Hall of India Private Limited, N'yu-Deli
         Prentice-Hall of Japan, Inc., Tokio
         Prentice-Hall of Southeast Asia Pte. Ltd., Singapur
         Editora Prentice-Hall do Brasil, Ltda., Rio-de-ZHanejro
         Prentice-Hall, Inc., |nglvud Kliffs, N'yu-Dzhersi




    Vpervye  sistema  UNIX byla opisana v 1974 godu v stat'e Kena Tompsona i
Dennisa Richi v zhurnale "Communications of the ACM" [Thompson  74].  S  etogo
vremeni  ona  poluchila  shirokoe rasprostranenie i zavoevala shirokuyu populyar-
nost' sredi proizvoditelej |VM, kotorye vse chashche stali osnashchat' eyu svoi  ma-
shiny. Osoboj populyarnost'yu ona pol'zuetsya v universitetah, gde dovol'no chas-
to uchastvuet v issledovatel'skom i uchebnom processe.
    Mnozhestvo  knig  i  statej  posvyashcheno opisaniyu otdel'nyh chastej sistemy;
sredi nih dva special'nyh vypuska "Bell System Technical  Journal"  za  1978
god  [BSTJ 78] i za 1984 god [BSTJ 84]. Vo mnogih knigah opisyvaetsya pol'zo-
vatel'skij interfejs, v chastnosti ispol'zovanie elektronnoj pochty, podgotov-
ka dokumentacii, rabota s komandnym processorom Shell; v  nekotoryh  knigah,
takih kak "The UNIX Programming Environment" [Kernighan 84] i "Advanced UNIX
Programming"  [Rochkind  85],  opisyvaetsya  programmnyj interfejs. Nastoyashchaya
kniga posvyashchena opisaniyu vnutrennih algoritmov i struktur, sostavlyayushchih  os-
novu operacionnoj sistemy (t.n. "yadro"), i ob座asneniyu ih vzaimosvyazi s prog-
rammnym  interfejsom. Takim obrazom, ona budet polezna dlya rabotayushchih v raz-
lichnyh operacionnyh sredah. Vo-pervyh, ona mozhet ispol'zovat'sya  v  kachestve
uchebnogo posobiya po kursu "Operacionnye sistemy" kak dlya studentov posledne-
go  kursa,  tak  i dlya aspirantov pervogo goda obucheniya. Pri rabote s knigoj
bylo by gorazdo poleznee obrashchat'sya neposredstvenno k ishodnomu tekstu  sis-
temnyh  programm, no knigu mozhno chitat' i nezavisimo ot nego. Vo-vtoryh, eta
kniga mozhet sluzhit' v kachestve spravochnogo rukovodstva dlya  sistemnyh  prog-
rammistov, iz kotorogo poslednie mogli by luchshe uyasnit' sebe mehanizm raboty
yadra  operacionnoj  sistemy i sravnit' mezhdu soboj algoritmy, ispol'zuemye v
UNIX, i algoritmy, ispol'zuemye v  drugih  operacionnyh  sistemah.  Nakonec,
programmisty,  rabotayushchie  v srede UNIX, mogut uglubit' svoe ponimanie meha-
nizma vzaimodejstviya programm s operacionnoj sistemoj  i  posredstvom  etogo
prijti k napisaniyu bolee effektivnyh i sovershennyh programm.
    Soderzhanie  i  poryadok  postroeniya materiala v knige sootvetstvuyut kursu
lekcij, podgotovlennomu i  prochitannomu  mnoj  dlya  sotrudnikov  firmy  Bell
Laboratories,  vhodyashchej v sostav korporacii AT&T, mezhdu 1983 i 1984 gg. Nes-
motrya na to, chto glavnoe vnimanie v  kurse  lekcij  obrashchalos'  na  ishodnyj
tekst sistemnyh programm, ya obnaruzhil, chto ponimanie ishodnogo teksta obleg-
chaetsya, esli pol'zovatel' imeet predstavlenie o sistemnyh algoritmah. V kni-
ge  ya  pytalsya izlozhit' opisanie algoritmov kak mozhno proshche, chtoby i v malom
otrazit' prostotu i izyashchestvo rassmatrivaemoj  operacionnoj  sistemy.  Takim
obrazom,  kniga  predstavlyaet soboj ne tol'ko podrobnoe istolkovanie osoben-
nostej sistemy na anglijskom yazyke; eto izobrazhenie obshchego mehanizma  raboty
razlichnyh  algoritmov, i chto gorazdo vazhnee, eto otrazhenie processa ih vzai-
modejstviya mezhdu soboj. Algoritmy predstavleny  na  psevdokode,  pohozhem  na
yazyk Si, poskol'ku chitatelyu legche vosprinimat' opisanie na estestvennom yazy-
ke; naimenovaniya algoritmov sootvetstvuyut imenam procedur, sostavlyayushchih yadro
operacionnoj  sistemy. Risunki opisyvayut vzaimodejstvie razlichnyh informaci-
onnyh struktur pod upravleniem operacionnoj sistemy. V poslednih glavah mno-
gie sistemnye ponyatiya illyustriruyutsya s pomoshch'yu nebol'shih programm  na  yazyke
Si.  V celyah ekonomii mesta i obespecheniya yasnosti izlozheniya iz etih primerov
isklyuchen kontrol' vozniknoveniya oshibok, kotoryj obychno predusmatrivaetsya pri
napisanii programm. |ti primery progonyalis' mnoyu pod upravleniem  versii  V;
za  isklyucheniem  programm, illyustriruyushchih osobennosti, prisushchie versii V, ih
mozhno vypolnyat' pod upravleniem drugih versij operacionnoj sistemy.
    Bol'shoe chislo uprazhnenij, podgotovlennyh pervonachal'no dlya kursa lekcij,
privedeno v konce kazhdoj glavy, oni sostavlyayut klyuchevuyu chast' knigi. Otdel'-
nye uprazhneniya, illyustriruyushchie osnovnye ponyatiya, razmeshcheny neposredstvenno v
tekste  knigi.  Drugaya  chast' uprazhnenij otlichaetsya bol'shej slozhnost'yu, pos-
kol'ku ih prednaznachenie sostoit v tom, chtoby pomoch' chitatelyu uglubit'  svoe
ponimanie  osobennostej  sistemy.  I,  nakonec, chast' uprazhnenij yavlyaetsya po

                                     3

prirode issledovatel'skoj, prednaznachennoj dlya izucheniya  otdel'nyh  problem.
Uprazhneniya povyshennoj slozhnosti pomecheny zvezdochkami.
    Sistemnoe  opisanie baziruetsya na osobennostyah operacionnoj sistemy UNIX
versiya V redakciya 2, rasprostraneniem kotoroj zanimaetsya korporaciya AT&T,  s
uchetom otdel'nyh osobennostej redakcii 3. |to ta sistema, s kotoroj ya naibo-
lee  znakom,  odnako ya postaralsya otrazit' i interesnye detali drugih razno-
vidnostej operacionnyh sistem, v chastnosti  sistem,  rasprostranyaemyh  cherez
"Berkeley  Software  Distribution" (BSD). YA ne kasalsya voprosov, svyazannyh s
harakteristikami otdel'nyh apparatnyh sredstv, starayas' tol'ko v obshchih  cher-
tah  ohvatit' process vzaimodejstviya yadra operacionnoj sistemy s apparatnymi
sredstvami i ignoriruya harakternye osobennosti fizicheskoj konfiguracii.  Tem
ne  menee, tam, gde voprosy, svyazannye s mashinnymi osobennostyami, predstavi-
lis' mne vazhnymi s tochki zreniya ponimaniya mehanizma  funkcionirovaniya  yadra,
okazalos'  umestnym  i uglublenie v detali. Po krajnej mere, beglyj prosmotr
zatronutyh v knige voprosov yasno ukazyvaet te sostavnye  chasti  operacionnoj
sistemy, kotorye yavlyayutsya naibolee mashinno-zavisimymi.
    Obshchenie  s knigoj predpolagaet nalichie u chitatelya opyta programmirovaniya
na odnom iz yazykov vysokogo urovnya i zhelatel'no na yazyke assemblera. CHitate-
lyu rekomenduetsya priobresti opyt raboty s operacionnoj sistemoj UNIX i  poz-
nakomit'sya s yazykom programmirovaniya Si [Kernighan 78]. Tem ne menee, ya sta-
ralsya  izlozhit' material v knige takim obrazom, chtoby chitatel' smog ovladet'
im dazhe pri otsutstvii trebuemyh navykov. V  prilozhenii  k  knige  privedeno
kratkoe opisanie obrashchenij k operacionnoj sisteme, kotorogo budet dostatochno
dlya togo, chtoby poluchit' predstavlenie o soderzhanii knigi, no kotoroe ne mo-
zhet sluzhit' v kachestve polnogo spravochnogo rukovodstva.
    Material  v  knige postroen sleduyushchim obrazom. Glava 1 sluzhit vvedeniem,
soderzhashchim kratkoe, obshchee opisanie sistemnyh  osobennostej  s  tochki  zreniya
pol'zovatelya  i ob座asnyayushchim strukturu sistemy. V glave 2 daetsya obshchee preds-
tavlenie ob arhitekture yadra i poyasnyayutsya nekotorye osnovnye ponyatiya. V  os-
tal'noj  chasti knigi osveshchayutsya voprosy, svyazannye s obshchej arhitekturoj sis-
temy i opisaniem ee razlichnyh komponent kak blokov edinoj konstrukcii. V nej
mozhno vydelit' tri razdela: fajlovaya sistema, upravlenie processami i vopro-
sy, svyazannye s razvitiem. Fajlovaya sistema predstavlena  pervoj,  poskol'ku
ee  ponimanie legche po sravneniyu s upravleniem processami. Tak, glava 3 pos-
vyashchena opisaniyu mehanizma funkcionirovaniya sistemnogo bufera  sverhoperativ-
noj  pamyati (kesha), sostavlyayushchego osnovu fajlovoj sistemy. Glava 4 opisyvaet
informacionnye struktury i algoritmy, ispol'zuemye fajlovoj sistemoj. V etih
algoritmah ispol'zuyutsya metody, ob座asnyaemye v glave 3, dlya vedeniya  vnutren-
nej  "buhgalterii",  neobhodimoj  dlya  upravleniya pol'zovatel'skimi fajlami.
Glava 5 posvyashchena opisaniyu obrashchenij k operacionnoj  sisteme,  obsluzhivayushchih
interfejs  pol'zovatelya s fajlovoj sistemoj; dlya obespecheniya dostupa k pol'-
zovatel'skim fajlam ispol'zuyutsya algoritmy glavy 4.
    Osnovnoe vnimanie v glave 6 udelyaetsya upravleniyu processami. V nej opre-
delyaetsya ponyatie konteksta processa i  issleduyutsya  vnutrennie  sostavlyayushchie
yadra  operacionnoj  sistemy,  upravlyayushchie  kontekstom processa. V chastnosti,
rassmatrivaetsya obrashchenie k operacionnoj sisteme, obrabotka preryvanij i pe-
reklyuchenie konteksta. V glave 7 analiziruyutsya te sistemnye operacii, kotorye
upravlyayut kontekstom processa. Glava 8 kasaetsya planirovaniya processov, gla-
va 9 - raspredeleniya pamyati, vklyuchaya sistemy podkachki i zameshcheniya stranic.
    V glave 10 daetsya obzor obshchih osobennostej vzaimodejstviya, kotoroe obes-
pechivayut drajvery ustrojstv, osoboe vnimanie udelyaetsya diskovym i terminal'-
nym drajveram. Nesmotrya na to, chto ustrojstva logicheski vhodyat v sostav faj-
lovoj sistemy, ih rassmotrenie do etogo momenta otkladyvalos' v svyazi s voz-
niknoveniem voprosov, svyazannyh s  upravleniem  processami,  pri  obsuzhdenii
terminal'nyh  drajverov. |ta glava takzhe sluzhit mostikom k voprosam, svyazan-
nym s razvitiem sistemy, kotorye rassmatrivayutsya v konce knigi. Glava 11 ka-
saetsya vzaimodejstviya processov i organizacii setej, v tom chisle  soobshchenij,
ispol'zuemyh  v  versii V, razdeleniya pamyati, semaforov i paketov BSD. Glava
12 soderzhit kompaktnoe izlozhenie osobennostej dvuhprocessornoj sistemy UNIX,

                                     4

v glave 13 issleduyutsya dvuhmashinnye raspredelennye vychislitel'nye sistemy.
    Material, predstavlennyj v pervyh devyati glavah, mozhet byt'  prochitan  v
processe  izucheniya  kursa  "Operacionnye sistemy" v techenie odnogo semestra,
material ostal'nyh glav sleduet izuchat' na operezhayushchih  seminarah  s  paral-
lel'nym vypolneniem prakticheskih zadanij.
    Teper'  mne  by hotelos' predupredit' chitatelya o sleduyushchem. YA ne pytalsya
ocenit' proizvoditel'nost' sistemy v absolyutnom vyrazhenii, ne kasalsya i  pa-
rametrov konfiguracii, neobhodimyh dlya installyacii sistemy. |ti dannye menya-
yutsya  v zavisimosti ot tipa mashiny, konfiguracii kompleksa tehnicheskih sred-
stv, versii i realizacii sistemy, sostava zadach. Krome togo,  ya  soznatel'no
izbegal  lyubyh predskazanij po povodu dal'nejshego razvitiya operacionnoj sis-
temy UNIX. Izlozhenie voprosov, svyazannyh s razvitiem, ne podkrepleno  obyaza-
tel'stvom korporacii AT&T obespechit' sootvetstvuyushchie harakteristiki, dazhe ne
garantiruetsya  to,  chto sootvetstvuyushchie oblasti yavlyayutsya ob容ktom issledova-
niya.
    Mne priyatno vyrazit' blagodarnost' mnogim druz'yam i kollegam  za  pomoshch'
pri  napisanii  etoj knigi i za konstruktivnye kriticheskie zamechaniya, vyska-
zannye pri oznakomlenii s rukopis'yu. YA dolzhen vyrazit'  glubochajshuyu  prizna-
tel'nost'  YAnu Dzhonstonu, kotoryj posovetoval mne napisat' etu knigu, okazal
mne podderzhku na nachal'nom etape i prosmotrel nabrosok pervyh glav. YAn  otk-
ryl  mne mnogie sekrety remesla i ya vsegda budu v dolgu pered nim. Doris Ra-
jan takzhe podderzhivala menya s samogo nachala, i ya vsegda budu cenit' ee  dob-
rotu  i  vnimatel'nost'.  Dennis  Richi dobrovol'no otvetil na mnogochislennye
voprosy, kasayushchiesya istoricheskogo i tehnicheskogo aspektov sistemy. Mnozhestvo
lyudej pozhertvovali svoim vremenem i silami na oznakomlenie s variantami  ru-
kopisi, poyavlenie etoj knigi vo mnogom obyazano vyskazannym imi podrobnym za-
mechaniyam.  Sredi nih Debbi Bech, Dug Bajer, Lenni Brendvejn, Stiv Baroff, Tom
Batler, Ron Gomes, Mesat Gandak, Laura Izrejel, Din Dzhegels, Kejt  Kelleman,
Brajan  Kernigan,  Bob  Martin, Bob Mitc, Dejv Novic, Majkl Poppers, Merilin
Sefran, Kurt SHimmel', Zui Spitc, Tom Veden, Bill Veber, Lerri Ver i Bob Zer-
rou. Meri Frustak pomogala podgotovit' rukopis' k naboru. YA hotel  by  takzhe
poblagodarit'  moe  rukovodstvo za postoyannuyu podderzhku, kotoruyu ya oshchushchal na
vsem protyazhenii raboty,i kolleg za atmosferu, sposobstvovavshuyu mne v rabote,
i za zamechatel'nye usloviya, predostavlennye firmoj AT&T  Bell  Laboratories.
Dzhon  Vejt i personal izdatel'stva Prentice-Hall okazali samuyu raznoobraznuyu
pomoshch' v pridanii knige ee okonchatel'nogo vida. Poslednej po spisku,  no  ne
po  velichine  yavilas'  pomoshch'  moej zheny, Debbi, okazavshej mne emocional'nuyu
podderzhku, bez kotoroj ya by ne dostig uspeha.






















                                     5


    GLAVA 1




    Za  vremya,  proshedshee  s  momenta ee poyavleniya v 1969 godu, sistema UNIX
stala dovol'no populyarnoj i poluchila rasprostranenie na mashinah s  razlichnoj
moshchnost'yu  obrabotki, ot mikroprocessorov do bol'shih |VM, obespechivaya na nih
obshchie usloviya vypolneniya programm. Sistema delitsya na dve chasti. Odnu  chast'
sostavlyayut  programmy i servisnye funkcii, to, chto delaet operacionnuyu sredu
UNIX takoj populyarnoj; eta chast' legko dostupna pol'zovatelyam, ona  vklyuchaet
takie programmy, kak komandnyj processor, obmen soobshcheniyami, pakety obrabot-
ki tekstov i sistemy obrabotki ishodnyh tekstov programm. Drugaya chast' vklyu-
chaet  v sebya sobstvenno operacionnuyu sistemu, podderzhivayushchuyu eti programmy i
funkcii. V etoj knige daetsya detal'noe opisanie sobstvenno operacionnoj sis-
temy. Osnovnoe vnimanie koncentriruetsya na opisanii sistemy UNIX  versii  V,
rasprostraneniem kotoroj zanimaetsya korporaciya AT&T, pri etom rassmatrivayut-
sya  interesnye osobennosti i drugih versij. Privodyatsya osnovnye informacion-
nye struktury i algoritmy, ispol'zuemye v operacionnoj sisteme i v  konechnom
itoge  sozdayushchie usloviya dlya funkcionirovaniya standartnogo pol'zovatel'skogo
interfejsa.
    Dannaya glava sluzhit vvedeniem v sistemu UNIX. V nej delaetsya obzor isto-
rii ee sozdaniya i namechayutsya kontury obshchej struktury  sistemy.  V  sleduyushchej
glave soderzhitsya bolee detal'naya vvodnaya informaciya po operacionnoj sisteme.




    V  1965  godu firma Bell Telephone Laboratories, ob容diniv svoi usiliya s
kompaniej General Electric i proektom MAC  Massachusetskogo  tehnologicheskogo
instituta,  pristupili  k  razrabotke novoj operacionnoj sistemy, poluchivshej
nazvanie Multics [Organick 72]. Pered sistemoj Multics byli postavleny zada-
chi - obespechit' odnovremennyj dostup  k  resursam  |VM  bol'shogo  kolichestva
pol'zovatelej,  obespechit' dostatochnuyu skorost' vychislenij i hranenie dannyh
i dat' vozmozhnost' pol'zovatelyam v sluchae neobhodimosti sovmestno  ispol'zo-
vat'  dannye. Mnogie razrabotchiki, vposledstvii prinyavshie uchastie v sozdanii
rannih redakcij sistemy UNIX, uchastvovali v rabote nad  sistemoj  Multics  v
firme  Bell Laboratories. Hotya pervaya versiya sistemy Multics i byla zapushchena
v 1969 godu na |VM GE 645, ona ne obespechivala vypolnenie  glavnyh  vychisli-
tel'nyh zadach, dlya resheniya kotoryh ona prednaznachalas', i ne bylo dazhe yasno,
kogda  celi  razrabotki  budut  dostignuty.  Poetomu firma Bell Laboratories
prekratila svoe uchastie v proekte.
    Po okonchanii raboty nad proektom Multics  sotrudniki  Issledovatel'skogo
centra po informatike firmy Bell Laboratories ostalis' bez "dostatochno inte-
raktivnogo  vychislitel'nogo  sredstva" [Ritchie 84a]. Pytayas' usovershenstvo-
vat' sredu programmirovaniya, Ken Tompson, Dennis Richi i drugie nabrosali  na
bumage  proekt  fajlovoj  sistemy,  poluchivshij pozdnee dal'nejshee razvitie v
rannej versii fajlovoj sistemy UNIX. Tompsonom byli napisany programmy, imi-
tiruyushchie povedenie predlozhennoj fajlovoj sistemy v rezhime podkachki dannyh po
zaprosu, im bylo dazhe sozdano prostejshee yadro operacionnoj sistemy  dlya  |VM
GE  645.  V  to  zhe  vremya  on  napisal na Fortrane igrovuyu programmu "Space
Travel" ("Kosmicheskoe puteshestvie") dlya sistemy GECOS  (Honeywell  635),  no
programma ne smogla udovletvorit' pol'zovatelej, poskol'ku upravlyat' "kosmi-
cheskim  korablem" okazalos' slozhno, krome togo, pri zagruzke programma zani-
mala mnogo mesta. Pozzhe Tompson obnaruzhil maloispol'zuemyj komp'yuter  PDP-7,
osnashchennyj  horoshim  graficheskim  displeem i imeyushchij deshevoe mashinnoe vremya.
Sozdavaya programmu "Kosmicheskoe puteshestvie" dlya PDP-7, Tompson poluchil voz-
mozhnost' izuchit' mashinu, odnako usloviya razrabotki programm potrebovali  is-

                                     6

pol'zovaniya  kross-assemblera  dlya translyacii programmy na mashine s sistemoj
GECOS i ispol'zovaniya perfolenty dlya vvoda v PDP-7. Dlya togo, chtoby uluchshit'
usloviya razrabotki, Tompson i Richi vypolnili na PDP-7 svoj  proekt  sistemy,
vklyuchivshij  pervuyu  versiyu fajlovoj sistemy UNIX, podsistemu upravleniya pro-
cessami i nebol'shoj nabor utilit. V konce koncov, novaya  sistema  bol'she  ne
nuzhdalas' v podderzhke so storony sistemy GECOS v kachestve operacionnoj sredy
razrabotki  i  mogla podderzhivat' sebya sama. Novaya sistema poluchila nazvanie
UNIX, po shodstvu s Multics ego pridumal eshche odin  sotrudnik  Issledovatel'-
skogo centra po informatike Brajan Kernigan.
    Nesmotrya na to, chto eta rannyaya versiya sistemy UNIX uzhe byla mnogoobeshchayu-
shchej,  ona  ne  mogla realizovat' svoj potencial do teh por, poka ne poluchila
primenenie v real'nom proekte. Tak, dlya togo, chtoby obespechit'  funkcioniro-
vanie   sistemy   obrabotki   tekstov   dlya  patentnogo  otdela  firmy  Bell
Laboratories, v 1971 godu sistema UNIX byla perenesena na |VM PDP-11. Siste-
ma otlichalas' nebol'shim ob容mom: 16 Kbajt dlya sistemy, 8 Kbajt dlya  programm
pol'zovatelej, obsluzhivala disk ob容mom 512 Kbajt i otvodila pod kazhdyj fajl
ne  bolee  64 Kbajt. Posle svoego pervogo uspeha Tompson sobralsya bylo napi-
sat' dlya novoj sistemy translyator s Fortrana, no vmesto etogo zanyalsya yazykom
Bi (B), predshestvennikom kotorogo yavilsya yazyk BCPL [Richards 69]. Bi byl in-
terpretiruemym yazykom so vsemi nedostatkami, prisushchimi podobnym yazykam, poe-
tomu Richi peredelal ego v novuyu raznovidnost', poluchivshuyu nazvanie Si (C)  i
razreshayushchuyu  generirovat'  mashinnyj  kod, ob座avlyat' tipy dannyh i opredelyat'
strukturu dannyh. V 1973 godu sistema byla napisana zanovo na  Si,  eto  byl
shag,  neslyhannyj  dlya togo vremeni, no imevshij ogromnyj rezonans sredi sto-
ronnih pol'zovatelej. Kolichestvo mashin firmy Bell Laboratories,  na  kotoryh
byla  installirovana sistema, vozroslo do 25, v rezul'tate chego byla sozdana
gruppa po sistemnomu soprovozhdeniyu UNIX vnutri firmy.
    V to vremya korporaciya AT&T ne  mogla  zanimat'sya  prodazhej  komp'yuternyh
produktov  v svyazi s sootvetstvuyushchim soglasheniem, podpisannym eyu s federal'-
nym pravitel'stvom v 1956 godu, i rasprostranyala sistemu UNIX sredi  univer-
sitetov,  kotorym  ona  byla nuzhna v uchebnyh celyah. Sleduya bukve soglasheniya,
korporaciya AT&T ne reklamirovala, ne prodavala i  ne  soprovozhdala  sistemu.
Nesmotrya na eto, populyarnost' sistemy ustojchivo rosla. V 1974 godu Tompson i
Richi opublikovali stat'yu, opisyvayushchuyu sistemu UNIX, v zhurnale Communications
of the ACM [Thompson 74], chto dalo eshche odin impul's k rasprostraneniyu siste-
my.  K  1977 godu kolichestvo mashin, na kotoryh funkcionirovala sistema UNIX,
uvelichilos' do 500, pri chem 125 iz nih  rabotali  v  universitetah.  Sistema
UNIX zavoevala populyarnost' sredi telefonnyh kompanij, poskol'ku obespechiva-
la  horoshie usloviya dlya razrabotki programm, obsluzhivala rabotu v seti v re-
zhime dialoga i rabotu v real'nom masshtabe vremeni (s  pomoshch'yu  sistemy  MERT
[Lycklama 78a]). Pomimo universitetov, licenzii na sistemu UNIX byli pereda-
ny  kommercheskim  organizaciyam.  V  1977 godu korporaciya Interactive Systems
stala pervoj organizaciej, poluchivshej prava na pereprodazhu  sistemy  UNIX  s
nadbavkoj k cene za dopolnitel'nye uslugi (*), kotorye zaklyuchalis' v adapta-
cii  sistemy k funkcionirovaniyu v avtomatizirovannyh sistemah upravleniya uch-
rezhdencheskoj deyatel'nost'yu. 1977 god takzhe byl otmechen  "perenosom"  sistemy
UNIX na mashinu, otlichnuyu ot PDP (blagodarya chemu stal vozmozhen zapusk sistemy
na  drugoj  mashine  bez izmenenij ili s nebol'shimi izmeneniyami), a imenno na
Interdata 8/32.
    S rostom populyarnosti mikroprocessorov drugie kompanii stali  perenosit'
sistemu  UNIX  na novye mashiny, odnako ee prostota i yasnost' pobudili mnogih
razrabotchikov k samostoyatel'nomu razvitiyu sistemy, v  rezul'tate  chego  bylo

---------------------------
(*) Organizacii, poluchivshie prava na pereprodazhu s nadbavkoj k cene  za  do-
     polnitel'nye  uslugi, osnashchayut vychislitel'nuyu sistemu prikladnymi prog-
     rammami, kasayushchimisya konkretnyh oblastej primeneniya, stremyas'  udovlet-
     vorit'  trebovaniya  rynka.  Takie  organizacii  chashche prodayut prikladnye
     programmy, nezheli operacionnye sistemy,  pod  upravleniem  kotoryh  eti
     programmy rabotayut.
                                     7

sozdano  neskol'ko  variantov  bazisnoj sistemy. Za period mezhdu 1977 i 1982
godom firma Bell Laboratories ob容dinila neskol'ko variantov,  razrabotannyh
v korporacii AT&T, v odin, poluchivshij kommercheskoe nazvanie UNIX versiya III.
V  dal'nejshem  firma Bell Laboratories dobavila v versiyu III neskol'ko novyh
osobennostej, nazvav novyj produkt UNIX versiya V (**), i  eta  versiya  stala
oficial'no  rasprostranyat'sya  korporaciej  AT&T  s yanvarya 1983 goda. V to zhe
vremya sotrudniki Kalifornijskogo universiteta v Berkli  razrabotali  variant
sistemy UNIX, poluchivshij nazvanie BSD 4.3 dlya mashin serii VAX i otlichayushchijsya
nekotorymi novymi, interesnymi osobennostyami. Osnovnoe vnimanie v etoj knige
koncentriruetsya  na  opisanii sistemy UNIX versii V, odnako vremya ot vremeni
my budem kasat'sya i osobennostej sistemy BSD.
    K nachalu 1984 goda sistema UNIX byla uzhe  installirovana  priblizitel'no
na  100000  mashin po vsemu miru, pri chem na mashinah s shirokim diapazonom vy-
chislitel'nyh vozmozhnostej - ot mikroprocessorov do bol'shih |VM  -  i  raznyh
izgotovitelej. Ni o kakoj drugoj operacionnoj sisteme nel'zya bylo by skazat'
togo  zhe. Populyarnost' i uspeh sistemy UNIX ob座asnyalis' neskol'kimi prichina-
mi:

* Sistema napisana na yazyke vysokogo urovnya, blagodarya chemu ee legko chitat',
  ponimat', izmenyat' i perenosit' na drugie mashiny.  Po  ocenkam,  sdelannym
  Richi, pervyj variant sistemy na Si imel na 20-40 % bol'shij ob容m i rabotal
  medlennee  po sravneniyu s variantom na assemblere, odnako preimushchestva is-
  pol'zovaniya yazyka vysokogo urovnya  namnogo  pereveshivayut  nedostatki  (sm.
  [Ritchie 78b], str. 1965).
* Nalichie dovol'no prostogo pol'zovatel'skogo interfejsa, v kotorom imeetsya
  vozmozhnost' predostavlyat' vse neobhodimye pol'zovatelyu uslugi.
* Nalichie elementarnyh sredstv, pozvolyayushchih sozdavat' slozhnye  programmy  iz
  bolee prostyh.
* Nalichie ierarhicheskoj fajlovoj sistemy, legkoj v soprovozhdenii i effektiv-
  noj v rabote.
* Obespechenie soglasovaniya formatov v fajlah, rabota s posledovatel'nym po-
  tokom bajtov, blagodarya chemu oblegchaetsya chtenie prikladnyh programm.
* Nalichie prostogo, posledovatel'nogo interfejsa s periferijnymi ustrojstva-
  mi.
* Sistema yavlyaetsya mnogopol'zovatel'skoj, mnogozadachnoj; kazhdyj pol'zovatel'
  mozhet odnovremenno vypolnyat' neskol'ko processov.
* Arhitektura mashiny skryta ot pol'zovatelya, blagodarya etomu  oblegchen  pro-
  cess  napisaniya programm, rabotayushchih na razlichnyh konfiguraciyah apparatnyh
  sredstv.
    Prostota  i  posledovatel'nost' voobshche otlichayut sistemu UNIX i ob座asnyayut
bol'shinstvo iz vysheprivedennyh dovodov v ee pol'zu.
    Hotya operacionnaya sistema i bol'shinstvo komand napisany na  Si,  sistema
UNIX  podderzhivaet  ryad  drugih  yazykov, takih kak Fortran, Bejsik, Paskal',
Ada, Kobol, Lisp i Prolog. Sistema UNIX mozhet podderzhivat' lyuboj yazyk  prog-
rammirovaniya, dlya kotorogo imeetsya kompilyator ili interpretator, i obespechi-
vat'  sistemnyj  interfejs, ustanavlivayushchij sootvetstvie mezhdu pol'zovatel'-
skimi zaprosami k operacionnoj sisteme i naborom zaprosov, prinyatyh v UNIX.




    Na Risunke 1.1 izobrazhena arhitektura verhnego urovnya sistemy UNIX. Teh-
nicheskie sredstva, pokazannye v centre diagrammy, vypolnyayut funkcii, obespe-
chivayushchie funkcionirovanie operacionnoj sistemy  i  perechislennye  v  razdele
1.5.  Operacionnaya  sistema  vzaimodejstvuet  s  apparaturoj neposredstvenno

---------------------------
(**)  A chto zhe versiya IV ? Modifikaciya vnutrennego varianta sistemy poluchila
     nazvanie "versiya V".
                                     8

(***), obespechivaya obsluzhivanie programm i ih nezavisimost' ot detalej appa-
ratnoj konfiguracii. Esli predstavit' sistemu sostoyashchej iz  plastov,  v  nej
mozhno vydelit' sistemnoe yadro, izolirovannoe ot pol'zovatel'skih

            +---------+----------------------------------+
            |         |  Drugie prikladnye programmy     |
            |    +----+-------+--------+-------+----+    |
            |    | srr| nroff |   sh   |  who  |    |    |
            |    |    +-------+--------+-------+ a. |    |
            |    +----+          YAdro          |out |    |
            |    |    |    +--------------+    |    |    |
            |    |comr|    |              |    +----+    |
            |    |    |    | Tehnicheskie  |    |    |    |
            | cc +----+    |              |    |date|    |
            |    |    |    |   sredstva   |    |    |    |
            |    | as |    |              |    +----+    |
            |    |    |    +--------------+    |    |    |
            |    +----+                        |    |    |
            |    |    +-------+--------+-------+ wc |    |
            |    | ld |  vi   |   ed   |  grep |    |    |
            |    +----+-------+--------+-------+----+    |
            |         |  Drugie prikladnye programmy     |
            +---------+----------------------------------+

                Risunok 1.1. Arhitektura sistemy UNIX


programm. Poskol'ku programmy ne zavisyat ot apparatury, ih legko  perenosit'
iz  odnoj  sistemy UNIX v druguyu, funkcioniruyushchuyu na drugom komplekse tehni-
cheskih sredstv, esli tol'ko v etih programmah ne  podrazumevaetsya  rabota  s
konkretnym  oborudovaniem.  Naprimer, programmy, raschitannye na opredelennyj
razmer mashinnogo slova, gorazdo trudnee perevodit' na drugie mashiny po srav-
neniyu s programmami, ne trebuyushchimi podobnyh ustanovlenij.
    Programmy, podobnye komandnomu processoru shell i redaktoram (ed i vi) i
pokazannye na vneshnem po otnosheniyu k yadru sloe, vzaimodejstvuyut s yadrom  pri
pomoshchi horosho opredelennogo nabora obrashchenij k operacionnoj sisteme. Obrashche-
niya  k  operacionnoj sisteme ponuzhdayut yadro k vypolneniyu razlichnyh operacij,
kotoryh trebuet vyzyvayushchaya programma, i obespechivayut obmen dannymi mezhdu yad-
rom i programmoj. Nekotorye iz programm, privedennyh na risunke, v standart-
nyh konfiguraciyah sistemy izvestny kak komandy, odnako na odnom urovne s ni-
mi mogut raspolagat'sya i dostupnye pol'zovatelyu programmy, takie  kak  prog-
ramma a.out, standartnoe imya dlya ispolnyaemogo fajla, sozdannogo kompilyatorom
s  yazyka  Si. Drugie prikladnye programmy raspolagayutsya vyshe ukazannyh prog-
ramm, na verhnem urovne, kak eto pokazano na risunke. Naprimer,  standartnyj
kompilyator  s yazyka Si, cc, raspolagaetsya na samom vneshnem sloe: on vyzyvaet
preprocessor dlya Si, assembler i  zagruzchik  (komponovshchik),  t.e.  otdel'nye
programmy predydushchego urovnya. Hotya na risunke privedena dvuhurovnevaya ierar-
hiya prikladnyh programm, pol'zovatel' mozhet rasshirit' ierarhicheskuyu struktu-
ru  na stol'ko urovnej, skol'ko neobhodimo. V samom dele, stil' programmiro-

---------------------------
(***) V nekotoryh realizaciyah sistemy UNIX operacionnaya sistema vzaimodejst-
      vuet  s  sobstvennoj  operacionnoj  sistemoj, kotoraya, v svoyu ochered',
      vzaimodejstvuet s apparaturoj i vypolnyaet neobhodimye funkcii po  obs-
      luzhivaniyu  sistemy. V takih realizaciyah dopuskaetsya installyaciya drugih
      operacionnyh sistem s zagruzkoj pod ih upravleniem prikladnyh programm
      parallel'no s sistemoj UNIX. Klassicheskim primerom podobnoj realizacii
      yavilas' sistema MERT [Lycklama 78a]. Bolee novym primerom  mogut  slu-
      zhit'  realizacii  dlya  komp'yuterov  serii IBM 370 [Felton 84] i UNIVAC
      1100 [Bodenstab 84].
                                     9

vaniya, prinyatyj v sisteme UNIX, dopuskaet  razrabotku  kombinacii  programm,
vypolnyayushchih odnu i tu zhe, obshchuyu zadachu.
    Mnogie  prikladnye  podsistemy i programmy, sostavlyayushchie verhnij uroven'
sistemy, takie kak komandnyj processor shell, redaktory, SCCS (sistema obra-
botki ishodnyh tekstov programm) i pakety programm podgotovki  dokumentacii,
postepenno stanovyatsya sinonimom ponyatiya "sistema UNIX". Odnako vse oni pol'-
zuyutsya  uslugami  programm  nizhnih urovnej i v konechnom schete yadra s pomoshch'yu
nabora obrashchenij k operacionnoj sisteme. V versii V prinyato 64 tipa  obrashche-
nij k operacionnoj sisteme, iz kotoryh nemnogim men'she poloviny ispol'zuyutsya
chasto.  Oni  imeyut neslozhnye parametry, chto oblegchaet ih ispol'zovanie, pre-
dostavlyaya pri etom bol'shie vozmozhnosti pol'zovatelyu. Nabor obrashchenij k  ope-
racionnoj sisteme vmeste s realizuyushchimi ih vnutrennimi algoritmami sostavlya-
yut  "telo" yadra, v svyazi s chem rassmotrenie operacionnoj sistemy UNIX v etoj
knige svoditsya k podrobnomu izucheniyu i analizu obrashchenij k sisteme i ih vza-
imodejstviya mezhdu soboj. Koroche govorya, yadro realizuet funkcii,  na  kotoryh
osnovyvaetsya vypolnenie vseh prikladnyh programm v sisteme UNIX, i im zhe op-
redelyayutsya  eti funkcii. V knige chasto upotreblyayutsya terminy "sistema UNIX",
"yadro" ili "sistema", odnako pri etom imeetsya vvidu yadro operacionnoj siste-
my UNIX, chto i dolzhno vytekat' iz konteksta.




    V etom razdele kratko rassmatrivayutsya glavnye  detali  sistemy  UNIX,  v
chastnosti  fajlovaya sistema, sreda vypolneniya processov i elementy struktur-
nyh blokov (naprimer, kanaly). Podrobnoe  issledovanie  vzaimodejstviya  etih
detalej s yadrom soderzhitsya v posleduyushchih glavah.




    Fajlovaya sistema UNIX harakterizuetsya:
    * ierarhicheskoj strukturoj,
    * soglasovannoj obrabotkoj massivov dannyh,
    * vozmozhnost'yu sozdaniya i udaleniya fajlov,
    * dinamicheskim rasshireniem fajlov,
    * zashchitoj informacii v fajlah,
    * traktovkoj periferijnyh ustrojstv (takih kak terminaly i lentochnye us-
      trojstva) kak fajlov.
    Fajlovaya  sistema  organizovana v vide dereva s odnoj ishodnoj vershinoj,
kotoraya nazyvaetsya kornem (zapisyvaetsya: "/"); kazhdaya vershina v  drevovidnoj
strukture fajlovoj sistemy, krome list'ev, yavlyaetsya katalogom fajlov, a faj-

                               /
    +-------------+------------+---------+---------+---------+
    |             |            |         |         |         |
   fsl           bin          etc       usr       unix      dev
  +-+-+       +---+---+        |       +-+-+               +-+-+
  |   |       |   |   |        |       |   |               |   |
 mjb maury   sh  date who    passwd   src bin          tty00 tty01
                                       |
                                       |
                                      cmd
                                   +---+---+
                                   |       |
                                 date.c  who.c

    Risunok 1.2. Primer drevovidnoj struktury fajlovoj sistemy


                                     10


ly,  sootvetstvuyushchie dochernim vershinam, yavlyayutsya libo katalogami, libo obych-
nymi fajlami, libo fajlami ustrojstv. Imeni fajla predshestvuet ukazanie puti
poiska, kotoryj opisyvaet mesto raspolozheniya fajla v ierarhicheskoj strukture
fajlovoj sistemy. Imya puti poiska sostoit iz  komponent,  razdelennyh  mezhdu
soboj naklonnoj chertoj (/); kazhdaya komponenta
predstavlyaet soboj nabor simvolov, sostavlyayushchih imya vershiny (fajla), kotoroe
yavlyaetsya  unikal'nym dlya kataloga (predydushchej komponenty), v kotorom ono so-
derzhitsya. Polnoe imya puti poiska nachinaetsya s  ukazaniya  naklonnoj  cherty  i
identificiruet  fajl  (vershinu),  poisk kotorogo vedetsya ot kornevoj vershiny
dereva fajlovoj sistemy s obhodom teh vetvej dereva fajlov, kotorye sootvet-
stvuyut imenam otdel'nyh komponent. Tak,  puti  "/etc/passwd",  "/bin/who"  i
"/usr/src/cmd/who.c"  ukazyvayut na fajly, yavlyayushchiesya vershinami dereva, izob-
razhennogo na Risunke 1.2, a puti "/bin/passwd" i "/usr/ src/date.c" soderzhat
nevernyj marshrut. Imya puti poiska neobyazatel'no dolzhno nachinat'sya s kornya, v
nem sleduet ukazyvat' marshrut otnositel'no tekushchego dlya vypolnyaemogo proces-
sa kataloga, pri etom predydushchie simvoly  "naklonnaya  cherta"  v  imeni  puti
opuskayutsya.  Tak,  naprimer,  esli  my  nahodimsya v kataloge "/dev", to put'
"tty01" ukazyvaet fajl, polnoe imya puti poiska dlya kotorogo "/dev
/tty01".
    Programmy, vypolnyaemye pod upravleniem sistemy UNIX, ne soderzhat nikakoj
informacii otnositel'no vnutrennego formata, v  kotorom  yadro  hranit  fajly
dannyh,  dannye  v  programmah predstavlyayutsya kak besformatnyj potok bajtov.
Programmy mogut interpretirovat' potok bajtov po svoemu  zhelaniyu,  pri  etom
lyubaya  interpretaciya  nikak ne budet svyazana s fakticheskim sposobom hraneniya
dannyh v operacionnoj sisteme. Tak, sintaksicheskie pravila, opredelyayushchie za-
danie metoda dostupa k dannym v fajle, ustanavlivayutsya sistemoj  i  yavlyayutsya
edinymi  dlya  vseh programm, odnako semantika dannyh opredelyaetsya konkretnoj
programmoj. Naprimer, programma formatirovaniya teksta  troff  ishchet  v  konce
kazhdoj  stroki  teksta  simvoly  perehoda na novuyu stroku, a programma ucheta
sistemnyh resursov acctcom rabotaet  s  zapisyami  fiksirovannoj  dliny.  Obe
programmy  pol'zuyutsya odnimi i temi zhe sistemnymi sredstvami dlya osushchestvle-
niya dostupa k dannym v fajle kak k potoku bajtov, i vnutri sebya  preobrazuyut
etot  potok  po  sootvetstvuyushchemu formatu. Esli lyubaya iz programm obnaruzhit,
chto format dannyh neveren, ona prinimaet sootvetstvuyushchie mery.
    Katalogi pohozhi na obychnye fajly v odnom otnoshenii; sistema predstavlyaet
informaciyu v kataloge naborom bajtov, no eta informaciya vklyuchaet v sebya ime-
na fajlov v kataloge v ob座avlennom formate dlya togo, chtoby operacionnaya sis-
tema i programmy, takie kak ls (vyvodit spisok  imen  i  atributov  fajlov),
mogli ih obnaruzhit'.
    Prava dostupa k fajlu reguliruyutsya ustanovkoj special'nyh bitov razreshe-
niya dostupa, svyazannyh s fajlom. Ustanavlivaya bity razresheniya dostupa, mozhno
nezavisimo  upravlyat'  vydachej razreshenij na chtenie, zapis' i vypolnenie dlya
treh kategorij pol'zovatelej: vladel'ca  fajla,  gruppovogo  pol'zovatelya  i
prochih. Pol'zovateli mogut sozdavat' fajly, esli razreshen dostup k katalogu.
Vnov'  sozdannye  fajly stanovyatsya list'yami v drevovidnoj strukture fajlovoj
sistemy.
    Dlya pol'zovatelya sistema UNIX traktuet ustrojstva tak, kak esli  by  oni
byli fajlami. Ustrojstva, dlya kotoryh naznacheny special'nye fajly ustrojstv,
stanovyatsya vershinami v strukture fajlovoj sistemy. Obrashchenie programm k ust-
rojstvam imeet tot zhe samyj sintaksis, chto i obrashchenie k obychnym fajlam; se-
mantika operacij chteniya i zapisi po otnosheniyu k ustrojstvam v bol'shoj stepe-
ni  sovpadaet  s  semantikoj operacij chteniya i zapisi obychnyh fajlov. Sposob
zashchity ustrojstv sovpadaet so sposobom zashchity obychnyh fajlov: putem sootvet-
stvuyushchej ustanovki bitov razresheniya dostupa k nim (fajlam). Poskol'ku  imena
ustrojstv  vyglyadyat tak zhe, kak i imena obychnyh fajlov, i poskol'ku nad ust-
rojstvami i nad obychnymi fajlami vypolnyayutsya odni i te zhe operacii, bol'shin-
stvu programm net neobhodimosti razlichat' vnutri  sebya  tipy  obrabatyvaemyh
fajlov.

                                     11

    Naprimer, rassmotrim programmu na yazyke Si (Risunok 1.3), v kotoroj soz-
daetsya  novaya kopiya sushchestvuyushchego fajla. Predpolozhim, chto ispolnyaemaya versiya
programmy imeet naimenovanie copy. Dlya zapuska programmy pol'zovatel' vvodit
s terminala:

     copy oldfile newfile

gde oldfile - imya sushchestvuyushchego fajla, a newfile - imya  sozdavaemogo  fajla.
Sistema  vypolnyaet  proceduru main, prisvaivaya argumentu argc znachenie koli-
chestva parametrov v spiske argv, a kazhdomu elementu  massiva  argv  znachenie
parametra,  soobshchennogo pol'zovatelem. V privedennom primere argc imeet zna-
chenie 3, element argv[0] soderzhit stroku simvolov "copy" (imya programmy  us-
lovno  yavlyaetsya  nulevym parametrom), argv[1] - stroku simvolov "oldfile", a
argv[2] - stroku simvolov "newfile". Zatem programma  proveryaet,  pravil'noe
li kolichestvo parametrov bylo ukazano pri ee zapuske. Esli eto tak, zapuska-
etsya  operaciya  open  (otkryt')  dlya  fajla oldfile s parametrom "read-only"
(tol'ko dlya chteniya), v sluchae uspeshnogo vypolneniya kotoroj zapuskaetsya  ope-
raciya  creat  (otkryt')  dlya fajla newfile. Rezhim dostupa k vnov' sozdannomu
fajlu opisyvaetsya chislom 0666 (v vos'mirichnom kode), chto oznachaet razreshenie
dostupa k fajlu dlya chteniya i zapisi dlya vseh pol'zovatelej. Vse obrashcheniya  k
operacionnoj  sisteme  v  sluchae neudachi vozvrashchayut kod -1; esli zhe neudachno
zavershayutsya operacii open i creat, programma vydaet  soobshchenie  i  zapuskaet
operaciyu  exit  (vyjti)  s  vozvrashcheniem koda sostoyaniya, ravnogo 1, zavershaya
svoyu rabotu i ukazyvaya na vozniknovenie oshibki.
    Operacii open i creat vozvrashchayut celoe znachenie, yavlyayushcheesya deskriptorom
fajla i ispol'zuemoe programmoj v posleduyushchih ssylkah na fajly. Posle  etogo
programma vyzyvaet podprogrammu copy, vypolnyayushchuyu v cikle operaciyu read (chi-
tat'),  po kotoroj proizvoditsya chtenie v bufer porcii simvolov iz sushchestvuyu-
shchego fajla, i operaciyu write (pisat') dlya zapisi informacii  v  novyj  fajl.
Operaciya  read kazhdyj raz vozvrashchaet kolichestvo prochitannyh bajtov (0 - esli
dostignut konec fajla). Cikl zavershaetsya, esli dostignut konec fajla ili es-
li proizoshla oshibka pri vypolnenii operacii read (otsutstvuet kontrol'  voz-
niknoveniya  oshibok pri vypolnenii operacii write). Zatem upravlenie iz podp-
rogrammy copy vozvrashchaetsya v osnovnuyu programmu i zapuskaetsya operaciya  exit
s kodom sostoyaniya 0 v kachestve parametra, chto ukazyvaet na uspeshnoe zavershe-
nie vypolneniya programmy.

    Programma kopiruet lyubye fajly, ukazannye pri ee vyzove v kachestve argu-
mentov,  pri  uslovii, chto razresheno otkrytie sushchestvuyushchego fajla i sozdanie
novogo fajla. Fajl mozhet vklyuchat' v sebya kak tekst, kotoryj mozhet byt' vyve-
den na pechatayushchee ustrojstvo, naprimer, ishodnyj tekst programmy, tak i sim-
voly, ne vyvodimye na pechat', dazhe samu programmu. Takim obrazom, oba  vyzo-
va:

    copy copy.c newcopy.c
    copy copy newcopy

yavlyayutsya  dopustimymi.  Sushchestvuyushchij fajl takzhe mozhet byt' katalogom. Napri-
mer, po vyzovu:

    copy . dircontents

kopiruetsya soderzhimoe tekushchego kataloga, oboznachennogo simvolom ".", v obych-
nyj fajl "dircontents"; informaciya v novom fajle sovpadaet, vplot' do kazhdo-
go bajta, s soderzhimym kataloga, tol'ko etot fajl obychnogo tipa (dlya  sozda-
niya  novogo kataloga prednaznachena operaciya mknod). Nakonec, lyuboj iz fajlov
mozhet byt' fajlom ustrojstva. Naprimer, programma, vyzvannaya sleduyushchim obra-
zom:


                                     12

    +------------------------------------------------------------+
    | #include                                          |
    | char buffer[2048];                                         |
    | int version = 1;        /* budet ob座asneno v glave 2 */    |
    |                                                            |
    | main(argc,argv)                                            |
    |      int argc;                                             |
    |      char *argv[];                                         |
    | {                                                          |
    |      int fdold,fdnew;                                      |
    |                                                            |
    |      if (argc != 3)                                        |
    |      {                                                     |
    |             printf("need 2 arguments for copy program\n);  |
    |             exit(1);                                       |
    |      }                                                     |
    |      fdold = open(argv[1],O_RDONLY);  /* otkryt' ishodnyj  |
    |                                          fajl tol'ko dlya   |
    |                                          chteniya */         |
    |      if (fdold == -1)                                      |
    |      {                                                     |
    |             printf("cannot open file %s\n",argv[1]);       |
    |             exit(1);                                       |
    |      }                                                     |
    |      fdnew = creat(argv[2],0666);  /* sozdat' novyj fajl s |
    |                                       razresheniem chteniya i |
    |                                       zapisi dlya vseh pol'-|
    |                                       zovatelej */         |
    |      if (fdnew == -1)                                      |
    |      {                                                     |
    |             printf("cannot create file %s\n",argv[2]);     |
    |             exit(1);                                       |
    |      }                                                     |
    |      copy(fdold,fdnew);                                    |
    |      exit(0);                                              |
    | }                                                          |
    |                                                            |
    | copy(old,new)                                              |
    |      int old,new;                                          |
    | {                                                          |
    |      int count;                                            |
    |                                                            |
    |      while ((count = read(old,buffer,sizeof(buffer))) > 0) |
    |             write(new,buffer,count);                       |
    | }                                                          |
    +------------------------------------------------------------+

              Risunok 1.3. Programma kopirovaniya fajla


    copy /dev/tty terminalread

chitaet simvoly, vvodimye s terminala (fajl /dev/tty sootvetstvuet  terminalu
pol'zovatelya),  i  kopiruet ih v fajl terminalread, zavershaya rabotu tol'ko v
tom sluchae, esli pol'zovatel' nazhmet
. Pohozhaya forma zapuska programmy:

    copy /dev/tty /dev/tty


                                     13

vyzyvaet chtenie simvolov s terminala i ih kopirovanie obratno na terminal.


    1.3.2 Sreda vypolneniya processov

Programmoj nazyvaetsya ispolnyaemyj fajl, a processom nazyvaetsya posledo- vatel'nost' operacij programmy ili chast' programmy pri ee vypolnenii. V sis- teme UNIX mozhet odnovremenno vypolnyat'sya mnozhestvo processov (etu osoben- nost' inogda nazyvayut mul'tiprogrammirovaniem ili mnogozadachnym rezhimom), pri chem ih chislo logicheski ne ogranichivaetsya, i mnozhestvo chastej programmy (takoj kak copy) mozhet odnovremenno nahodit'sya v sisteme. Razlichnye sistem- nye operacii pozvolyayut processam porozhdat' novye processy, zavershayut proces- sy, sinhroniziruyut vypolnenie etapov processa i upravlyayut reakciej na nas- tuplenie razlichnyh sobytij. Blagodarya razlichnym obrashcheniyam k operacionnoj sisteme, processy vypolnyayutsya nezavisimo drug ot druga. Naprimer, process, vypolnyayushchijsya v programme, privedennoj na Risunke 1.4, zapuskaet operaciyu fork, chtoby porodit' novyj process. Novyj process, imenuemyj porozhdennym processom, poluchaet znachenie koda zaversheniya operacii fork, ravnoe 0, i aktiviziruet operaciyu execl, kotoraya vypolnyaet programmu copy (Risunok 1.3). Operaciya execl zagruzhaet fajl "copy", kotoryj predpolo- zhitel'no nahoditsya v tekushchem kataloge, v adresnoe prostranstvo porozhdennogo processa i zapuskaet programmu s parametrami, poluchennymi ot pol'zovatelya. V sluchae uspeshnogo vypolneniya operacii execl upravlenie v vyzvavshij ee process ne vozvrashchaetsya, poskol'ku process vypolnyaetsya v novom adresnom prostranstve (podrobnee ob etom v glave 7). Tem vremenem, process, zapustivshij operaciyu fork (roditel'skij process), poluchaet nenulevoe znachenie koda zaversheniya operacii, vyzyvaet operaciyu wait, kotoraya priostanavlivaet ego vypolnenie do teh por, poka ne zakonchitsya vypolnenie programmy copy, i zavershaetsya (kazhdaya programma imeet vyhod v konce glavnoj procedury, posle kotoroj raspolagayutsya programmy standartnyh bibliotek Si, podklyuchaemye v processe kompilyacii). Naprimer, esli ispolnyaemaya programma nazyvaetsya run, pol'zovatel' zapuskaet ee sleduyushchim obrazom: +------------------------------------------------------------+ | main(argc,argv) | | int argc; | | char *argv[]; | | { | | /* predusmotreno 2 argumenta: ishodnyj fajl i novyj fajl */| | if (fork() == 0) | | execl("copy","copy",argv[1],argv[2],0); | | wait((int *)0) | | printf("copy done\n"); | | } | +------------------------------------------------------------+ Risunok 1.4. Programma porozhdeniya novogo processa, vypolnyayushchego kopiro- vanie fajlov run oldfile newfile Process vypolnyaet kopirovanie fajla s imenem "oldfile" v fajl s imenem "newfile" i vyvodit soobshchenie. Hotya dannaya programma malo chto dobavila k programme "copy", v nej poyavilis' chetyre osnovnyh obrashcheniya k operacionnoj sisteme, upravlyayushchie vypolneniem processov: fork, exec, wait i exit. Voobshche ispol'zovanie obrashchenij k operacionnoj sisteme daet vozmozhnost' pol'zovatelyu sozdavat' programmy, vypolnyayushchie slozhnye dejstviya, i kak sleds- tvie, yadro operacionnoj sistemy UNIX ne vklyuchaet v sebya mnogie funkcii, yav- 14 lyayushchiesya chast'yu "yadra" v drugih sistemah. Takie funkcii, i sredi nih kompi- lyatory i redaktory, v sisteme UNIX yavlyayutsya programmami pol'zovatel'skogo urovnya. Naibolee harakternym primerom podobnoj programmy mozhet sluzhit' ko- mandnyj processor shell, s kotorym obychno vzaimodejstvuyut pol'zovateli posle vhoda v sistemu. Shell interpretiruet pervoe slovo komandnoj stroki kak imya komandy: vo mnogih komandah, v tom chisle i v komandah fork (porodit' novyj process) i exec (vypolnit' porozhdennyj process), sama komanda associiruetsya s ee imenem, vse ostal'nye slova v komandnoj stroke traktuyutsya kak parametry komandy. Shell obrabatyvaet komandy treh tipov. Vo-pervyh, v kachestve imeni ko- mandy mozhet byt' ukazano imya ispolnyaemogo fajla v ob容ktnom kode, poluchenno- go v rezul'tate kompilyacii ishodnogo teksta programmy (naprimer, programmy na yazyke Si). Vo-vtoryh, imenem komandy mozhet byt' imya komandnogo fajla, so- derzhashchego nabor komandnyh strok, obrabatyvaemyh shell'om. Nakonec, komanda mozhet byt' vnutrennej komandoj yazyka shell (v otlichie ot ispolnyaemogo faj- la). Nalichie vnutrennih komand delaet shell yazykom programmirovaniya v dopol- nenie k funkciyam komandnogo processora; komandnyj yazyk shell vklyuchaet koman- dy organizacii ciklov (for-in-do-done i while-do-done), komandy vypolneniya po usloviyam (if-then-else-fi), operator vybora, komandu izmeneniya tekushchego dlya processa kataloga (cd) i nekotorye drugie. Sintaksis shell'a dopuskaet sravnenie s obrazcom i obrabotku parametrov. Pol'zovatelyam, zapuskayushchim ko- mandy, net neobhodimosti znat', kakogo tipa eti komandy. Komandnyj processor shell ishchet imena komand v ukazannom nabore katalo- gov, kotoryj mozhno izmenit' po zhelaniyu pol'zovatelya, vyzvav shell. Shell obychno ispolnyaet komandu sinhronno, s ozhidaniem zaversheniya vypolneniya koman- dy prezhde, chem schitat' sleduyushchuyu komandnuyu stroku. Tem ne menee, dopuskaetsya i asinhronnoe ispolnenie, kogda ocherednaya komandnaya stroka schityvaetsya i is- polnyaetsya, ne dozhidayas' zaversheniya vypolneniya predydushchej komandy. O koman- dah, vypolnyaemyh asinhronno, govoryat, chto oni vypolnyayutsya na fone drugih ko- mand. Naprimer, vvod komandy who vyzyvaet vypolnenie sistemoj programmy, hranyashchejsya v fajle /bin/who (****) i osushchestvlyayushchej vyvod spiska pol'zovatelej, ko- torye v nastoyashchij moment rabotayut s sistemoj. Poka komanda who vypolnyaetsya, komandnyj processor shell ozhidaet zaversheniya ee vypolneniya i tol'ko zatem zaprashivaet u pol'zovatelya sleduyushchuyu komandu. Esli zhe vvesti komandu who & sistema vypolnit programmu who na fone i shell gotov nemedlenno prinyat' sle- duyushchuyu komandu. V sredu vypolneniya kazhdogo processa v sisteme UNIX vklyuchaetsya tekushchij katalog. Tekushchij dlya processa katalog yavlyaetsya nachal'nym katalogom, imya ko- torogo prisoedinyaetsya ko vsem imenam putej poiska, kotorye ne nachinayutsya s naklonnoj cherty. Pol'zovatel' mozhet zapustit' vnutrennyuyu komandu shell'a cd (izmenit' katalog) dlya peremeshcheniya po derevu fajlovoj sistemy i dlya smeny tekushchego kataloga. Komandnaya stroka cd /usr/src/uts delaet tekushchim katalog "/usr/src/uts". Komandnaya stroka cd ../.. --------------------------- (****) Katalog "/bin" soderzhit bol'shinstvo neobhodimyh komand i obychno vho- dit v chislo katalogov, v kotoryh vedet poisk komandnyj processor shell. 15 delaet tekushchim katalog, kotoryj na dve vershiny "blizhe" k kornyu (kornevomu katalogu): parametr ".." otnositsya k katalogu, yavlyayushchemusya roditel'skim dlya tekushchego. Poskol'ku shell yavlyaetsya pol'zovatel'skoj programmoj i ne vhodit v sos- tav yadra operacionnoj sistemy, ego legko modificirovat' i pomeshchat' v konk- retnye usloviya ekspluatacii. Naprimer, vmesto komandnogo processora Baurna (nazyvaemogo tak po imeni ego sozdatelya, Stiva Baurna), yavlyayushchegosya chast'yu versii V standartnoj sistemy, mozhno ispol'zovat' processor komand Si, obes- pechivayushchij rabotu mehanizma vedeniya istorii izmenenij i pozvolyayushchij izbegat' povtornogo vvoda tol'ko chto ispol'zovannyh komand. V nekotoryh sluchayah pri zhelanii mozhno vospol'zovat'sya komandnym processorom shell s ogranichennymi vozmozhnostyami, yavlyayushchimsya predydushchej versiej obychnogo shell'a. Sistema mozhet rabotat' s neskol'kimi komandnymi processorami odnovremenno. Pol'zovateli imeyut vozmozhnost' zapuskat' odnovremenno mnozhestvo processov, processy zhe v svoyu ochered' mogut dinamicheski porozhdat' novye processy i sinhronizirovat' ih vypolnenie. Vse eti vozmozhnosti obespechivayutsya blagodarya nalichiyu moshchnyh programmnyh i apparatnyh sredstv, sostavlyayushchih sredu vypolneniya processov. Hotya privlekatel'nost' shell'a v naibol'shej stepeni opredelyaetsya ego vozmozh- nostyami kak yazyka programmirovaniya i ego vozmozhnostyami v obrabotke argumen- tov, v dannom razdele osnovnoe vnimanie koncentriruetsya na srede vypolneniya processov, upravlenie kotoroj v sisteme vozlozheno na komandnyj processor shell. Drugie vazhnye osobennosti shell'a vyhodyat za ramki nastoyashchej knigi (podrobnoe opisanie shell'a sm. v [Bourne 78]).

    1.3.3 |lementy konstrukcionnyh blokov

Kak uzhe govorilos' ranee, koncepciya razrabotki sistemy UNIX zaklyuchalas' v postroenii operacionnoj sistemy iz elementov, kotorye pozvolili by pol'zo- vatelyu sozdavat' nebol'shie programmnye moduli, vystupayushchie v kachestve konst- rukcionnyh blokov pri sozdanii bolee slozhnyh programm. Odnim iz takih ele- mentov, s kotorym chasto stalkivayutsya pol'zovateli pri rabote s komandnym processorom shell, yavlyaetsya vozmozhnost' perenaznacheniya vvoda-vyvoda. Govorya uslovno, processy imeyut dostup k trem fajlam: oni chitayut iz fajla standart- nogo vvoda, zapisyvayut v fajl standartnogo vyvoda i vyvodyat soobshcheniya ob oshibkah v standartnyj fajl oshibok. Processy, zapuskaemye s terminala, obychno ispol'zuyut terminal vmesto vseh etih treh fajlov, odnako kazhdyj fajl nezavi- simo ot drugih mozhet byt' "perenaznachen". Naprimer, komanda ls vyvodit spisok vseh fajlov tekushchego kataloga na ustrojstvo (v fajl) standar- tnogo vyvoda, a komanda ls > output perenaznachaet vyvodnoj potok so standartnogo vyvoda v fajl "output" v teku- shchem kataloge, ispol'zuya vysheupomyanutyj sistemnyj vyzov creat. Podobnym zhe obrazom, komanda mail mjb < letter otkryvaet (s pomoshch'yu sistemnogo vyzova open) fajl "letter" v kachestve fajla standartnogo vvoda i peresylaet ego soderzhimoe pol'zovatelyu s imenem "mjb". Processy mogut perenaznachat' odnovremenno i vvod, i vyvod, kak, naprimer, v komandnoj stroke: 16 nroff -mm < doc1 > doc1.out 2> errors gde programma formatirovaniya nroff chitaet vvodnoj fajl doc1, v kachestve faj- la standartnogo vyvoda zadaet fajl doc1.out i vyvodit soobshcheniya ob oshibkah v fajl errors ("2>" oznachaet perenaznachenie vyvoda, prednaznachavshegosya dlya fajla s deskriptorom 2, kotoryj sootvetstvuet standartnomu fajlu oshibok). Programmy ls, mail i nroff ne znayut, kakie fajly vybrany v kachestve fajlov standartnogo vvoda, standartnogo vyvoda i zapisi soobshchenij ob oshibkah; ko- mandnyj processor shell sam raspoznaet simvoly "<", ">" i "2>" i naznachaet v sootvetstvii s ih ukazaniem fajly dlya standartnogo vvoda, standartnogo vyvo- da i zapisi soobshchenij ob oshibkah neposredstvenno pered zapuskom processov. Vtorym konstrukcionnym elementom yavlyaetsya kanal, mehanizm, obespechivayu- shchij informacionnyj obmen mezhdu processami, vypolnenie kotoryh svyazano s ope- raciyami chteniya i zapisi. Processy mogut perenaznachat' vyvodnoj potok so standartnogo vyvoda na kanal dlya chteniya s nego drugimi processami, perenaz- nachivshimi na kanal svoj standartnyj vvod. Dannye, posylaemye v kanal pervymi processami, yavlyayutsya vhodnymi dlya vtoryh processov. Vtorye processy tak zhe mogut perenaznachit' svoj vyvodnoj potok i tak dalee, v zavisimosti ot pozhe- lanij programmista. I snova, tak zhe kak i v vysheukazannom sluchae, processam net neobhodimosti znat', kakogo tipa fajl ispol'zuetsya v kachestve fajla standartnogo vyvoda; ih vypolnenie ne zavisit ot togo, budet li fajlom stan- dartnogo vyvoda obychnyj fajl, kanal ili ustrojstvo. V processe postroeniya bol'shih i slozhnyh programm iz konstrukcionnyh elementov men'shego razmera programmisty chasto ispol'zuyut kanaly i perenaznachenie vvoda-vyvoda pri sbor- ke i soedinenii otdel'nyh chastej. I dejstvitel'no, takoj stil' programmiro- vaniya nahodit podderzhku v sisteme, blagodarya chemu novye programmy mogut ra- botat' vmeste s sushchestvuyushchimi programmami. Naprimer, programma grep proizvodit poisk konteksta v nabore fajlov (yav- lyayushchihsya parametrami programmy) po sleduyushchemu obrazcu: grep main a.c b.c c.c gde "main" - podstroka, poisk kotoroj proizvoditsya v fajlah a.c, b.c i c.c s vydachej v fajl standartnogo vyvoda teh strok, v kotoryh ona soderzhitsya. So- derzhimoe vyvodnogo fajla mozhet byt' sleduyushchim: a.c: main(argc,argv) c.c: /* here is the main loop in the program */ c.c: main() Programma wc s neobyazatel'nym parametrom -l podschityvaet chislo strok v fajle standartnogo vvoda. Komandnaya stroka grep main a.c b.c c.c | wc -l vyzovet podschet chisla strok v ukazannyh fajlah, gde budet obnaruzhena podst- roka "main"; vyvodnoj potok komandy grep postupit neposredstvenno na vhod komandy wc. Dlya predydushchego primera rezul'tat budet takoj: 3 Ispol'zovanie kanalov zachastuyu delaet nenuzhnym sozdanie vremennyh fajlov.

    1.4 FUNKCII OPERACIONNOJ SISTEMY

Na Risunke 1.1 uroven' yadra operacionnoj sistemy izobrazhen neposredst- venno pod urovnem prikladnyh programm pol'zovatelya. Vypolnyaya razlichnye ele- mentarnye operacii po zaprosam pol'zovatel'skih processov, yadro obespechivaet funkcionirovanie pol'zovatel'skogo interfejsa, opisannogo vyshe. Sredi funk- 17 cij yadra mozhno otmetit': * Upravlenie vypolneniem processov posredstvom ih sozdaniya, zaversheniya ili priostanovki i organizacii vzaimodejstviya mezhdu nimi. * Planirovanie ocherednosti predostavleniya vypolnyayushchimsya processam vremeni central'nogo processora (dispetcherizaciya). Processy rabotayut s central'nym processorom v rezhime razdeleniya vremeni: central'nyj processor (*****) vy- polnyaet process, po zavershenii otschityvaemogo yadrom kvanta vremeni process priostanavlivaetsya i yadro aktiviziruet vypolnenie drugogo processa. Pozd- nee yadro zapuskaet priostanovlennyj process. * Vydelenie vypolnyaemomu processu operativnoj pamyati. YAdro operacionnoj sis- temy daet processam vozmozhnost' sovmestno ispol'zovat' uchastki adresnogo prostranstva na opredelennyh usloviyah, zashchishchaya pri etom adresnoe prostran- stvo, vydelennoe processu, ot vmeshatel'stva izvne. Esli sisteme trebuetsya svobodnaya pamyat', yadro osvobozhdaet pamyat', vremenno vygruzhaya process na vneshnie zapominayushchie ustrojstva, kotorye nazyvayut ustrojstvami vygruzki. Esli yadro vygruzhaet processy na ustrojstva vygruzki celikom, takaya realizaciya siste- my UNIX nazyvaetsya sistemoj so svopingom (podkachkoj); esli zhe na ustrojst- vo vygruzki vyvodyatsya stranicy pamyati, takaya sistema nazyvaetsya sistemoj s zameshcheniem stranic. * Vydelenie vneshnej pamyati s cel'yu obespecheniya effektivnogo hraneniya infor- macii i vyborka dannyh pol'zovatelya. Imenno v processe realizacii etoj funkcii sozdaetsya fajlovaya sistema. YAdro vydelyaet vneshnyuyu pamyat' pod pol'- zovatel'skie fajly, mobilizuet neispol'zuemuyu pamyat', strukturiruet fajlo- vuyu sistemu v forme, dostupnoj dlya ponimaniya, i zashchishchaet pol'zovatel'skie fajly ot nesankcionirovannogo dostupa. * Upravlenie dostupom processov k periferijnym ustrojstvam, takim kak termi- naly, lentochnye ustrojstva, diskovody i setevoe oborudovanie. Vypolnenie yadrom svoih funkcij dovol'no ochevidno. Naprimer, ono uznaet, chto dannyj fajl yavlyaetsya obychnym fajlom ili ustrojstvom, no skryvaet eto razlichie ot pol'zovatel'skih processov. Tak zhe ono, formatiruya informaciyu fajla dlya vnutrennego hraneniya, zashchishchaet vnutrennij format ot pol'zovatel'- skih processov, vozvrashchaya im neotformatirovannyj potok bajtov. Nakonec, yadro realizuet ryad neobhodimyh funkcij po obespecheniyu vypolneniya processov pol'- zovatel'skogo urovnya, za isklyucheniem funkcij, kotorye mogut byt' realizovany na samom pol'zovatel'skom urovne. Naprimer, yadro vypolnyaet dejstviya, neobho- dimye shell'u kak interpretatoru komand: ono pozvolyaet processoru shell chi- tat' vvodimye s terminala dannye, dinamicheski porozhdat' processy, sinhroni- zirovat' vypolnenie processov, otkryvat' kanaly i pereadresovyvat' vvod-vy- vod. Pol'zovateli mogut razrabatyvat' svoi versii komandnogo processora shell s tem, chtoby privesti rabochuyu sredu v sootvetstvie so svoimi trebova- niyami, ne zatragivaya drugih pol'zovatelej. Takie programmy pol'zuyutsya temi zhe uslugami yadra, chto i standartnyj processor shell.

    1.5 PREDPOLAGAEMAYA APPARATNAYA SREDA

Vypolnenie pol'zovatel'skih processov v sisteme UNIX osushchestvlyaetsya na dvuh urovnyah: urovne pol'zovatelya i urovne yadra. Kogda process proizvodit obrashchenie k operacionnoj sisteme, rezhim vypolneniya processa pereklyuchaetsya s rezhima zadachi (pol'zovatel'skogo) na rezhim yadra: operacionnaya sistema pyta- etsya obsluzhit' zapros pol'zovatelya, vozvrashchaya kod oshibki v sluchae neudachnogo zaversheniya operacii. Dazhe esli pol'zovatel' ne nuzhdaetsya v kakih-libo opre- delennyh uslugah operacionnoj sistemy i ne obrashchaetsya k nej s zaprosami, -------------------------- (*****) V glave 12 rassmatrivayutsya mnogoprocessornye sistemy; do togo rech' budet idti ob odnoprocessornoj modeli. 18 sistema eshche vypolnyaet uchetnye operacii, svyazannye s pol'zovatel'skim proces- som, obrabatyvaet preryvaniya, planiruet processy, upravlyaet raspredeleniem pamyati i t.d. Bol'shinstvo vychislitel'nyh sistem raznoobraznoj arhitektury (i sootvetstvuyushchie im operacionnye sistemy) podderzhivayut bol'shee chislo urovnej, chem ukazano zdes', odnako uzhe dvuh rezhimov, rezhima zadachi i rezhima yadra, vpolne dostatochno dlya sistemy UNIX. Osnovnye razlichiya mezhdu etimi dvumya rezhimami: * V rezhime zadachi processy imeyut dostup tol'ko k svoim sobstvennym instruk- ciyam i dannym, no ne k instrukciyam i dannym yadra (libo drugih processov). Odnako v rezhime yadra processam uzhe dostupny adresnye prostranstva yadra i pol'zovatelej. Naprimer, virtual'noe adresnoe prostranstvo processa mozhet byt' podeleno na adresa, dostupnye tol'ko v rezhime yadra, i na adresa, dos- tupnye v lyubom rezhime. * Nekotorye mashinnye komandy yavlyayutsya privilegirovannymi i vyzyvayut voznik- novenie oshibok pri popytke ih ispol'zovaniya v rezhime zadachi. Naprimer, v mashinnom yazyke mozhet byt' komanda, upravlyayushchaya registrom sostoyaniya proces- sora; processam, vypolnyayushchimsya v Processy A B C D +-------+-------+-------+-------+ Rezhim yadra | YA | | | YA | +-------+-------+-------+-------+ Rezhim zadachi | | Z | Z | | +-------+-------+-------+-------+ Risunok 1.5. Processy i rezhimy ih vypolneniya rezhime zadachi, ona nedostupna. Proshche govorya, lyuboe vzaimodejstvie s apparaturoj opisyvaetsya v terminah rezhima yadra i rezhima zadachi i protekaet odinakovo dlya vseh pol'zovatel'skih programm, vypolnyayushchihsya v etih rezhimah. Operacionnaya sistema hranit vnutren- nie zapisi o kazhdom processe, vypolnyayushchemsya v sisteme. Na Risunke 1.5 poka- zano eto razdelenie: yadro delit processy A, B, C i D, raspolozhennye vdol' gorizontal'noj osi, apparatnye sredstva vvodyat razlichiya mezhdu rezhimami vy- polneniya, raspolozhennymi po vertikali. Nesmotrya na to, chto sistema funkcioniruet v odnom iz dvuh rezhimov, yadro dejstvuet ot imeni pol'zovatel'skogo processa. YAdro ne yavlyaetsya kakoj-to osoboj sovokupnost'yu processov, vypolnyayushchihsya parallel'no s pol'zovatel'ski- mi, ono samo vystupaet sostavnoj chast'yu lyubogo pol'zovatel'skogo processa. Sdelannyj vyvod budet skoree otnosit'sya k "yadru", raspredelyayushchemu resursy, ili k "yadru", proizvodyashchemu razlichnye operacii, i eto budet oznachat', chto process, vypolnyaemyj v rezhime yadra, raspredelyaet resursy i proizvodit soot- vetstvuyushchie operacii. Naprimer, komandnyj processor shell schityvaet vvodnoj potok s terminala s pomoshch'yu zaprosa k operacionnoj sisteme. YAdro operacion- noj sistemy, vystupaya ot imeni processora shell, upravlyaet funkcionirovaniem terminala i peredaet vvodimye simvoly processoru shell. Shell perehodit v rezhim zadachi, analiziruet potok simvolov, vvedennyh pol'zovatelem i vypolnya- et zadannuyu posledovatel'nost' dejstvij, kotorye mogut potrebovat' vypolne- niya i drugih sistemnyh operacij.

    1.5.1 Preryvaniya i osobye situacii

Sistema UNIX pozvolyaet takim ustrojstva, kak vneshnie ustrojstva vvo- da-vyvoda i sistemnye chasy, asinhronno preryvat' rabotu central'nogo proces- 19 sora. Po poluchenii signala preryvaniya yadro operacionnoj sistemy sohranyaet svoj tekushchij kontekst (zastyvshij obraz vypolnyaemogo processa), ustanavlivaet prichinu preryvaniya i obrabatyvaet preryvanie. Posle togo, kak preryvanie bu- det obrabotano yadrom, prervannyj kontekst vosstanovitsya i rabota prodolzhitsya tak, kak budto nichego ne sluchilos'. Ustrojstvam obychno pripisyvayutsya priori- tety v sootvetstvii s ocherednost'yu obrabotki preryvanij. V processe obrabot- ki preryvanij yadro uchityvaet ih prioritety i blokiruet obsluzhivanie preryva- niya s nizkim prioritetom na vremya obrabotki preryvaniya s bolee vysokim prio- ritetom. Osobye situacii svyazany s vozniknoveniem nezaplanirovannyh sobytij, vyz- vannyh processom, takih kak nedopustimaya adresaciya, zadanie privilegirovan- nyh komand, delenie na nol' i t.d. Oni otlichayutsya ot preryvanij, kotorye vy- zyvayutsya sobytiyami, vneshnimi po otnosheniyu k processu. Osobye situacii vozni- kayut pryamo "posredine" vypolneniya komandy, i sistema, obrabotav osobuyu situ- aciyu, pytaetsya perezapustit' komandu; schitaetsya, chto preryvaniya voznikayut mezhdu vypolneniem dvuh komand, pri etom sistema posle obrabotki preryvaniya prodolzhaet vypolnenie processa uzhe nachinaya so sleduyushchej komandy. Dlya obra- botki preryvanij i osobyh situacij v sisteme UNIX ispol'zuetsya odin i tot zhe mehanizm.

    1.5.2 Urovni preryvaniya processora

YAdro inogda obyazano preduprezhdat' vozniknovenie preryvanij vo vremya kri- ticheskih dejstvij, mogushchih v sluchae preryvaniya zaportit' informaciyu. Napri- mer, vo vremya obrabotki spiska s ukazatelyami vozniknovenie preryvaniya ot diska dlya yadra nezhelatel'no, t.k. pri obrabotke preryvaniya mozhno zaportit' ukazateli, chto mozhno uvidet' na primere v sleduyushchej glave. Obychno imeetsya ryad privilegirovannyh komand, ustanavlivayushchih uroven' preryvaniya processora v slove sostoyaniya processora. Ustanovka urovnya preryvaniya na opredelennoe znachenie otsekaet preryvaniya etogo i bolee nizkih urovnej, razreshaya obrabot- ku tol'ko preryvanij s bolee vysokim prioritetom. Na Risunke 1.6 pokazana posledovatel'nost' urovnej preryvaniya. Esli yadro ignoriruet preryvaniya ot diska, v etom sluchae ignoriruyutsya i vse ostal'nye preryvaniya, krome preryva- nij ot chasov i mashinnyh sboev. +------------------------------+ ^ | Mashinnye sboi | | +------------------------------+ | | Sistemnye chasy | Vysokij prioritet +------------------------------+ | | Disk | | +------------------------------+ | | Setevoe oborudovanie | | +------------------------------+ | | Terminaly | Nizkij prioritet +------------------------------+ | | Programmnye preryvaniya | | +------------------------------+ v Risunok 1.6. Standartnye urovni preryvanij

    1.5.3 Raspredelenie pamyati

YAdro postoyanno raspolagaetsya v operativnoj pamyati, naryadu s vypolnyayushchim- sya v dannyj moment processom (ili chast'yu ego, po men'shej mere). V processe kompilyacii programma-kompilyator generiruet posledovatel'nost' adresov, yavlya- 20 yushchihsya adresami peremennyh i informacionnyh struktur, a takzhe adresami inst- rukcij i funkcij. Kompilyator generiruet adresa dlya virtual'noj mashiny tak, slovno na fizicheskoj mashine ne budet vypolnyat'sya parallel'no s transliruemoj ni odna drugaya programma. Kogda programma zapuskaetsya na vypolnenie, yadro vydelyaet dlya nee mesto v operativnoj pamyati, pri etom sovpadenie virtual'nyh adresov, sgenerirovannyh kompilyatorom, s fizicheskimi adresami sovsem neobyazatel'no. YAdro, vzaimodejs- tvuya s apparatnymi sredstvami, transliruet virtual'nye adresa v fizicheskie, t.e. otobrazhaet adresa, sgenerirovannye kompilyatorom, v fizicheskie, mashinnye adresa. Takoe otobrazhenie opiraetsya na vozmozhnosti apparatnyh sredstv, poe- tomu komponenty sistemy UNIX, zanimayushchiesya im, yavlyayutsya mashinno-zavisimymi. Naprimer, otdel'nye vychislitel'nye mashiny imeyut special'noe oborudovanie dlya podkachki vygruzhennyh stranic pamyati. Glavy 6 i 9 posvyashcheny bolee podrobnomu rassmotreniyu voprosov, svyazannyh s raspredeleniem pamyati, i issledovaniyu ih sootnosheniya s apparatnymi sredstvami.

    1.6 VYVODY

V etoj glave opisany polnaya struktura sistemy UNIX, vzaimootnosheniya mezh- du processami, vypolnyayushchimisya v rezhime zadachi i v rezhime yadra, a takzhe appa- ratnaya sreda funkcionirovaniya yadra operacionnoj sistemy. Processy vypolnyayut- sya v rezhime zadachi ili v rezhime yadra, v kotorom oni pol'zuyutsya uslugami sis- temy blagodarya nalichiyu nabora obrashchenij k operacionnoj sisteme. Arhitektura sistemy podderzhivaet takoj stil' programmirovaniya, pri kotorom iz nebol'shih programm, vypolnyayushchih tol'ko otdel'nye funkcii, no horosho, sostavlyayutsya bo- lee slozhnye programmy, ispol'zuyushchie mehanizm kanalov i perenaznachenie vvo- da-vyvoda. Obrashcheniya k operacionnoj sisteme pozvolyayut processam proizvodit' opera- cii, kotorye inache ne vypolnyayutsya. V dopolnenie k obrabotke podobnyh obrashche- nij yadro operacionnoj sistemy osushchestvlyaet obshchie uchetnye operacii, upravlyaet planirovaniem processov, raspredeleniem pamyati i zashchitoj processov v opera- tivnoj pamyati, obsluzhivaet preryvaniya, upravlyaet fajlami i ustrojstvami i obrabatyvaet osobye situacii, voznikayushchie v sisteme. V funkcii yadra sistemy UNIX namerenno ne vklyucheny mnogie funkcii, yavlyayushchiesya chast'yu drugih operaci- onnyh sistem, poskol'ku nabor obrashchenij k sisteme pozvolyaet processam vypol- nyat' vse neobhodimye operacii na pol'zovatel'skom urovne. V sleduyushchej glave soderzhitsya bolee detal'naya informaciya o yadre, opisyvayushchaya ego arhitekturu i vvodyashchaya nekotorye osnovnye ponyatiya, kotorye ispol'zuyutsya pri opisanii ego funkcionirovaniya. 21 GLAVA 2

    VVEDENIE V ARHITEKTURU YADRA OPERACIONNOJ SISTEMY

V predydushchej glave byl sdelan tol'ko poverhnostnyj obzor osobennostej operacionnoj sredy UNIX. V etoj glave osnovnoe vnimanie udelyaetsya yadru ope- racionnoj sistemy, delaetsya obzor ego arhitektury i izlagayutsya v obshchih cher- tah osnovnye ponyatiya i struktury, sushchestvennye dlya ponimaniya vsego posleduyu- shchego materiala knigi.

    2.1 ARHITEKTURA OPERACIONNOJ SISTEMY UNIH

Kak uzhe ranee bylo zamecheno (sm. [Christian 83], str.239), v sisteme UNIX sozdaetsya illyuziya togo, chto fajlovaya sistema imeet "mesta" i chto u pro- cessov est' "zhizn'". Obe sushchnosti, fajly i processy, yavlyayutsya central'nymi ponyatiyami modeli operacionnoj sistemy UNIX. Na Risunke 2.1 predstavlena blok-shema yadra sistemy, otrazhayushchaya sostav modulej, iz kotoryh sostoit yadro, i ih vzaimosvyazi drug s drugom. V chastnosti, na nej sleva izobrazhena fajlo- vaya podsistema, a sprava podsistema upravleniya processami, dve glavnye kom- ponenty yadra. |ta shema daet logicheskoe predstavlenie o yadre, hotya v dejst- vitel'nosti v strukture yadra imeyutsya otkloneniya ot modeli, poskol'ku otdel'- nye moduli ispytyvayut vnutrennee vozdejstvie so storony drugih modulej. Shema na Risunke 2.1 imeet tri urovnya: uroven' pol'zovatelya, uroven' yad- ra i uroven' apparatury. Obrashcheniya k operacionnoj sisteme i biblioteki sos- tavlyayut granicu mezhdu pol'zovatel'skimi programmami i yadrom, provedennuyu na Risunke 1.1. Obrashcheniya k operacionnoj sisteme vyglyadyat tak zhe, kak obychnye vyzovy funkcij v programmah na yazyke Si, i biblioteki ustanavlivayut sootvet- stvie mezhdu etimi vyzovami funkcij i elementarnymi sistemnymi operaciya- mi, o chem bolee podrobno sm. v glave 6. Pri etom programmy na assemblere mo- gut obrashchat'sya k operacionnoj sisteme neposredstvenno, bez ispol'zovaniya biblioteki sistemnyh vyzovov. Programmy chasto obrashchayutsya k drugim bibliote- kam, takim kak biblioteka standartnyh podprogramm vvoda-vyvoda, dostigaya tem samym bolee polnogo ispol'zovaniya sistemnyh uslug. Dlya etogo vo vremya kompi- lyacii biblioteki svyazyvayutsya s programmami i chastichno vklyuchayutsya v programmu pol'zovatelya. Dalee my proillyustriruem eti momenty na primere. Na risunke sovokupnost' obrashchenij k operacionnoj sisteme razdelena na te obrashcheniya, kotorye vzaimodejstvuyut s podsistemoj upravleniya fajlami, i te, kotorye vzaimodejstvuyut s podsistemoj upravleniya processami. Fajlovaya pod- sistema upravlyaet fajlami, razmeshchaet zapisi fajlov, upravlyaet svobodnym prostranstvom, dostupom k fajlam i poiskom dannyh dlya pol'zovatelej. Proces- sy vzaimodejstvuyut s podsistemoj upravleniya fajlami, ispol'zuya pri etom so- vokupnost' special'nyh obrashchenij k operacionnoj sisteme, takih kak open (dlya togo, chtoby otkryt' fajl na chtenie ili zapis'),close, read, write, stat (zaprosit' atributy fajla), chown (izmenit' zapis' s informaciej o vladel'ce fajla) i chmod (izmenit' prava dostupa k fajlu). |ti i drugie operacii rass- matrivayutsya v glave 5. Podsistema upravleniya fajlami obrashchaetsya k dannym, kotorye hranyatsya v fajle, ispol'zuya bufernyj mehanizm, upravlyayushchij potokom dannyh mezhdu yadrom i ustrojstvami vneshnej pamyati. Bufernyj mehanizm, vzaimodejstvuya s drajverami ustrojstv vvoda-vyvoda blokami, iniciiruet peredachu dannyh k yadru i obratno. Drajvery ustrojstv yavlyayutsya takimi modulyami v sostave yadra, kotorye upravlya- yut rabotoj periferijnyh ustrojstv. Ustrojstva vvoda-vyvoda blokami otnosyatsya 22 programmy pol'zovatelya ^ | +----------------------+ tochka pere- | | biblioteki | secheniya ---------|------- +----------------------+ - | - ^ Uroven' pol'zovatelya - | - | --------------------------|---------------------|----------------- Uroven' yadra v v +---------------------------------------------------+ | ^ obrashcheniya k operacionnoj sisteme ^ | +------+------------------------------------+-------+ | | +-----------------+---------------+ +----------------+---------+ | v | | v | | | | | | podsistema upravle- | | ............| | niya fajlami | | . vzaimo- .| | <---+-+ | . dejstvie .| | | | | . processov.| | ^ ^ | | | podsistema ............| | | | | | | ............| +-------+--------------+----------+ | | . planirov-.| | v +-+> upravleniya . shchik .| | +--------------+ | ............| | | bufer sverh- | | ............| | | operativnoj | | processami . rasprede-.| | | pamyati (kesh) | | . lenie .| | +--------------+ | . pamyati .| | ^ | ^ ............| | | | | | | v +-------+------------------+ +-------+----------------------+ | | v . | | | simvol . blok | | | . | | +------------------------------+ | | | | | drajvery ustrojstv | | | ^ | | +--------------+---------------+ | | | +--------------+------------------------------+------------------+ | v apparatnyj kontrol' v | +----------------------------------------------------------------+ Uroven' yadra ------------------------------------------------------------------ Uroven' apparatury +----------------------------------------------------------------+ | tehnicheskie sredstva (apparatura) | +----------------------------------------------------------------+ Risunok 2.1. Blok-shema yadra operacionnoj sistemy k tipu zapominayushchih ustrojstv s proizvol'noj vyborkoj; ih drajvery postroeny takim obrazom, chto vse ostal'nye komponenty sistemy vosprinimayut eti ustroj- stva kak zapominayushchie ustrojstva s proizvol'noj vyborkoj. Naprimer, drajver zapominayushchego ustrojstva na magnitnoj lente pozvolyaet yadru sistemy vosprini- 23 mat' eto ustrojstvo kak zapominayushchee ustrojstvo s proizvol'noj vyborkoj. Podsistema upravleniya fajlami takzhe neposredstvenno vzaimodejstvuet s draj- verami ustrojstv "nestrukturirovannogo" vvoda-vyvoda, bez vmeshatel'stva bu- fernogo mehanizma. K ustrojstvam nestrukturirovannogo vvoda-vyvoda, inogda imenuemym ustrojstvami posimvol'nogo vvoda-vyvoda (tekstovymi), otnosyatsya ustrojstva, otlichnye ot ustrojstv vvoda-vyvoda blokami. Podsistema upravleniya processami otvechaet za sinhronizaciyu processov, vzaimodejstvie processov, raspredelenie pamyati i planirovanie vypolneniya processov. Podsistema upravleniya fajlami i podsistema upravleniya processami vzaimodejstvuyut mezhdu soboj, kogda fajl zagruzhaetsya v pamyat' na vypolnenie (sm. glavu 7): podsistema upravleniya processami chitaet v pamyat' ispolnyaemye fajly pered tem, kak ih vypolnit'. Primerami obrashchenij k operacionnoj sisteme, ispol'zuemyh pri upravlenii processami, mogut sluzhit' fork (sozdanie novogo processa), exec (nalozhenie obraza programmy na vypolnyaemyj process), exit (zavershenie vypolneniya pro- cessa), wait (sinhronizaciya prodolzheniya vypolneniya osnovnogo processa s mo- mentom vyhoda iz porozhdennogo processa), brk (upravlenie razmerom pamyati, vydelennoj processu) i signal (upravlenie reakciej processa na vozniknovenie ekstraordinarnyh sobytij). Glava 7 posvyashchena rassmotreniyu etih i drugih sis- temnyh vyzovov. Modul' raspredeleniya pamyati kontroliruet vydelenie pamyati processam. Es- li v kakoj-to moment sistema ispytyvaet nedostatok v fizicheskoj pamyati dlya zapuska vseh processov, yadro peresylaet processy mezhdu osnovnoj i vneshnej pamyat'yu s tem, chtoby vse processy imeli vozmozhnost' vypolnyat'sya. V glave 9 opisyvayutsya dva sposoba upravleniya raspredeleniem pamyati: vygruzka (podkach- ka) i zameshchenie stranic. Programmu podkachki inogda nazyvayut planirovshchikom, t.k. ona "planiruet" vydelenie pamyati processam i okazyvaet vliyanie na rabo- tu planirovshchika central'nogo processora. Odnako v dal'nejshem my budem sta- rat'sya ssylat'sya na nee kak na "programmu podkachki", chtoby izbezhat' putanicy s planirovshchikom central'nogo processora. Modul' "planirovshchik" raspredelyaet mezhdu processami vremya central'nogo processora. On planiruet ocherednost' vypolneniya processov do teh por, poka oni dobrovol'no ne osvobodyat central'nyj processor, dozhdavshis' vydeleniya k.-l. resursa, ili do teh por, poka yadro sistemy ne vygruzit ih posle togo, kak ih vremya vypolneniya prevysit zaranee opredelennyj kvant vremeni. Plani- rovshchik vybiraet na vypolnenie gotovyj k zapusku process s naivysshim priori- tetom; vypolnenie predydushchego processa (priostanovlennogo) budet prodolzheno togda, kogda ego prioritet budet naivysshim sredi prioritetov vseh gotovyh k zapusku processov. Sushchestvuet neskol'ko form vzaimodejstviya processov mezhdu soboj, ot asinhronnogo obmena signalami o sobytiyah do sinhronnogo obmena so- obshcheniyami. Nakonec, apparatnyj kontrol' otvechaet za obrabotku preryvanij i za svyaz' s mashinoj. Takie ustrojstva, kak diski i terminaly, mogut preryvat' rabotu central'nogo processora vo vremya vypolneniya processa. Pri etom yadro sistemy posle obrabotki preryvaniya mozhet vozobnovit' vypolnenie prervannogo proces- sa. Preryvaniya obrabatyvayutsya ne samimi processami, a special'nymi funkciyami yadra sistemy, perechislennymi v kontekste vypolnyaemogo processa.

    2.2 VVEDENIE V OSNOVNYE PONYATIYA SISTEMY

V eto razdele daetsya obzor nekotoryh osnovnyh informacionnyh struktur, ispol'zuemyh yadrom sistemy, i bolee podrobno opisyvaetsya funkcionirovanie modulej yadra, pokazannyh na Risunke 2.1.

    2.2.1 Obzor osobennostej podsistemy upravleniya fajlami

Vnutrennee predstavlenie fajla opisyvaetsya v indekse, kotoryj soderzhit 24 opisanie razmeshcheniya informacii fajla na diske i druguyu informaciyu, takuyu kak vladelec fajla, prava dostupa k fajlu i vremya dostupa. Termin "indeks" (inode) shiroko ispol'zuetsya v literature po sisteme UNIX. Kazhdyj fajl imeet odin indeks, no mozhet byt' svyazan s neskol'kimi imenami, kotorye vse otrazha- yutsya v indekse. Kazhdoe imya yavlyaetsya ukazatelem. Kogda process obrashchaetsya k fajlu po imeni, yadro sistemy analiziruet po ocheredi kazhduyu komponentu imeni fajla, proveryaya prava processa na prosmotr vhodyashchih v put' poiska katalogov, i v konce koncov vozvrashchaet indeks fajla. Naprimer, esli process obrashchaetsya k sisteme: open("/fs2/mjb/rje/sourcefile", 1); yadro sistemy vozvrashchaet indeks dlya fajla "/fs2/mjb/rje/sourcefile". Esli process sozdaet novyj fajl, yadro prisvaivaet etomu fajlu neispol'zuemyj in- deks. Indeksy hranyatsya v fajlovoj sisteme (i eto my eshche uvidim), odnako pri obrabotke fajlov yadro zanosit ih v tablicu indeksov v operativnoj pamyati. YAdro podderzhivaet eshche dve informacionnye struktury, tablicu fajlov i pol'zovatel'skuyu tablicu deskriptorov fajla. Tablica fajlov vystupaet glo- bal'noj strukturoj yadra, a pol'zovatel'skaya tablica deskriptorov fajla vyde- lyaetsya pod process. Esli process otkryvaet ili sozdaet fajl, yadro vydelyaet v kazhdoj tablice element, korrespondiruyushchij s indeksom fajla. |lementy v etih treh strukturah - v pol'zovatel'skoj tablice deskriptorov fajla, v tablice fajlov i v tablice indeksov - hranyat informaciyu o sostoyanii fajla i o dostu- pe pol'zovatelej k nemu. V tablice fajlov hranitsya smeshchenie v bajtah ot na- chala fajla do togo mesta, otkuda nachnet vypolnyat'sya sleduyushchaya komanda pol'- zovatelya read ili write, Pol'zovatel'skaya tablica deskrip- Tablica fajlov Tablica indeksov torov fajla +---------+ +-----+ +-----+ | | | | | | +---------+ | | | | | --+---+ | | +-----+ +---------+ | | | +-------->| | | --+-+ | +-----+ | +-----+ +---------+ | +-------->| --+---+ | | | | | +-----+ | | | | +--+ | ... | +-----+ | | | +-----+ +-------->| | | | +------->| --+---+ +-----+ | | +-----+ | | | | | | | | +---------+ +-----+ +-----+ Risunok 2.2. Tablicy fajlov, deskriptorov fajla i indeksov a takzhe informaciya o pravah dostupa k otkryvaemomu processu. Tablica desk- riptorov fajla identificiruet vse otkrytye dlya processa fajly. Na Risunke 2.2 pokazany eti tablicy i svyazi mezhdu nimi. V sistemnyh operaciyah open (ot- kryt') i creat (sozdat') yadro vozvrashchaet deskriptor fajla, kotoromu sootvet- stvuet ukazatel' v tablice deskriptorov fajla. Pri vypolnenii operacij read (chitat') i write (pisat') yadro ispol'zuet deskriptor fajla dlya vhoda v tab- licu deskriptorov i, sleduya ukazatelyam na tablicu fajlov i na tablicu indek- sov, nahodit informaciyu v fajle. Bolee podrobno eti informacionnye struktury rassmatrivayutsya v glavah 4 i 5. Sejchas dostatochno skazat', chto ispol'zovanie etih tablic obespechivaet razlichnuyu stepen' razdeleniya dostupa k fajlu. Obychnye fajly i katalogi hranyatsya v sisteme UNIX na ustrojstvah vvo- da-vyvoda blokami, takih kak magnitnye lenty ili diski. Poskol'ku sushchestvuet 25 nekotoroe razlichie vo vremeni dostupa k etim ustrojstvam, pri ustanovke sis- temy UNIX na lentah razmeshchayut fajlovye sistemy. S godami bezdiskovye avtoma- tizirovannye rabochie mesta stanut obshchim sluchaem, i fajly budut raspolagat'sya v udalennoj sisteme, dostup k kotoroj budet osushchestvlyat'sya cherez set' (sm. glavu 13). Dlya prostoty, tem ne menee, v posleduyushchem tekste podrazumevaetsya ispol'zovanie diskov. V sisteme mozhet byt' neskol'ko fizicheskih diskov, na kazhdom iz kotoryh mozhet razmeshchat'sya odna i bolee fajlovyh sistem. Razbivka diska na neskol'ko fajlovyh sistem oblegchaet administratoru upravlenie hra- nimymi dannymi. Na logicheskom urovne yadro imeet delo s fajlovymi sistemami, a ne s diskami, pri etom kazhdaya sistema traktuetsya kak logicheskoe ustrojst- vo, identificiruemoe nomerom. Preobrazovanie adresov logicheskogo ustrojstva (fajlovoj sistemy) v adresa fizicheskogo ustrojstva (diska) i obratno vypol- nyaetsya diskovym drajverom. Termin "ustrojstvo" v etoj knige ispol'zuetsya dlya oboznacheniya logicheskogo ustrojstva, krome special'no ogovorennyh sluchaev. Fajlovaya sistema sostoit iz posledovatel'nosti logicheskih blokov dlinoj 512, 1024, 2048 ili drugogo chisla bajt, kratnogo 512, v zavisimosti ot rea- lizacii sistemy. Razmer logicheskogo bloka vnutri odnoj fajlovoj sistemy pos- toyanen, no mozhet var'irovat'sya v raznyh fajlovyh sistemah v dannoj konfigu- racii. Ispol'zovanie logicheskih blokov bol'shogo razmera uvelichivaet skorost' peredachi dannyh mezhdu diskom i pamyat'yu, poskol'ku yadro smozhet peredat' bol'- she informacii za odnu diskovuyu operaciyu, i sokrashchaet kolichestvo prodolzhi- tel'nyh operacij. Naprimer, chtenie 1 Kbajta s diska za odnu operaciyu osushches- tvlyaetsya bystree, chem chtenie 512 bajt za dve. Odnako, esli razmer logichesko- go bloka slishkom velik, poleznyj ob容m pamyati mozhet umen'shit'sya, eto budet pokazano v glave 5. Dlya prostoty termin "blok" v etoj knige budet ispol'zo- vat'sya dlya oboznacheniya logicheskogo bloka, pri etom podrazumevaetsya logiches- kij blok razmerom 1 Kbajt, krome special'no ogovorennyh sluchaev. +---------+---------+-------------------+-----------------+ | blok | super- | spisok | informacionnye | |zagruzki | blok | indeksov | bloki | +---------+---------+-------------------+-----------------+ Risunok 2.3. Format fajlovoj sistemy Fajlovaya sistema imeet sleduyushchuyu strukturu (Risunok 2.3). * Blok zagruzki raspolagaetsya v nachale prostranstva, otvedennogo pod fajlo- vuyu sistemu, obychno v pervom sektore, i soderzhit programmu nachal'noj zag- ruzki, kotoraya schityvaetsya v mashinu pri zagruzke ili inicializacii opera- cionnoj sistemy. Hotya dlya zapuska sistemy trebuetsya tol'ko odin blok zag- ruzki, kazhdaya fajlovaya sistema imeet svoj (pust' dazhe pustoj) blok zagruz- ki. * Superblok opisyvaet sostoyanie fajlovoj sistemy - kakogo ona razmera, skol'ko fajlov mozhet v nej hranit'sya, gde raspolagaetsya svobodnoe prost- ranstvo, dostupnoe dlya fajlovoj sistemy, i drugaya informaciya. * Spisok indeksov v fajlovoj sisteme raspolagaetsya vsled za superblokom. Ad- ministratory ukazyvayut razmer spiska indeksov pri generacii fajlovoj sis- temy. YAdro operacionnoj sistemy obrashchaetsya k indeksam, ispol'zuya ukazateli v spiske indeksov. Odin iz indeksov yavlyaetsya kornevym indeksom fajlovoj sistemy: eto indeks, po kotoromu osushchestvlyaetsya dostup k strukture katalo- gov fajlovoj sistemy posle vypolneniya sistemnoj operacii mount (montiro- vat') (razdel 5.14). * Informacionnye bloki raspolagayutsya srazu posle spiska indeksov i soderzhat dannye fajlov i upravlyayushchie dannye. Otdel'no vzyatyj informacionnyj blok mozhet prinadlezhat' odnomu i tol'ko odnomu fajlu v fajlovoj sisteme. 26

    2.2.2 Processy

V etom razdele my rassmotrim bolee podrobno podsistemu upravleniya pro- cessami. Dayutsya raz座asneniya po povodu struktury processa i nekotoryh infor- macionnyh struktur, ispol'zuemyh pri raspredelenii pamyati pod processy. Za- tem daetsya predvaritel'nyj obzor diagrammy sostoyaniya processov i zatragiva- yutsya razlichnye voprosy, svyazannye s perehodami iz odnogo sostoyaniya v drugoe. Processom nazyvaetsya posledovatel'nost' operacij pri vypolnenii program- my, kotorye predstavlyayut soboj nabory bajtov, interpretiruemye central'nym processorom kak mashinnye instrukcii (t.n. "tekst"), dannye i stekovye struk- tury. Sozdaetsya vpechatlenie, chto odnovremenno vypolnyaetsya mnozhestvo proces- sov, poskol'ku ih vypolnenie planiruetsya yadrom, i, krome togo, neskol'ko processov mogut byt' ekzemplyarami odnoj programmy. Vypolnenie processa zak- lyuchaetsya v tochnom sledovanii naboru instrukcij, kotoryj yavlyaetsya zamknutym i ne peredaet upravlenie naboru instrukcij drugogo processa; on schityvaet i zapisyvaet informaciyu v razdel dannyh i v stek, no emu nedostupny dannye i steki drugih processov. Odni processy vzaimodejstvuyut s drugimi processami i s ostal'nym mirom posredstvom obrashchenij k operacionnoj sisteme. S prakticheskoj tochki zreniya process v sisteme UNIX yavlyaetsya ob容ktom, sozdavaemym v rezul'tate vypolneniya sistemnoj operacii fork. Kazhdyj process, za isklyucheniem nulevogo, porozhdaetsya v rezul'tate zapuska drugim processom operacii fork. Process, zapustivshij operaciyu fork, nazyvaetsya roditel'skim, a vnov' sozdannyj process - porozhdennym. Kazhdyj process imeet odnogo rodite- lya, no mozhet porodit' mnogo processov. YAdro sistemy identificiruet kazhdyj process po ego nomeru, kotoryj nazyvaetsya identifikatorom processa (PID). Nulevoj process yavlyaetsya osobennym processom, kotoryj sozdaetsya "vruchnuyu" v rezul'tate zagruzki sistemy; posle porozhdeniya novogo processa (process 1) nulevoj process stanovitsya processom podkachki. Process 1, izvestnyj pod ime- nem init, yavlyaetsya predkom lyubogo drugogo processa v sisteme i svyazan s kazh- dym processom osobym obrazom, opisyvaemym v glave 7. Pol'zovatel', transliruya ishodnyj tekst programmy, sozdaet ispolnyaemyj fajl, kotoryj sostoit iz neskol'kih chastej: * nabora "zagolovkov", opisyvayushchih atributy fajla, * teksta programmy, * predstavleniya na mashinnom yazyke dannyh, imeyushchih nachal'nye znacheniya pri zapuske programmy na vypolnenie, i ukazaniya na to, skol'ko prostranstva pamyati yadro sistemy vydelit pod neinacializirovannye dannye, tak nazyvaemye bss (*) (yadro ustanavlivaet ih v 0 v moment zapuska), * drugih sekcij, takih kak informaciya simvolicheskih tablic. Dlya programmy, privedennoj na Risunke 1.3, tekst ispolnyaemogo fajla predstavlyaet soboj sgenerirovannyj kod dlya funkcij main i copy, k opredelen- nym dannym otnositsya peremennaya version (vstavlennaya v programmu dlya togo, chtoby v poslednej imelis' nekotorye opredelennye dannye), a k neopredelennym - massiv buffer. Kompilyator s yazyka Si dlya sistemy versii V sozdaet otdel'no tekstovuyu sekciyu po umolchaniyu, no ne isklyuchaetsya vozmozhnost' vklyucheniya inst- rukcij programmy i v sekciyu dannyh, kak v predydushchih versiyah sistemy. YAdro zagruzhaet ispolnyaemyj fajl v pamyat' pri vypolnenii sistemnoj opera- cii exec, pri etom zagruzhennyj process sostoit po men'shej mere iz treh chas- tej, tak nazyvaemyh oblastej: teksta, dannyh i steka. Oblasti teksta i dan- nyh korrespondiruyut s sekciyami teksta i bss-dannyh ispolnyaemogo fajla, a ob- last' steka sozdaetsya avtomaticheski i ee razmer dinamicheski ustanavlivaetsya yadrom sistemy vo vremya vypolneniya. Stek sostoit iz logicheskih zapisej akti- vacii, pomeshchaemyh v stek pri vyzove funkcii i vytalkivaemyh iz steka pri vozvrate upravleniya v vyzvavshuyu proceduru; special'nyj registr, imenuemyj ukazatelem vershiny steka, pokazyvaet tekushchuyu glubinu steka. Zapis' aktivacii vklyuchaet parametry peredavae- ------------------------------------------------ (*) Sokrashchenie bss imeet proishozhdenie ot assemblernogo psevdooperatora dlya mashiny IBM 7090 i rasshifrovyvaetsya kak "block started by symbol" ("blok, na- chinayushchijsya s simvola"). 27 mye funkcii, ee lokal'nye peremennye, a takzhe dannye, neobhodimye dlya voss- tanovleniya predydushchej zapisi aktivacii, v tom chisle znacheniya schetchika komand i ukazatelya vershiny steka v moment vyzova funkcii. Tekst programmy vklyuchaet Stek zadachi Napravlenie Stek yadra +--------------+ uvelicheniya steka +------------------+ | Lokal'nye | ^ | | | peremennye | | | ^ | | (ne pokazany)| | | . | |--------------| | | . | |Adres zapisi 2| | | . | |--------------| | | . | |Adres vozvrata| | | . | | posle vyzova | | | . | | write | | | . | |--------------| | | . | |parametry, pe-| | | . | | redavaemye | | | . | | write | | | . | |(new, buffer, | | | v | | count) | Zapis' 3 | | +--------------+ call write() Zapis' 3 +------------------+ | Lokal'nye | | Lokal'nye | | peremennye | | peremennye | | (count) | | | |--------------| |------------------| |Adres zapisi 1| | Adres zapisi 1 | |--------------| |------------------| |Adres vozvrata| | Adres vozvrata | | posle vyzova | | posle vyzova | | copy | | func2 | |--------------| |------------------| |parametry, pe-| | parametry, pere- | | redavaemye | | davaemye funkcii | | copy | | yadra func2 | | (old, new) | Zapis' 2 Zapis' 2 | | +--------------+ call copy() call func2() +------------------+ | Lokal'nye | | Lokal'nye | | peremennye | | peremennye | |(fdold, fdnew)| | | |--------------| |------------------| |Adres zapisi 0| | Adres zapisi 0 | |--------------| |------------------| |Adres vozvrata| | Adres vozvrata | | posle vyzova | | posle vyzova | | main | | func1 | |--------------| |------------------| |parametry, pe-| | parametry, pere- | | redavaemye | | davaemye funkcii | | main | | yadra func1 | | (argc, argv) | Zapis' 1 Zapis' 1 | | +--------------+ call main() call func1() +------------------+ Zapis' 0 Zapis' 0 Start Interfejs obrashchenij k operacionnoj sisteme Risunok 2.4. Steki zadachi i yadra dlya programmy kopirovaniya. 28 posledovatel'nosti komand, upravlyayushchie uvelicheniem steka, a yadro sistemy vy- delyaet, esli nuzhno, mesto pod stek. V programme na Risunke 1.3 parametry argc i argv, a takzhe peremennye fdold i fdnew, soderzhashchiesya v vyzove funkcii main, pomeshchayutsya v stek, kak tol'ko vstretilos' obrashchenie k funkcii main (odin raz v kazhdoj programme, po usloviyu), tak zhe i parametry old i new i peremennaya count, soderzhashchiesya v vyzove funkcii copy, pomeshchayutsya v stek v moment obrashcheniya k ukazannoj funkcii. Poskol'ku process v sisteme UNIX mozhet vypolnyat'sya v dvuh rezhimah, rezhi- me yadra ili rezhime zadachi, on pol'zuetsya v kazhdom iz etih rezhimov otdel'nym stekom. Stek zadachi soderzhit argumenty, lokal'nye peremennye i druguyu infor- maciyu otnositel'no funkcij, vypolnyaemyh v rezhime zadachi. Sleva na Risunke 2.4 pokazan stek zadachi dlya processa, svyazannogo s vypolneniem sistemnoj operacii write v programme copy. Procedura zapuska processa (vklyuchennaya v biblioteku) obratilas' k funkcii main s peredachej ej dvuh parametrov, pomes- tiv v stek zadachi zapis' 1; v zapisi 1 est' mesto dlya dvuh lokal'nyh pere- mennyh funkcii main. Funkciya main zatem vyzyvaet funkciyu copy s peredachej ej dvuh parametrov, old i new, i pomeshchaet v stek zadachi zapis' 2; v zapisi 2 est' mesto dlya lokal'noj peremennoj count. Nakonec, process aktiviziruet sistemnuyu operaciyu write, vyzvav bibliotechnuyu funkciyu s tem zhe imenem. Kazh- doj sistemnoj operacii sootvetstvuet tochka vhoda v biblioteke sistemnyh ope- racij; biblioteka sistemnyh operacij napisana na yazyke assemblera i vklyuchaet special'nye komandy preryvaniya, kotorye, vypolnyayas', porozhdayut "preryvanie", vyzyvayushchee pereklyuchenie apparatury v rezhim yadra. Process ishchet v biblioteke tochku vhoda, sootvetstvuyushchuyu otdel'noj sistemnoj operacii, podobno tomu, kak on vyzyvaet lyubuyu iz funkcij, sozdavaya pri etom dlya bibliotechnoj funkcii za- pis' aktivacii. Kogda process vypolnyaet special'nuyu instrukciyu, on pereklyu- chaetsya v rezhim yadra, vypolnyaet operacii yadra i ispol'zuet stek yadra. Stek yadra soderzhit zapisi aktivacii dlya funkcij, vypolnyayushchihsya v rezhime yadra. |lementy funkcij i dannyh v steke yadra sootvetstvuyut funkciyam i dan- nym, otnosyashchimsya k yadru, no ne k programme pol'zovatelya, tem ne menee, kons- trukciya steka yadra podobna konstrukcii steka zadachi. Stek yadra dlya processa pust, esli process vypolnyaetsya v rezhime zadachi. Sprava na Risunke 2.4 preds- tavlen stek yadra dlya processa vypolneniya sistemnoj operacii write v program- promezhutochnaya tablica oblas- tablica tej processov oblastej +---------------------+ +-------------+ +------------+ | chast' adresnogo pro-| | | | | | stranstva zadachi, | | | | | | vydelennaya processu | | | | | +---------------------+ +-------------+ +------------+ ^ +--+-> ---+-----+-> | | | +-------------+ +-----+------+ +----------+----------+ +--+-> ---+--+ | | | | | | | +-------------+ | | | | | | | | | | | +-----+------+ +----------+----------+ | | | +--+-> | | | v -----+--+ | | +-----+---+--+ +---------------------+ | | | | | | | | +-------------+ +-----+---+--+ | | | | +---------------------+ | | tablica processov +-------------------------+---+--+ | operativnaya pamyat' v v | +--------------------------------+ Risunok 2.5. Informacionnye struktury dlya processov 29 me copy. Podrobno algoritmy vypolneniya sistemnoj operacii write budut opisa- ny v posleduyushchih razdelah. Kazhdomu processu sootvetstvuet tochka vhoda v tablice processov yadra, krome togo, kazhdomu processu vydelyaetsya chast' operativnoj pamyati, otvedennaya pod zadachu pol'zovatelya. Tablica processov vklyuchaet v sebya ukazateli na pro- mezhutochnuyu tablicu oblastej processov, tochki vhoda v kotoruyu sluzhat v kaches- tve ukazatelej na sobstvenno tablicu oblastej. Oblast'yu nazyvaetsya nepreryv- naya zona adresnogo prostranstva, vydelyaemaya processu dlya razmeshcheniya teksta, dannyh i steka. Tochki vhoda v tablicu oblastej opisyvayut atributy oblasti, kak napri- mer, hranyatsya li v oblasti tekst programmy ili dannye, zakrytaya li eta ob- last' ili zhe sovmestno ispol'zuemaya, i gde konkretno v pamyati razmeshchaetsya soderzhimoe oblasti. Vneshnij uroven' kosvennoj adresacii (cherez promezhutochnuyu tablicu oblastej, ispol'zuemyh processami, k sobstvenno tablice oblastej) pozvolyaet nezavisimym processam sovmestno ispol'zovat' oblasti. Kogda pro- cess zapuskaet sistemnuyu operaciyu exec, yadro sistemy vydelyaet oblasti pod ee tekst, dannye i stek, osvobozhdaya starye oblasti, kotorye ispol'zovalis' pro- cessom. Esli process zapuskaet operaciyu fork, yadro udvaivaet razmer adresno- go prostranstva starogo processa, pozvolyaya processam sovmestno ispol'zovat' oblasti, kogda eto vozmozhno, i, s drugoj storony, proizvodya fizicheskoe kopi- rovanie. Esli process zapuskaet operaciyu exit, yadro osvobozhdaet oblasti, ko- torye ispol'zovalis' processom. Na Risunke 2.5 izobrazheny informacionnye struktury, svyazannye s zapuskom processa. Tablica processov ssylaetsya na promezhutochnuyu tablicu oblastej, ispol'zuemyh processom, v kotoroj soderzhatsya ukazateli na zapisi v sobstvenno tablice oblastej, sootvetstvuyushchie oblastyam dlya teksta, dannyh i steka processa. Zapis' v tablice processov i chast' adresnogo prostranstva zadachi, vyde- lennaya processu, soderzhat upravlyayushchuyu informaciyu i dannye o sostoyanii pro- cessa. |to adresnoe prostranstvo yavlyaetsya rasshireniem sootvetstvuyushchej zapisi v tablice processov, razlichiya mezhdu dannymi ob容ktami budut rassmotreny v glave 6. V kachestve polej v tablice processov, kotorye rassmatrivayutsya v posleduyushchih razdelah, vystupayut: * pole sostoyaniya, * identifikatory, kotorye harakterizuyut pol'zovatelya, yavlyayushchegosya vla- del'cem processa (kod pol'zovatelya ili UID), * znachenie deskriptora sobytiya, kogda process priostanovlen (nahoditsya v sostoyanii "sna"). Adresnoe prostranstvo zadachi, vydelennoe processu, soderzhit opisyvayushchuyu process informaciyu, dostup k kotoroj dolzhen obespechivat'sya tol'ko vo vremya vypolneniya processa. Vazhnymi polyami yavlyayutsya: * ukazatel' na poziciyu v tablice processov, sootvetstvuyushchuyu tekushchemu processu, * parametry tekushchej sistemnoj operacii, vozvrashchaemye znacheniya i kody oshibok, * deskriptory fajla dlya vseh otkrytyh fajlov, * vnutrennie parametry vvoda-vyvoda, * tekushchij katalog i tekushchij koren' (sm. glavu 5), * granicy fajlov i processa. YAdro sistemy imeet neposredstvennyj dostup k polyam adresnogo prostranst- va zadachi, vydelennogo vypolnyaemomu processu, no ne imeet dostup k sootvets- tvuyushchim polyam drugih processov. S tochki zreniya vnutrennego algoritma, pri obrashchenii k adresnomu prostranstvu zadachi, vydelennomu vypolnyaemomu proces- su, yadro ssylaetsya na strukturnuyu peremennuyu u, i, kogda zapuskaetsya na vy- polnenie drugoj process, yadro perenastraivaet virtual'nye adresa takim obra- zom, chtoby strukturnaya peremennaya u ukazyvala by na adresnoe prostranstvo zadachi dlya novogo processa. V sistemnoj realizacii predusmotreno oblegchenie identifikacii tekushchego processa blagodarya nalichiyu ukazatelya na sootvetstvuyu- 30 shchuyu zapis' v tablice processov iz adresnogo prostranstva zadachi.

    2.2.2.1 Kontekst processa

Kontekstom processa yavlyaetsya ego sostoyanie, opredelyaemoe tekstom, znache- niyami global'nyh peremennyh pol'zovatelya i informacionnymi strukturami, zna- cheniyami ispol'zuemyh mashinnyh registrov, znacheniyami, hranimymi v pozicii tablicy processov i v adresnom prostranstve zadachi, a takzhe soderzhimym ste- kov zadachi i yadra, otnosyashchihsya k dannomu processu. Tekst operacij sistemy i ee global'nye informacionnye struktury sovmestno ispol'zuyutsya vsemi proces- sami, no ne yavlyayutsya sostavnoj chast'yu konteksta processa. Govoryat, chto pri zapuske processa sistema ispolnyaetsya v kontekste pro- cessa. Kogda yadro sistemy reshaet zapustit' drugoj process, ono vypolnyaet pe- reklyuchenie konteksta s tem, chtoby sistema ispolnyalas' v kontekste drugogo processa. YAdro osushchestvlyaet pereklyuchenie konteksta tol'ko pri opredelennyh usloviyah, chto my uvidim v dal'nejshem. Vypolnyaya pereklyuchenie konteksta, yadro sohranyaet informaciyu, dostatochnuyu dlya togo, chtoby pozdnee pereklyuchit'sya vnov' na pervyj process i vozobnovit' ego vypolnenie. Analogichnym obrazom, pri perehode iz rezhima zadachi v rezhim yadra, yadro sistemy sohranyaet informa- ciyu, dostatochnuyu dlya togo, chtoby pozdnee vernut'sya v rezhim zadachi i prodol- zhit' vypolnenie s prervannogo mesta. Odnako, perehod iz rezhima zadachi v re- zhim yadra yavlyaetsya smenoj rezhima, no ne pereklyucheniem konteksta. Esli obra- tit'sya eshche raz k Risunku 1.5, mozhno skazat', chto yadro vypolnyaet pereklyuchenie konteksta, kogda menyaet kontekst processa A na kontekst processa B; ono me- nyaet rezhim vypolneniya s rezhima zadachi na rezhim yadra i naoborot, ostavayas' v kontekste odnogo processa, naprimer, processa A. YAdro obrabatyvaet preryvaniya v kontekste prervannogo processa, pust' da- zhe ono i ne vyzyvalo nikakogo preryvaniya. Prervannyj process mog pri etom vypolnyat'sya kak v rezhime zadachi, tak i v rezhime yadra. YAdro sohranyaet infor- maciyu, dostatochnuyu dlya togo, chtoby mozhno bylo pozzhe vozobnovit' vypolnenie prervannogo processa, i obrabatyvaet preryvanie v rezhime yadra. YAdro ne po- rozhdaet i ne planiruet porozhdenie kakogo-to osobogo processa po obrabotke preryvanij.

    2.2.2.2 Sostoyaniya processa

Vremya zhizni processa mozhno razdelit' na neskol'ko sostoyanij, kazhdoe iz kotoryh imeet opredelennye harakteristiki, opisyvayushchie process. Vse sostoya- niya processa rassmatrivayutsya v glave 6, odnako predstavlyaetsya sushchestvennym dlya ponimaniya perechislit' nekotorye iz sostoyanij uzhe sejchas: 1. Process vypolnyaetsya v rezhime zadachi. 2. Process vypolnyaetsya v rezhime yadra. 3. Process ne vypolnyaetsya, no gotov k vypolneniyu i zhdet, kogda planirov- shchik vyberet ego. V etom sostoyanii mozhet nahodit'sya mnogo processov, i algo- ritm planirovaniya ustanavlivaet, kakoj iz processov budet vypolnyat'sya sledu- yushchim. 4. Process priostanovlen ("spit"). Process "vpadaet v son", kogda on ne mozhet bol'she prodolzhat' vypolnenie, naprimer, kogda zhdet zaversheniya vvo- da-vyvoda. Poskol'ku processor v kazhdyj moment vremeni vypolnyaet tol'ko odin pro- cess, v sostoyaniyah 1 i 2 mozhet nahodit'sya samoe bol'shee odin process. |ti dva sostoyaniya sootvetstvuyut dvum rezhimam vypolneniya, rezhimu zadachi i rezhimu yadra. 31

    2.2.2.3 Perehody iz sostoyaniya v sostoyanie

Sostoyaniya processa, perechislennye vyshe, dayut staticheskoe predstavlenie o processe, odnako processy nepreryvno perehodyat iz sostoyaniya v sostoyanie v sootvetstvii s opredelennymi pravilami. Diagramma perehodov predstavlyaet so- boj orientirovannyj graf, vershiny kotorogo predstavlyayut soboj sostoyaniya, v kotorye mozhet perejti process, a dugi - sobytiya, yavlyayushchiesya prichinami pere- hoda processa iz odnogo sostoyaniya v drugoe. Perehod mezhdu dvumya sostoyaniyami razreshen, esli sushchestvuet duga iz pervogo sostoyaniya vo vtoroe. Neskol'ko dug mozhet vyhodit' iz odnogo sostoyaniya, odnako process perehodit tol'ko po odnoj iz nih v zavisimosti ot togo, kakoe sobytie proizoshlo v sisteme. Na Risunke 2.6 predstavlena diagramma perehodov dlya sostoyanij, perechislennyh vyshe. Kak uzhe govorilos' vyshe, v rezhime razdeleniya vremeni mozhet vypolnyat'sya odnovremenno neskol'ko processov, i vse oni mogut odnovremenno rabotat' v rezhime yadra. Esli im razreshit' svobodno vypolnyat'sya v rezhime yadra, to oni mogut isportit' global'nye informacionnye struktury, prinadlezhashchie yadru. Zapreshchaya proizvol'noe pereklyuchenie kontekstov i upravlyaya vozniknoveniem so- bytij, yadro zashchishchaet svoyu celostnost'. YAdro razreshaet pereklyuchenie konteksta tol'ko togda, kogda process pere- hodit iz sostoyaniya "zapusk v rezhime yadra" v sostoyanie "sna v pamyati". Pro- cessy, zapushchennye v rezhime yadra, ne mogut byt' vygruzheny drugimi processami; poetomu inogda govoryat, chto yadro nevygruzhaemo, pri etom processy, nahodyashchie- sya v rezhime zadachi, mogut vygruzhat'sya sistemoj. YAdro podderzhivaet celost- nost' svoih informacionnyh struktur, poskol'ku ono nevygruzhaemo, takim obra- zom reshaya problemu "vzaimnogo isklyucheniya" - obespecheniya togo, chto kritiches- kie sekcii programmy vypolnyayutsya v kazhdyj moment vremeni v ramkah samoe bol'shee odnogo processa. V kachestve primera rassmotrim programmu (Risunok 2.7) vklyucheniya informa- cionnoj struktury, chej adres soderzhitsya v ukazatele bp1, v spisok s ispol'- zovaniem ukazatelej posle struktury, chej adres soderzhitsya v bp. Esli sistema razreshila pereklyuchenie konteksta pri vypolnenii yadrom fragmenta programmy, vozmozhno vozniknovenie sleduyushchej situacii. Predpolozhim, yadro vypolnyaet prog- rammu zapusk +-------+ v rezhi- | | me za- | 1 | dachi | | +-+-----+ obrashchenie | ^ vozvrat k sisteme | | ili pre- | | ryvanie | | v | zapusk +-----+-+ v rezhi- | |<---------+ preryvanie, me yad- | 2 | | vozvrat iz ra | |<---------+ preryvaniya +-+-----+ priosta-| ^ process pla- +-------+ nov | | nirovaniya +-------+ ozhidanie | |<----------+ +------------+ | gotovnost' ("son")| 4 +--------------------------->| 3 | k vypolneniyu +-------+ probuzhdenie +-------+ pereklyuchenie konteksta dopustimo Risunok 2.6. Sostoyaniya processa i perehody mezhdu nimi 32 do kommentariev i zatem osushchestvlyaet pereklyuchenie konteksta. Spisok s is- pol'zovaniem sdvoennyh ukazatelej imeet protivorechivyj vid: struktura bp1 tol'ko napolovinu vhodit v etot spisok. Esli process sleduet za perednimi ukazatelyami, on obnaruzhit bp1 v dannom spiske, no esli on posleduet za fono- vymi ukazatelyami, to voobshche ne najdet strukturu bp1 (Risunok 2.8). Esli dru- gie processy budut obrabatyvat' ukazateli v spiske do momenta povtornogo za- puska pervogo processa, struktura spiska mozhet postoyanno razrushat'sya. Siste- ma UNIX preduprezhdaet vozniknovenie podobnyh situacij, zapreshchaya pereklyuchenie kontekstov na vremya vypolneniya processa v rezhime yadra. Esli process pereho- dit v sostoyanie "sna", delaya dopustimym pereklyuchenie konteksta, algoritmy yadra obespechivayut zashchitu celostnosti informacionnyh struktur sistemy. Problemoj, kotoraya mozhet privesti k narusheniyu celostnosti informacii yad- ra, yavlyaetsya obrabotka preryvanij, mogushchaya vnosit' izmeneniya v informaciyu o sostoyanii yadra. Naprimer, esli yadro vypolnyalo programmu, privedennuyu na Ri- sunke 2.7, i poluchilo preryvanie po dostizhenii kommentariev, programma obra- botki preryva- +-----------------------------------------------------------+ | struct queue { | | | | | | | | } *bp, *bp1; | | bp1 - > forp = bp - > forp; | | bp1 - > backp = bp; | | bp - > forp = bp1; | | /* zdes' rassmotrite vozmozhnost' pereklyucheniya konteksta */| | bp1 - > forp - > backp = bp1; | +-----------------------------------------------------------+ Risunok 2.7. Primer programmy, sozdayushchej spisok s dvunapravlennymi ukazate- lyami +-------+ | | | bp1 | | | +-------+ +-------+ +-------+ ----->| +------------------------------>| +----> | bp | | | <-----+ |<------------------------------+ |<---- +-------+ +-------+ Vklyuchenie bp1 v spisok s dvunapravlennymi ukazatelyami +-------+ +-------+ +-------+ ----->| +---------->| +---------->| +----> | bp | | bp1 | | | <-----+ |<----------+ | +-----+ |<---- +-------+<----+ +-------+ | +-------+ +-------------------+ Risunok 2.8. Spisok s ukazatelyami, nekorrektnyj iz-za pereklyucheniya kontek- sta 33 nij mozhet razrushit' ssylki, esli budet manipulirovat' ukazatelyami, kak bylo pokazano ranee. CHtoby reshit' etu problemu, sistema mogla by zapretit' vse preryvaniya na vremya raboty v rezhime yadra, no pri etom zatyanulas' by obrabot- ka preryvaniya, chto v konechnom schete naneslo by ushcherb proizvoditel'nosti sis- temy. Vmesto etogo yadro povyshaet prioritet preryvaniya processora, zapreshchaya preryvaniya na vremya vypolneniya kriticheskih sekcij programmy. Sekciya program- my yavlyaetsya kriticheskoj, esli v processe ee vypolneniya zapusk programm obra- botki proizvol'nogo preryvaniya mozhet privesti k vozniknoveniyu problem, imeyu- shchih otnoshenie k narusheniyu celostnosti. Naprimer, esli programma obrabotki preryvaniya ot diska rabotaet s bufernymi ocheredyami, to chast' preryvaemoj programmy, pri vypolnenii kotoroj yadro obrabatyvaet bufernye ocheredi, yavlya- etsya kriticheskoj sekciej po otnosheniyu k programme obrabotki preryvaniya ot diska. Kriticheskie sekcii neveliki po razmeru i vstrechayutsya nechasto, poetomu ih sushchestvovanie ne okazyvaet prakticheski nikakogo vozdejstviya na proizvodi- tel'nost' sistemy. V drugih operacionnyh sistemah dannyj vopros reshaetsya pu- tem zapreshcheniya lyubyh preryvanij pri rabote v sistemnyh rezhimah ili putem razrabotki shem blokirovki, obespechivayushchih celostnost'. V glave 12 my eshche vernemsya k etomu voprosu, kogda budem govorit' o mnogoprocessornyh sistemah, gde primeneniya ukazannyh mer dlya resheniya problemy nedostatochno. CHtoby podvesti chertu, eshche raz skazhem, chto yadro zashchishchaet svoyu celost- nost', razreshaya pereklyuchenie konteksta tol'ko togda, kogda process perehodit v sostoyanie "sna", a takzhe prepyatstvuya vozdejstviyu odnogo processa na drugoj s cel'yu izmeneniya sostoyaniya poslednego. Ono takzhe povyshaet prioritet prery- vaniya processora na vremya vypolneniya kriticheskih sekcij programm, zapreshchaya takim obrazom preryvaniya, kotorye v protivnom sluchae mogut vyzvat' narushenie celostnosti. Planirovshchik processov periodicheski vygruzhaet processy, vypolnya- yushchiesya v rezhime zadachi, dlya togo, chtoby processy ne mogli monopol'no ispol'- zovat' central'nyj processor.

    2.2.2.4 "Son" i probuzhdenie

Process, vypolnyayushchijsya v rezhime yadra, imeet znachitel'nuyu stepen' avtono- mii v reshenii togo, kak emu sleduet reagirovat' na vozniknovenie sistemnyh sobytij. Processy mogut obshchat'sya mezhdu soboj i "predlagat'" razlichnye al'- ternativy, no pri etom okonchatel'noe reshenie oni prinimayut samostoyatel'no. My eshche uvidim, chto sushchestvuet nabor pravil, kotorym podchinyaetsya povedenie processov v razlichnyh obstoyatel'stvah, no kazhdyj process v konechnom itoge sleduet etim pravilam po svoej sobstvennoj iniciative. Naprimer, esli pro- cess dolzhen vremenno priostanovit' vypolnenie ("perejti ko snu"), on eto de- laet po svoej dobroj vole. Sledovatel'no, programma obrabotki preryvanij ne mozhet priostanovit' svoe vypolnenie, ibo esli eto sluchitsya, prervannyj pro- cess dolzhen byl by "perejti ko snu" po umolchaniyu. Processy priostanavlivayut svoe vypolnenie, potomu chto oni ozhidayut voz- niknoveniya nekotorogo sobytiya, naprimer, zaversheniya vvoda-vyvoda na perife- rijnom ustrojstve, vyhoda, vydeleniya sistemnyh resursov i t.d. Kogda govo- ryat, chto process priostanovilsya po sobytiyu, to imeetsya vvidu, chto process nahoditsya v sostoyanii "sna" do nastupleniya sobytiya, posle chego on probuditsya i perejdet v sostoyanie "gotovnosti k vypolneniyu". Odnovremenno mogut prios- tanovit'sya po sobytiyu mnogo processov; kogda sobytie nastupaet, vse proces- sy, priostanovlennye po sobytiyu, probuzhdayutsya, poskol'ku znachenie usloviya, svyazannogo s sobytiem, bol'she ne yavlyaetsya "istinnym". Kogda process probuzh- daetsya, on perehodit iz sostoyaniya "sna" v sostoyanie "gotovnosti k vypolne- niyu", nahodyas' v kotorom on uzhe mozhet byt' vybran planirovshchikom; sleduet ob- ratit' vnimanie na to, chto on ne vypolnyaetsya nemedlenno. Priostanovlennye processy ne zanimayut central'nyj processor. YAdru sistemy net nadobnosti pos- toyanno proveryat' to, chto process vse eshche priostanovlen, t.k. ozhidaet nastup- leniya sobytiya, i zatem budit' ego. Naprimer, process, vypolnyaemyj v rezhime yadra, dolzhen inogda blokirovat' 34 strukturu dannyh na sluchaj priostanovki v budushchem; processy, pytayushchiesya ob- ratit'sya k zablokirovannoj strukture, obyazany proverit' nalichie blokirovki i priostanovit' svoe vypolnenie, esli struktura zablokirovana drugim proces- som. YAdro vypolnyaet blokirovki takogo roda sleduyushchim obrazom: while (uslovie "istinno") sleep (sobytie: uslovie prinimaet znachenie "lozh'"); set condition true; to est': poka (uslovie "istinno") priostanovit'sya (do nastupleniya sobytiya, pri kotorom uslovie prinimaet znachenie "lozh'"); prisvoit' usloviyu znachenie "istina"; YAdro snimaet blokirovku i "budit" vse processy, priostanov- lennye iz-za etoj blokirovki, sleduyushchim obrazom: set condition false; wakeup (sobytie: uslovie "lozhno"); to est': prisvoit' usloviyu znachenie "lozh'"; perezapustit'sya (pri nastuplenii sobytiya, pri kotorom uslovie prinimaet znachenie "lozh'"); Na Risunke 2.9 priveden primer, v kotorom tri processa, A, B i C ospari- vayut zablokirovannyj bufer. Perehod v sostoyanie "sna" vyzyvaetsya zablokiro- vannost'yu bufera. Processy, odnazhdy zapustivshis', obnaruzhivayut, chto bufer zablokirovan, i priostanavlivayut svoe vypolnenie do nastupleniya sobytiya, po kotoromu bufer budet razblokirovan. V konce koncov blokirovka s bufera sni- maetsya i vse processy "probuzhdayutsya", perehodya v sostoyanie "gotovnosti k vy- polneniyu". YAdro nakonec vybiraet odin iz processov, skazhem, B, dlya vypolne- niya. Process B, vypolnyaya cikl "while", obnaruzhivaet, chto bufer razblokiro- van, blokiruet ego i prodolzhaet svoe vypolnenie. Esli process B v dal'nejshem snova priostanovitsya bez snyatiya blokirovki s bufera (naprimer, ozhidaya zaver- sheniya operacii vvoda-vyvoda), yadro smozhet pristupit' k planirovaniyu vypolne- niya drugih processov. Esli budet pri etom vybran process A, etot process, vypolnyaya cikl "while", obnaruzhit, chto bufer zablokirovan, i snova perejdet v sostoyanie "sna"; vozmozhno to zhe samoe proizojdet i s processom C. V konce koncov vypolnenie processa B vozobnovitsya i blokirovka s bufera budet snyata, v rezul'tate chego processy A i C poluchat dostup k nemu. Takim obrazom, cikl "while-sleep" obespechivaet takoe polozhenie, pri kotorom samoe bol'shee odin process mozhet imet' dostup k resursu. Algoritmy perehoda v sostoyanie "sna" i probuzhdeniya bolee podrobno budut rassmotreny v glave 6. Tem vremenem oni budut schitat'sya "nedelimymi". Pro- cess perehodit v sostoyanie "sna" mgnovenno i nahoditsya v nem do teh por, po- ka ne budet "razbuzhen". Posle togo, kak on priostanavlivaetsya, yadro sistemy nachinaet planirovat' vypolnenie sleduyushchego processa i pereklyuchaet kontekst na nego.

    2.3 STRUKTURY DANNYH YADRA

Bol'shinstvo informacionnyh struktur yadra razmeshchaetsya v tablicah fiksiro- vannogo razmera, a ne v dinamicheski vydelennoj pamyati. Preimushchestvo takogo podhoda sostoit v tom, chto programma yadra prosta, no v nej ogranichivaetsya chislo elementov informacionnoj struktury do znacheniya, predvaritel'no zadan- nogo pri generacii sistemy. Esli vo vremya funkcionirovaniya sistemy chislo elementov informacionnoj struktury yadra vyjdet za ukazannoe znachenie, yadro ne smozhet dinamicheski vydelit' mesto dlya novyh elementov i dolzhno soobshchit' 35 ob oshibke pol'zovatelyu, sdelavshemu zapros. Esli, s drugoj storony, yadro sge- nerirovano takim obrazom, chto vyhod za granicy tablichnogo prostranstva budet maloveroyaten, dopolnitel'noe tablichnoe prostranstvo mozhet ne ponadobit'sya, poskol'ku ono ne mozhet byt' ispol'zovano dlya drugih celej. Kak by to ni by- lo, prostota algoritmov yadra predstavlyaetsya bolee vazhnoj, chem szhatie posled- nih bajtov operativnoj pamyati. Obychno v algoritmah dlya poiska svobodnyh mest v tablicah ispol'zuyutsya neslozhnye cikly i etot metod bolee ponyaten i inogda bolee effektiven po sravneniyu s bolee slozhnymi shemami vydeleniya pamyati.

    2.4 UPRAVLENIE SISTEMOJ

K upravlyayushchim processam, grubo govorya, otnosyatsya te processy, kotorye vypolnyayut razlichnye funkcii po obespecheniyu blagopoluchnoj raboty pol'zovate- lej sistemy. K takim funkciyam otnosyatsya formatirovanie diskov, sozdanie no- vyh fajlovyh sistem, vosstanovlenie razrushennyh fajlovyh sistem, otladka yad- ra i dr. S konceptual'noj Vremya Process A Process B Process C +------------------------------------------------------------- | Bufer zablokirovan | Priostanovlen | . Bufer zablokirovan | . Priostanovlen | . . Bufer zablokirovan | . . Priostanovlen | +----------------------------------------------------------+ | |Bufer razblokirovan Probuzhdenie vseh "spyashchih" processov| | +----------------------------------------------------------+ | Gotov k Gotov k Gotov k | vypolneniyu vypolneniyu vypolneniyu | . . | . Zapushchen . | . Bufer razblokirovan . | . Blokirovka bufera . | . . . | . Priostanovka po . | . proizvol'noj prichine . | . . . | Zapushchen . . | Bufer zablokirovan . . | Priostanovka . . | . . Zapushchen | . . Bufer zablokirovan | . . Priostanovka | . Probuzhdenie . | . Snyatie blokirovki . | . bufera . | Gotov k Probuzhdenie vseh Gotov k | vypolneniyu "spyashchih" processov vypolneniyu | v Pereklyuchenie konteksta Zapushchen Risunok 2.9. Mnogokratnaya priostanovka vypolneniya processov, vyzvannaya blokirovkoj 36 tochki zreniya, mezhdu upravlyayushchimi i pol'zovatel'skimi processami net raznicy. Oni ispol'zuyut odin i tot zhe nabor obrashchenij k operacionnoj sisteme, dostup- nyj dlya vseh. Upravlyayushchie processy otlichayutsya ot obychnyh pol'zovatel'skih processov tol'ko pravami i privilegiyami, kotorymi oni obladayut. Naprimer, rezhimy razresheniya dostupa k fajlu mogut predusmatrivat' predostavlenie voz- mozhnosti raboty s fajlami dlya upravlyayushchih processov i otsutstvie takoj voz- mozhnosti dlya obychnyh pol'zovatelej. Vnutri sistemy yadro vydelyaet osobogo pol'zovatelya, imenuemogo superpol'zovatelem, i nadelyaet ego osobymi privile- giyami, o chem my eshche pogovorim nizhe. Pol'zovatel' mozhet stat' superpol'zova- telem, esli sootvetstvuyushchim obrazom zaregistriruetsya v sisteme ili zapustit special'nuyu programmu. Privilegii superpol'zovatelya budut rassmotreny v sle- duyushchih glavah. Esli skazat' korotko, yadro sistemy ne vydelyaet upravlyayushchie processy v otdel'nyj klass.

    2.5 VYVODY I OBZOR POSLEDUYUSHCHIH GLAV

V etoj glave opisana arhitektura yadra operacionnoj sistemy; ego osnovny- mi komponentami vystupayut podsistema upravleniya fajlami i podsistema uprav- leniya processami. Podsistema upravleniya fajlami upravlyaet hraneniem i vybor- koj dannyh v pol'zovatel'skih fajlah. Fajly organizovany v vide fajlovyh sistem, kotorye traktuyutsya kak logicheskie ustrojstva; fizicheskoe ustrojstvo, takoe kak disk, mozhet soderzhat' neskol'ko logicheskih ustrojstv (fajlovyh sistem). Kazhdaya fajlovaya sistema imeet superblok, v kotorom opisyvaetsya struktura i soderzhimoe fajlovoj sistemy, kazhdyj fajl v fajlovoj sisteme opi- syvaetsya indeksom, hranyashchim atributy fajla. Sistemnye operacii rabotayut s fajlami, ispol'zuya indeksy. Processy nahodyatsya v razlichnyh sostoyaniyah i perehodyat iz sostoyaniya v sostoyanie, sleduya opredelennym pravilam perehoda. V chastnosti, processy, vy- polnyayushchiesya v rezhime yadra, mogut priostanovit' svoe vypolnenie i perejti v sostoyanie "sna", no ni odin process ne mozhet perevesti v eto sostoyanie dru- goj process. YAdro yavlyaetsya nevygruzhaemym i eto oznachaet, chto process, vypol- nyayushchijsya v rezhime yadra, budet prodolzhat' svoe vypolnenie do teh por, poka ne perejdet v sostoyanie "sna" ili poka ne vernetsya v rezhim zadachi. YAdro obespe- chivaet celostnost' svoih informacionnyh struktur blagodarya svoej nevygruzhae- mosti, a takzhe putem blokirovaniya preryvanij na vremya vypolneniya kriticheskih sekcij programmy. V ostal'nyh chastyah glavy detal'no opisyvayutsya podsistemy, izobrazhennye na Risunke 2.1, a takzhe vzaimodejstvie mezhdu nimi, nachinaya s podsistemy up- ravleniya fajlami i vklyuchaya podsistemu upravleniya processami. V sleduyushchej glave rassmatrivaetsya bufer sverhoperativnoj pamyati (kesh) i opisyvayutsya al- goritmy upravleniya buferom, ispol'zuemye v glavah 4, 5 i 7. V glave 4 rass- matrivayutsya vnutrennie algoritmy fajlovoj sistemy, vklyuchaya obrabotku indek- sov, strukturu fajlov, preobrazovanie imeni puti v indeks. V glave 5 rass- matrivayutsya sistemnye operacii, kotorye, ispol'zuya privedennye v glave 4 al- goritmy, obrashchayutsya k fajlovoj sisteme, t.e. takie, kak open, close, read i write. Glava 6 imeet delo s ponyatiem konteksta processa i ego adresnym pros- transtvom, a glava 7 rassmatrivaet sistemnye operacii, svyazannye s upravle- niem processami i ispol'zuyushchie algoritmy glavy 6. Glava 8 kasaetsya planiro- vaniya vypolneniya processov, v glave 9 obsuzhdayutsya algoritmy raspredeleniya pamyati. Glava 10 posvyashchena drajveram ustrojstv, rassmotrenie kotoryh do togo otkladyvalos', chtoby prezhde ob座asnit' svyaz' drajvera terminala s upravleniem processami. V glave 11 predstavleno neskol'ko form vzaimodejstviya processov. Nakonec, v poslednih dvuh glavah rassmatrivayutsya voprosy, svyazannye s uglub- lennym izucheniem osobennostej sistemy, v chastnosti, osobennosti mnogoproces- sornyh sistem i raspredelennyh sistem. 37

    2.6 UPRAZHNENIYA

1. Rassmotrim sleduyushchij nabor komand: grep main a.c b.c c.c > grepout & wc -1 < grepout & rm grepout & Ampersand (simvol "&") v konce kazhdoj komandnoj stroki govorit komandnomu processoru shell o tom, chto komandu sleduet vypolnit' na fone, pri etom shell mozhet vypolnyat' vse komandnye stroki parallel'no. Pochemu eto ne ravnocenno sleduyushchej komandnoj stroke ? grep main a.c b.c c.c | wc -1 2. Rassmotrim primer programmy, privedennyj na Risunke 2.7. Predpolozhim, chto v tot moment, kogda pri ee vypolnenii vstretilsya kommentarij, proizoshlo pereklyuchenie konteksta i drugoj process ubral soderzhimoe bufera iz spiska ukazatelej s pomoshch'yu sleduyushchih komand: remove(gp) struct queue *gp; { gp - > forp - > backp = gp - > backp; gp - > backp - > forp = gp - > forp; gp - > forp = gp - > backp = NULL; } Rassmotrim tri sluchaya: - Process ubiraet iz spiska s ukazatelyami strukturu bp1. - Process ubiraet iz spiska s ukazatelyami strukturu, sleduyushchuyu posle struktury bp1. - Process ubiraet iz spiska strukturu, kotoraya pervonachal'no sledovala za bp1 do togo, kak struktura bp byla napolovinu vklyuchena v ukazannyj spi- sok. V kakom sostoyanii budet spisok posle togo, kak pervyj process zavershit vypolnenie chasti programmy, raspolozhennoj posle kommentariev ? 3. CHto proizoshlo by v tom sluchae, esli yadro popytalos' by vozobnovit' vypol- nenie vseh processov, priostanovlennyh po sobytiyu, no v sisteme ne bylo by k etomu momentu ni odnogo takogo processa ? 38

Last-modified: Tue, 23 Mar 2004 10:06:51 GMT
Ocenite etot tekst: