[운영체제] 세마포어(semapore) 구현 - 다음 리눅스Linux C 프로그램을 읽고 아래 물음에 답하시오
본 자료는 3페이지 의 미리보기를 제공합니다. 이미지를 클릭하여 주세요.
닫기
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
해당 자료는 3페이지 까지만 미리보기를 제공합니다.
3페이지 이후부터 다운로드 후 확인할 수 있습니다.

소개글

[운영체제] 세마포어(semapore) 구현 - 다음 리눅스Linux C 프로그램을 읽고 아래 물음에 답하시오에 대한 보고서 자료입니다.

목차

[컴파일 실행환경]

[문제]다음 Linux C 프로그램을 읽고 아래 물음에 답하시오.

(1) 이 프로그램에서 사용된 세마포어 관련 시스템 호출들을 찾아내어, 그 목적 및 사용 방법에 대해 설명하시오.

(2) 이 프로그램의 목적 및 실행과정을 단계적으로 말해 보시오.

(3) 이 프로그램을 실행한 결과를 나타내보시오(필요한 header file이 있으면 정의하여 사용하시오).

(4) 이 프로그램을 수정하여 critical section을 가진 두 개 이상의 프로세스가 병행하여 실행되게 하여 그 결과를 나타내보시오.

본문내용

use_time = rand()%3; //세마포어가 기다리는 시간설정
switch(op_char)//임계영역내에서의 작업
{
case 'O' : printf("O"); break;
case 'X' : printf("X"); break;
case 'Z' : printf("Z"); break;
}
sleep(pause_time); //세마포어가 기다리게 한다.
printf("%c", op_char); fflush(stdout); //두번째 op_char출력
//c.s후에 우리는 semaphore_v를 호출한다. randon wait후에 다시 for loop
//겪기 전에 세마포어를 이용할수 있게 세팅한다.
if(!semaphore_v()) exit(EXIT_FAILURE); //V() 임계영역에서 나온다.
pause_time = rand() % 2;
sleep(pause_time);
}
wait(NULL); //자식 프로세스가 끝나기를 기다린다.
printf("\n%d - finished\n", getpid());
if(chPID1 < 0){ //부모프로세스라면 세마포어를 제거한다.
sleep(10);
del_semvalue(); //세마포어의 제거
}
if(getpid() == chPID1)
{
sleep(2);
}
exit(EXIT_SUCCESS);
}
//생성된 세마포어집합을 제거한다.
static void del_semvalue(void)
{
union semun sem_union;
if(semctl(sem_id, 0, IPC_RMID, sem_union) == -1)
fprintf(stderr, "Failed to delete semaphore\n");
}
//semaphore_v는 1에 sembuf 구조의 sem_op 부분을 세팅을 제외하고 유사하다.
//그래서 그결과 세마포어는 이용가능하다.
//V() 세마포어값의 증가를 통해 프로세스가 임계영역에서 나온것을 알린다.
static int semaphore_v(void)
{
struct sembuf sem_b;
sem_b.sem_num = 0; //세마포어의 수초기화
sem_b.sem_op = 1; //세마포어 연산지정
//프로세스가 세마포어를 돌려주지 않고 종료해버 릴경우 커널에서 알아서 세마포어 값을 조정( //증가)할수 있도록 만들어준다
sem_b.sem_flg = SEM_UNDO;
if(semop(sem_id, &sem_b, 1) == -1){// 세마포어 값 조작에 실패하면
fprintf(stderr, "semaphore_v failed\n"); //에러메시지를 출력한다.
return(0);
}
return(1);
}
//세마포어의 초기값을 지정한다. 정상종료면 1을 반환하고 그렇지 않으면 0을 반환한다.
static int set_semvalue(void)
{
union semun sem_union; //세마포어 조작에 대한 정보를 담은 구조체
sem_union.val = 1; //세마포어의 초기값을 1로 설정
//최초의 생성이므로 1설정 만약 만들어진 것이었으면 0설정
//semctl : 세마포어를 조정한다.
if(semctl(sem_id, 0, SETVAL, sem_union) == -1)return(0);
return(1);
}
//semaphore_p는 semaphore를 -1에의해서 바꾼다.
static int semaphore_p(void)
{
struct sembuf sem_b;
sem_b.sem_num = 0; //세마포어의 수의 초기화
sem_b.sem_op = -1; //세마포어 연산지정
//프로세스가 세마포어를 돌려주지 않고 종료해버릴경우 커널에서 알아서 세마포어 값을 조정 //(증가)할수 있도록 만들어준다
sem_b.sem_flg = SEM_UNDO;
if(semop(sem_id, &sem_b, 1) == -1){ //세마포어 값 조작에 실패하면
fprintf(stderr, "semaphore_p failed\n"); //에러메시지를 출력한다.
return(0);
}
return(1);
}
★소 감
수업시간에 배웠던 세마포어를 실제적인 unix상에서 구현을 해봄으로써 단순히 이론에만 충실했던 것에서 실질적으로 세마포어가 운영체제안에서 어떤식으로 구현이 되는가를 알 수 있던 좋은 기회였던 것 같다. 또한 문제를 통해서 세마포어 관련 시스템 호출함수들을 배울수 있었고 그함수들이 어떻게 어떤 목적으로 쓰이는지도 알수 있어서 개인적으로 공부하는데 도움이 많이 되었던거 같다.
  • 가격2,000
  • 페이지수9페이지
  • 등록일2015.07.21
  • 저작시기2007.5
  • 파일형식한글(hwp)
  • 자료번호#977232
본 자료는 최근 2주간 다운받은 회원이 없습니다.
청소해
다운로드 장바구니