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


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



Pdf көрінісі
бет45/57
Дата06.01.2022
өлшемі1,9 Mb.
#14410
1   ...   41   42   43   44   45   46   47   48   ...   57
№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   ...   41   42   43   44   45   46   47   48   ...   57




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

    Басты бет