글을 시작하기에 앞서 Semaphore에 대해 잘 정리해놓은 또다른 글인 joockim의 노션을 소개한다.

여기 링크를 클릭하면 들어갈 수 있다. 이곳에서 도움을 받았다면 joockim님께 감사인사라도 전하자.

 

그리고 이 글은 seongwpa님의 글에 (아주 살짝) 내 의견을 덧붙인 글이다.

도움이 되었다면 seongwpa님께 고맙다고 한 번씩 말씀 부탁드립니땅!

 

 

 

  • semapore.h
  • sem_open
#include <semaphore.h>        
sem_t* sem_open(const char *name, int oflag, /*optional*/ mode_t mode , /*optional*/ unsigned int value);    
역할: 세마포어 생성.                

인자 -             
첫번째 인자 name : semapore의 이름            
두번째 인자 oflag             
: 세마포어 생성을 위해 O_CREAT로 설정,             
: (이 세마포어가 존재하는 경우 함수호출을 실패로 처리하기 위해 O_EXCL로 설정.    

/*optional*/            
세번째 인자 mode : 새로운 세마포어에 대한 허가권 제어            
플래그를 O_CREAT로 설정하면, mode 인자를 받을 수 있음.             
<sys/stat.h> 를 인클루드 하면 아래 상수들을 활용할 수 있다.                
- S_IRWXR : 그룹 접근                
- S_IRWXO : 타인 접근            
- S_IRWXU : 개인 접근                        
네번째 인자 value : 세마포어의 초기 값. unlock된 세마포어 수. 세마포어 디스크립터 반환.    

에러 반환값 - SEM_FAILED         

ex) if (t = sem_open("name", O_CREAT, S_IRWXU, 1) == SEM_FAILED) {...}
  • sem_close
        int sem_close(sem_t *sem);    
        semapore 종료.        
        semapore 종료에 성공하면 '0'을 리턴        
        에러가 발생하면 '-1'을 리턴
  • sem_post
        int sem_post(sem_t *sem);        
        semapore 참조값 증가.        
        성공하면 '0'을 리턴        
        에러가 발생하면 '-1'을 리턴
  • sem_wait
        int sem_wait(sem_t *sem);        
        semapore 참조값 감소.        
        성공하면 '0'을 리턴        
        에러가 발생하면 '-1'을 리턴
  • sem_unlink
#include <semaphore.h>                
int sem_unlink(const char *name);                
ex) sem_unlink("fork");                

설명
sem_unlink()는 name이라는 이름의 세마포어를 제거한다.
만약 name이라는 이름을 가진 세마포어가 어떤 프로세스에 의해 참조 되고 있다면, sem_unlink()는 해당 세마포어에 영향을 미치지 않는다. 
만일 하나 혹은 그 이상의 프로세스가 sem_unlink()가 호출 되었을 때, 해당 세마포어를 열고 있다면, 
모든 참조되고 있는 세마포어가 sem_close(), _exit(), 혹은 exec.에 의해 종료될 때까지, 세마포어 제거는 연기된다.
재생성 혹은 재연결을 하기 위한 sem_open() 호출은 sem_unlink()을 호출한 후에 새로운 세마포어에 대하여 참조를 한다.
반환 값:
성공 시 '0', 실패 시 '-1' 리턴

philo_three

  • sys/type.h
  • unistd.h
  • fork
  • sys/type.h
  • signal.h
  • kill
  • sys/type.h
  • sys/wait.h
  • waitpid
  • stdlib.h

-exit

  • semapore.h
  • sem_open
  • sem_close
  • sem_post
  • sem_wait
  • sem_unlink


    philo_one
    가장 보편적인 알고리즘!
    첫번째 철학자가 오른쪽 포크를 먼저 집어든다!
    나머지 철학자는 무조건 왼쪽 포크를 집어든다!
    식사가 끝난 철학자는 무조건 오른쪽 포크부터 내려놓는다!
    이러면 deadlock에 빠지지 않고 계속 먹을  있다. 다만 시간에 따라 철학자가 사망하는건 어쩔  없는 일!

    philo_two, three
    포크에 값을 정한다. 0,1,2,3,4, ... n
    첫번째 철학자는 0번과 n번을 집는다.
    나머지 철학자는 무조건  다음 남아있는 높은 값의 포크를 집는다.
    식사가 끝난 철학자는 포크를 하나씩 내려놓는다!

    philo_two

    one : mutex_lock
    two : sem_wait

    one : mutex_unlock
    two : sem_post

    one : mutex_destroy
    two : sem_unlink

    one : mutex_init
    two : sem_open
    usleep -> 함수 자체에 딜레이있음.   
    while( 목표시간 < 현재시간 )        
    usleep(100)   
    와 같은 방식으로 딜레이를 없앨 수 있다.

'Code 42 > Philosophers' 카테고리의 다른 글

42 Philosophers(철학자 문제) 필수지식 정리 - 1  (0) 2021.05.01
Philosophers 해석  (0) 2021.02.09
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
// custom