Problem czytelników i pisarzy w C

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
large
Piegowaty Guziec
Piegowaty Guziec
Posty: 7
Rejestracja: 14 paź 2008, 16:38
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Problem czytelników i pisarzy w C

Post autor: large »

Chcę napisać program w C w linuksie rozwiązujący pierwszy problem czytelników i pisarzy czyli ten w którym faworyzowani są czytelnicy. Chciałbym żebyście mi pomogli ale nie szukam pomocy w postaci gotowego kodu. Nie wiem za bardzo jak to wszytko zaimplementować i dlatego chciałbym żeby ktoś wyjaśnił mi krok po kroku jak to ma działać. Na razie mój pomysł jest taki żeby napisać program uruchamiający przy pomocy funkcji fork kilka podprocesów, które wykonywały by procesy czytelników i pisarzy. Poniżej wklejam jak może wyglądać kod procesu pisarza i czytelnika.

Struktura procesu pisarza:

Kod: Zaznacz cały

wait(pis);

	//tu następujepisanie

signal(pis);

Struktura procesu czytelnika:

Kod: Zaznacz cały

wait(mutex);
liczba_czyt++;
if (liczba_czyt == 1)
		wait(pis);
signal(mutex);
	
		//tu nastepuje czytanie

wait(mutex);
if (liczba_czyt == 0)
		signal(pis);
signal(mutex);
Te dwa procesy wykorzystują dwa semafory mutex i pis oraz zmienną liczba_czyt, która jest liczbą całkowitą. Tutaj pojawia się pierwszy problem jak zrobić, żeby te zmienne były dzielone przez wszystkie procesy czyli żeby każdy z podprocesów mógł je czytać i modyfikować? Zmienne mutex i pis mają być liczbami całkowitymi czy mają być semaforami. Coś czytałem, że w linuksie można deklarować zmienne jako semafory ale nie wiem jak to działa i może w tak prostym problemie wystarczy aby te zmienne były tylko liczbami całkowitymi?

Do tego dochodzą dwie funkcje zmieniające wartości semaforów:

Kod: Zaznacz cały

wait(S) {
		while (S <= 0)
				;
		S--;
}

signal(S) {
		S++;
}
Wykonywanie, funkcji signal i wait musi być wykonywane niepodzielnie czyli w każdym procesie wykonywanie tych funkcji musi należeć do sekcji krytycznej. Jak najłatwiej zapewnić, że jeśli jeden proces wykonuje tą funkcje to żaden inny nie będzie też mógł tego zrobić do póki ten pierwszy nie skończy? Zastosować algorytm piekarni czy może jakiś inny sposób?
Awatar użytkownika
el.pescado
Zakręcona Traszka
Zakręcona Traszka
Posty: 734
Rejestracja: 26 maja 2005, 11:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Problem czytelników i pisarzy w C

Post autor: el.pescado »

Tutaj pojawia się pierwszy problem jak zrobić, żeby te zmienne były dzielone przez wszystkie procesy czyli żeby każdy z podprocesów mógł je czytać i modyfikować?
Można się posłużyć pamięcią współdzieloną, ale przypuszczam, że nie o to chodzi. Ogólnie, procesy mają swoją własną przestrzeń adresową. Jeżeli jest to przeszkodą, możesz użyć wątków, które działają w jednej przestrzeni adresowej i mogą wzajemnie nadpisywać sobie zmienne;)
Zmienne mutex i pis mają być liczbami całkowitymi czy mają być semaforami.
Do synchronizacji procesów i wątków wykorzystuje się semafory. Linux dostarcza implementacji semaforów. Podręcznik systemowy dosyć obszernie opisuje to zagadnienie:

Kod: Zaznacz cały

man sem_overview
może być konieczne zainstalowanie pakietu manpages-dev


PS:

Kod: Zaznacz cały

wait(S) {
		while (S <= 0)
				;
		S--;
}
To jest dosyć powszechny błąd w programowaniu współbieżnym, tzw. spin-lock, czy też aktywne czekanie. Niby jest to poprawne, program czeka aż wartość zmiennej osiągnie zero, lecz przez ten cały czas pętla się "kręci", mocno obciążając procesor. Lepiej użyć obiektów dostarczanych przez system operacyjny, które powodują "uśpienie" procesu tak, że inne procesy mogą wykorzystać czas procesora.
large
Piegowaty Guziec
Piegowaty Guziec
Posty: 7
Rejestracja: 14 paź 2008, 16:38
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: Problem czytelników i pisarzy w C

Post autor: large »

Muszę używać procesów a nie wątków więc pomysł z wątkami odpada. Pomysł z tym żeby w jednym programie za pomocą funkcji fork uruchomić kilka procesów czytelników i pisarzy jest dobry? Jeśli tak to czy jest możliwość dzielenia wspólnych danych przez te procesy?

Zaraz sobie dokładniej poczytam o tych semaforach w linuksie bo prawdę mówiąc na razie to dla mnie czarna magia ;) A do tej wirującej blokady to wiem, że jest to błędne ale na razie chce napisać prostszą wersję a jak już to się uda to wtedy postaram się poprawić usuwając ten efekt.
Awatar użytkownika
el.pescado
Zakręcona Traszka
Zakręcona Traszka
Posty: 734
Rejestracja: 26 maja 2005, 11:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Problem czytelników i pisarzy w C

Post autor: el.pescado »

Muszę używać procesów a nie wątków więc pomysł z wątkami odpada. Pomysł z tym żeby w jednym programie za pomocą funkcji fork uruchomić kilka procesów czytelników i pisarzy jest dobry? Jeśli tak to czy jest możliwość dzielenia wspólnych danych przez te procesy?
Jeżeli chcesz mieć kilka procesów to musisz użyć fork(). Do dzielenia danych / komunikacji między tymi procesami trzeba użyć mechanizmów IPC. Opis większości mechanizmów IPC oferowanych przez jądro Linuksa można znależć w podręczniku na stronie

Kod: Zaznacz cały

man svipc
large
Piegowaty Guziec
Piegowaty Guziec
Posty: 7
Rejestracja: 14 paź 2008, 16:38
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: Problem czytelników i pisarzy w C

Post autor: large »

Niestety nie mam u siebie w podręczniku stron o svipc, jak można je ściągnąć z internetu i zainstalować tak żeby dało się je przeglądać?

Edit: Głupie jest to pytanie ale jestem zmęczony i dlatego je zadałem... nie ma niestety możliwości usuwania swoich postów :)
vtr
Sędziwy Jeż
Sędziwy Jeż
Posty: 36
Rejestracja: 02 lip 2008, 13:58
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86

Odp: Problem czytelników i pisarzy w C

Post autor: vtr »

tak jak było napisane wcześniej wstukaj na klawiaturze:

Kod: Zaznacz cały

sudo apt-get install manpages-dev
There is no system but GNU, and Linux is one of its kernels.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 8 gości