
- •21. Виды программных единиц в современных ос
- •22. Программное порождение процессов в Unix
- •23. Программное порождение процессов в Windows
- •24. Программное уничтожение процессов
- •25. Ожидание завершения процессов
- •26. Иерархия процессов и ее использование
- •27. Понятие нити и связь ее с процессом
- •28. Создание нитей (thread) в программахWindows.
- •29. Создание posiXнитей в программе.
- •Int pthread_create(pthread_t* tid, const pthread_attr_t* att, void*(*fun)(void*), void* argp)
- •Int pthread_exit(void *status)
- •30. Уничтожение (отмена) нитей
- •Int pthread_setcancelstate(int state, int *oldstate),
- •Int pthread_setcanceltype(int type, int *oldtype),
- •31. Приостановка и повторный запуск нити.
- •32. Ожидание завершения нити
- •Int pthread_join(pthread_t tid, void** status).
- •33. Абстрактные критические секции.
- •34. Абстрактные двоичные семафоры.
- •35. Абстрактные семафоры с внутренним счетчиком.
- •36. Семафоры взаимоисключения в Windows.
- •37. Семафоры взаимоисключения в posix
- •Int pthread_mutex_lock(ptread_mutex_t* hmtx)
- •Int pthread_mutex_unlock(ptread_mutex_t* hmtx)
- •Int pthread_mutex_init( ptread_mutex_t *hmtx, ptread_mutexattr_*pattr)
- •38. Семафоры событий.
- •39. Средства множественных ожиданий
- •40. Программные семафоры с внутренним счетчиком в Windows.
21. Виды программных единиц в современных ос
В соврем-х ОС абстрактный процесс «расщепили» на части: программный процесс и нить (поток, thread).
Процесс – действия, выполняемые над конкретными данными под управлением программы.
Элементарные составляющие процесса - нити. В рамках процесса могут функционировать несколько нитей.
22. Программное порождение процессов в Unix
Процесс – не программа, но без программы, которая определяет действия процесса, он функционировать не может. Поэтому при создании процесса, в частности путем заявки другого процесса на создание процесса, как минимум необходимо дать ОС информацию, какой программой воспользоваться при создании и запуске процесса. Заметим, что в дальнейшем процесс может сменить используемую программу соответствующим системным вызовом.
При вызове программы из командной строки иногда используются текстовые аргументы, задаваемые в этой строке после имени программы.
Оригинальное и очень изящное решение для создания процессов принято в Unix. Для создания процесса здесь служит системная функция fork(), которая даже не имеет аргументов! Эта функция по существу раздваивает процесс (fork - вилка), в результате в ОС оказываются два почти идентичных процесса.
Единственно различие между ними для ОС - их различные идентификаторы, под которыми они зарегистрированы в системе. Различие этих процессов для выполняемой программы в том, что процесс-родитель получает как результат функции fork() значение идентификатора нового - дочернего процесса, а дочерний процесс в качестве числа, возвращаемого функцией, получает нуль. Поэтому в программе, общей хотя бы на участке порождения дочернего процесса, анализом кода возврата функции можно решить, какой процесс в анализируемый момент обслуживает программа - родительский или дочерний. Дочерний процесс, как правило, распознав ситуацию и обнаружив себя, использует вызов запуска другой исполняемой программы. Имеется несколько вариантов системных функций такого запуска. Особенностью их в Unix является то, что они не создают новый процесс, но просто позволяют процессу сменить управляющую им программу.
23. Программное порождение процессов в Windows
BOOL CreateProcess(LPCTSTR pNameModule, LPCTSTR pCommandLine,
SECURITY_ATTRIBUTES *pProcessAttr,
SECURITY_ATTRIBUTES *pThreadAttr, BOOL InheritFlag,
DWORD CreateFlag, LPVOID penv, LPCTSTR pCurrDir,
STARTUPINFO *pstartinfo,
PROCESS_INFORMATION *pProcInfo)
pNameModule – указатель на строку имени процесса
pCommandLine – дублирует первый аргумент
pCurrDir – текущий каталог запускаемого процесса
InheritFlag – используется для задания наследования объектов дочерним процессом
CreateFlag – приоритет создаваемого процесса
STARTINFO – соответсвует структуре описания сесии в OS/2 и содержаит поля определяющие характеристики окна для создаваемого процесса
PROCESS_IFORMATION – содержит четыре поля возврата учётной информации из ОС после создания нового проуесса
STRUCT {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThread;
}
Наиболее важные поля: hProcess, возвращает хэндл созданного процесса, и dwProcessId, возвращает идентификатор (условный номер) созданного процесса.
Функция memset записывает столько значений, заданных своим вторым параметром в память, начало которой задано первым аргументом, сколько указано числом в третьем аргументе.
Возвращаемое функцией CreateProcess значение типа BOOL позволяет вызывающей программе решить, как прошел запуск, удалось ли создать процесс. При создании возвращается TRUE, иначе FALSE.