LXF130:DrBrown2

Материал из Linuxformat.

Перейти к: навигация, поиск

О про­цес­сах яс­но

Ти­пич­ный жиз­нен­ный цикл про­цес­са в ви­де сис­тем­ных вы­зо­вов ро­ди­тель­ско­го и до­чер­не­го про­цес­сов.

Про­цесс init — роди­тель тер­ми­на­ла Gnome, ко­то­рый запус­ка­ет обо­лоч­ку Bash, ко­то­рая запус­ка­ет pstree.

О про­цес­сах слы­ша­ли все, но что, собственно, это та­кое?

Нас при­шла на­вестить те­туш­ка Мод – джин при­шлось при­пря­тать. Те­тя Мод что-то слы­ша­ла о ми­ре ИТ, но знала, что я «экс­перт», и (к ее чести) хо­те­ла уз­нать еще. Она спро­си­ла: «А где програм­мы, ко­то­рые ра­бо­та­ют на мо­ем ком­пь­ю­те­ре? Ес­ли мы за­глянем внутрь, смо­жешь их по­ка­зать?» На этот во­прос бы­ло непро­сто от­ве­тить так, что­бы те­тя Мод поня­ла. Конеч­но, мож­но бы­ло ска­зать, что про­грам­ма – это «по­сле­до­ва­тель­ность команд», и, ука­зав на же­ст­кий диск или чи­пы па­мя­ти, зая­вить: «Вот тут они и жи­вут».

Мы спря­та­ли и виски, по­то­му что ее муж, Клайв, то­же пришел. Его по­знания про­сти­ра­лись несколь­ко даль­ше, и по­то­му он был еще опаснее те­ти. Он спро­сил: «Ес­ли Linux – мно­го­процесс­ная опе­ра­ци­он­ная систе­ма, то где же про­цес­сы? Ес­ли от­крыть ком­пь­ю­тер, смо­жешь их по­ка­зать?» Этот во­прос по­сложнее, по­тому что по сравнению с про­грам­мой про­цесс – бо­лее аб­ст­ракт­ное по­ня­тие. Я мог бы вы­дать го­то­вый от­вет, ска­зав, что «про­цесс – это эк­зем­п­ляр вы­пол­няе­мой про­грам­мы», но это вряд ли бы помог­ло бед­но­му Клай­ву. Да и мне бы не по­мог­ло.

Нуд­ные осно­вы

Итак, вот мое объ­яснение, что же та­кое про­цесс. Оно ни сжато, ни кра­соч­но – я не ду­маю, что так вы раз­бе­ре­тесь в этой штуке. Про­грам­ме, вы­пол­няе­мой в Linux, нуж­ны некие ре­сур­сы. Ей тре­бу­ет­ся па­мять (ко­до­вый сег­мент, где хранит­ся она са­ма, сег­мент ста­ти­че­ских дан­ных, стек и «ку­ча», где со­дер­жат­ся данные). Про­грам­ма мо­жет от­крывать фай­лы или под­клю­чать­ся к оп­ре­де­лен­но­му сер­ве­ру. Эти со­единения от­сле­жи­ва­ют­ся с по­мо­щью «фай­ло­вых деск­рип­то­ров». У про­грам­мы есть по­ня­тие о «те­ку­щем ката­ло­ге», где она бу­дет искать фай­лы, ес­ли их име­на на­чи­на­ются не с ‘/’. У нее есть «ок­ру­жение» с «пе­ре­мен­ны­ми ок­ру­жения», вро­де HOME=/home/chris. На­конец, про­грам­ме нуж­но про­цес­сорное вре­мя – дей­стви­тель­ная воз­мож­ность быть за­планиро­ван­ной на вы­полнение в со­перниче­стве с дру­ги­ми про­цес­са­ми, тре­бующи­ми то­го же. Имен­но про­цесс хранит весь кон­текст и ре­сур­сы, необ­хо­ди­мые для за­пуска про­грам­мы.

Здесь мо­жет по­мочь ана­ло­гия с ак­те­ром, чи­таю­щим сце­нарий пье­сы. Сце­на­рий – на­бор ин­ст­рук­ций, по­яс­няю­щий ак­те­ру, что го­во­рить и как вести се­бя на сцене. Сце­на­рий мож­но сравнить с про­грам­мой. Ак­тер – объ­ект, от­вет­ствен­ный за чтение сце­на­рия, и по­до­бие про­цес­са.

Но­вый про­цесс соз­да­ет­ся тогда, когда в су­ще­ствую­щем процес­се про­ис­хо­дит систем­ный вы­зов fork(). Ис­ход­ный про­цесс на­зы­ва­ет­ся ро­ди­тель­ским, а но­вый – до­черним. Сна­ча­ла до­черний про­цесс пред­став­ля­ет со­бой точ­ную ко­пию ро­ди­тель­ско­го и вы­пол­ня­ет ту же са­мую про­­грам­му. В мо­ем при­ме­ре с ак­те­ра­ми, два ак­те­ра те­перь сто­ят ря­дом и чи­та­ют один и тот же сце­на­рий. Иногда дочерний про­цесс про­дол­жа­ет вы­пол­нять ту же про­грам­му, что и ро­ди­тель­ский: на­при­мер, когда Apache по­ро­ж­да­ет до­черние про­цес­сы, все они вы­пол­ня­ют один и тот же код. Но ча­ще дочерний про­цесс пе­ре­ста­ет ра­бо­тать и за­пуска­ет дру­гую про­грамму с по­мо­щью систем­но­го вы­зо­ва exec(). В мо­ем при­ме­ре ак­тер ви­дит ука­зание от­ло­жить те­ку­щую пье­су, взять текст «Макбе­та» и на­чать сна­ча­ла.

Про­цесс за­вер­ша­ет­ся систем­ным вы­зо­вом exit(). Его мож­но пре­рвать и с по­мо­щью сиг­на­ла: об этом мы по­го­во­рим че­рез месяц. Когда до­черний про­цесс пре­кра­ща­ет ра­бо­ту, он воз­вра­ща­ет код за­вер­шения (exit status) ро­ди­тель­ско­му про­цес­су, для со­общения о том, что все за­кон­чи­лось хо­ро­шо (код за­вер­шения 0) или что-то по­шло не так (зна­чение, от­лич­ное от нуля). Ро­ди­тель­ский про­цесс мо­жет ждать, по­ка за­вер­шит­ся до­черний, и по­лу­чить его ста­тус с по­мо­щью систем­но­го вы­зо­ва wait(). Та­кое про­ис­хо­дит, когда вы на­би­рае­те коман­ду в обо­лоч­ке: она соз­да­ет для пе­ре­данной коман­ды но­вый про­цесс и ждет, по­ка он за­вер­шит­ся. Но ро­ди­тель­ский про­цесс не обя­зан до­жи­дать­ся до­черних. Когда из ме­ню ра­бо­че­го сто­ла за­пуска­ет­ся гра­фи­че­ское при­ло­жение или обо­лоч­кой за­пуска­ет­ся фо­но­вое за­дание, ро­ди­тель­ский процесс про­сто про­дол­жа­ет ра­бо­тать вме­сте с до­черним.

Про­смот­реть про­цес­сы, вы­пол­няю­щие­ся на ком­пь­ю­те­ре, можно коман­дой ps. У нее есть мно­го фла­гов для вы­бо­ра ото­бра­жаемых про­цес­сов и ин­фор­ма­ции о них, но осо­бен­но удоб­но на­чать с ps -ef. Коман­да про­из­ве­ла глу­бо­кое впе­чат­ление на мое­го дядюш­ку Клай­ва.

Личные инструменты
  • Купить электронную версию
  • Подписаться на бумажную версию