Non-preemptive Kernel 에 대한 질문입니다.

zieben의 이미지

KLDP에 올라온 글을 쭉 보던 중에 선점현 커널과 비선점형 커널에 대한 어느분의 질문에 대해서 Linux의 커널은 비선점 Non-preemptive Kernel 이라는 내용을 봤습니다.

그리고 그 예제로 커널소스의 경우 무한반복의 내용을 넣으면 시스템이 다운된다고 적어놓으셨는데요..
만일 비선점형이라고 하더라도 time-slice를 두어서 그 시간이 지나면 자원을 다른 Task에 넘기는 것이 아닌지요?
그렇다면 무한루프를 돌더라도 자신에게 주어진 시간이 지나면 결국 그 task는 자원을 할당하고 대기상태로 넘어가야 하는게 아닌가요?
혹시 time slice라는 건 cpu의 점유만을 의미하고 다른 자원을 의미하는 건 아닌가요?

기본적인 질문일지 모르지만 답해주시면 감사하겠습니다.

kslee80의 이미지

non-preemptive 커널은 커널모드 상에서는 preempt 가 일어나지 않습니다.
예를 든 커널 모듈이나 커널 소스의 경우, 커널모드에서 수행되는 코드기 때문에
time-slice 를 다 쓰더라도 preempt 되지 않기 때문에 그런 현상이 일어나는거죠.

time-slice 를 다 쓰더라도 preempt 되지 않는 현상은,
time-slice 가 다 되었다는 것을 어떻게 확인하느냐와 관련이 있습니다.

(다른 non-preemptive 커널들은 어떤지 모르겠지만)
Linux 커널에서는 time-slice 를 timer 인터럽트를 통해서 확인하고
preempt 동작을 수행합니다만,
대부분의 커널모드 동작은 인터럽트 금지 상태에서 수행합니다.
그렇기 때문에, 커널모드에 진입한 프로세스가 time-slice 를 다 쓰더라도
timer 인터럽트를 처리할 수 없기 때문에 커널모드에서 빠져나오기 전까지는
preempt 동작이 수행되질 않으며,
커널모드에 진입해서 무한루프라던지 하는 동작을 수행하는 경우에는 시스템 전체를
멎게 만들 수 있는것이죠.

sangwoo의 이미지

이 부분만 제가 알고 있는 것과 조금 다른 것 같습니다.
non-preemptive인 2.4 커널 기준으로 말해 보겠습니다.

kslee80 wrote:

Linux 커널에서는 time-slice 를 timer 인터럽트를 통해서 확인하고
preempt 동작을 수행합니다만,
대부분의 커널모드 동작은 인터럽트 금지 상태에서 수행합니다.

인터럽트 disable은 top-half와 bottom-half의 synchronization이 필요한 곳에서만 이루어지고, 대부분의 동작은 인터럽트를 금지하지 않은 상태에서 이루어질 겁니다. 안그러면 인터럽트가 인터럽트가 아니게 되겠죠.. :-)

Quote:

그렇기 때문에, 커널모드에 진입한 프로세스가 time-slice 를 다 쓰더라도
timer 인터럽트를 처리할 수 없기 때문에 커널모드에서 빠져나오기 전까지는
preempt 동작이 수행되질 않으며,
커널모드에 진입해서 무한루프라던지 하는 동작을 수행하는 경우에는 시스템 전체를
멎게 만들 수 있는것이죠.

Timer 인터럽트는 처리가 될겁니다! 다만, 인터럽트 서비스 루틴이 처리된 후에 다시 이전의 무한루프로 돌아가게 되는 것이죠.

(2.4까지의) Linux kernel이 non-preemptive 라는 말의 뜻은 커널 모드로 동작하는 프로세스는 반드시 자신이 명시적으로 제어권을 포기해야만 (voluntary) context switching이 일어난다, 즉 다른 프로세스가 커널 모드를 수행중인 프로세스를 임의로 preempt 할 수 없다는 뜻으로 생각하시는 게 옳을 것으로 봅니다. (인터럽트 서비스 루틴은 커널 모드로 동작하는 프로세스를 preempt 할 수 있습니다. 단 인터럽트가 disable되어 있지 않다면요.)

----
Let's shut up and code.

댓글 달기

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