경전의 동기화 문제 - 독자 작성자
하나의 데이터 파일이나 기록을 여러 프로세스에 공유할 수 있습니다. 이 파일만 읽어야 하는 프로세스를 'Reader 프로세스' 라고 하고, 다른 프로세스를 'Writer 프로세스' 라고 합니다.여러 프로세스가 하나의 공유 대상을 동시에 읽을 수 있도록 합니다. 왜냐하면 읽기 동작이 데이터 파일을 혼란스럽게 하지 않기 때문입니다.그러나 한 Writer 프로세스와 다른 Reader 프로세스 또는 Writer 프로세스가 공유 객체에 동시에 액세스하는 것은 허용되지 않습니다. 이러한 액세스는 혼란을 야기하기 때문입니다.독자-작성자 문제(Reader-Writer Problem)란 하나의 Writer 프로세스가 다른 프로세스와 공유 객체에 배타적으로 액세스해야 하는 동기화 문제를 말합니다.독자 - 작성자 문제는 항상 새로운 동기화 원어를 테스트하는 데 쓰인다.
1. 기록형 신호량으로 독자-작성자 문제 해결
Reader와 Writer 프로세스 간에 읽거나 쓸 때의 상호 배척을 실현하기 위해 상호 배척 신호량인 Wmutex를 설정합니다.또한 읽는 프로세스 수를 나타내는 정수 변수 Readcount를 설정합니다.Reader 프로세스가 읽기 중이면 Writer 프로세스가 쓰기를 허용하지 않기 때문입니다.따라서 Readcount=0 은 읽기 중인 Reader 프로세스가 없음을 나타내는 경우에만 Wait(Wmutex) 작업을 수행해야 합니다.Wait(Wmutex) 작업이 성공하면 Reader 프로세스를 읽고 Readcount+1 작업을 할 수 있습니다.마찬가지로, Reader 프로세스가 Readcount 마이너스 1 작업을 실행한 후에 값이 0일 때만, Writer 프로세스가 쓰기 위해 signal (Wmutex) 작업을 실행해야 한다.또한 Readcount는 여러 Reader 프로세스에 접근할 수 있는 임계 자원이기 때문에 상호 배척 신호량인rmutex를 설정해야 한다.
설명:
상호 배척 신호량wmutex: Reader와 Writer 프로세스 간에 읽거나 쓸 때의 상호 배척을 실현하고, 정형 변수Readcount: 읽는 프로세스의 수를 표시합니다.Reader 프로세스 중 하나만 읽으면 Writer 프로세스 쓰기가 허용되지 않기 때문입니다.따라서 Readcount=0, 즉 Reader 프로세스가 읽지 않을 때만 Reader는 Wait(wmutex) 작업을 수행해야 합니다.Wait(wmutex) 작업이 성공하면 Reader 프로세스를 읽을 수 있고 그에 상응하여Readcount+1 작업을 할 수 있습니다.같은 이치로, Reader 프로세스가 Readcount 감1 작업을 실행한 후에 값이 0일 때만, Write 프로세스가 쓰기 위해 signal (wmutex) 작업을 실행해야 한다.
상호 배척 신호량 rmutex: Reader 프로세스 간 상호 배척 접근 Readcount
독자 - 작성자 문제는 다음과 같습니다.
1 Var rmutex,wmutex: semaphore:=1,1;
2 Readcount: integer:=0;
3 begin
4 parbegin
5 Reader: begin
6 repeat
7 wait(rmutex);
8 if readcount=0 then wait(wmutex);
9 Readcount:=Readcount+1;
10 signal(rmutex);
11 ...
12 perform read operation;
13 ...
14 wait(rmutex);
15 readcount:=readcount-1;
16 if readcount=0 then signal(wmutex);
17 signal(rmutex);
18 until false;
19 end
20 writer: begin
21 repeat
22 wait(wmutex);
23 perform write operation;
24 signal(wmutex);
25 until false;
26 end
27 parend
28 end
2. 신호량 집합 메커니즘을 이용하여 독자-작가 문제를 해결한다.
여기의 독자 - 작성자 문제는 앞의 것과 약간 다르기 때문에 최대 RN 독자만 동시에 읽을 수 있도록 제한을 추가했다.이를 위해 또 하나의 신호량 L을 도입하고 RN으로 초기 값을 부여해 wait(L, 1, 1) 조작을 실행함으로써 독자의 수를 조절한다.한 명의 독자가 들어갈 때마다 먼저 wait(L,1,1) 조작을 실행하여 L의 값을 1로 줄여야 한다.RN 독자가 읽기에 들어가면 L은 0으로 줄고, 제RN +1 독자가 읽기에 들어가면 wait(L, 1, 1) 조작 실패로 막힐 수밖에 없다.
설명은 다음과 같습니다.
1 Var RN integer;
2 L, mx: semaphore:=RN,1;
3 begin
4 parbegin
5 reader: begin
6 repeat
7 Swait(L,1,1);
8 Swait(mx,1,0);
9 ...
10 perform read operation;
11 ...
12 Ssignal(L,1);
13 until false;
14 end
15 writer: begin
16 repeat
17 Swait(mx,1,1;L,RN,0);
18 perform write operation;
19 Ssignal(mx,1);
20 until false;
21 end
22 parend
23 end
전재 대상:https://www.cnblogs.com/IamJiangXiaoKun/p/9467420.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.