Қазақстан респудликасы білім және ғылым министрлігі


№9,10  лабораториялық жұмыс



Pdf көрінісі
бет56/82
Дата06.01.2022
өлшемі11,68 Mb.
#15553
1   ...   52   53   54   55   56   57   58   59   ...   82
№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.Компьютер өнімділігі (операциялардың орындалу жылдамдығы) 
мына шамаға тәуелді:
А)  процессор жиілігіне;
В) монитор экранының мөлшеріне;
С) пернеге басу жылдамдығына;




Достарыңызбен бөлісу:
1   ...   52   53   54   55   56   57   58   59   ...   82




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет