<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Technogeek &#187; hqla</title>
	<atom:link href="http://technogeek.ru/category/hqla/feed/" rel="self" type="application/rss+xml" />
	<link>http://technogeek.ru</link>
	<description>by Darth Bender</description>
	<lastBuildDate>Sun, 30 May 2010 20:30:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>HQLA. Выпуск #4</title>
		<link>http://technogeek.ru/2009/01/11/282/</link>
		<comments>http://technogeek.ru/2009/01/11/282/#comments</comments>
		<pubDate>Sun, 11 Jan 2009 16:17:25 +0000</pubDate>
		<dc:creator>Darth Bender</dc:creator>
				<category><![CDATA[hqla]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://technogeek.ru/?p=282</guid>
		<description><![CDATA[В этом выпуске:
Раздел: Средний .NET разработчик 

Вопрос #10: Опишите разницу между интерфейсно-ориентированным, объектно-ориентированным и аспектно-ориентированным стилями программирования.
Вопрос #11: Дайте описание Интерфейса и опишите основные его отличия от Класса.
Вопрос #12: Что такое Reflection?

Вопрос #10: Опишите разницу между интерфейсно-ориентированным, объектно-ориентированным и аспектно-ориентированным стилями программирования.
Ответ: Основная идея аспектно-оринетированного подхода (АОП) – возможность из кода управлять содержимым этого кода [...]]]></description>
			<content:encoded><![CDATA[<p>В этом выпуске:<br />
<strong>Раздел</strong>: Средний .NET разработчик </p>
<ol>
<li>Вопрос #10: Опишите разницу между интерфейсно-ориентированным, объектно-ориентированным и аспектно-ориентированным стилями программирования.</li>
<li>Вопрос #11: Дайте описание Интерфейса и опишите основные его отличия от Класса.</li>
<li>Вопрос #12: Что такое Reflection?</li>
</ol>
<p><strong>Вопрос #10</strong>: Опишите разницу между интерфейсно-ориентированным, объектно-ориентированным и аспектно-ориентированным стилями программирования.</p>
<p><strong>Ответ</strong>: Основная идея аспектно-оринетированного подхода (АОП) – возможность из кода управлять содержимым этого кода при сборке. Такое управление осуществляется посредством специальных конструкций – аспектов, фактически подпрограмм, логически связанных с какой-либо особенностью разрабатываемого ПО. Простейшим примером аспекта является аспект, отвечающий за логирование. Например, необходимо добавить в начало и конец тел всех методов вызов логировщика, для журналирования состояния в моменты входа в метод и выхода из него. Оофрмляется аспект, который как раз это правило и  описывает, и далее, при компиляции, результирующий бинарий получает все необходимые изменения.<br />
Объектно- (ООП) и интерфейсно-ориентированные (ИОП) подходы по сути представляют собой одно и то же, только в случае ИОП политики переопределения поведения базовых классов более жесткие, что вытекает из особенностей интерфейсов. А так, те же 3 концепции: наследование, инкапсуляция, полиморфизм.<br />
Можно рационально ли говорить о каких-либо различиях? Не уверен. В рамках .NET успешно применяются все 3 подхода: интерфейсы и классы описаны в спецификации, об этом следующий вопрос, а аспекты реализуются посредством атрибутов классов.</p>
<p><strong>Вопрос #11</strong>: Дайте описание Интерфейса и опишите его основные отличия от Класса.</p>
<p><strong>Ответ</strong>: Ответ на этот вопрос чрезвычайно объемен. Попробую сделать выжимку. Начать, думаю, стоит с определений, доступных в спецификации языка C#:<br />
Класс – структура данных, которая может содержать: члены-данные, такие как константы и переменные; члены-функции, такие как методы, свойства, события, индексаторы, операторы, конструкторы класса, деструкторы и статические конструкторы; вложенные типы. Классы поддерживают одиночное наследование.<br />
Интерфейс &#8211; структура данных, которая может содержать: методы, свойства, события и индексаторы. Интерфейс не содержит реализации этих типов. Он определяет контракт, предписывающий, классам и структурам, которые реализуют этот интерфейс реализовывать все его члены. Интерфейсы поддерживают множественное наследование.<br />
Уже из определения видно, что основное различие – идеологическое. Не смотря на то, что с точки зрения CLR и то и то является типом данных, класс – это контейнер, а интерфейс – контракт.<br />
Вообще говоря, вопрос, поставленный в самом начале не совсем верен. О различиях, как мне кажется, мы можем говорить, в случае сущностей противоположных или в каких-то аспектах, претендующих на одну и ту же роль. <a href="http://technogeek.ru/2008/07/07/143/">Такая ситуация имеет место быть, например, в случаях с абстрактными классами и интерфейсами.</a> В обобщенном же случае мы говорим и связке «класс-интерфейс», эффективно они существуют в паре. Отсутствие механизма множественного наследования в CLR в большинстве случаев разрешается множественной реализацией интерфейсов. В случае значимых типов, когда имеется базовый тип ValueType, наличие интерфейсов позволяет создавать пользовательские типы, удовлетворяющие определенным ограничениям и т.п.</p>
<p><strong>Вопрос #12</strong>: Что такое Reflection?</p>
<p><strong>Ответ</strong>: Говоря формально, Reflection или Отражение (перевод, принятый в русскоязычной литературе), по сути, процесс, при котором приложение во время выполнения, может отслеживать трассу исполнения, поведение и собственную структуру и менять их. В разрезе .NET, а мы говорим, уже о конкретной реализации отражений в среде виртуальной машины .NET, этот механизм реализован с помощью средств, доступных в пространстве имен System.Reflection. Эти средства позволяют читать метаданные сборок, подгружать их в домены приложений, исполнять методы и использовать типы сторонних сборок, о которых приложение в момент компиляции ничего не знает.  Чаще всего, практическое применение механизм отражений находит в создании приложений, поддерживающих подключаемые модули (add-in). Однако наличие механизмов отражений открывает широкие возможности для <a href="http://en.wikipedia.org/wiki/Metaprogramming">метапрограммирования</a> и создания <a href="http://supercompilers.com/technology.shtml">суперкомпиляторов</a>. </p>
]]></content:encoded>
			<wfw:commentRss>http://technogeek.ru/2009/01/11/282/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Пояснения к вопросу #6 HQLA</title>
		<link>http://technogeek.ru/2008/07/31/164/</link>
		<comments>http://technogeek.ru/2008/07/31/164/#comments</comments>
		<pubDate>Thu, 31 Jul 2008 10:21:56 +0000</pubDate>
		<dc:creator>Darth Bender</dc:creator>
				<category><![CDATA[hqla]]></category>
		<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://technogeek.ru/?p=164</guid>
		<description><![CDATA[На шестой вопрос ответов на вопросы Хансельмана, по поводу Component Cоntainer, пришло некоторое количество недоуменных отзывов. Действительно, я написал несколько расплывчато и не объяснил откуда взялся именно Windows Server. Попробую исправиться.
В данном вопросе речь идет скорее о поддержке разноцелевых операционных систем. Серверные опреационные системы несколько отличаются от клиентских. Разный набор поддерживаемых фич. Дело в том, [...]]]></description>
			<content:encoded><![CDATA[<p>На <a href="http://technogeek.ru/2008/07/21/150/">шестой вопрос</a> ответов на <a href="http://technogeek.ru/hqla/">вопросы Хансельмана</a>, по поводу Component Cоntainer, пришло некоторое количество недоуменных отзывов. Действительно, я написал несколько расплывчато и не объяснил откуда взялся именно Windows Server. Попробую исправиться.</p>
<p>В данном вопросе речь идет скорее о поддержке разноцелевых операционных систем. Серверные опреационные системы несколько отличаются от клиентских. Разный набор поддерживаемых фич. Дело в том, что в .NET CL есть множество Component Container, однако в МСДН, в разделе про применимость каждого из них, частенько ничего не сказано о поддержке серверных ОС. Ограничения могут быть связаны, например, с тем, что серверные ОС не поддерживают красивостей интефейсной части, там нет тем рабочего стола, потому большая часть контролов относящихся к украшательству на сервере недоступна, и т.п.</p>
<p>Мне кажется, что правильнее было бы сформулировать вопрос о наиболее универсальных Compnent Container, применимых как в серверных так и в клиентских ОС.</p>
]]></content:encoded>
			<wfw:commentRss>http://technogeek.ru/2008/07/31/164/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>HQLA. Выпуск #3</title>
		<link>http://technogeek.ru/2008/07/25/154/</link>
		<comments>http://technogeek.ru/2008/07/25/154/#comments</comments>
		<pubDate>Fri, 25 Jul 2008 07:13:13 +0000</pubDate>
		<dc:creator>Darth Bender</dc:creator>
				<category><![CDATA[hqla]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://technogeek.ru/?p=154</guid>
		<description><![CDATA[В этом выпуске:
Раздел: Каждый, кто пишет код 
1.       Вопрос #7: Что такое PID? Как его можно использовать для устранения неисправностей системы?
2.       Вопрос #8: Сколько процессов могут &#8220;слушать&#8221; один TCP/IP порт?
3.       Вопрос #9: Что такое GAC? Какую проблему [...]]]></description>
			<content:encoded><![CDATA[<p>В этом выпуске:<br />
<strong>Раздел: </strong>Каждый, кто пишет код<strong> </strong></p>
<p>1.       <strong>Вопрос #7: </strong>Что такое PID? Как его можно использовать для устранения неисправностей системы?<br />
2.       <strong>Вопрос #8: </strong>Сколько процессов могут &#8220;слушать&#8221; один TCP/IP порт?<br />
3.       <strong>Вопрос #9: </strong>Что такое GAC? Какую проблему он решает?</p>
<p><strong>Вопрос #7: </strong>Что такое PID? Как его можно использовать для устранения неисправностей системы?<br />
<strong>Ответ: </strong>PID (Process Identifier) уникальный идентификатор процесса, который выдается системой при создании. Идентификатор интересующего процесса можно подсмотреть в Task Manager. Использовать идентификатор процесса можно для завершения этого процесса из Task Manager, можно подключать к нему из дебугер Visual Studio при наличии соответствующих символов и т.д. Подробнее <a href="http://technogeek.ru/2008/07/14/147/">о процессах можно почитать</a> в ответе на первый вопрос и по ссылке на MSDN.</p>
<p><strong>Вопрос #8: </strong>Сколько процессов могут &#8220;слушать&#8221; один TCP/IP порт?<br />
<strong>Ответ: </strong>В каждый момент времени только один.</p>
<p><strong>Вопрос #9: </strong>Что такое GAC? Какую проблему он решает?<br />
<strong>Ответ: </strong>GAC (Global Assembly Cache) &#8211; кэш для хранения сборок .NET. По сути GAC &#8211; это директория расположенная по пути %WINDIR%\assembly и хранящая все зарегистрированные сборки. Хорошим тоном считается, при использовании сборки на клиентской машине, зарегистрировать её в GAC. Это помогает решить, так называемую проблему dll-hell. GAC позволяет отслеживать версионность, связи и зависимости сборок (динамически линкуемых библиотек, к примеру) зарегистрированных в системе, тем самым избавляя разработчика от множества проблем связанных с подгрузкорй «не той» dll, выщитыванием и валидацией пути к нужной dll и т.п. (<a href="http://msdn.microsoft.com/en-us/library/yf1d93sz.aspx">http://msdn.microsoft.com/en-us/library/yf1d93sz.aspx</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://technogeek.ru/2008/07/25/154/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HQLA. Выпуск #2</title>
		<link>http://technogeek.ru/2008/07/21/150/</link>
		<comments>http://technogeek.ru/2008/07/21/150/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 16:19:14 +0000</pubDate>
		<dc:creator>Darth Bender</dc:creator>
				<category><![CDATA[hqla]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://technogeek.ru/?p=150</guid>
		<description><![CDATA[В этом выпуске:
Раздел: Каждый кто пишет код.

Вопрос #4: Какая разница между исполняемым EXE-фалом и библиотекой динамической линковки DLL?
Вопрос #5: Чем строгая типизация отличается от нестрогой типизации? Какая предпочтительнее? Почему?
Вопрос #6: Некий продукт является &#8220;Component Container&#8221;. Назовите хотя бы 3 компонента семейства Windows Server которые можно называть &#8220;Component Container&#8221;.

Вопрос #4: Какая разница между исполняемым EXE-фалом и [...]]]></description>
			<content:encoded><![CDATA[<p>В этом выпуске:<br />
<strong>Раздел:</strong> Каждый кто пишет код.</p>
<ol>
<li><strong>Вопрос #4:</strong> Какая разница между исполняемым EXE-фалом и библиотекой динамической линковки DLL?</li>
<li><strong>Вопрос #5:</strong> Чем строгая типизация отличается от нестрогой типизации? Какая предпочтительнее? Почему?</li>
<li><strong>Вопрос #6:</strong> Некий продукт является &#8220;Component Container&#8221;. Назовите хотя бы 3 компонента семейства Windows Server которые можно называть &#8220;Component Container&#8221;.</li>
</ol>
<p><strong>Вопрос #4:</strong> Какая разница между исполняемым EXE-фалом и библиотекой динамической линковки DLL?<br />
<strong>Овтет:</strong> Оговорюсь сразу, основные различия между exe и dll буду рассматривать в рамках .NET. Для начала расшифруем названия, дабы было все ясно: exe-сокращение от executable, т.е. исполняемый файл; dll &#8211; сокращение от dynamic linked library, т.е. динамически линкуемая библиотека. Получается, что exe мы выполняем и в процессе используем некие методы или типы из динамической библиотеки. С точки зрения кодирования в случае исполняемого фала необходимо наличие единственной &#8220;точки входа&#8221;. В коде это реализуется обязательным public static методом Main, который в качестве параметров, например, может брать массив строк, содержащий параметры командной строки. При создании динамической библиотеки, мы вообще можем не задумываться о &#8220;точке входа&#8221;. По сути это просто набор классов, интерфейсов, структур и т.п. необходимых нам для структурирования ПО. С точки зрения внутренней структуры файла, то исполняемый файл от библиотеки можно отличить например по PE-заголовку.</p>
<p><strong>Вопрос #5:</strong> Чем строгая типизация отличается от нестрогой типизации? Какая предпочтительнее? Почему?<br />
<strong>Ответ:</strong> Для начала рассмотрим основные различия между сильной и слабой типизацией. Прежде всего, слабая типизация предполагает неявное вычисление/преобразование типов и/или ad hoc (это слово я сам не рискую переводить и толкового перевода ещё не встречал) полиморфизм. При сильной или строгой типизации все типы известны заранее, и преобразование проходит по заранее установленным строгим правилам. Строгим, понятно, по отношению к правилам принятым при слабой типизации. Классическим примером слабой типизации является, например, присвоение значения переменной в языке TCL. С одной стороны мы можем написать:</p>

<div class="wp_syntax"><div class="code"><pre class="tcl" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">set</span> myVal <span style="color: #483d8b;">&quot;Hello world!&quot;</span></pre></div></div>

<p>myVal &#8211; строка</p>
<p>с другой стороны можно написать так:</p>

<div class="wp_syntax"><div class="code"><pre class="tcl" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">set</span> myVal <span style="color: black;">&#91;</span><span style="color: #008000;">file</span> dirname <span style="color: black;">&#91;</span><span style="color: #008000;">file</span> dirname <span style="color: #ff3333;">$curentdir</span><span style="color: black;">&#93;</span><span style="color: black;">&#93;</span></pre></div></div>

<p>maVal &#8211; путь</p>
<p>Или, делая так:</p>

<div class="wp_syntax"><div class="code"><pre class="tcl" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">set</span> myVal <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span></pre></div></div>

<p>А потом в цикле так:</p>

<div class="wp_syntax"><div class="code"><pre class="tcl" style="font-family:monospace;"><span style="color: #008000;">lappend</span> myVal @someItem</pre></div></div>

<p>в myVal получим список.</p>
<p>Таким образом, тип переменной вычисляется на момент выполнения присвоения ей некого значения.</p>
<p>Сильную (строгую) типизацию, представляет язык C#. Если раньше в C++ мы могли написать:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">MyObj<span style="color: #000040;">*</span> m_pObj <span style="color: #000080;">=</span> GenerateMyObj<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>m_pObj<span style="color: #008000;">&#41;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span></pre></div></div>

<p>То уже в C# такое преобразование типов не пройдёт, тут будь добр делать все явно:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">MyObj m_pObj <span style="color: #008000;">=</span> GenerateMyObj<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>m_pObj <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
    <span style="color: #0600FF;">return</span> <span style="color: #008000;">-</span><span style="color: #FF0000;">1</span><span style="color: #008000;">;</span></pre></div></div>

<p>В этой разновидности типизации для присвоения переменной некоторого значения мы должны сначала объявить эту переменную и задать ей тип. Т.е. основное отличие от слабой типизации в том, что на момент компиляции все типы должны быть известны. Так же, не может быть речи не о каком ad hoc полиморфизме. Например в случае функционального полиморфизма операция сложения, определённая для целочисленных типов, при использовании со строками просто вызовет ошибку компиляции.<br />
На вопрос что лучше, понятно, однозначный ответ получить сложно. Мне по духу ближе сильная динамическая типизация, однако и в слабой есть свои плюсы, язык с такой системой типов более гибкий. Однако у строгой типизации, как мне кажется, есть одно неоспоримое преимущество, такой код чаще, банально, надёжнее. Использование операторов кастования as или is в C#, сводит появления исключительной ситуации практически на нуль. Однако речь идёт о компилируемых языках, для интерпретируемых слабая типизация оказывается удобнее и прозрачнее.</p>
<p><strong>Вопрос #6:</strong> Некий продукт является &#8220;Component Container&#8221;. Назовите хотя бы 3 компонента семейства Windows Server которые можно называть &#8220;Component Container&#8221;.<br />
<strong>Ответ:</strong> Начнём со строгих определений в рамках .NET. Контейнером называется объект, реализующий интерфейс System.ComponentModel.IСontainer или наследующийся от класса реализующего этот интерфейс, и, содержащий нуль или более компонентов. В свою очередь, компонентом называется объект, реализующий интерфейс Systerm.ComponentModel.IСomponent или наследующийся от класса, реализующего этот интерфейс, предназначенный для повторного использования и взаимодействия с другими объектами.<br />
Самое важное, это то, что компонентом является объект, который мы можем повторно использовать. Воплощение идеи объектно-ориентированного программирования. Зачем нам писать что-то свое, когда мы можем использовать уже написанный, оттестированный и отлаженный компонент? По сути, реализации интерфейсов IComponent и IContainer необходимы для более грамотного и удобного обращения с компонентами. Любой графический контрол тоже компонент, который описывает пользовательский интерфейс. Т.е .компонент с визуальным представлением.<br />
Что же касается примеров, возьмем основные контейнеры: System.Windows.Forms.Form, System.Windows.Forms.UserControl и, например, System.Windows.Forms.PrpertyGrid.</p>
]]></content:encoded>
			<wfw:commentRss>http://technogeek.ru/2008/07/21/150/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>HQLA. Выпуск #1.</title>
		<link>http://technogeek.ru/2008/07/14/147/</link>
		<comments>http://technogeek.ru/2008/07/14/147/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 10:50:04 +0000</pubDate>
		<dc:creator>Darth Bender</dc:creator>
				<category><![CDATA[hqla]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://technogeek.ru/?p=147</guid>
		<description><![CDATA[Первый выпуск ответов на вопросы HQLA.
В этом выпуске:
Раздел: Каждый кто пишет код.

Вопрос #1: Опишите разницу между Нитью и Процессом.
Вопрос #2: Что такое Сервис Windows и чем его жизненный  цикл отличается от жизненного цикла обычного EXE файла?
Вопрос #3: Каков максимальный объем памяти адресуемой одним  процессом в Windows? Отличается ли этот объем от общего объема [...]]]></description>
			<content:encoded><![CDATA[<p>Первый выпуск <a href="http://technogeek.ru/hqla" target="_blank">ответов на вопросы HQLA</a>.</p>
<p>В этом выпуске:</p>
<p><strong>Раздел</strong>: Каждый кто пишет код.</p>
<ol>
<li><strong>Вопрос #1</strong>: Опишите разницу между Нитью и Процессом.</li>
<li><strong>Вопрос #2</strong>: Что такое Сервис Windows и чем его жизненный  цикл отличается от жизненного цикла обычного EXE файла?</li>
<li><strong>Вопрос #3</strong>: Каков максимальный объем памяти адресуемой одним  процессом в Windows? Отличается ли этот объем от общего объема виртуальной  памяти выделяемой системой? Как это отражается на архитектуре системы?</li>
</ol>
<p><strong>Вопрос #1</strong>: Опишите разницу между Нитью и Процессом.</p>
<p><strong>Ответ</strong>: По сути основная разница в том, что нить и процесс в  данном случае сущности разного уровня абстракции. Начнем сверху. Исполняемый  модуль состоит из процессов, одного или нескольких. Грубо говоря процесс &#8211; суть  выполняемая программа. Каждый процесс состоит из одной или нескольких нитей.  Нить же &#8211; последовательность команд непосредственно под которую система выделяет  процессорное время. Однако, как мне кажется, основная цель данного вопроса  завести разговор о ресурсах.</p>
<p>Процесс имеет в своем распоряжении ресурсы необходимые для выполнения  программы: виртуальное адресное пространство, исполняемый код, открытые  указатели на системные объекты, набор настроек и атрибутов безопасности,  уникальный идентификатор, переменные окружения, приоритеты классов, максимальный  и минимальный размер области, в которой происходит исполнение процесса и как  минимум одну нить для исполнения. Каждый процесс стартует с нити, называемой  начальной, и далее в процессе исполнения может порождать дополнительные нити.</p>
<p>Нить &#8211; внутренняя сущность процесса, которая может быть выполнена в  соответствии с некоторым расписанием или событием. Все нити процесса разделяют  его виртуальное адресное пространство и системные ресурсы. Но у нити есть и  собственное окружение, которое включает обработку исключительных ситуаций,  приоритет исполнения, локальная область памяти (TLS), уникальный идентификатор  нити и набор сущностей, хранящих ее контекст во время ожидания исполнения.  Контекст нити включает значения машинных регистров, используемых нитью, стеки  как системный так и пользовательский, и переменные окружения. Так же нить может  иметь свой контекст безопасности для обезличенных (в плане принадлежности  пользователю) клиентов.(<a href="http://msdn2.microsoft.com/en-us/library/ms681917(VS.85).aspx">http://msdn2.microsoft.com/en-us/library/ms681917(VS.85).aspx</a>)</p>
<p><strong>Вопрос #2</strong>: Что такое Сервис Windows и чем его жизненный цикл  отличается от жизненного цикла обычного EXE файла?</p>
<p><strong>Ответ</strong>: Под Сервисом Windows понимается приложение,  реализующее программный интерфейс для управления посредством Диспетчера  Управления Сервисами (Service Control Manager, SCM). Существует несколько  способов запуска сервисов: автоматически при старте операционной системы, с  помощью Диспетчера Управления Сервисами, программно, вызывая функции, описанные  в интерфейсе Сервиса.</p>
<p>Одна из основных особенностей жизненного цикла Сервиса, отличающего его от  обыкновенного EXE файла состоит в том, что он может работать при отсутствии  инициированной пользовательской сессии локальной или удаленной консоли. Про  функции которые должен реализовывать сервис подробнее можно почитать тут (<a href="http://msdn2.microsoft.com/en-us/library/ms685942.aspx">http://msdn2.microsoft.com/en-us/library/ms685942.aspx</a>).</p>
<p><strong>Вопрос #3</strong>: Каков максимальный объем памяти адресуемой одним  процессом в Windows? Отличается ли этот объем от общего объема виртуальной  памяти выделяемой системой? Как это отражается на архитектуре системы?</p>
<p><strong>Ответ</strong>: Виртуальная память в Windows имеет плоскую страничную  архитектуру, операционная система создает процессам иллюзию того, что он  работают в закрытом адресном пространстве. Логическая организация страниц  памяти, вообще говоря, может не соответствовать физической организации памяти.  Отображение или мэпирование адресов логического представления в адреса  физического происходят на аппаратном уровне силами диспетчера памяти. Объем  физической памяти зачастую отличается, в меньшую сторону, от объема виртуальной  памяти и для обеспечения хранения всех страниц виртуальной памяти системой  используется механизм подкачки. Суть механизма состоит в том, что мало  используемые страницы выгружаются из оперативной памяти на диск, а при  необходимости обращения к данным записанным на диск, требуемая виртуальная  страница подкачивается обратно в оперативную память.</p>
<p>Далее я приведу небольшую таблицу, описывающую размер виртуального адресного  пространства выделяемого одному процессу, в зависимости от архитектуры системы:</p>
<table border="1" cellspacing="2" cellpadding="2" width="654">
<tbody>
<tr>
<td width="306" valign="top"><strong>Архитектура</strong></td>
<td width="340" valign="top"><strong>Размер виртуального адресного  пространства</strong></td>
</tr>
<tr>
<td width="306" valign="top"><strong>x86</strong></td>
<td width="340" valign="top">Всего <em>4 GB</em> из них <em>2 GB</em> системе <em>2  GB</em> процессу</td>
</tr>
<tr>
<td width="306" valign="top"><strong>x86</strong> со <strong>спец. ключами</strong> /3GB и /USERVA d boot.ini для ос Win2K (Server/Client), Win2K3, WinXP</td>
<td width="340" valign="top">Всего <em>4 GB</em> из них <em>1 GB</em> системе <em>3  GB</em> процессу</td>
</tr>
<tr>
<td width="306" valign="top"><strong>x86</strong> с системой <strong>Address  Windowing Extension</strong></td>
<td width="340" valign="top">Всего <em>64 Gb</em> но используется механизм  проецирования на <em>2Gb</em> виртуальное адресное пространство.</td>
</tr>
<tr>
<td width="306" valign="top"><strong>x64</strong></td>
<td width="340" valign="top">В связи с реализационными ограничениями <em>6657  GB</em> системе и <em>8192 GB</em> процессу. Адресное пространство меньше  теоретически возможного.</td>
</tr>
<tr>
<td width="306" valign="top"><strong>Itanium</strong></td>
<td width="341" valign="top">В связи с реализационными ограничениями <em>6144  GB</em> системе и <em>7152 GB</em> процессу. Адресное пространство меньше  теоретически возможного.</td>
</tr>
</tbody>
</table>
<p>(<a href="http://msdn2.microsoft.com/en-us/library/aa366912.aspx">http://msdn2.microsoft.com/en-us/library/aa366912.aspx</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://technogeek.ru/2008/07/14/147/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
