sleep()함수의 원리에 관하여

pjs0919의 이미지

보통 마이컴이나 ucos에서 sleep()함수의 원리를 보면..
tick값변경할때마다 원하는 대기시간을 감소시켜서 0이 될때까지 계속 루프를 돌게끔 구현되어 있는데요...

하지만 PC의 OS상에서는 sleep()함수나 세마포어, 뮤텍스락을 잡는 과정에서는 cpu점유율을보면 연산처리자원을 사용하지 않게끔되어 있습니다.

OS상에서 lock과 sleep함수처리과정이 무엇이 다른지 알수있을까요?

rgbi3307의 이미지

운영체제에서 기본적인 것이지만 아주 중요한 개념을 질문하신듯 하네요.
일단 lock과 sleep의 기본개념을 정리해둘 필요가 있습니다.
lock은 커널의 동기화(synchronization)에서 공유자원에 동시 접근한는 것을 막는 개념이고,
sleep은 커널의 프로세스 스케쥴링에 관련되는 개념입니다.
lock은 아키텍쳐에 의존적이고 대부분 어셈블리로 구현되어 있습니다.
아키텍쳐에서 데이터 버스 lock을 지원하는 경우도 있고,
spin-lock과 같이 CPU 클럭을 소모하면서 busy-waiting 하는 경우도 있습니다.
lock은 CPU가 클럭을 소비하면서 대기하고 있는 특징이 있습니다.
이것과 반대로 sleep은 busy-waiting 하지 않고,
현재 CPU에서 실행하고 있었던 IP(Program Counter), 각종 레지스터값 및 스택등의 정보를
메모리에 보관시킵니다.(context switching)
즉, 현재 CPU에서 실행되고 있는 프로세스를 메모리로 sleep 시키는 것인데,
이렇게 하면 CPU는 다른 일을 할 수가 있어 다중 프로세싱이 가능한 것이구요.
sleep하는 시간 및 관리는 커널안의 타이머 인터럽트와 프로세스 스케쥴러가 합니다.
sleep은 context switching으로 인해서 CPU에게 부하를 줄 수 있는 단점이 있어서,
인터럽트에서는 사용하지 않는 특징이 있습니다.

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

pjs0919의 이미지

답변감사합니다.

그렇다면 클럭을 소모하지 않는 이유가.. 위에서 말씀하신 내용대로
어셈블리 명령어로 데이터버스 lock을 잡는 경우와 타임머 인터럽트, 프로세스는 스케쥴링에 따라 처리되므로

자원소모없이 대기할수있다는 뜻인가요?

\(´∇`)ノ.大韓兒 朴鐘緖人

rgbi3307의 이미지

네 그런 셈입니다.
"자원소모없이 대기한다"라고 표현하신것은 결국,
"특정 프로세스 하나가 CPU 클럭을 계속 잡고 busy-waiting 하지 않는다." 라고 이해하시면 될듯 합니다.

처음 질문글에서 "마이컴"이라는 말씀을 하셨는데,
마이컴은 보통 8비트 Micro Controller Unit 환경(아키텍쳐)에서
1개의 CPU와 1개의 프로세스로 동작하는 경우가 대부분입니다.
이런 환경에서는 복잡한 운영체제 개념을 도입하지 않아도 됩니다.
또한, lock이나 sleep개념도 구분없이
그냥 for 루프를 돌린다든지 타이머 1개를 돌린다든지 해서 간단하게 구현하는 것이 더 효율적입니다.

제가 지금까지 말씀드린 것은 리눅스 커널과 같은 운영체제가
1개 이상의 CPU(SMP환경)에서 다중 프로세싱을 할때 의미가 있는 것입니다.
이런 환경에서는 lock을 통하여 동기화도 해야 하고,
sleep을 사용하여 프로세스 스케쥴링도 해서
시스템 전체 성능을 높이고자 하는데 의미가 있는 것이구요.

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

wariua의 이미지

rgbi3307님이 충분히 답변을 해주신 것 같지만 "세마포어처럼 sleep 가능한 락킹이나 sleep 기능을 범용 OS에서 구현하는 방식"에 초점을 맞춰서 써보자면...

프로세스가 sleep()을 호출하면 그에 대응하는 시스템 호출이 이뤄집니다. 커널 모드로 진입해서 그 시스템 호출 핸들러를 실행합니다.

핸들러에서는 타이머용 대기 큐에 그 프로세스를 집어넣습니다. 넣어 두면서 "이 프로세스는 몇 초 후에 깨워야 됨" 표시도 해둡니다.

실행하던 프로세스를 대기 큐에 넣어버렸으니 할 일이 없어졌습니다. 그러면 스케줄러를 실행합니다. 다른 프로세스를 실행하고, 실행할 프로세스가 없으면 그냥 놉니다 (즉, idle 태스크를 실행합니다).

한편 시스템에서는 주기적으로 타이머 인터럽트가 발생합니다. 초당 100회이건 1000회이건 하드웨어 클럭에서 인터럽트를 발생시키고, 그러면 그 때마다 운영체제의 인터럽트 핸들러를 실행합니다.

타이머 인터럽트 핸들러에서 수행하는 작업들 중 하나가 타이머 대기 큐를 확인하는 것입니다. 충분한 시간이 지나서 큐의 맨 앞에 있는 프로세스를 깨워야 할 시점이 됐다면 그 프로세스를 깨웁니다. (즉, 대기 큐에서 준비 큐로 옮깁니다.) 인터럽트 핸들러 실행이 끝난 직후 다시 스케줄러를 실행하고, 그 때 (우선순위 높은 다른 프로세스가 없다면) 방금 준비 큐에 넣은 프로세스를 실행합니다.

여기까지가 기본 구조입니다. sleep 하는 프로세스 말고 다른 프로세스들은 무시한다면, sleep으로 대기하는 동안의 CPU 활동은 주기적인 타이머 인터럽트 핸들러 실행이 전부입니다. 거기에 쓰이는 CPU 시간은 충분히 작기에 CPU 점유율 통계에는 잡히지 않습니다.

세마포어 같은 sleep 가능한 락의 경우도 유사합니다. 타이머 대기 큐 대신 세마포어에 딸린 대기 큐에 프로세스를 집어넣으며, 타이머 인터럽트 핸들러에서 프로세스를 깨우는 것이 아니라 다른 프로세스가 세마포어를 up 할 때의 시스템 호출 핸들러에서 프로세스를 깨운다는 정도의 차이입니다.

실제 운영체제 구현에서는 몇 가지 변형이 추가되기도 하지만 일단 기본 구조는 이렇습니다.

$PWD `date`

댓글 달기

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