Міністерство освіти та науки України
Національний Технічний Університет
«Харківський Політехнічний Інститут»
Звіт
з лабораторної роботи № 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]);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.