1. Разработать программу, реализующую действия, указанные в задании к лабораторной работе с учётом следующих требований:
· все действия, относящиеся как к родительскому процессу, так и к порожденным процессам, выполняются в рамках одного исполняемого файла;
· обмен данными между процессом-отцом и процессом-потомком предлагается выполнить посредством временного файла: процесс-отец после порождения процесса-потомка постоянно опрашивает временный файл, ожидая появления в нем информации от процесса-потомка;
· если процессов-потомков несколько, и все они подготавливают некоторую информацию для процесса-родителя, каждый из процессов помещает в файл некоторую структурированную запись, при этом в этой структурированной записи содержатся сведения о том, какой процесс посылает запись, и сама подготовленная информация.
2. Модифицировать ранее разработанную программу с учётом следующих требований:
· действия процесса-потомка реализуются отдельной программой, запускаемой по одному из системных вызовов execl(), execv() и т.д. из процесса-потомка;
· процесс-потомок, после порождения, должен начинать и завершать свое функционирование по сигналу, посылаемому процессом-предком (это же относится и к нескольким процессам-потомкам);
· обмен данными между процессами необходимо осуществить через программный канал.
Варианты заданий
1. Разработать программу, вычисляющую интеграл на отрезке [A;B] от функции exp(x) методом трапеций, разбивая интервал на K равных отрезков. Для нахождения exp(х) программа должна породить процесс, вычисляющий её значение путём разложения в ряд по формулам вычислительной математики.
2. Разработать программу, вычисляющую значение f(x) как сумму ряда от k=0 до k=N от выражения x^(2k+1)/(2k+1)! для значений x, равномерно распределённых на интервале [0;Pi], и выводящую полученный результат f(x) в файл в двоичном формате. В это время предварительно подготовленный процесс-потомок читает данные из файла, преобразовывает их в текстовую форму и выводит на экран до тех пор, пока процесс-предок не передаст ему через файл ключевое слово (например, "STOP"), свидетельствующее об окончании процессов.
3. Разработать программу, вычисляющую плотность распределения Пуассона с параметром lambda в точке k (k - целое) по формуле f(k)=lambda^k*exp(-lambda)/k!. Для нахождения факториала и exp(-lambda) программа должна породить два параллельных процесса, вычисляющих эти величины путём разложения в ряд по формулам вычислительной математики.
4. Разработать программу, вычисляющую плотность выпуклого распределения в точке х по формуле f(x)=(1-cos(x))/(Pi*x^2). Для нахождения Pi и cos(х) программа должна породить два параллельных процесса, вычисляющих эти величины путём разложения в ряд по формулам вычислительной математики.
5. Разработать программу, вычисляющую значение плотности лог-нормального распределения в точке х (x>0) по формуле f(x)=(1/2)*exp(-(1/2)*ln(x)^2)/(x*sqrt(2*Pi)). Для нахождения Pi, exp(x) и ln(x) программа должна породить три параллельных процесса, вычисляющих эти величины путём разложения в ряд по формулам вычислительной математики.
6. Разработать программу, вычисляющую число размещений n элементов по r ячейкам N=n!/n(1)!*n(2)!*...*n(r)!, удовлетворяющее требованию, что в ячейку с номером i попадает ровно n(i) элементов (i=1..r) и n(1)+n(2)+...+n(r)=n. Для вычисления каждого факториала необходимо породить процесс-потомок.
7. Разработать программу, вычисляющую число сочетаний C(k,n)=n!/(k!*(n-k)!). Для вычисления факториалов n!, k!, (n-k)! должны быть порождены три параллельных процесса-потомка.
8. Разработать программу, вычисляющую значение f(x) как сумму ряда от k=1 до k=N от выражения (-1)^(k+1)*x^(2k-1)/(2k-1)! для значений x, равномерно распределённых на интервале [0;Pi], и выводящую полученный результат f(x) в файл в двоичном формате. В это время предварительно подготовленный процесс-потомок читает данные из файла, преобразовывает их в текстовую форму и выводит на экран до тех пор, пока процесс-предок не передаст ему через файл ключевое слово (например, "STOP"), свидетельствующее об окончании процессов.
9. Разработать программу, вычисляющую плотность нормального распределения в точке x по формуле f(x)=exp(-x^2/2)/sqrt(2*Pi). Для нахождения Pi и exp(-x^2/2) программа должна породить два параллельных процесса, вычисляющих эти величины путём разложения в ряд по формулам вычислительной математики.
10. Разработать программу, вычисляющую интеграл в диапазоне от 0 до 1 от подинтегрального выражения 4*dx/(1+x^2) с помощью последовательности равномерно распределённых на отрезке [0;1] случайных чисел, которая генерируется процессом-потомком параллельно. Процесс-потомок должен завершиться после заранее заданного числа генераций N.
Контрольные вопросы
1. Каким образом может быть порожден новый процесс? Какова структура нового процесса?
2. Если процесс-предок открывает файл, а затем порождает процесс-потомок, а тот, в свою очередь, изменяет положение указателя чтения-записи файла, то изменится ли положение указателя чтения-записи файла процесса-отца?
3. Что произойдет, если процесс-потомок завершится раньше, чем процесс-предок осуществит системный вызов wait()?
4. Могут ли родственные процессы разделять общую память?
5. Каков алгоритм системного вызова fork()?
6. Какова структура таблиц открытых файлов, файлов и описателей файлов после создания процесса?
7. Каков алгоритм системного вызова exit()?
8. Каков алгоритм системного вызова wait()?
9. В чем разница между различными формами системных вызовов типа exec()?
10. Для чего используются сигналы в ОС UNIX?
11. Какие виды сигналов существуют в ОС UNIX?
12. Для чего используются каналы?
13. Какие требования предъявляются к процессам, чтобы они могли осуществлять обмен данными посредством каналов?
14. Каков максимальный размер программного канала и почему?