- •Лекция №1
- •История операционных систем.
- •Управление памятью.
- •Однозадачные системы.
- •Лекция №2
- •Способы учета участков памяти.
- •2 Алгоритм (наиболее подходящий).
- •3 Алгоритм (наименее подходящий).
- •4 Алгоритм (алгоритм двоичного разбиения).
- •Лекция №4
- •Принципы
- •Лекция №5
- •Лекция №6 Управление процессами.
- •Алгоритмы планирования системы.
- •Лекция №7
- •Два подхода к планированию.
- •Синхронизация.
- •Лекция №8
- •Тупики.
- •Способы взаимодействия между процессами.
- •Лекция №9 Управление процессами в среде Window’s.
- •Лекция №10
- •Волокна
- •Лекция №11 Синхронизация процессов.
- •Ссобытия
- •Способы взаимодействия процессов.
- •Серверная сторона
- •Второй семестр Управление процессами в среде unix Лекция №1
- •Лекция №2
- •Сигналы.
- •Способ взаимодействия общая память.
- •Лекция №3
- •Семафоры.
- •Лекция №4 Файлы как средства сообщения.
- •Файловыe системы.
- •Примеры файловых систем
- •Лекция № 6
- •Система ext 2
- •Лекция № 7
- •Лекция № 8 Функции работы с файлами в unix.
- •Лекция № 9 Java — скрипт.
- •Лекция № 10
- •Лекция № 11
Серверная сторона
CREATE_NAMED_PIPE
BOOL ConnectNamePipe(HANDLE h, LPOVERLAPPED Ov)
BOOL DisconnectNamedPipe(HANDLE h)
КЛИЕНТ
BOOL WiatNamedPipe(LPCTSTR Name, DWORD TimeOut)
Подключиться к каналу:
CreateFile
В виде имени – имя канала \\<pc>\piep\<имя>
BOOL CallNamedPipe(
LPCTSTR NamePipe, //имя канала
LPVOID InBuf, // входные параметры
DWORD InSize, // сколько будет отправлено байт
LPVOID OutBuf, // выходной результат
DWORD OutSize, // полный размер буфера
LPDWORD BytesRead, // сколько реально прочитано
DWORD TimeOut)
Второй семестр Управление процессами в среде unix Лекция №1
Введение.
B – это процесс, который запускает процесс Е
Е – это дочерний процесс
Процесс В по отношению к процессу Е – родительский
Родительский процесс, запустив дочерний процесс, должен дождаться кода возврата. (Казус: Если G завершится без завершения Н, то процесс Н будет переведен в поддерево Init)
Если Е завершится, но В не получит код возврата, то процесс Е будет называться зомби процессом.
Система порождения процессов специфична из-за потоков, которые перекрывают адресное пространство
Е динственная возможность создания нового процесса – это создать полную копию уже запущенного процесса
pid_t fork () – создание копии
void main()
{
fork ();
cout<<”1”;
}
Для родителя fork() возвращает номер дочернего процесса, а для дочернего процесса fork() возвращает 0.
Void main ()
{
Cout << fork()<<endl;
}
На экран будет выведено два числа:
0
Любое число > 0
Void main ()
{
if(fork()==0)
cout <<”1”; else
cout <<”2”;
}
На экране появится и 1, и 2.
int exec *(…) – запуск внешней программы
exec запускает внешнюю программу, замещая ей текущую. Возвращает код ошибки (т.к. она замещает текущую программу, то любой возврат int надо рассматривать как ошибку)
Если «дочка»:
void main()
{
if(fork()==0)
{
exec(“…”); //запуск
exit(1); //внешней программы
}…
}
Если exec – ошибка, т.е. «дочка» не смогла запустить процесс и exit не будет – в результате получим 2-а родительских процесса.
Лекция №2
int clone (int (*fn) (void*),
void *stack,
int flags,
void *args)
Создает новый процесс в самом широком понимании.
указатель на функцию, которая будет запущена как новый поток
указатель на стек для нового процесса (конец стека)
флаги
аргумент функции
Подробнее о флагах
CLONE_PARENT
CLONE_FS – клонировать файловую систему (клонируется корневой или текущий каталог), если флага нет, то С получит копию, если есть, то В и С имеют общие корневой и текущий каталоги.
CLONE_FILES – общими становятся таблицы файлов.
CLONE_SIGHAND – общая обработка сигналов
CLONE_VFORK – если установлен, то запускается процесс, а родительский процесс приостанавливается до остановки дочернего (выход по exit или вызов любой функции exec *)
CLONE_VM – общей становится виртуальная память, в этом случае можно не указывать PARENT, FS, FILES (фактически создается поток).
pid_t wautpid( pid_t pid,
int *status,
int flags)
Ожидает завершение процесса(ов)
Если pid > 0, то мы ждем завершение процесса с указанным pid номером .
Если pid = 0, ждем завершения любого дочернего процесса, который принадлежит к той же группе процессов, что и вызывающий.
Если pid = -1, ждем завершение любого дочернего процесса.
Если pid < -1, ждем завершение любого дочернего процесса из группы, номер которой равно модулю числа pid.
Указатель на нашу переменную, в которую будет записан код завершения процесса.
либо 0
либо WNOHANG – не вешаться, если установлен, то функция проверяет на завершенность процессы, не ожидая их завершения.
Результат > 0 – номер процесса, который завершился;
Результат = 0 – нет завершившихся процессов (дочерние есть, но они не завершены);
Результат = -1 – ошибка.
pid_t wait (int *st) – ждет завершения дочернего процесса.
pid_t getpid() – получить номер процесса.
pid_t getppid() – получить номер родителя.