Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Понятие приложений, процессов и потоков




Приложение – самодостаточный набор машинных инструкций, обеспечивающий решение конкретной задачи.

Процесс обычно определяют как экземпляр или копию выполняемой программы – приложения. В Win32 процессу отводится 4Гбайта адресного пространства. В этом адресном пространстве расположен exe-файл, код и данные DLL-библиотек. Кроме того, процессу принадлежат такие ресурсы, как файлы, динамические области памяти и потоки (thread). Ресурсы, которые создаются при жизни процесса, обязательно уничтожаются при его завершении.

Поток можно определить как создаваемый многозадачной операционной системой объект (один или несколько) внутри процесса, который выполняет инструкции программы. Потоки позволяют осуществлять параллельное выполнение процессов и одновременное выполнение одним процессом частей программы на различных процессорах.

В MSDN процесс определяется как контекст безопасности, в котором выполняется приложение. Обычно контекст безопасности связан с пользователем и приложения получают его уровень полномочий.

Процесс состоит из двух компонентов:

· объекта ядра, через который операционная система управляет процессом. Там же хранится статистическая информация о процессе;

· адресного пространства, в котором содержится код и данные всех ЕХЕ- и DLL-модулей. Именно в нем находятся области памяти, динамически распределяемой для стеков потоков и других нужд.

 

Процессы инертны. Чтобы процесс что-нибудь выполнил, в нем нужно создать поток. Именно потоки отвечают за исполнение кода, содержащегося в адресном пространстве процесса. В принципе, один процесс может владеть несколькими потоками, и тогда они «одновременно» исполняют код в адресном пространстве процесса. Для этого каждый поток должен располагать собственным набором регистров процессора и собственным стеком. В каждом процессе есть минимум один поток. При создании процесса система автоматически создает его первый поток, называемый главным потоком. Если бы у процесса не было ни одного потока, ему нечего было бы делать на этом свете, и система автоматически уничтожила бы его вместе с выделенным ему адресным пространством.

Чтобы все эти потоки работали, операционная система отводит каждому из них определенное процессорное время. Выделяя потокам отрезки времени (называемые квантами) по принципу карусели, она создает тем самым иллюзию одновременного выполнения потоков.

Если в машине установлено более одного процессора, алгоритм работы операционной системы значительно усложняется (в этом случае система стремится сбалансировать нагрузку между процессорами). Ядро Windows автоматически управляет планированием исполнения потоков. Для использования преимуществ многопроцессорности в своих программах разработчикам ничего не требуется делать — система автоматически делает все необходимое для этого. Однако в ваших силах оптимизировать алгоритм вашего приложения, чтобы оно лучше использовало ресурсы многопроцессорных компьютеров.

Замечание. Windows поддерживает объект ядра под названием «задание» (job). Он позволяет группировать процессы и помещать их в нечто вроде песочницы, которая определенным образом ограничивает их действия. Этот объект является своего рода контейнером процессов. Кстати, очень полезно создавать задание и с одним процессом — это позволяет налагать на процесс ограничения, которые иначе указать нельзя.

GUI и CUI  приложения

Windows поддерживает два типа приложений: основанные на графическом интерфейсе (graphical user interface, GUI) и консольные (console user interface, CUI). У приложений первого типа внешний интерфейс чисто графический. GUI-приложения создают окна, имеют меню, взаимодействуют с пользователем через диалоговые окна и вообще пользуются всей стандартной «Windows'oвской» начинкой. Почти все стандартные программы Windows — Notepad, Calculator, WordPad и др. — являются GUI-приложениями. Приложения консольного типа работают в текстовом режиме: они не формируют окна, не обрабатывают сообщения и не требуют GUI. И хотя консольные приложения на экране тоже размещаются в окне в нем содержится только текст. Командные процессоры вроде Cmd.exe (в Windows 2000) или Command. com (в Windows 98)- типичные образцы подобных приложений.

Вместе с тем граница между двумя типами приложений весьма условна. Можно, например, создать консольное приложение, способное отображать диалоговые окна. Скажем, в командном процессоре вполне может быть специальная команда, открывающая графическое диалоговое окно со списком команд; вроде мелочь — а избавляет от запоминания лишней информации. В то же время можно создать и GUI-приложение, выводящее текстовые строки в консольное окно, наример, отладочную информацию, связанную с исполняемым приложением. Но, конечно, графический интерфейс предпочтительнее, чем старомодный текстовый. Как показывает опыт, приложения на основе GUI «дружественнее» к пользователю, а значит и более популярны.

Когда вы создаете проект приложения, Microsoft Visual C++ устанавливает такие ключи для компоновщика, чтобы в исполняемом файле был указан соответствующий тип подсистемы. Для CUI-программ используется ключ /SUBSYSTEM:CONSOLE, а для GUI-приложений — /SUBSYSTEM:WINDOWS. Когда пользователь запускает приложение, загрузчик операционной системы проверяет номер подсистемы, хранящийся в заголовке образа исполняемого файла, и определяет, что это за программа — GUI или CUI. Если номер указывает на приложение последнего типа, загрузчик автоматически создает текстовое консольное окно, а если номер свидетельствует о противоположном — просто загружает программу в память. После того как приложение начинает работать, операционная система больше не интересуется, к какому типу оно относится.

Во всех Windows-приложениях должна быть входная функция, за реализацию которой отвечаете вы. Существует две такие функции:

· int WINAPI _tWinMain( HINSTANCE hlnstanceExe, HINSTANCE hPrevInstance, PTSTR pszCmdLine, int nCmdShow);

· int _tmain( int argc, TCHAR *argv[], TCHAR *envp[]);

 

Конкретная функция зависит от того, используете ли вы Unicode или нет. На самом деле входная функция операционной системой не вызывается. Вместо этого происходит обращение к стартовой функции из библиотеки C/C++, заданной во время компоновки параметром -entry: командной строки. Она инициализирует библиотеку C/C++, чтобы можно было вызывать такие функции, как malloc и free, а также обеспечивает корректное создание любых объявленных вами глобальных и статических С++-объектов до того, как начнется выполнение вашего кода.

Вы можете увидеть, какие функции запускаются при старте вашего приложения, обратившись к вкладке Call Stack в режиме отладки приложения. Например, при запуске консольного приложения с именем AlgTest.exe в окне Call Stack можно видеть такие функции (самая последняя вызванная функция находится вверху списка):

 

Рис. 1. Список функций консольного приложения










Последнее изменение этой страницы: 2018-04-12; просмотров: 410.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...