세마포어 사용할려고 하는데요.

kknd345의 이미지

프로세스 10개가 동시에 공유메모리를 이용하는 프로그래밍을 하고 있는데요.

여기서 10개의 프로세스가 하나의 세마포어(단일)만을 가지고 프로그래밍 할려고 하니 버벅 될거 같아서 세마포어 배열을 이용할려고 하는데 혹시 잘 아시는 분 계시나요?

제 코드에서 세마포어 부분만 뽑아서 아래에 올려 놓았는데... 레퍼런스만 보고 프로그래밍 하기가 어렵네요.(영어바보라서 ㅜㅜ) 한글로 된 책은 하나의 세마포어 사용에 국한 되어 있어서 이용하기 어렵고요.

// 세마포어 배열시 첫번째 세마포어의 위치
#define SEM_USER 0
#define SEM_WEAPON 10
#define SEM_MESSAGE 60  // 개인당 메시지 이므로 10개만 있으면 됨.
#define SEM_CNT_USER 70


... 중략.....


    // 세마 포어 지정을 위한 구조체
    // sem_open.sem_num = 자신이원하는 세마포어 ;
    struct sembuf sem_open = { 0, -1, SEM_UNDO}; // 세마포어 얻기
    struct sembuf sem_close = { 0, 1, SEM_UNDO}; // 세마포어 돌려주기


//======================//
//  세마포어 설정 & 초기화   //
//=====================//

    semid = semget ( (key_t)200424398,  SEM_CNT , 0666 | IPC_CREAT );
    if( semid == -1 ){
        fprintf(stderr,"shmget failed\n");
        exit(EXIT_FAILURE);
    }

//===========================//
... 중략 ....

//===========================//
    // 세마포어 세팅
    sem_open.sem_num = SEM_CNT_USER;
    if(semop(semid, &sem_open, 1) == -1) {
        perror("semop error ");
        exit(0);
    }

    ////
    tmp_cnt_user = shared_stuff->cnt_user;
    ////

    // 세마포어 해제
    sem_close.sem_num = SEM_CNT_USER;
    if(semop(semid, &sem_close, 1) == -1) {
        perror("semop error ");
        exit(0);
    }

잘못 된 점 지적좀 해주세요 ㅜㅜ..

아무리 생각해도 제가
semop 함수 같은걸 잘못 쓰고 있는거 같은데...

자세히 좀 설명해 주세요

부탁드립니다.

kdoll의 이미지

락 설계시 락이 어떤 용도인가 중요할것입니다.

10개의 프로세스가 완전 exclusive로 접근하느냐 아니면 전혀 다른

형태로 접근하느냐에 따라 세마포어의 사용이 다르지요.

님의 경우 거친형태의 exclusive락이네요.

만일 단순한하고 적은 공유메모리 처리라면 지금형태의 세마포어도 충분히 빠른 속도를 보장해 줄 수 있습니다.

님이 작성하신 부분은 세마포어를 얻고 어떤 한 값을 공유메모리로

부터 가지고 오는것 같습니다면 그 이상 세마포어를 처리 할 필요가 없을듯 싶습니다.
(물론 가지고 오는 값이 설마 10M짜리 구조체는 아니겠죠?)

wfellow의 이미지

Quote:
... 여기서 10개의 프로세스가 하나의 세마포어(단일)만을 가지고 프로그래밍 할려고 하니 버벅 될거 같아서 ...

이 부분은 저의 경험에 의하여 말씀을 드려야 겠네요. SUN SPARC(500MHz*2)에서 하나의 shm을 한개의 semaphore를 사용하여 처리를 했었습니다. 한개의 프로세스(생산자)가 생성해 놓은 약 100KB미만의 자료를 20~50개의 동시 사용자(프로세스)가 초당 20회를 조금 밑도는 정도의 속도로 read를 했었습니다. X86은 Linux(933MHz*1)쯤이 비슷한 성능이었구요.

위의 코드를 보니 적절히 잘 코딩을 하신 것으로 보입니다만 조금 아쉬운 것은 세마포어의 초기화나 에러 반환값에 대한 처리가 없는것 정도 입니다. 최초의 세마포어 생성시, 생산자나 소비자를 구분할 수 있다해도 semget에서의 semflg에 IPC_EXCL을 BITOR하셔서 반환값이 EEXIST인지를 확인하시면서 동시에 EACCESS를 확인하셔야 할 것 같습니다. (EEXIST인경우에는 semflg를 0으로 설정 하셔서 다시 semget을 호출하심 되겠지요. IPC_EXCL이 있으니 정상적으로 semid를 받았다면 최초의 생성이므로 semctl()을 사용하셔서 초기화를 하시면 되겠네요.)

    // 세마포어 세팅 
    sem_open.sem_num = SEM_CNT_USER; 
    if(semop(semid, &sem_open, 1) == -1) { 
        perror("semop error "); 
        exit(0); 
    }

POSIX의 sem_wait()처럼 SystemV용으로 만드셨군요.^^ .
여기에도 블랙홀이 하나 보입니다. 반환값이 -1일 경우의 errno중에, 전부는 반영을 하지 않더라도 EINVAL과 EIDRM은 구현을 하셔야 합니다. 그런 경우에는 semget을 다시 실행하여 새로운 semid를 생성후, 다시 semop를 해야 하지요. 게다가 EINTR은?....

    // 세마포어 해제 
    sem_close.sem_num = SEM_CNT_USER; 
    if(semop(semid, &sem_close, 1) == -1) { 
        perror("semop error "); 
        exit(0); 
    }

이 부분도 걸리지만 위의 P()부분이 해결되면 별로 신경쓸것은 없어 보입니다.

Quote:
레퍼런스만 보고 프로그래밍 하기가 어렵네요.(영어바보라서 ㅜㅜ)

그래도 man 해봐야 합니다. 계속 한글만 찾다보면 코더(coder)밖에 안됩니다.

-----[꼬릿말 절취선 시작]-----
삽질전에 먼저 구글신께 기도하자.
-----[꼬릿말 절취선 끝]-----

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.