메모리 동기화에서 다중읽기 방법

thisnome의 이미지

쓰레드 혹은 프로세스들이 자료구조(트리, 해쉬등)로 저장된 데이터를 서로 공유(쓰고, 읽는) 하려고 합니다.

쓰기 보다는 읽기가 더욱 빈번하게 일어나기 때문에 데이터 테이블에 접근할때마다 락을 걸어주자니 아쉽다는 생각을 떨칠수가 없네요. :D

읽을때는 여러놈이 동시에 읽기 가능하고, 쓰기동작은 혼자서만 공유데이터에 접근하도록 할 수 있는 방법은 없을까요?

bear의 이미지

쓸때만 자료구조(트리, 해쉬등)에 락을 걸어주면 될듯 한데요...

쓸때는 물론 읽는것도 안되야 겠죠..^^;;

쓸때 읽으면 잘못된 데이터를 읽을수도 있으니까요..

어차피 뮤텍스 같은 방법을 사용하여 제어 해야 할것 같습니다.

굳이 뮤텍스만은 아닙니다..^^

thisnome의 이미지

bear wrote:
쓸때만 자료구조(트리, 해쉬등)에 락을 걸어주면 될듯 한데요...

쓸때는 물론 읽는것도 안되야 겠죠..^^;;

쓸때 읽으면 잘못된 데이터를 읽을수도 있으니까요..

어차피 뮤텍스 같은 방법을 사용하여 제어 해야 할것 같습니다.

굳이 뮤텍스만은 아닙니다..^^

목표는 말씀하신데로 쓸때만 자료구조에 락을 거는 겁니다.
그런데 그렇게 하면, 두개 이상의 쓰레드나 프로세스가 동시에 쓰는것은 막아주지만, 다른놈이 읽고 있을때 쓰려는 놈이 접근하면 그걸 제지할 방법이 없는것 같아 난감합니다.

bear의 이미지

그러면 공유 메모리를 쓰는것은 어떨까 합니다.

읽는 스레드나 프로세스를 카운트 하는겁니다.

그렇게 해서 0일때만 쓰기를 하는것입니다.

0일때 락을 발생 시키고 쓰면 될것 같습니다.

그러니까 쓸려고 하는 녀석이 발생을 하면 우선 다른 녀석들이 읽지를 못하도록 공유 메모리 변수를 두어 그 변수를 1로 셋해주고 공유메모리의 카운트 값이 0일 될때 까지 기다렸다가 쓰고 나서
다시 다른 공유메모리의 변수를 0으로 셋 하게 되면 다른 스레드나 프로세서 들이 읽을수 있도록 하는 것입니다.

그러니까 정리하면..^^;;;

공유메모리로 2개의 변수를 두어 제어 하는 거죠..

하나는 읽는 스레드나 프로세서의 갯수를 저장하는 변수와 하나는 쓰고 있다고 알려주는 변수

2개를 가지고 제어 하면 될것 같습니다.^^;;

bugiii의 이미지

pthread_rwlock_* 을 사용하는 경우가 아닌가요?

thisnome의 이미지

켁~ bugiii 님께서 단 한줄로 찾던 답을 주셨네요.. :roll:

원래 알고나면 다 쉬운거겠죠? 감사합니다.

bear의 이미지

그럼 진작에 pthread 쓰신다고 말씀을 하셨으면..ㅠㅠ

그쪽에서 찾아 봤을텐데.ㅠㅠ

프로세스도 언급을 하셔서.ㅠㅠ

왠지 초라해진 기분이네요.ㅋㅋ

빠샤 저도 더욱 노력 해야 겠네요..^^

bugiii의 이미지

pthread_rwlockattr_* 프로세스간 rwlock 도 가능합니다.

p.s. 죄송합니다.

echo의 이미지

궁금해서 물어 봅니다.

하나 혹은 그 이상의 reader 가 pthread_rwlock_rdlock 로 the read-write lock 에 대해 read lock 을 가지고 data 를 읽고 있는 사이에, 새로운 writer 가 pthread_rwlock_wrlock 로 the read-write lock 을 얻으려 할 때, 어떤 일이 벌어 지나요?

예상 답] 모든 reader 들이 read lock 을 모두 release 한 후에야 writer 가 read-write lock 을 acquire 할 수 있다. <- 이게 맞는 건가요?

다들 자기 이야기 밖에 할 줄 모르는 세상에서,
메아리 같은 사람 하나 필요할 거 같아서...

echo의 이미지

혹 원래 질문을 하신 분께서 pthread_rwlock_* 로 만족하신다면 별 다른 이견 없습니다 :)

제가 원래 질문의 의도를 잘못 이해했었습니다. 저는 writer 가 non-blocking 이 되는 것을 원하시는 줄 알았거든요. 그런 protocol 로 있기는 해서요. 혹 관심 있으시면 여기 간략하게 적어 두겠습니다.


혹 관심 있으신 분들을 위해 레퍼런스를 달았습니다. 그리고, reference 에 나와 있는 protocol 은 'single writer - multiple readers' 의 경우입니다. 'multiple writers - multiple readers' 의 경우는 아래 protocol 에 약간의 변경을 통해 해결 할 수 있을 겁니다.

The Non-blocking Write (NBW) Protocol
Hermann Kopetz - REAL-TIME SYSTEMS: Design Principles for Distributed Embedded Applications, Kluwer Academic Publishers, 1997, Chap. 10.2.2, page 217-218.

The protocol requires a concurrency control field (CCF) and atomic access to the CCF must be guaranteed.

Initialization: 
    CCF := 0

Writer:
    start: CCF_old := CCF;
              CCF:= CCF_old +1;
              <write into data structure>
              CCF := CCF_old + 2;

Reader:
    start: CCF_begin := CCF;
              If CCF_begin == odd  // 지금 writer 가 쓰는 중!!!
               then goto start;
               <read data structure>
               CCF_end := CCF;
               If CCF_end != CCF_begin  // 내가 읽는 도중 writer 가 쓰기 시작 했음!!!
                then goto start;

다들 자기 이야기 밖에 할 줄 모르는 세상에서,
메아리 같은 사람 하나 필요할 거 같아서...

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.