스케줄러가 계속 실행되는 상태인가요??

zasxer의 이미지

cpu가 하나일때 스케줄러는 늘 실행 상태일 수가 없는데,
어떻게 프로세스를 중지시키고 다른 프로세스를 실행시키나요??

정확히 타임슬라이스를 어떻게 작동시키는지 궁금합니다.
코드 중간중간 타임체크를 넣을 수 있는 것두 아니구...ㅠ

익명 사용자의 이미지

하드웨어에서 지원이 됩니다. 일정 간격으로 인터럽트를 발생시키는 타이머가 있고, 인터럽트가 발생되면 cpu에서 자동으로 현재 실행중인 코드를 중단하고, 커널 코드로 넘어가는 방식입니다.
더 자세한건 "인터럽트"로 검색해 보세요.

라스코니의 이미지

윗 분 말씀대로 타이머 인터럽트가 100Hz, 200Hz 식으로 발생하고 그때마다 system call 또는 스케줄러로 넘어가서 현재 프로세스에 주어진 실행 quota가 끝났는지 체크한다음에 quota가 끝났으면 다른 프로세스에게 실행 권한을 넘겨줍니다. 그리고 다시 스케줄러는 다음 timer tick이 발생할 때까지 잠들고요.

만약 프로세스 내에서 IPC (Inter Process Communication)가 호출되면 그때 다시 스케줄러가 깨어납니다. 왜냐하면 IPC를 처리하기 위해서는 현재 프로세스를 재우고 다른 프로세스를 깨워야 할 경우가 생기기 때문입니다.

zasxer의 이미지

하드웨어적인 인터럽트를 시그널로 받아서 처리하는 방식이 맞나여???

그리고 현재 프로세스 실행을 멈추게 만드는 것도 소프트웨어가 제어하는게 아닌가??? 궁금합니다. 소프트웨어가 제어하면 이 프로세스는 항시 인터럽트 발생을 주시하면서 실행되어야 하는게 아닌가 헷갈리네여...

그리고 뮤텍스가 걸린 시점에서 인터럽트로 중단된다면... 뮤텍스 걸린 자원에 대해서는 어떻게 처리가 되고 있을까요...???

라스코니의 이미지

유저 프로세스는 스케줄러의 존재를 전혀 모르고 실행된다고 보시면 됩니다. 뮤텍스라 할지라도 마찬가지이고요. 만약 중간에 중단되어서는 안되는 처리라면 인터럽트 발생을 금지시키기도 합니다. 유저 프로세스는 커널 스케줄러에 의해서 중단/재개가 수십번~수천번 반복되지만 유저 프로세스는 자기가 어떻게 스케줄링 되는지 알수가 없습니다. 알 필요도 없고요. 만약 더 빠른 실행을 보장하고 싶으면 우선순위를 높여주거나 실시간 타스크 등으로 만들어 주어야 합니다.

어떤 자원이 특정 프로세스에 종속되어 있는데 뮤텍스가 걸렸고 그 걸린 시점에서 그 프로세스의 실행이 중지(스케줄러에 의해서)된다면 그 자원은 그냥 그 특정 프로세스에 종속되어 있는 상태로 있는 거죠. 다른 프로세스에서 뺏어올 수 없습니다.

zasxer의 이미지

스케줄러에 대한 궁금증이 풀렸네요!

pald의 이미지

현재의 OS 에서는 고정된 timer tick 을 사용하지 않습니다. 그 이유는 매번 tick 에 응답하는 과정에 불필요하며 mobile device등에서는 전원 절약에 문제가 생기기 때문입니다. 이걸 tickless kernel 이라고 하는데요. 러프하게 설명하자면 tickless kernel 에서는 다음에 발생할 이벤트까지의 시간을 계산하고 다음에 깨어날 시간을 ondemand 하게 설정합니다. 이후 인터럽트가 발생한 후 일어나는 일들은 위 분들이 설명해주시는 것과 같고요..

timeslice 에 관해서는 현재의 리눅스 스케쥴러인 CFS 는 명시적인 timeslice 개념을 사용하고 있지 않습니다. 각 task 는 자신이 동작한 시간 * 보정치인 vruntime 를 계속해서 누적하며, 자신의 vruntime 이 대기중인 task 들의 vruntime 을 상회할 때까지 계속해서 동작하는 구조로 되어 있습니다.

라스코니의 이미지

좋은 정보 감사합니다. 저는 현재 RTOS 쪽만 다루고 있어서 linux의 CFS를 살펴보니 많이 흥미롭네요.

댓글 달기

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