№9,10 лабораториялық жұмыс
Ағындарды қолданып, Linux- те программалар құру.
Жұмыстың мақсаты: Linux операциялық жүйесінде ағындарды қолдану
Материалдар және жабдықтар: ДК, параллельді есептеулерді программалау
ортасы, Linux операциялық жүйесі.
Жұмыстың мазмұны және орындалу тәртібі:
Өз бетімен орындауға арналған тапсырмалардың нұсқалары:
1. Linux операциялық жүйесінің ерекшеліктері талдау
2. Ағындар. Ағындар түрлерін қарастыру
Лабораториялық жұмыстың орындалуы туралы есебінің формасы:
1. Linux операциялық жүйесіндегі ағындар туралы конспекті жазып, түсіндіру.
2. Орындалған жұмыс жөнінде есеп беру.
Лабоаториялық жұмыстың мазмұны:
Ағындарды құру үшін pthread кітапханасы қолданылып, pthread_create
функциясы шақырылады, осы кітапханада синхронизациялау үшін арнайы
объектілер – мутекс тер сипатталған.
/*sem.h*/
#include
#include
#include
// semafore
#include
#include
#include
#include
/*
* В моей системе данное объединение не объявлено в подключенных файлах -
* если компилятор напишет что оно ранее объявлено - просто сотрите :)
*/
union semun {
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO
(Linux specific) */
};
class sem
{
private:
int sid; // идентификатор семафора
key_t key; // ключ по которому получаем идентификатор
int res_count; // количество ресурсов у семафора
public:
/*
* кол-во ресурсов
* некое случайное число
* путь в системе - обязательно должен существовать !
*/
sem(int max_res, int id, const char* identify);
/*
* деструктор - тут удаляем семафор, иначе он останется до
* следующей перезагрузки системы или пока его кто-то явно не удалит
*/
~sem();
/*
* обертки для занятия/освобождения ресурсов
*/
bool lock(int res);
bool unlock(int res);
};
typedef sem* psem;
;
Cледующий файл:
/*sem.cpp*/
#include "sem.h"
sem::sem(int max_res, int id, const char* identify)
{
sid = -1;
res_count = 0;
/*
* получаем ключ для семафора
*/
if ((key = ftok(identify,id)) == -1)
{
return;
}
/*
* 0666 - rw для всех, чтобы потом можно было обратиться к семафору
* от любого пользователя системы, в общем то личное дело каждого
* сначала пытаемся открыть имеющийся семафор с таким ключом - и
* удалить его, старый нам ни к чему
*/
if ((sid = semget(key, 0, 0666)) != -1)
{
if (semctl(sid, 0, IPC_RMID, 0) == -1)
{
sid = 0;
}
}
if (sid != 0) // проверяем что семафор был найден и удален или не
существовал
{
/*
* создаем с флагом IPC_EXCL - означает что в случае если семафор уже
* имеется - вызов будет провален c значением EEXIST,
* без возврата значения отрытого уже существующего семафора
*/
if ((sid = semget( key, 1, IPC_CREAT | IPC_EXCL | 0666 )) != -1) //
{
union semun semopts;
semopts.val = max_res;
semctl(sid, 0, SETVAL, semopts);
res_count = max_res;
}
} else sid = -1;
}
sem::~sem()
{
if (sid != -1)
{
semctl(sid, 0, IPC_RMID, 0);
}
}
bool sem::lock(int res)
{
/*
* отсекаем неверные запросы сразу, не используя обращения к структурам
семафора
*/
if ((res > res_count) || (sid == -1))
{
return false;
}
/*
* параметры в структуре
* 0 - номер семафора
* количество ресурсов - если захватываем, должно быть отрицательным
* 0 - ждать если на данный момент нет достаточного
* количества ресурсов или IPC_NOWAIT - возвращать ошибку
*/
struct sembuf sem_lock={0,(-1)*res,0};
/*
* параметры запроса
* - идентификатор семафора
* - структура которую заполняли выше - ее адрес
* - сколько раз выполнить операцию
*/
if ((semop(sid, &sem_lock, 1)) == -1)
{
return false;
}
return true;
}
bool sem::unlock(int res)
{
/*
* аналогично функции lock
*/
if ((res > res_count) || (sid == -1))
{
return false;
}
struct sembuf sem_unlock= { 0, res, IPC_NOWAIT};
if ((semop(sid, &sem_unlock, 1)) == -1)
{
return false;
}
return true;
}
Блиц тест.
1. Параллельді программалау тіліне жатпайды:
А) Бейсик;
В) Фортран;
С) OCCAM;
Д) OpenMP.
2. Параллельді компьютер дегеніміз:
А) есепті сандық түрде шешіп, бірігіп жұмыс істей алатын поцессорлар
жиынтығы;
В) бүкіләлемдік компьютерлік жүйе;
С) локалды жүйе;
Д) республикалық компьютерлік жүйе.
3.Компьютер өнімділігі (операциялардың орындалу жылдамдығы)
мына шамаға тәуелді:
А) процессор жиілігіне;
В) монитор экранының мөлшеріне;
С) пернеге басу жылдамдығына;
Достарыңызбен бөлісу: |