Barrier의 개념이나 구현을 완전히 자세하게 하진 않고,
간단하게 개념을 알아본 뒤, IPC 중 하나인 SIGNAL을 이용해서 간단하게 구현해보자.
> Barrier란?
간단히 말해서 동기화 도구 중 하나이다. 같은 작업을 여러 processors가 나눠서 진행중이라면, 다른 놈들보다 먼저 본인의 일을 끝내는 processor가 나오기 마련이다.
그럴때 같은 일을 하는 다른 모든 processors가 일을 끝마칠때까지 기다리도록 하는 것이 barrier이다.
위 예시처럼 특정 작업이 끝나고 다른 작업을 시작해야할때 적용할 수 있다.
SIGNAL을 이용해서 이런 기능을 하도록 하려면 어떻게 해야할까?
0. 일단 모든 processors는 미리 정해둔 SIGNAL을 받아서 카운트를 하도록 signal handler를 설정한다.
(여기서 handler는 그냥 signal 몇번 받았는지 카운트만 해준다.)
1. 해당 processor의 일이 끝나면, 동기화 대상인 모든 다른 processors에게 미리 정해둔 SIGNAL을 보낸다.(다른 processors의 pid를 알고 있어야 한다. 아래 예시 코드에선 그냥 유저가 입력하도록 함.)
2. `pause()` 함수 등으로 다른 processors에게서 받아오는 SIGNAL들의 총 개수가 N-1개가 될때까지 멈춰있는다.
3. SIGNAL을 N-1개 받아오면 이제는 다음 일을 진행할 수 있도록 프로그램을 종료하거나, 해당 process내에 다음 일이 있다면 다음 일을 진행한다.
아래는 이를 간단하게 구현한 것이다.
#include <stdio.h>
#include <signal.h>
int cnt=0;
int pnum;
int pids[10];
void my_sig_handler(int signum)
{
printf("signum = %d\n", signum);
cnt++;
}
void barrier()
{
int i;
for (i=0; i<pnum-1; i++)
kill(pids[i], SIGUSR1);
while (cnt < pnum-1) pause();
//막 반복하면 소모가 많음. pause는 signal이 생길때까지 멈추므로 작동도 잘되고 이게 더 굿
cnt = 0;
}
void work(int secs)
{
int i,j,k,sum;
sum = 0;
for (i=0; i<secs; i++)
for (j=0; j<500; j++)
for (k=0; k<1000000; k++)
sum++;
}
int main()
{
int work_t;
printf("pid = %d\n", getpid());
signal(SIGUSR1, my_sig_handler);
printf("Enter the number of process : ");
scanf("%d", &pnum);
for (int i = 0; i<pnum-1; i++) {
printf("Enter %d process id : ", i);
scanf("%d", &pids[i]);
}
srand(time(NULL));
while (1) {
work_t = rand() % 10+1;
work(work_t);
printf(" Done.\n");
barrier();
printf("----- End of Barrier -----\n");
}
return 0;
}
'수업 > System Programming' 카테고리의 다른 글
[System Programming] Thread & Mutex Lock (0) | 2022.12.07 |
---|---|
[System Programming] Semaphore (0) | 2022.12.03 |
[System Programming] Inter Process Communication(IPC) (0) | 2022.11.23 |
[System Programming] pipe 공부 (0) | 2022.11.09 |
[System Programming] Shell 공부 (0) | 2022.11.05 |