임계영역의 하드웨어적 지원 불가분명령어 Test and Set에 대해서 질문좀요.

inviolable의 이미지


 
 Boolean Test_and_Set(Boolean *target)
 
 {
     Boolean rv = *target;
 
     *target = true;//target값을 항상 true로 설정함으로써 다른 프로세스가 lock 변수를 false로 변경하기 전까지는 while문을 계속 돌게 한다(아래 코드참조)
      return rv;
 
  }
 
 
  do{
          while(Test_and_Set(&lock));
 
 
 
          critical_section;  <- 임계영역에 들어간 다른 프로세스가 나오면서 락을 풀어주면 다른 프로세스가 여기 들어가면서 락 잠그는 거 맞나요???(이게 질문의 요지) 교수님이 설명해 주신 거보니까 락을 잠근다는 건 안 설명하신 것 같아서요... 생각하면서 공부하라시던데... 임계영역에 들어간 후에 바로 락 잠그는 것 맞죠???
 
 
           lock = false;(락 해제)
           기타작업;
        }while(true);
 
jick의 이미지

조금만(??) 생각해 보시면 "critical section에 들어가서 락을 잠근다"라는 게 전혀 말이 안되는 행동임을 아실 수 있습니다.

"Critical section에 들어가기"와 "락을 잠그기"는 동일한 행동이어야만 합니다. 둘이 서로 다른 별개의 행동이면 안됩니다.

inviolable의 이미지

그렇게 생각할 수도 있겠군요.
헌데 그렇다면 마찬가지로 임계 영역에서 나갈 때도 락을 해제하는 과정이 바로 일어날 것이므로 굳이 코드에 적을 필요는 없지 않나요??
근데 lock = false 이렇게 락을 해제하는 과정은 적혀 있는데 그럼 락을 설정하는 과정도 적어야되는 것 아닌지 궁금합니다.

밑에 분께서 코드가 Test_and_Set에 대한 코드가 아닌 것 같다고 하셨는데 저는 교수님이 칠판에 적은 걸 그대로 적은 것이고 지금 운영체제에 대해 배우는 것이기 때문에(6장 임계영역에 대한 내용...) 맞는지 아닌지를 판별할 능력은 없습니다...

jick의 이미지

test&set = acquire lock = ciritical section에 진입
"lock = false" = release lock = critical section에서 빠져나옴

Quiz: test&set을 atomic operation이 아닌 일반 명령어로 if (lock == false) { lock = true; ... } 이렇게 쓴다면 어떤 일이 일어날까요?

inviolable의 이미지

제 생각은... 저건 c언어로 예를 든 것 뿐이고(대학생 수준에 맞게 쉽게 설명하시려고) 실제로는 다르겠지요.

교수님께 여쭤보니...(마침 오늘 강의가 있던 날이어서요...) test_and_set함수에서 락을 잠근다고 하네요. 그래서 일단 알겠습니다 하고 그 함수를 다시 봤더니 인수를 &lock으로 받고, 그 lock인수 값을 true로 바꾸더군요. 이게 lock = true(락 잠금)과 같은 것이 되었던 것이었습니다.

아무튼 관심과 답변 정말 감사드립니다. ^^ 도움 많이 되었습니다~.

sohn9086의 이미지

글 제목이랑 본문이 매치가 되지 않는데 하드웨어적인 Test and set명령어에 대해서
공부하고 싶은건지 멀티프로세스 환경에서 어떻게 소프트웨어로 락을 구현하는지 알고싶은건지 잘 모르겠네요.

하드웨어적인 명령이라면 intel의 경우 compare and exchange명령(cmpxchg)에 대해서 살펴보시면 되겠네요.

http://download.intel.com/products/processor/manual/325462.pdf (chapter 8 혹은 cmpxchg로 검색)
http://web.cs.du.edu/~dconnors/courses/comp3361/notes/lock.pdf

아, 그리고 본문에 적으신 Test_and_Set은 Test and set이 아니라 trylock같네요.
Test and set을 하기위해서는 적어도 test하고싶은 조건과 set하고싶은 값을
파라메터로 넘겨주어야하지 않을까요? GCC의 인라인 함수에 Test and Set같은게 있으니 참고가 될 겁니다.

__sync_bool_compare_and_swap, __sync_val_compare_and_swap

http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html

GCC소스 다운받아서 보시면 알겠지만, intel플랫폼의 경우에는 내부적으로 결국 cmpxchg명령을 이용합니다.
(8086은요? <- 이런 태클 걸기없기)

생산적인 댓글을 달자

inviolable의 이미지

글쎄요... 저는 교수님이 칠판에 적은 걸 그대로 옮겨 쓴 것밖엔 없습니다... Test_and_Set함수와 Swap함수 두개를 설명하셨죠. 임계영역에 대한 하드웨어적 지원이라고요...

틀린 거라면 교수님이 대체 뭘 설명하려 하신 걸까요???

sohn9086의 이미지

음... 위 코드대로라면

     Boolean rv = *target;
 
     *target = true;

이 부분이 critical section이 아니라서 제대로 락이 걸리지 않을것 같으니까
아마도 하드웨어적인 test and set명령을 이용해서 Test_and_Set()내부를 구현하라는 뜻이 아닌가 싶은데요.

생산적인 댓글을 달자

inviolable의 이미지

그 부분이 락을 잠그는 부분인데 기초적인 코드를 분석을 못하는 실수를 해버렸네요...;;;

뭐 원래 c언어로 구현될 수는 없는 부분일 수 있지만 이해하기 쉽도록 c언어로 설명하신 듯 합니다(사실 어셈블리언어를 아직 모릅니다...).

bushi의 이미지

'mutex 를 사용해서 multi-thread 상황의 임계영역을 보호한다' 정도의 생각으로 교수님의 강의를 재단하시는 것 같은데요,
교수님께선 바로 그 mutex 를 만드는 방법에 대한 언급을 하신 듯 합니다.

교수님이 언급하신 '임계영역' 이 과연 어디 있는 무엇을 지적하신 것이길래 '하드웨어적 지원'이라는 말이 따라 붙었는지 다시 생각해보세요.

본문에 적혀 있는 Test_and_Set() 은 개념 설명을 위한 의사코드라 보시면 됩니다.
cmpxchg(compare and exchange) 를 CPU 가 지원한다면 좋겠지만,
그렇지 않고 swap 만 지원한다면 그걸 이용해서 Test_and_Set() 을 만들 수도 있으며,
swap instruction 을 이용하는 경우에 그 *개념*은 본문에 적으신 Test_and_Set() 과 같습니다.

inviolable의 이미지

답변 감사합니다... 좋은 하루 되세요~~.^^

댓글 달기

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