Загальні області пам’яті та семафори

Страницы работы

Содержание работы

Міністерство освіти та науки України

Національний Технічний Університет

«Харківський Політехнічний Інститут»

Звіт

з лабораторної роботи № 5-6

з дисципліни «Операційні системи»

Виконав:  студент

групи КІТ-14б              

Самітов М. Б.                

Викладач:                      

Максюта Н.В.               

Харків 2007 р.


Тема: загальні області пам’яті та семафори.

Ціль: засвоєння використання у програмах загальних областей пам’яті та семафорів.

Індивідуальне завдання: промоделювати задачу «читачів та письменників».

Хід виконання

            У даній лабораторній роботи потрібно об’єднати застосування семафорів та загальних областей пам’ятей. Також потрібно створити два типа потомків, читачів та письменників, відповідно.

            У головній програмі, спочатку підключаємо усі необхідні заготовочні файли, потім описуємо структуру читачів та письменників, семафорів. У тілі головної програми спочатку іниціалізуємо усі потрібні змінні та індитефікатори семафорів та загальних областей пам’яті. Заповнюємо загальну область пам’яті випадковими числами, а семафори створюємо наступним шляхом: перший, семафор письменників, іниціалізуємо 1, другий, семафор дозволу читачам, іниціалізуємо 0, третій, семафор кількості читачів, іниціалізуємо 4. Після чого створюємо у циклі процеси-потомки. Передаємо ім’я та індитефікатори семафорів та загальних областей пам’яті. Якщо змінна циклу парна, тоді створюємо читачів, інакше створюємо письменників. Перевіряємо чи запустилися процеси-потомки. Після чекаємо 10 секунд, та закінчуємо всі процеси й програму, перед цим видаливши семафори та загальні області пам’яті.

            У процесі письменник, читаємо ім.’я та індитефікатори семафорів та загальних областей пам’яті. Перевіряємо чи вільний семафор письменників, якщо вільний, закриваємо семафор дозволу читачам, та записуємо у загальну область випадкові числа, якщо семафор письменників занятий, чекаємо 0,1 секунди, потім знов повторюємо спробу. Після виконання дії, відкриваємо обидва семафори. Потім закінчуємо процес.

            У процесі читачі, читаємо ім.’я та індитефікатори семафорів та загальних областей пам’яті. Перевіряємо чи вільний семафор дозволу на читання, якщо вільний, закриваємо семафор письменників, та читаємо з загальної області, якщо семафор дозволу на читання занятий, чекаємо 0,1 секунди, потім знов повторюємо спробу. Після виконання дії, відкриваємо семафори письменників. Потім закінчуємо процес.

Текст головної програми:


  /**********************************************/

  /* Задача "Читатели и писатели"               */

  /**********************************************/

  #include <unistd.h>

  #include <stdio.h>

  #include <stdlib.h>

  #include <string.h>

  #include <signal.h>

  #include <sys/sem.h>

  #include <sys/types.h>

  #include <sys/wait.h>

  #include <sys/shm.h>

  #include <sys/ipc.h>

  #include <sys/time.h>

  #include <time.h>

  #include "../srtRW.h"

  #include "../writers.h"

  #include "../readers.h"

  #include "../curtime.c"

  /* размер буфера общей памяти */

  #define shmSize 8

  #define NE 8

  struct mwr {

             struct strRW *w;

             pid_t chpidWR;         /* ID процесса */

             char statusWR;

             }; 

  struct mrd {

               struct strRW *r;

               pid_t chpidRD;  

              char statusRD;

             };

  static int ne;

  static struct mwr wrt[NE];

  static struct mrd rdt[NE];

  static int cnt;

   static char chld_nameWR[]="./writer";/*процесс "писателей" */

   static char chld_nameRD[]="./reader";/*процесс "читатитлей"*/

union semun {

               int val;

               struct semid_ds *buf;

               unsigned short *array;

               struct seminfo *__buf;                  

            } arg;

  /**********************************************/

  main() {

   char *shm; /*bufer address*/     

   int i;  /*counter value*/

   int in; /*position in bufer*/

   int shmId; /*индификатор общей области памяти*/

   char eee[512];/*текст сообщения об ошибке*/

   pid_t pw;/*индификатор дочерних процессов*/

   char t[20];

   char t1[20];

   struct sembuf sb[1];

   int statWR;

   int statRD;

   int sk=semget(IPC_PRIVATE,3,IPC_CREAT|0x1ff); 

   #include "../incl_bgn.c"

   arg.array=1;//semafor writer

   semctl(sk,0, SETVAL,arg);

   arg.array=1;//semafor prav read

   semctl(sk,1, SETVAL,arg);

   arg.array=4;//semafor reader

   semctl(sk,2, SETVAL,arg);

     /* создание общей области, которая будет совместно

         использоваться родительским и дочерним процессами */

      shmId=shmget(IPC_PRIVATE,shmSize,IPC_CREAT|0x1ff);

      /* получение адреса общей области */

      shm=(char *)shmat(shmId,(char *)0,0);

      /* общая область пустая (заполнена 0) */

      for (i=0; i<shmSize; i++) shm[i]=rand();

    //  for (i=0; i<shmSize; i++) printf("%d ",shm[i]);

Похожие материалы

Информация о работе