글을 시작하기에 앞서 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