메뉴 건너뛰기

(*.106.188.101) 조회 수 527 추천 수 0 댓글 0
Atachment
첨부 '5'
Extra Form

Semaphore(세마포어) 개념

- 프로세스간 메세지 전송을 하거나, 혹은 Shared Memory(공유메모리)를 통해서 특정 data를 공유하게 될경우

   발생하는 문제는, 공유된 자원에 여러개의 프로세스가 동시에 접근을 하면서 발생한다. 

   단지 한번에 하나의 프로세스만 접근 가능하도록 만들어 줘야 하고,

   이때 세마포어를 쓴다.

- 쓰레드에서는 뮤텍스, 프로세스에서는 세마포어

- 교착상태

1.jpg

A 프로세스가 k 에 접근하고 나오면 k = 2 라는 값을 예상할수 있다.

   A 프로세스가 k 에 접근했을때, B 프로세스가 k 에 접근을 하고 일을 하고 나오면, k = 2 가 되고,

   A 프로세스가 그후로 일을 하면 k = 3 이 된다.

   즉, 예상한 값을 얻을수 없다.

   이를 방지 하기 위해,

   A 프로세스가 접근 했을때 다른 프로세스의 접근을 막고,

   끝난후 접근을 풀어 준다.

   이를 세마포어로 접근을 막고 접근을 허용 할수 있다.

- 차단을 원하는 자원에 대해서 semaphore를 생성하면 해당자원을 가리키는

   semaphore 값이 할당 된다.

   이 값이 0 이면 해당자원에 접근할수 없고,

              0 보다 크면 해당자원에 접근할수 있다.

2.jpg

-  그러므로, 자원에 접근하기 전에 semaphore 값을 검사해서

   값이 0이면 자원을 사용할수 있을때까지 기다리고,

   0보다 더 크면 자원에 접근해서 semaphore 값을 0 으로 감소 시켜서,

   다른 프로세스가 자원에 접근 할수 없도록 하고,

   자원의 사용이 끝나면 다시 semaphore 값을 증가 시켜 다른프로세스가 사용할수 있게 해준다.

4.jpg


--- 실전 예제 ---
 
pthread 가 들어있는 파일 컴파일시!
gcc -lpthread 파일명.c 하면 된다.
 
직접 구현해보고자 해서 이것저것 검색하다가 쉬운 예제가 나왔다.
이 에제를 따라하면서 이해하면 위에서 공부한 이론이 한방에 이해갈 것이다.
퍼온 소스에 주석만 좀 자세히 달아보았다.
 
= 초기화 함수
int sem_init(sem_t *sem, int pshared, unsigned int value);
 
= 세마포어 값 감소 함수
int sem_wait(sem_t *sem);
 
= 세마포어 값 감소 함수인데 넌 블로킹이라서 0에서 대기하지 않고 바로 EAGAIN(error의 일종) 를 리턴
int sem_trywait(sem_t *sem);
 
= 세마포어 값 증가 함수
int sem_post(sem_t *sem);
 
= sval 이 가리키는 위치에 sem 세마포어의 현재값을 저장
int sem_getvalue(sem_t *sem, int *sval);
 
= 세마포어 객체 삭제(할당된 자원 해제)
int sem_destroy(sem_t *sem);
 
----------------- 반환값 -----------------------
sem_wait와 sem_getvalue 는 항상 0을 반환
다른 모든 세마포어 함수들은 성공시 0, 실패시 -1 반환
실패 반환시 errno변수에 해당 에러코드를 기록!
 
----------------- 에러 ------------------------
sem_init 함수 에러시 errno 변수에 설정된다.
             EINVAL : value는 카운터의 최대값인 SEM_VALUE_MAX 값보다 크다
             ENOSYS : pshared 값이 0이 아니다.
 
sem_trywait 함수 에러시 errno 변수에 설정된다.
             EAGAIN : 현재 세마포어의 카운터 값이 0이다.
 
sem_post 함수 에러시 errno 변수에 설정된다.
             ERANGE : 증가 후 세마포어의 값이 SEM_VALUE_MAX 값보다 커진다.
 
sem_destroy 함수 에러시 errno 변수에 설정된다.
            다른 쓰레드가현재 해당 세마포어를 기다리는 중이다. 
 
--- Source Code ---

#include <stdio.h></stdio.h>
#include <pthread.h></pthread.h>
#include <semaphore.h></semaphore.h>
#include <unistd.h></unistd.h>
#include <stdlib.h></stdlib.h>

void Error(const char *mes);
int number = 0; //일반출력변수
sem_t bin_sem;  //세마포어 생성
void *sem_snd(void *arg);
void *sem_rev(void *arg);

int main() {
        int state = 0;
        pthread_t t1,t2,t3; //3개의 스레드 선언
        char thread1[] = "Thread_A";
        char thread2[] = "Thread_B";
        char thread3[] = "Thread_C";
        void * result_t = NULL;
        /*
         * sem_init(sem_t *sem, int pshared, unsigned int value);
         *
         * sem가 가리키는 세마포어 객체를 초기화 한다.
         * 아래 초기화문에서는 세번째 인자 1로 객체가 초기화 되며 두번째 인자 0은
         * 세마포어가 현재 프로세스에서만 사용될지(현재 프로세스에서만 사용 = 0)
         * 아니면 여러 프로세스간에 공유될지 지정한다.
         * LinuxThreads는 세마포어가 여러 프로세스 간에 공유되는 것을 지원하지 않기때문에
         * 두번째 인자가 0이 아닐 경우 sem_init 는 항상 ENOSYS 에러코드를 반환한다.
         */
        state = sem_init(&bin_sem,0,0);           //최초 으로 세팅
        if(state != 0)  Error("sem_init Error\n");
        pthread_create(&t1,NULL,sem_snd,thread1); //쓰레드 1 생성 (sam_snd 호출)
        pthread_create(&t2,NULL,sem_rev,thread2); //쓰레드 2 생성 (sam_rev 호출)
        pthread_create(&t3,NULL,sem_rev,thread3); //스레드 3 생성 (sam_rev 호출)
        pthread_join(t1,&result_t); //쓰레드가 종료되기를 기다린 후 메인 프로세스가 종료되도록
        pthread_join(t2,&result_t); //pthread_join 을 호출
        pthread_join(t3,&result_t); //그 결과는 3개의 쓰레드 동작이 모두 종료되고 메인 프로세스가 종료된다.
        printf("Finale Number : %d\n",number);
        /*
         * int sem_destroy(sem_t *sem);
         *
         * 세마포어와 이에 관련된 리소스들을 소멸시킨다.
         */
        sem_destroy(&bin_sem);
        return 0;
}

void *sem_snd(void *arg) {
        int i = 0;
        for(i=0; i<4; i++)
        {
                while(number != 0)
                sleep(1);
                number++;
                printf("%s Running : %d\n",(char*)arg,number);
                /*
                 * int sem_post(sem_t *sem);
                 * 세마포어의 값을 하나 증가시킨다.
                 */
                sem_post(&bin_sem);
        }
}

void *sem_rev(void *arg) {
        int i = 0;
        for(i=0; i<2; i++)
        {
                /*
                 * int sem_wait(sem_t *sem);
                 *
                 * 세마포어 값을 하나 감소시킨다
                 * 값이 0인 경우에는 1 이상이 될 때까지 대기 상태에 있다가
                 * 1이상이 되면 값을 감소시키며 대기상태에서 빠져나오게 된다.
                 * 즉 세마포어는 0보다 작은 값이 될 수 없다.
                 */
                sem_wait(&bin_sem);
                number--;
                printf("%s Running : %d\n",(char*)arg,number);
        }
}

void Error(const char *mes) {
        printf("%s\n",mes);
        exit(0);
}


뮤텍스(Mutex)와 세마포어(Semaphore) 비교

사실 이 뮤텍스와 세마포어는 비슷하지만 차이가 있습니다.


뮤텍스 (Mutex)

스레드들 간에서 공유가 배제되는 객체입니다.

파일과 같은 공유 자원이 수행 중 오직 한 프로그램이나 스레이드에게만 소유되어야 할 필요가 있을 때

그 자원에 대한 뮤텍스 객체를 생성시킵니다.

뮤텍스가 비 신호 상태면 프로그램은 자원을 점유하여 사용한 후 이를 반환하고

다른 프로그램 또는 스레드가 자원을 사용중(뮤텍스가 신호 상태) 이면 대기 상태로 들어가 끝나기를 기다립니다.

뮤텍스는 여러 면에서 임계구역(Critical Section)과 비슷하고

대신 사용할 수도 있지만 이름을 가질 수 있다는 점에서 임계구역보다 우월한 점이 있습니다.


세마포어 (Semaphore)

운영 체계 또는 프로그램 작성 내에서 공유 자원에 대한 접속을 제어하기 위해 사용되는 신호입니다.

병행 내지 병렬로 동작되는 둘 이상의 프로세서 사이에서 마이크로프로세서

시간이나 입출력 접속구와 같은 공유 자원을 동시에 사용할 수 없기 때문에

한 프로세서가 사용하고 있는 동안에 세마포어를 세워서 다른 프로세서를 대기시키고

사용이 끝나면 해제시키는 방법으로 사용합니다.

 ​

​이 둘을 비교/비유해 보면,

뮤텍스 : 화장실에 들어가기 위한 열쇠

세마포어 : 빈 화장실의 열쇠 개수

 

그러니까, 뮤텍스는 화장실에 들어갈 수 있는 열쇠를 한 명만 갖고 있다면!

한 번에 열쇠를 가진 한 명만이 화장실에 들어갈 수 있고 들어간 사람이 나와야만

기다리던 다음 사람이 열쇠를 받고 화장실에 들어갈 수 있습니다.

(여기서 기다리는 사람들은 대기 큐에 있는 프로세스가 되겠다)

5.jpg

반대로 세마포어는 들어갈 수 있는 화장실의 개수가 4개이고, 열쇠가 4개가 있다고 가정하면!

한 사람이 들어갈 때마다 들어갈 수 있는 화장실과 열쇠의 수는 1개씩 감소하게 되고

남은 열쇠가 없게 되면 다른 사람은 기다려야 하는 상황이지요.

화장실에 들어갔던 사람이 사용을 마치고 나오면 화장실과 열쇠의 사용 가능한 개수는

1개가 증가하고 다음 사람이 이용할 수 있게 되는 것!

6.jpg

즉, 결론을 말하자면 뮤텍스는 값이 1인 세마포어와 같습니다.


  1. No Image

    COBOL Programming Guide - IBM Library Server

    Programming Guide - CONTENTS Table of Contents
    Date2017.03.04 Reply0 Views1445
    Read More
  2. No Image

    Middleware Tuxedo, T-Max

    턱시도(TUXEDO), Tmax(Transaction Maximization) 1. 등장 배경 턱시도(TUXEDO)는 Transaction Manager의 표준으로 X/OPEN, OSF 등의 표준화 근간을 제공하였고, 현존하는 대부분의 TP Monitor들이 턱시도를 기반으로 개발되었다. Tmax는 Transaction Maximiza...
    Date2017.02.28 Reply0 Views476
    Read More
  3. 프로시져, 객체지향

    1. 객체가뭔지? (가지고있는 속성 2.이벤트 기반의 프로그래밍이란? 3. 콘솔 프로그램과 Window 프로그앰의차이 4. 변수선언방법 의견1나도 궁금해요 신고 답변 1개 옵션 니바리님의 답변초인채택답변수905 활동분야베이직 펼치기 질문자 채택 질문자인사답변...
    Date2017.02.27 Reply0 Views453
    Read More
  4. No Image

    VTS(Virtual Tape Server), VTL(Virtual Tape Library)

    가상 테이프 라이브러리(VTL, Virtual Tape Library)란 데이터의 백업 및 복구를 위해 가상화 기술을 이용함으로써 디스크를 마치 테이프처럼 인식하여 데이터를 저장하는 시스템이다. 파일 단위로 데이터를 복구할 수 있고, 보유한 서버 수만큼 디스크를 분할...
    Date2017.02.27 Reply0 Views3722
    Read More
  5. JDK 설치 및 설정 (환경변수 설정)

          JDK 다운로드       ▲ 자바 프로그래밍을 하기 위해서 먼저 오라클 홈페이지에서 제공하는 자바 개발 툴을 설치해야 합니다. http://www.oracle.com 으로 접속한 뒤 Downloads > Java for Developers 메뉴를 선택합니다.         ▲ 2015년 1월 1일 현재...
    Date2016.05.27 Reply0 Views393 file
    Read More
  6. 알고 보면 쉬운 랜섬웨어 예방법 6가지

    개인과 기업을 막론하고 2016년 최대 보안 위협으로 자리 잡은 랜섬웨어. 2년 전만 해도 한국은 랜섬웨어 공격에 비교적 자유로운 편이었으나, 2015년 4월경 국내에 상륙한 이후 신종과 변종을 거듭하며 광범위하고 무차별적으로 우리를 공격하고 있다. 랜섬...
    Date2016.05.27 Reply0 Views401 file
    Read More
  7. No Image

    소스포지(SourceForge.net)

    이 문서는 웹사이트에 관한 것입니다. 소프트웨어에 대해서는 소스포지 엔터프라이즈 에디션 문서를 참조하십시오. SourceForge.net주소http://sourceforge.net/영리여부예사이트 종류협력 리비전 관리, 소프트웨어 개발관리사용 언어영어소유자지크넷제작자V...
    Date2016.05.22 Reply0 Views359
    Read More
  8. No Image

    홈페이지 웹취약점 표준 점검항목

    홈페이지 웹취약점 표준 점검항목 No. 코드 점검항목 설명 조치영역 1 OC 운영체제 명령 실행 웹 서버에 존재하는 명령어 실행 가능 함수 인자를 조작하여 특정 명령어 실행이 가능한 취약점 소스코드 2 SI SQL 인젝션 입력 폼에 악의적인 쿼리문을 삽입하여 D...
    Date2016.05.19 Reply0 Views667
    Read More
  9. No Image

    취약점 점검

    취약점 진단도구로 많이 활용 되는 TOP10 사용되는 취지는 악의적인 목적으로 중국에서 개발해서 많이 사용 되나 보안담당자들은 간혹 테스트 목적으로도 사용되어진다. 절대 악의적인 목적으로 사용하는일이 없기를 바랍니다..     1.    Pangolin - 중국에서...
    Date2016.05.19 Reply0 Views513
    Read More
  10. 취약점 점검에 대해 규정하는 법률 및 국내/외 제도

    취약점 점검에 대해 규정하는 법률 및 국내/외 제도 본 포스팅의 목적은 독자가 속해있는 기업이 1) 취약점 점검을 수행해야 하는지, 혹은 2) 어떤 법/제도에 의해 취약점 점검을 수행해야 하는지, 3) 취약점 점검을 강제하는 규정이 어떤것이 있는지에 대한 ...
    Date2016.05.19 Reply0 Views436
    Read More
  11. No Image

    SW개발보안 (Secure Coding)

    SW개발보안 (Secure Coding)   1. SW 개발 보안의 필요성   "SW 개발보안"이란 SW 개발 과정에서 개발자 실수, 논리적 오류 등으로 인해 SW에 내재된 보안취약점을 최소화하는 한편, 해킹 등 보안위협에 대응할 수 있는 안전한 SW를 개발하기 위한 과정을 의미...
    Date2016.05.19 Reply0 Views354 file
    Read More
  12. 비정형데이터 암호화 의무적용으로 파일암호화 시장 들썩

    비정형데이터 암호화 의무적용으로 파일암호화 시장 들썩 로그 및 이미지와 음성 파일 등 비정형데이터도 암호화 솔루션 확대 적용해야 길민권 mkgil@dailysecu.com ...
    Date2016.04.27 Reply0 Views505 file
    Read More
  13. No Image

    WiresharkPortable_2.0.3.paf / HTTP.Analyzer.Full.Edition.v7...

    WiresharkPortable_2.0.3.paf (Win32 / Win64) HTTP Analyzer - Full Edition.v7.0.2.439
    Date2016.04.25 Reply0 Views363
    Read More
  14. Java Applet, HyperText Markup Language 란?

    자바 애플릿(Java Applet)이란? - 웹 브라이주(Web browser)에 내장된 Java 가상 머신(JVM)에 의해 실행되는 Java프로그램 [참고] 자바 어플리케이션(Java Application) -> 사이즈가 작은프로그램(applet) - 각 컴퓨터 플랫폼에서 JVM에 의해 독립적으로 실행...
    Date2016.04.23 Reply0 Views813 file
    Read More
  15. WAS. TOMCAT. EJB

    * 웹표준의 기본 레이아웃 - 기본 속성에 대한 이해(wrap, header, container, footer, clear:both) http://jlayout.blog.me/220251928646 * 웹 서버(web server), 웹 컨테이너(web container), 웹 어플리케이션 서버(web application server, WAS) 란? 웹 서...
    Date2016.04.20 Reply0 Views439 file
    Read More
  16. No Image

    편의성 무기로 백업 시장에서 떠오르는 ‘PBBA’

    편의성 무기로 백업 시장에서 떠오르는 ‘PBBA’
    Date2016.04.19 Reply0 Views412
    Read More
  17. Shared Memory 공유방법 - Semaphore / Mutex

    Semaphore(세마포어) 개념 - 프로세스간 메세지 전송을 하거나, 혹은 Shared Memory(공유메모리)를 통해서 특정 data를 공유하게 될경우    발생하는 문제는, 공유된 자원에 여러개의 프로세스가 동시에 접근을 하면서 발생한다.     단지 한번에 하나의 프로...
    Date2016.04.17 Reply0 Views527 file
    Read More
  18. No Image

    아이디·비번 방식 대안 '파이도'(FIDO) 규격 확정··· "쉽...

    아이디, 비밀번호 방식보다 더 간단하면서도 안전한 인증 표준 '파이도'(FIDO-Fast Identity Oline) 최종 규격이 9일 마침내 등장했다. 모바일 기기 제조사들이 도입 대열에 서둘러 합류할 것으로 관측된다.  Read more: http://www.ciokorea.com/news/23328#c...
    Date2016.04.05 Reply0 Views3569
    Read More
  19. No Image

    이중 인증이란? 5가지 요점

    모든 컴퓨터 전문가들이 사용자에게 주는 최선의 보안 조언 중 하나는 웹사이트에 이중 인증을 지원하도록 만들라는 것이다. 암호 유출이 너무 흔해진 요즘 이중 인증이 해커로부터 당신의 신원을 지킬 수 있는 방법이 될 수 있다. 여기 이중 인증 기술을 이해...
    Date2016.04.05 Reply0 Views368
    Read More
  20. No Image

    URL / URI

    URL과 URI가 많이 혼용되는 편이고, 생김세도 비슷하거니와 I를 L의 소문자 오타로 보고 그냥 둘다 URL이라고 생각하는 경우도 더러 있다. 그래서인지 경력직도 그냥 구분 안하고 URL이라고 하는 경우가 있는데, 그래서 그 차이를 설명함. URL은 Uniform Resou...
    Date2016.04.04 Reply0 Views380
    Read More
목록
Board Pagination Prev 1 2 3 4 5 Next
/ 5