Gcc 1.C –o 1.Exe -lpthread

Порядок выполнения работы

1.Изучить теоретическую часть лабораторной работы.

2.Написать программу, создающую два дочерних потока. Родительский процесс и два дочерних потока должны выводить на экран свой id и pid родительского процесса и текущее время в формате: часы: минуты: секунды: миллисекунды.

Варианты индивидуальных заданий

1.Написать программу шифрования всех файлов для заданного каталога его подкаталогов. Пользователь задаёт имя каталога. Главный процесс открывает каталоги и запускает для каждого файла каталога отдельный поток шифрования файла. Каждый поток выводит на экран свой id, полный путь к файлу, общее число зашифрованных байт. Число одновременно работающих потоков N (вводится пользователем). Проверить работу программы для каталога /etc.

2.Написать программу нахождения массива N последовательных значений функции y[i]=sin(2*PI*i/N)( i=0,1,2…N-1 ) с использованием ряда Тейлора. Пользователь задаёт значения N и количество n членов ряда Тейлора. Для расчета каждого члена ряда Тейлора запускается отдельный поток. Каждый поток выводит на экран и в файл свой id и рассчитанное значение ряда. Головной процесс считывает из файла значения всех рассчитанных членов ряда Тейлора, суммирует их и полученное значение y[i] записывает в файл. Проверить работу программы для N=256 n=5; N=1024 n=10.

3. Написать программу синхронизации двух каталогов, например, Dir1 и Dir2. Пользователь задаёт имена Dir1 и Dir2. В результате работы программы файлы, имеющиеся в Dir1, но отсутствующие в Dir2, должны скопироваться в Dir2 вместе с правами доступа. Процедуры копирования должны запускаться в отдельном потоке для каждого копируемого файла. Каждый поток выводит на экран свой id, полный путь к копируемому файлу и число скопированных байт. Число одновременно работающих потоков N (вводится пользователем). Скопировать несколько файлов из каталога /etc в свой домашний каталог. Проверить работу программы для каталога /etc и домашнего каталога.

4.Написать программу поиска одинаковых по содержимому файлов в двух каталогов, например, Dir1 и Dir2. Пользователь задаёт имена Dir1 и Dir2. В результате работы программы файлы, имеющиеся в Dir1, сравниваются с файлами в Dir2 по их содержимому. Процедуры сравнения должны запускаться в отдельном потоке для каждой пары сравниваемых файлов. Каждый поток выводит на экран свой id, имя файла, общее число просмотренных байт и результаты сравнения. Число одновременно работающих потоков N (вводится пользователем). Скопировать несколько файлов из каталога /etc в свой домашний каталог. Проверить работу программы для каталога /etc и домашнего каталога.

5.Написать программу поиска заданной пользователем комбинации из m байт (m <255) во всех файлах текущего каталога. Пользователь задаёт имя каталога. Главный процесс открывает каталог и запускает для каждого файла каталога отдельный поток поиска заданной комбинации из m байт. Каждый поток выводит на экран свой id, полный путь к файлу, общее число просмотренных байт и результаты (сколько раз найдена комбинация) поиска. Число одновременно работающих потоков N (вводится пользователем). Проверить работу программы для каталога /etc и строки ifconfig.

6.Написать программу подсчета количества слов в файлах заданного каталога его подкаталогов. Пользователь задаёт имя каталога. Главный процесс открывает каталоги и запускает для каждого файла каталога отдельный поток подсчета количества слов. Каждый поток выводит на экран свой id, полный путь к файлу, общее число просмотренных байт и количество слов. Число одновременно работающих потоков N (вводится пользователем). Проверить работу программы для каталога /etc и строки ifconfig.

7.Написать программу подсчета частоты встречающихся символов в файлах заданного каталога его подкаталогов. Пользователь задаёт имя каталога. Главный процесс открывает каталоги и запускает для каждого файла каталога и отдельный поток подсчета частоты встречающихся символов. Каждый поток выводит на экран свой id, полный путь к файлу, общее число просмотренных байт и количество слов. Число одновременно работающих потоков N(вводится пользователем). Проверить работу программы для каталога /etc и строки ifconfig.

8.Поиск плагиата. Имеются два файла (файл1 и файл2) с текстами. Необходимо найти совпадающие по содержанию куски текста вывести их в файл результата с указанием номера начальной позиции в файле 1 и в файле2 и размера куска текста. Для ускорения работы использовать потоки. Число одновременно работающих потоков N (вводится пользователем).

ЛАБОРАТОРНАЯ РАБОТА №6 СЕМАФОРЫ В ОС UNIX/LINUX

Цель работы – изучение механизма взаимодействия процессов с использованием семафоров.

Теоретическая часть

Семафор – переменная определенного типа, которая доступна параллельным процессам для проведения над ней только двух операций:

· A(S, n) – увеличить значение семафора S на величину n;

· D(S, n) – если значение семафора S < n, процесс блокируется. Далее S = S - n;

· Z(S) – процесс блокируется до тех пор, пока значение семафора S не станет равным 0.

Семафор играет роль вспомогательного критического ресурса, так как операции A и D неделимы при своем выполнении и взаимно исключают друг друга. Семафорный механизм работает по схеме, в которой сначала исследуется состояние критического ресурса, а затем уже осуществляется допуск к критическому ресурсу или отказ от него на некоторое время. Основным достоинством семафорных операций является отсутствие состояния «активного ожидания», что может существенно повысить эффективность работы мультипрограммной вычислительной системы.

Для работы с семафорами имеются следующие системные вызовы:

Создание и получение доступа к набору семафоров:

int semget(key_t key, int nsems, int semflg);

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

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

IPC_CREAT — если массива для указанного ключа не существует, он должен быть создан;

IPC_EXCL — применяется совместно с флагом IPC_CREAT. При совместном их использовании и существовании массива с указанным ключом, доступ к массиву не производится и констатируется ошибка, при этом переменная errno, описанная в файле <errno.h>, примет значение EEXIST;

0400 — разрешено чтение для пользователя, создавшего массив

0200 — разрешена запись для пользователя, создавшего массив

0040 — разрешено чтение для группы пользователя, создавшего массив

0020— разрешена запись для группы пользователя, создавшего массив

0004— разрешено чтение для всех остальных пользователей

0002— разрешена запись для всех остальных пользователей

Пример: semflg= IPC_CREAT | 0022

Изменение значений семафоров:

int semop(int semid, struct sembuf *sops, int nsops);

Параметр semid является дескриптором System V IPC для набора семафоров, т. е. значением, которое вернул системный вызов semget() при создании набора семафоров или при его поиске по ключу. Каждый из nsops элементов массива, на который указывает параметр sops, определяет операцию, которая должна быть совершена над каким-либо семафором из массива IPC семафоров, и имеет тип структуры:

struct sembuf {

short sem_num; //номер семафора в массиве IPC семафоров (начиная с 0);

short sem_op; //выполняемая операция;

short sem_flg; // флаги для выполнения операции.

}

Значение элемента структуры sem_op определяется следующим образом:

· для выполнения операции A(S,n)значение должно быть равно n;

· для выполнения операции D(S,n) значение должно быть равно -n;

· для выполнения операции Z(S) значение должно быть равно 0.

Семантика системного вызова подразумевает, что все операции будут в реальности выполнены над семафорами только перед успешным возвращением из системного вызова. Если при выполнении операций D или Z процесс перешел в состояние ожидания, то он может быть выведен из этого состояния при возникновении следующих форсмажорных ситуаций: массив семафоров был удален из системы; процесс получил сигнал, который должен быть обработан.

Выполнение разнообразных управляющих операций (включая удаление) над набором семафоров:

int semctl(int semid, int semnum, int cmd, union semun arg);

Изначально все семафоры инициируются нулевым значением.

Наши рекомендации