이런 프로그래밍이 C로 가능한가요?

thisrule의 이미지

공유메모리를 사용하고 있는 두개의 프로세스 proc1과 proc2가 있습니다.
공유메모리의 한 바이트를 플래그 개념으로 사용하여 이 플래그가 ON되어
있으면 proc1은 블럭되게 하고 싶습니다.
즉 proc1이 run중에 위의 플래그를 조사하고 그 플래그가 ON되어 있으면
블럭되는겁니다. 위의 플래그는 proc2에서 ON/OFF합니다.

공유메모리를 사용하는건 문제가 없으나 블럭되게 하는게 힘듭니다.
우선 세마포어를 사용했는데 그 다음이 방안이 따오르지 않습니다.

mastercho의 이미지

조건 변수 쓰면 됩니다

pthread_cond_t 이거와 관련된 자료를 찾아보세요

지금 --; 일이 있어서......

자료를 못올리고요

시간 나면 올리도록 하겠습니다

단 프로세스간에..는 잘 모르겠네요 --;
[방법이 있을텐데 ...음]

승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스

세벌의 이미지

Unix System Programming
The C Programming Language 2nd Edition.

그쪽은 다루어보진 않았지만 위의 책에서 관련된 내용을 본 것같아서.

crimsoncream의 이미지

전형적인 세마포어 case 인 것 같은데요.
따로 flag를 두실 필요없이 공유메모리 사용하는 부분을 critical section으로 생각하시고 세마포어 적용하시면 될 것 갈은데요.
세마포어를 사용하셨다니까 따로 질문을 안하셔도 될 것 같은데 :)

혹시 flag를 두어 직접 세마포어를 구현하셨다는 뜻이라면 그것보다는 atomic function인 아랫 것들을 쓰시는게 좋을 것 같습니다.

man semget
man semctl
man semop

를 보시면 될 것 같습니다

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

shs0917의 이미지

세마포어값이 1이면 거기에 하나의 프로세스가 접근을 해서 값을 -1해서 0을
만들어 주고.. 그럼 다른 프로세스가 접근을 못하고 대기하는 그런거라고
아는데요.. 그렇다면 어떤 프로세스가 처리를 하고 있는 동안 동시에 다수의
프로세스가 접근대기 상태에 있다면 과연 어떤 프로세스 부터 접근을 하게
될런지.. 혹시 이게 원자단위의 경쟁조건 같은 그런거랑 관계가 있는건가요?
궁금하네요..

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

mach의 이미지

shs0917 wrote:
세마포어값이 1이면 거기에 하나의 프로세스가 접근을 해서 값을 -1해서 0을
만들어 주고.. 그럼 다른 프로세스가 접근을 못하고 대기하는 그런거라고
아는데요.. 그렇다면 어떤 프로세스가 처리를 하고 있는 동안 동시에 다수의
프로세스가 접근대기 상태에 있다면 과연 어떤 프로세스 부터 접근을 하게
될런지.. 혹시 이게 원자단위의 경쟁조건 같은 그런거랑 관계가 있는건가요?
궁금하네요..

그것은 아무도 모릅니다. 며느리도 모르지요.
어떤 프로세스가 해당 자원을 가지게 될지는 정해지지 않습니다.
커널은 기본적으로 경쟁조건을 가지는 모든 프로세스에게 시그널을
보내게 되어 있습니다. 모든 프로세스가 접근하려 할것이고, 이 중
어느 프로세스가 그 자원을 먼저 선점하게 되면 나머지 프로세스들은
다시 잠이나 자러가야겠지요.
원자성은 다음과 같은 사례를 들어 설명할 수 있습니다.
1: if ( flag == 1)
2: flag = 0;

1라인에서 비교(test)하고 2라인에서 0으로 바꿉니다(set).
"소위 tes-and-set인데 이 연산이 수행중일때는
컨텍스트 스위치가 일어나서는 절대로 안된다."라는 것입니다.
예를들어, A라는 프로세스가 값을 비교하여 1임을 알았는데, 세팅하기전에(lock)
B라는 프로세스로 스케쥴이 바뀌면, B라는 프로세스는 비교하고 세팅도하고
다시 A라는 프로세스로 스케쥴이 왔다면, A는 이미 0으로 바뀐상황을 모르며,
flag값을 다시 0으로 세팅하고는 해당 리소스를 사용하러 가겠지요.
소위 A,B둘이 들어가게 되어서 mutual exclusion이 깨진거지요.
동기화가 깨지는 현상이 벌어집니다.
따라서, test-and-set은 하나의 명령어(또는, 다수개의 명령이어도 atomic한 연산을 지원하도록)로 만들어 져야합니다. 이는
하드웨어가 지원해야하는 것입니다. 소프트웨어만으로는 불가능합니다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

shs0917의 이미지

사실 저도 요즘 이런 동기화 문제로 머리가 좀 아픈 상황이였거던요..
테스트 해보구 별 문제없이 작동한다면 그냥 구현해야 겠네요...
lock만 제대로 해준다면 큰 문제 없을듯.. 다수의 프로세스중 어느놈이 먼저
접근을 하던 그건 그리 큰 문제가 아니기 때문에..
그럼 다들 수고 하세요

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

댓글 달기

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