Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Введение. Комсомольский-на-Амуре государственный технический университет



Комсомольский-на-Амуре государственный технический университет

Факультет компьютерных технологий

кафедра «Математического обеспечения и применения ЭВМ»

Тихомиров В.А.

ПРОЦЕССЫ, ПОТОКИ и НИТИ В

ОПЕРАЦИОННОЙ СИСТЕМЕ

WINDOWS

лабораторная работа по курсу

“Операционные системы (защищенный режим работы процессора)”

специальность 2204

Комсомольск-на-Амуре

Г.


Цель лабораторной работы: Изучить теоретические вопросы управления потоками в ОС Windows и освоить приемы практической реализации этого управления с использованием системных функций.

Задание на лабораторную работу:

- внимательно изучить ниже прилагаемый теоретический материал;

- набрать и проверить работоспособность программных модулей, представленных на листингах 1-7. Тексты программ вместе с результатами их тестирования вставить в отчет;

- выполнить индивидуальное задание в соответствии с выданным преподавателем вариантом:

№ вар. Содержание задания
  Программа должна запускать другую программу, путь которой указан в командной строке и анализировать код ее завершения.
  Составить программу, которая считает количество счастливых билетов в трамвайном рулоне и выводит их на экран в десять потоков. Каждый поток заведует своим диапазоном номеров: 000000 – 199999, 200000-299999, 300000-399999 … 900000 – 999999.
  Программа создает три потока, в которых делятся друг на друга случайные числа пока их число не станет 100000 или не произойдет деление на 0. Анализируется код возврата.
  Программа создает десять потоков. Каждый поток создает свою матрицу размером 1000х1000 элементов и заполняет ее случайными целыми числами. Далее каждый поток находит среднее арифметическое среди чисел матрицы и выводит результат на экран.
  Программа создает три потока и каждом запускает расчет разных сложных функций. После завершения потоков в главную программу возвращаются характеристики рабочего набора этих потоков и результаты выполнения расчетов. Вся информация выводится на экран.
  Главный поток создает матрицу 10000*10000 элементов и заполняет ее случайными числами. Затем поражается три потока, один – считает среднее арифметическое матрицы, второй – среднее геометрическое, а третий – средне квадратичное. Результаты выводятся на экран. Так же на экран выводится метка достижения каждого потока середины своих вычислений.
  Составить программу для ответа на вопрос: как много потоков может создать приложение, прежде чем ОС начнет «беспокоиться». Загрузку процессора контролировать системным монитором.
  Пять потоков генерируют случайные целые числа в диапазоне от 1 до 49. Шестой поток – анализирует эти числа. Если появляется пара одинаковых чисел – выводится сообщение ПАРА и номера потоков этой пары. Если три числа одинаковы – ТРИ, Четыре – ЧЕТЫРЕ и пять – ПЯТЬ. Через 60 секунд работы программа завершается. Если не было ни одного совпадения – выводится об этом сообщение.
  Главный поток преобразует себя в нить. Затем создает еще пять нитей. Главная нить по очереди передает управления каждой из пяти нитей. Те, выполняя действия (любые) возвращают управление главной нити.
  Создать три потока, контролирующие бюджет Смитта, Ганса и Ивана через локальную память потоков (TLS). Потоки обращаются к функции назначения выплат (генератор случайных чисел в интервале от –1000 до +1000). Функция передает обращающемуся потоку выработанную сумму, которую поток добавляет контролируемому абоненту. Вывести на экран суммы, которые накопятся у абонентов через 10 секунд работы программы.
  Создать три потока и, используя технологию APC, выполнить по очереди назначенные этим потокам функции АРС.

- тщательно откомментированный текст составленной программы вместе с результатами ее тестирования представить в отчете. Там же привести теоретический материал, на основе которого выполнялось задание.

- отчет оформить в электронной форме согласно СТП КнАГТУ.


Введение

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

Какая разница между процессом и потоком? Если каждый процесс обладает только одним потоком, то разницы фактически никакой. Однако поток может создавать другие потоки. А те потоки могут создавать еще потоки. Два процесса не могут обладать общими ресурсами, если при этом они не используют специ­альных механизмов операционной системы. Напротив, все потоки, принадлежа­щие одному процессу, имеют доступ ко всем ресурсам этого процесса, включая память, открытые файлы и другие ресурсы.

Чтобы запустить новую про­грамму в Windows система использует вызов CreateProcess. Новый процесс является полностью новым и име­ет очень мало общего с породившим его процессом. В частности, новый процесс не сможет получить доступа к данным родительского процесса, не воспользовав­шись для этого специальными механизмами операционной системы. Конечно, в рамках текущего процесса можно создать несколько программных потоков, од­нако все они будут иметь доступ к единственному экземпляру начальных дан­ных. Таким образом, если один из потоков модифицирует эти данные, это ска­жется на работе всех остальных потоков.

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

Многозадачность Win32 существенно отличается от многозадачности Win 16. В Windows 3.1 для того, чтобы несколько программ могли выполняться одновре­менно, все они должны определенным образом взаимодействовать между собой. При этом переключение между программами может произойти только в момент, когда выполняющаяся в данный момент программа обращается к операционной системе специальным образом. Если исполняемая в данный момент программа перестала обращаться к системе, все остальные программы теряют возможность продолжить работу. Таким образом, вся система может зависнуть по вине одной программы. Такой метод называется кооперативной многозадачностью. В Win32 многозадачность организована более надежно. В любой момент времени опера­ционная система имеет право временно прекратить выполнение одной програм­мы и переключить процессор на выполнение другой программы. Переключение происходит вне зависимости от желания каждой из программ.

Такой подход называется приоритетной или вытесняющей многозадачностью и обладает массой преимуществ. В рабочей среде Win32 некорректно написанная программа не сможет блокировать работу всей остальной системы. Медленно работающие программы не замедлят выполнения остальных процессов. Однако программисты, разрабатывающие программное обеспечение для приоритетной многозадачной среды, обязаны учитывать множество особенностей, на которые можно было не обращать внимания в Win 16.

Программа, работающая в Windows 3.1, обладает полным контролем над всем компьютером до тех пор, пока она не обратиться к одному из специальных си­стемных вызовов. Что это значит? Если вы открываете файл и начинаете за­пись данных в этот файл, ни одна другая программа не сможет обратиться к этому файлу до тех пор, пока вы сами этого не захотите. Однако при использовании приоритетной многозадачности это утверждение перестает быть верным, Предположим, вы открыли файл и начали записывать в него информацию. Однако в процессе выполнения этой процедуры Windows может прервать ис­полнение вашей программы. Управление будет передано другому программно­му потоку. Что произойдет, если другой поток попытается открыть тот же самый файл и произвести в него запись? Если ваш поток открыл файл для эксклюзивного доступа, другой поток просто не сможет открыть файл. Возник­нет ошибка доступа.

Чтобы предотвратить возникновение подобных проблем, необходимо проек­тировать приложения с учетом всех особенностей исполнения программ в при­оритетной многозадачной среде. При этом может потребоваться использование специальных механизмов синхронизации и межпроцессорного обмена данными.

Процессы

Если нужно запустить новую программу, вы должны создать новый процесс. Для этого используется стандартный системный вызов CreateProcess. Однако пользо­ваться им не очень удобно. Приходится определять значение множества аргу­ментов. Что делать, если вы хотите запустить WordPad только для того, чтобы отобразить содержимое файла README.TXT? Для этой цели можно использо­вать менее сложный механизм,

Какой из вызовов может оказаться полезным в данной ситуации? Проще все­го использовать WinExec, Документация Microsoft рекомендует вместо WinExec ис­пользовать CreateProcess, однако, если для выполнения того или иного действия вполне подходит WinExec, почему нельзя использовать именно эту функцию? WinExec работает чрезвычайно просто. Фактически внутри WinExec происходит обращение к функции LoadModule (еще один устаревший системный вызов), ко­торая вызывает CreateProcess со значениями аргументов по умолчанию. При об­ращении к WinExec необходимо сообщить имя программы (полный путь или ко­роткое имя исполняемого файла, расположенного в пути поиска), а также способ отображения окна программы (константа, используемая функцией ShowWindow, — SW_SHOW, SW_HIDE и т, д.), Конечно, программа может проигнорировать этот аргумент и запуститься так, как она сама того пожелает,

В случае если произошла ошибка, функция WinExec возвращает значение, мень­шее 32. Если программа успешно запущена, функция возвращает дескриптор но­вой программы (который не может быть меньше 32), После запуска новой про­граммы функция WinExec немедленно передает управление программе, из которой был осуществлен вызов, то есть она не ждет момента, пока вновь запущенная про­грамма завершит работу.

Еще один простой вызов, который можно использовать для запуска про­грамм, — это Shell Execute. Этот вызов во многом напоминает WinExec, однако он поддерживает обработку типов файлов, зарегистрированных графической оболоч­кой операционной системы. Например, если при помощи ShellExecute вы попробуете запустить файл с расширением ТХТ, будет запущена программа Notepad или любая другая программа, которая используется в вашей системе для просмот­ра текстовых файлов. В качестве аргументов функция ShellExecute принимает дескриптор окна (на случай, если возникнет необходимость в сообщениях об ошибках) и операционную строку, такую как open (открыть), print (распечатать) или explore (исследовать). В качестве операционной строки можно передать NULL-строку. В этом случае указанный вами файл будет открыт (open). Также функции Shell Execute необходимо сообщить имя файла и любые параметры командной строки (обычно NULL). Наконец, последние два аргумента — это текущий каталог и константа функции ShowWindow (как и в случае с WinExec).

Возвращаемое значение точно такое же, как и у W-inExec. Если вы указываете в качестве третьего аргумента функции ShellExecute имя исполняемого файла, вы можете не использовать другие аргументы, кроме аргумента параметров команд­ной строки и константы ShowWindow. Для файлов документов (например, ТХТ или DOC) значение этих аргументов обычно равно NULL.

Функцию ShellExecute можно использовать, например, для того, чтобы открыть корневой каталог диска С:

ShellExecute(handle, "open", "c:\\", NULL, NULL, SW_SHOWNORMAL);

Вы можете заменить строку «open» на строку «explore», а также указать в ка­честве третьего параметра имя абсолютно любого каталога.

Другим аналогичным системным вызовом является вызов ShellExecuteEx. Этот вызов фактически является полным аналогом ShellExecute, однако в качестве ар­гумента он принимает указатель на структуру, поля которой во многом совпада­ют с аргументами вызова ShellExecute. Помимо этого по завершении своей рабо­ты вызов ShellExecuteEx помещает в одно из полей этой структуры дескриптор вновь запущенного процесса.

Использовать WinExec и ShellExecute совсем не сложно. Пример простой кон­сольной программы приведен в листинге 1. Программа открывает текстовый файл, используя при этом два различных способа. Сначала происходит обраще­ние к функции W-inExec, которой напрямую сообщается имя программы текстово­го редактора и имя текстового файла, который должна открыть эта программа. Затем для открытия того же файла используется системный вызов ShellExecute (при этом, скорее всего, будет запущен WordPad или другая программа, ответ­ственная в вашей системе за открытие текстовых файлов).





Дата публикования: 2015-07-22; Прочитано: 365 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...