<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF158%3AErlang%3A_%D0%98%D0%B7%D1%83%C2%AD%D1%87%D0%B8%D0%BC_%D0%BC%D0%BD%D0%BE%C2%AD%D0%B3%D0%BE%C2%AD%D0%B7%D0%B0%C2%AD%D0%B4%D0%B0%D1%87%C2%AD%D0%BD%D0%BE%D1%81%D1%82%D1%8C</id>
		<title>LXF158:Erlang: Изу­чим мно­го­за­дач­ность - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF158%3AErlang%3A_%D0%98%D0%B7%D1%83%C2%AD%D1%87%D0%B8%D0%BC_%D0%BC%D0%BD%D0%BE%C2%AD%D0%B3%D0%BE%C2%AD%D0%B7%D0%B0%C2%AD%D0%B4%D0%B0%D1%87%C2%AD%D0%BD%D0%BE%D1%81%D1%82%D1%8C"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF158:Erlang:_%D0%98%D0%B7%D1%83%C2%AD%D1%87%D0%B8%D0%BC_%D0%BC%D0%BD%D0%BE%C2%AD%D0%B3%D0%BE%C2%AD%D0%B7%D0%B0%C2%AD%D0%B4%D0%B0%D1%87%C2%AD%D0%BD%D0%BE%D1%81%D1%82%D1%8C&amp;action=history"/>
		<updated>2026-05-13T07:43:31Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF158:Erlang:_%D0%98%D0%B7%D1%83%C2%AD%D1%87%D0%B8%D0%BC_%D0%BC%D0%BD%D0%BE%C2%AD%D0%B3%D0%BE%C2%AD%D0%B7%D0%B0%C2%AD%D0%B4%D0%B0%D1%87%C2%AD%D0%BD%D0%BE%D1%81%D1%82%D1%8C&amp;diff=17712&amp;oldid=prev</id>
		<title>Olkol: /* Erlang: Изу­чим мно­го­за­дач­ность */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF158:Erlang:_%D0%98%D0%B7%D1%83%C2%AD%D1%87%D0%B8%D0%BC_%D0%BC%D0%BD%D0%BE%C2%AD%D0%B3%D0%BE%C2%AD%D0%B7%D0%B0%C2%AD%D0%B4%D0%B0%D1%87%C2%AD%D0%BD%D0%BE%D1%81%D1%82%D1%8C&amp;diff=17712&amp;oldid=prev"/>
				<updated>2018-09-16T06:44:06Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Erlang: Изу­чим мно­го­за­дач­ность&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 06:44, 16 сентября 2018&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 27:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 27:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Возника­ет во­прос: зачем нам ис­поль­зо­вать бо­лее об­щие сред­ст­ва взаи­мо­дей­ст­вия в слу­чае, когда мож­но при­менить бо­лее под­хо­дя­щие для дан­но­го ти­па мно­го­за­дач­но­сти? Од­на из при­чин та­ко­го под­хо­да со­сто­ит в том, что, раз­ра­ба­ты­вая из­на­чаль­но взаи­мо­дей­ст­вие ме­ж­ду за­да­ча­ми та­ким спо­со­бом, мы по­лу­ча­ем воз­мож­ность ис­поль­зо­вать наш код для лю­бых ви­дов мно­го­за­дач­но­сти. Кро­ме то­го, при та­ком под­хо­де мы мо­жем из­бе­жать или миними­зи­ро­вать возник­но­вение од­но­вре­мен­но­го досту­па к дан­ным (точнее го­во­ря, нам на­до из­бе­гать од­но­вре­мен­но­го досту­па к дан­ным, ес­ли мы хо­тим из­ме­нять эти дан­ные) и, как след­ст­вие, воз­мож­но­го по­вре­ж­дения и несо­гла­со­ван­но­сти дан­ных.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Возника­ет во­прос: зачем нам ис­поль­зо­вать бо­лее об­щие сред­ст­ва взаи­мо­дей­ст­вия в слу­чае, когда мож­но при­менить бо­лее под­хо­дя­щие для дан­но­го ти­па мно­го­за­дач­но­сти? Од­на из при­чин та­ко­го под­хо­да со­сто­ит в том, что, раз­ра­ба­ты­вая из­на­чаль­но взаи­мо­дей­ст­вие ме­ж­ду за­да­ча­ми та­ким спо­со­бом, мы по­лу­ча­ем воз­мож­ность ис­поль­зо­вать наш код для лю­бых ви­дов мно­го­за­дач­но­сти. Кро­ме то­го, при та­ком под­хо­де мы мо­жем из­бе­жать или миними­зи­ро­вать возник­но­вение од­но­вре­мен­но­го досту­па к дан­ным (точнее го­во­ря, нам на­до из­бе­гать од­но­вре­мен­но­го досту­па к дан­ным, ес­ли мы хо­тим из­ме­нять эти дан­ные) и, как след­ст­вие, воз­мож­но­го по­вре­ж­дения и несо­гла­со­ван­но­сти дан­ных.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;{{Врезка|right|Заголовок=Ти­пы псев­до­па­рал­лель­ной мно­го­за­дач­но­сти |Ширина=50%|Содержание=&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* Не­вы­тес­няю­щая мно­го­за­дач­ность Тип мно­го­за­дач­но­сти, при ко­то­ром опе­ра­ци­он­ная сис­те­ма мо­жет за­гру­зить бо­лее од­но­го при­ло­жения в па­мять, но вре­мя про­цес­сора пре­достав­ля­ет­ся толь­ко од­но­му из них – основ­но­му при­ло­жению. Ос­таль­ные при­ло­жения яв­ля­ют­ся фо­но­вы­ми. Для пре­достав­ления про­цес­сор­но­го вре­мени фо­но­во­му при­ло­жению его необ­хо­ди­мо ак­ти­ви­зи­ро­вать. По­доб­ная мно­го­за­дач­ность мо­жет быть реа­ли­зо­ва­на не толь­ко в ОС, но и с по­мо­щью про­грамм – пе­ре­клю­ча­те­лей за­дач.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* Коо­пе­ра­тив­ная мно­го­за­дач­ность Тип мно­го­за­дач­но­сти, при ко­то­ром сле­дую­щая за­да­ча вы­пол­ня­ет­ся толь­ко по­сле то­го, как те­ку­щая за­да­ча яв­но провозгласит се­бя го­то­вой от­дать про­цес­сор­ное вре­мя дру­гим за­да­чам. Как ча­ст­ный слу­чай, та­кое объ­яв­ление под­ра­зу­ме­ва­ет­ся при по­пыт­ке за­хва­та уже за­ня­то­го объ­ек­та бло­ки­ров­ки, а так­же при ожи­дании по­сту­п­ления сле­дую­ще­го со­об­щения от под­сис­те­мы поль­зо­ва­тель­ско­го ин­тер­фей­са.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* Вы­тес­няю­щая мно­го­за­дач­ность Вид мно­го­за­дач­но­сти, в ко­то­ром ОС са­ма пе­ре­да­ет управ­ление от од­ной вы­пол­няе­мой про­грам­мы дру­гой в слу­чае за­вер­шения опе­ра­ций вво­да-вы­во­да, возник­но­вения со­бы­тий в ап­па­ра­ту­ре ком­пь­ю­те­ра, ис­те­чения тай­ме­ров и кван­тов вре­мени или же по­сту­п­лений тех или иных сиг­на­лов от од­ной про­грам­мы к дру­гой. В этом ви­де мно­го­за­дач­но­сти про­цес­сор мо­жет быть пе­ре­клю­чен с ис­полнения од­ной про­грам­мы на ис­полнение дру­гой без вся­ко­го по­же­лания пер­вой про­грам­мы и бу­к­валь­но ме­ж­ду лю­бы­ми дву­мя ин­ст­рук­ция­ми в ее ко­де. Рас­пре­де­ление про­цес­сор­но­го вре­мени осу­ще­ст­в­ля­ет­ся планиров­щи­ком про­цес­сов. К то­му же ка­ж­дой за­да­че мо­жет быть на­зна­чен поль­зо­ва­те­лем или са­мой опе­ра­ци­он­ной сис­те­мой оп­ре­де­лен­ный при­ори­тет, что обес­пе­чи­ва­ет гиб­кое управ­ление рас­пре­де­лением про­цес­сор­но­го вре­мени ме­ж­ду за­да­ча­ми (на­при­мер, мож­но снизить при­ори­тет ре­сур­со­ем­кой про­грам­ме, снизив тем са­мым ско­рость ее ра­бо­ты, но по­вы­сив про­из­во­ди­тель­ность фо­но­вых про­цес­сов). При этом обес­пе­чи­ва­ется бо­лее бы­ст­рый от­клик на дей­ст­вия поль­зо­ва­те­ля.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;}} &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Те­перь да­вай­те раз­бе­ремся, ка­кие есть сред­ст­ва для соз­дания мно­го­за­дач­ных про­грамм. В ка­че­­ст­ве при­ме­ра та­ко­го средства рас­смот­рим ОС Linux. Пер­вый во­прос, ко­то­рый вста­ет пе­ред на­ми – как соз­давать но­вые за­да­чи. Начнем с соз­дания по­то­ков. В Linux для ра­бо­ты с по­то­ка­ми у нас есть биб­лио­те­ка pthreads (ин­те­рес­но, что по­то­ки в Linux – это про­цес­сы, раз­де­ляю­щие ре­сур­сы с про­цес­сом, ко­то­рый их соз­дал); для соз­дания но­вых по­то­ков ис­поль­зу­ет­ся функ­ция pthread_create. Пе­рей­дем к соз­данию про­цес­сов. Для соз­дания про­цес­сов у нас есть сле­дую­щие биб­лио­теч­ные функ­ции: функ­ция fork для соз­дания но­во­го про­цес­са, се­мей­ст­во функ­ций exec для за­пуска в рам­ках про­цес­са дру­гой про­грам­мы, функ­ция system для вы­полнения команд. Сле­ду­ет ска­зать, что соз­да­вать но­вые про­цес­сы мы мо­жем толь­ко на локаль­ном ком­пь­ю­те­ре; воз­мож­но­сти соз­дать но­вый про­цесс (и за­пустить в нем ка­кую-ли­бо про­грам­му) у нас нет. По­это­му при по­строении рас­пре­де­лен­ной сис­те­мы необ­хо­ди­мо пре­ду­смот­реть ав­то­ма­ти­че­­ский старт (при стар­те сис­те­мы) неко­то­ро­го про­цес­са для взаи­мо­дей­ст­вия уз­лов этой рас­пре­де­лен­ной сис­те­мы.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Те­перь да­вай­те раз­бе­ремся, ка­кие есть сред­ст­ва для соз­дания мно­го­за­дач­ных про­грамм. В ка­че­­ст­ве при­ме­ра та­ко­го средства рас­смот­рим ОС Linux. Пер­вый во­прос, ко­то­рый вста­ет пе­ред на­ми – как соз­давать но­вые за­да­чи. Начнем с соз­дания по­то­ков. В Linux для ра­бо­ты с по­то­ка­ми у нас есть биб­лио­те­ка pthreads (ин­те­рес­но, что по­то­ки в Linux – это про­цес­сы, раз­де­ляю­щие ре­сур­сы с про­цес­сом, ко­то­рый их соз­дал); для соз­дания но­вых по­то­ков ис­поль­зу­ет­ся функ­ция pthread_create. Пе­рей­дем к соз­данию про­цес­сов. Для соз­дания про­цес­сов у нас есть сле­дую­щие биб­лио­теч­ные функ­ции: функ­ция fork для соз­дания но­во­го про­цес­са, се­мей­ст­во функ­ций exec для за­пуска в рам­ках про­цес­са дру­гой про­грам­мы, функ­ция system для вы­полнения команд. Сле­ду­ет ска­зать, что соз­да­вать но­вые про­цес­сы мы мо­жем толь­ко на локаль­ном ком­пь­ю­те­ре; воз­мож­но­сти соз­дать но­вый про­цесс (и за­пустить в нем ка­кую-ли­бо про­грам­му) у нас нет. По­это­му при по­строении рас­пре­де­лен­ной сис­те­мы необ­хо­ди­мо пре­ду­смот­реть ав­то­ма­ти­че­­ский старт (при стар­те сис­те­мы) неко­то­ро­го про­цес­са для взаи­мо­дей­ст­вия уз­лов этой рас­пре­де­лен­ной сис­те­мы.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 35:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 43:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В от­ли­чие от боль­шин­ст­ва язы­ков и плат­форм, в язы­ке Erlang су­ще­ст­ву­ет толь­ко один тип за­дач, на­зы­вае­мый про­цес­са­ми. За­да­чи в язы­ке Erlang не яв­ля­ют­ся ис­тин­ны­ми про­цес­са­ми, т. к. не об­ла­да­ют соб­ст­вен­ным ад­рес­ным про­стран­ст­вом. Это оз­на­ча­ет, что несколь­ко про­цес­сов мо­гут вы­пол­нять­ся в пре­де­лах од­но­го эк­зем­п­ля­ра сре­ды вы­полнения Erlang (на од­ной вир­ту­аль­ной ма­шине Erlang). С дру­гой сто­ро­ны – и это роднит про­цес­сы Erlang с ис­тин­ны­ми про­цес­са­ми – про­цес­сы Erlang изо­ли­ро­ва­ны друг от дру­га (в от­ли­чие от, на­при­мер, по­то­ков в слу­чае мно­го­за­дач­но­сти, осно­ван­ной на по­то­ках). Изо­ли­ро­ван­ность про­цес­сов друг от дру­га за­клю­ча­ет­ся в сле­дую­щих ас­пек­тах. Во-пер­вых, дан­ные од­но­го про­цес­са не доступ­ны нико­му, ес­ли это­го не по­же­лал сам про­цесс. Во-вто­рых, ес­ли во вре­мя ра­бо­ты возника­ет необ­ра­ба­ты­вае­мое ис­клю­чение, то про­цесс Erlang бу­дет за­вер­шен (так же как и неко­то­рые свя­зан­ные с этим про­цес­сом про­цес­сы; но об этом – на од­ном из сле­дую­щих уро­ков). При этом за­вер­шение сбой­но­го про­цес­са Erlang не коснет­ся дру­гих (не свя­зан­ных с ним) про­цес­сов, вне за­ви­си­мо­сти от то­го, вы­пол­ня­ют­ся ли они в этом же эк­зем­п­ля­ре сре­ды вы­полнения Erlang или нет. Та­кое по­ве­дение от­ли­ча­ет­ся от по­ве­дения при возник­но­вении необ­ра­ба­ты­вае­мо­го ис­клю­чения в од­ном из по­то­ков вы­полнения ка­ко­го-ли­бо про­цес­са: в этом слу­чае обыч­но за­вер­ша­ет­ся про­цесс це­ли­ком, в том чис­ле и дру­гие по­то­ки вы­полнения.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В от­ли­чие от боль­шин­ст­ва язы­ков и плат­форм, в язы­ке Erlang су­ще­ст­ву­ет толь­ко один тип за­дач, на­зы­вае­мый про­цес­са­ми. За­да­чи в язы­ке Erlang не яв­ля­ют­ся ис­тин­ны­ми про­цес­са­ми, т. к. не об­ла­да­ют соб­ст­вен­ным ад­рес­ным про­стран­ст­вом. Это оз­на­ча­ет, что несколь­ко про­цес­сов мо­гут вы­пол­нять­ся в пре­де­лах од­но­го эк­зем­п­ля­ра сре­ды вы­полнения Erlang (на од­ной вир­ту­аль­ной ма­шине Erlang). С дру­гой сто­ро­ны – и это роднит про­цес­сы Erlang с ис­тин­ны­ми про­цес­са­ми – про­цес­сы Erlang изо­ли­ро­ва­ны друг от дру­га (в от­ли­чие от, на­при­мер, по­то­ков в слу­чае мно­го­за­дач­но­сти, осно­ван­ной на по­то­ках). Изо­ли­ро­ван­ность про­цес­сов друг от дру­га за­клю­ча­ет­ся в сле­дую­щих ас­пек­тах. Во-пер­вых, дан­ные од­но­го про­цес­са не доступ­ны нико­му, ес­ли это­го не по­же­лал сам про­цесс. Во-вто­рых, ес­ли во вре­мя ра­бо­ты возника­ет необ­ра­ба­ты­вае­мое ис­клю­чение, то про­цесс Erlang бу­дет за­вер­шен (так же как и неко­то­рые свя­зан­ные с этим про­цес­сом про­цес­сы; но об этом – на од­ном из сле­дую­щих уро­ков). При этом за­вер­шение сбой­но­го про­цес­са Erlang не коснет­ся дру­гих (не свя­зан­ных с ним) про­цес­сов, вне за­ви­си­мо­сти от то­го, вы­пол­ня­ют­ся ли они в этом же эк­зем­п­ля­ре сре­ды вы­полнения Erlang или нет. Та­кое по­ве­дение от­ли­ча­ет­ся от по­ве­дения при возник­но­вении необ­ра­ба­ты­вае­мо­го ис­клю­чения в од­ном из по­то­ков вы­полнения ка­ко­го-ли­бо про­цес­са: в этом слу­чае обыч­но за­вер­ша­ет­ся про­цесс це­ли­ком, в том чис­ле и дру­гие по­то­ки вы­полнения.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;{{Врезка|right|Заголовок= Про­блем­ы в мно­го­за­дач­ных сре­дах|Ширина=50%|Содержание=&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* Го­ло­дание [starvation] За­держ­ка вре­мени от про­бу­ж­дения по­то­ка до его вы­зо­ва на про­цес­сор, в те­чение ко­то­рой он на­хо­дит­ся в спи­ске по­то­ков, го­то­вых к ис­полнению. Возника­ет по при­чине при­сут­ст­вия по­то­ков с боль­ши­ми или рав­ны­ми при­ори­те­та­ми, ко­то­рые ис­пол­ня­ют­ся все это вре­мя. Не­га­тив­ный эф­фект за­клю­ча­ет­ся в том, что возника­ет за­держ­ка вре­мени от про­бу­ж­дения по­то­ка до ис­полнения им сле­дую­щей важ­ной опе­ра­ции, что за­дер­жи­ва­ет ис­полнение этой опе­ра­ции, а сле­дом за ней и ра­бо­ту мно­гих дру­гих ком­понен­тов. Го­ло­дание соз­да­ет уз­кое ме­сто в сис­те­ме и не да­ет вы­жать из нее мак­си­маль­ную про­из­во­ди­тель­ность, ог­раничи­вае­мую толь­ко ап­па­рат­но обу­слов­лен­ны­ми уз­ки­ми мес­та­ми.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* Гон­ки [race condition] Не­де­тер­миниро­ван­ный по­ря­док ис­полнения двух пу­тей ко­да, ра­бо­таю­щих с одними и те­ми же дан­ны­ми и ис­пол­няе­мы­ми в двух раз­лич­ных за­да­чах. При­во­дит к за­ви­си­мо­сти по­ряд­ка и пра­виль­но­сти ис­полнения от слу­чай­ных фак­то­ров.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* Ин­вер­сия при­ори­те­та Пусть по­ток L име­ет низ­кий при­ори­тет, по­ток M – средний, по­ток H – вы­со­кий. Пусть по­ток L за­хва­тил объ­ект бло­ки­ров­ки (на­при­мер, мью­текс) и, вы­пол­ня­ясь с удер­жанием объ­ек­та бло­ки­ров­ки, пре­ры­ва­ет­ся про­бу­див­шим­ся по ка­кой-то при­чине по­то­ком M, ко­то­рый име­ет бо­лее вы­со­кий при­ори­тет. Пусть по­ток H так­же пы­та­ет­ся за­хва­тить этот объ­ект бло­ки­ров­ки. В такой си­туа­ции по­ток H ждет за­вер­шения те­ку­щей ра­бо­ты по­то­ком M, т. к., по­ка по­ток M ис­пол­ня­ет­ся, низ­ко­при­ори­тет­ный по­ток L не по­лу­ча­ет управ­ления и не мо­жет осво­бо­дить за­хва­чен­ный объ­ект бло­ки­ров­ки. }} &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Про­цес­сы Erlang лег­ко­вес­ны, их соз­дание и за­вер­шение доста­точ­но де­ше­во (по сравнению, на­при­мер, с соз­данием про­цес­сов и по­то­ков в Linux), по­это­му во­прос о том, ис­поль­зо­вать или нет мно­го­за­дач­ность при ре­шении той или иной за­да­чи, дол­жен решать­ся толь­ко ис­хо­дя из фак­та, мож­но ли рас­па­рал­ле­лить ал­го­ритм за­да­чи или нет. Конеч­но, сле­ду­ет ска­зать, что воз­мож­ны си­туа­ции, когда при­менение мно­го­за­дач­но­го ре­шения бу­дет неоп­рав­дан­но (когда, на­при­мер, необ­хо­ди­мо несколь­ким за­да­чам ра­бо­тать од­но­вре­мен­но с боль­шим на­бо­ром дан­ных, рас­по­ло­жен­ных в па­мя­ти), но это­му мы по­свя­тим один из по­сле­дую­щих уро­ков.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Про­цес­сы Erlang лег­ко­вес­ны, их соз­дание и за­вер­шение доста­точ­но де­ше­во (по сравнению, на­при­мер, с соз­данием про­цес­сов и по­то­ков в Linux), по­это­му во­прос о том, ис­поль­зо­вать или нет мно­го­за­дач­ность при ре­шении той или иной за­да­чи, дол­жен решать­ся толь­ко ис­хо­дя из фак­та, мож­но ли рас­па­рал­ле­лить ал­го­ритм за­да­чи или нет. Конеч­но, сле­ду­ет ска­зать, что воз­мож­ны си­туа­ции, когда при­менение мно­го­за­дач­но­го ре­шения бу­дет неоп­рав­дан­но (когда, на­при­мер, необ­хо­ди­мо несколь­ким за­да­чам ра­бо­тать од­но­вре­мен­но с боль­шим на­бо­ром дан­ных, рас­по­ло­жен­ных в па­мя­ти), но это­му мы по­свя­тим один из по­сле­дую­щих уро­ков.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF158:Erlang:_%D0%98%D0%B7%D1%83%C2%AD%D1%87%D0%B8%D0%BC_%D0%BC%D0%BD%D0%BE%C2%AD%D0%B3%D0%BE%C2%AD%D0%B7%D0%B0%C2%AD%D0%B4%D0%B0%D1%87%C2%AD%D0%BD%D0%BE%D1%81%D1%82%D1%8C&amp;diff=17711&amp;oldid=prev</id>
		<title>Olkol: Новая страница: «Категория: Учебники  Категория: Учебники    '''Erlang - Опи­сы­ва­ет­ся сле­дую­щей фор­м…»</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF158:Erlang:_%D0%98%D0%B7%D1%83%C2%AD%D1%87%D0%B8%D0%BC_%D0%BC%D0%BD%D0%BE%C2%AD%D0%B3%D0%BE%C2%AD%D0%B7%D0%B0%C2%AD%D0%B4%D0%B0%D1%87%C2%AD%D0%BD%D0%BE%D1%81%D1%82%D1%8C&amp;diff=17711&amp;oldid=prev"/>
				<updated>2018-09-16T06:35:32Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: «&lt;a href=&quot;/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA%D0%B8&quot; title=&quot;Категория:Учебники&quot;&gt;Категория: Учебники&lt;/a&gt;  &lt;a href=&quot;/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA%D0%B8&quot; title=&quot;Категория:Учебники&quot;&gt;Категория: Учебники&lt;/a&gt;    &amp;#039;&amp;#039;&amp;#039;Erlang - Опи­сы­ва­ет­ся сле­дую­щей фор­м…»&lt;/p&gt;
&lt;a href=&quot;http://wiki.linuxformat.ru/wiki/index.php?title=LXF158:Erlang:_%D0%98%D0%B7%D1%83%C2%AD%D1%87%D0%B8%D0%BC_%D0%BC%D0%BD%D0%BE%C2%AD%D0%B3%D0%BE%C2%AD%D0%B7%D0%B0%C2%AD%D0%B4%D0%B0%D1%87%C2%AD%D0%BD%D0%BE%D1%81%D1%82%D1%8C&amp;amp;diff=17711&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	</feed>