리눅스의 선점형과 비선점형을 아주 간단하게 한마디로 말하자면

sisbn의 이미지

-> [ 스케줄러의 호출 시점 ]

비선점형 : 인터럽트의 발생에 상관없이 실행중인 유저 프로세스

가 끝나면 스케줄러를 호출한다.

선점형 : 인터럽트가 발생을 하면 유저 프로세스로 넘어가기

바로전의 인터럽트 루틴을 마친후에 스케줄러를 호출

을 한다.

넘 단순하게 생각하는건가요?? 부족한 부분은 짚어주세요.^^

댓글

wish의 이미지

오래된 글이라 답글 달기가 좀 그렇긴 한데~

kenos 님께서 실수로 거꾸로 쓰신 듯 합니다. 선점형과 비선점형 순서가 바뀌었네요.

그리고 kenos 님께서 쓰신 선점형(순서가 바뀌었으니 실제로는 비선점형)의 설명은 살짝 오해의 소지가 있는게, 스타크레프트가 돌고 있더라도, 중간 중간 스타크레프트가 sleep 을 하게 되면 스케줄링이 일어날 수 있습니다. 명시적으로 하지 않더라도 커널 모드에서 자주 일어 나게 되겠죠~

hirameki의 이미지

한 1시간정도를 읽어댄 것 같습니다.
저는 커널쪽 소스는 본적이 없는지라 대략적인 개념만 가지고 있었는데 세분화하니 꽤 어렵군요.
사실 중간에 슬쩍 보였지만 우리나라에서 커널만드는 분들이 계시는줄은 몰랐네요.(커널 개발이란게 쉽지는 않겠죠)
커다란 운영체제는 아니더라도 역시 핸드폰이라던가 이런 모바일 기기에는 독립적인 커널을 만들기도 하는가보네요... :D

저도 운영체제에는 관심이 있었습니다만 공부를 게을리해서 솔직히 위 스레드를 한 40% 정도 이해한 느낌이랄까...
(읽다보니 한 60%에 대해서는 자료 찾아봐야 할 필요성을 느꼈다는 것입니다. 물론 40%도 반올림한 느낌입니다만..)

아무튼 이런 토론이 우리나라 개발 커뮤니티에서 일어났다는 것만으로도 왠지 든든한데요...

--

LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
Hirameki --X-
Mail : hirafilter-comunity@yahoo.co.kr
그외 비밀..
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL

--

LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
Hirameki --X-
Mail : hirameki_krjp@yahoo.co.jp
God is not customer center. Do it yourself
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL

mac040의 이미지

섬점형, 비선점형 두 단어에 집착하면 '커널'이란 단어 의미가 죽어서 설명이 모호해 질 것 같습니다.
일반적으로 유저모드에 선점모드?를 지원하는 OS에 대해 '선점형 OS'라 부릅니다. 즉 비선점모드 OS(유저모드에서 Task Switching을 강제로 하지 않는 OS)에서는 Task에 무한루프가 있으면 스위칭이 안되는 것이 맞습니다.
선점형 OS들도 커널에 대해서는 선점 비선점으로 나뉘는데, 간단한 구분 방법으로 커널 모드 진입시 스위처에 의해, 커널모드 Task 스위칭이 가능한가 여부라고 보시면 많이 틀리지는 않을 것이라 생각됩니다. 구분이 애매모호해진 이유는 아마도 예전내지 옛날에는 시스템 콜에 대한 부하가 지금보다 작아서 커널모드에서의 스위칭의 필요성이 별로 없다가 시스템 콜의 규모가 커지고 시스템 반응성에 대한 욕구가 높아져 커널 모드에 대해 선점형 스위칭을 구현하면서 이리 된게 아닌가 하는 결론을 조심스레 내려봅니다.

즉 선점형 OS는 커널의 구현에 있어 선점(Kernel 2.6)형 비선점(Kernel 2.4)형 커널로 나뉜다.
비선점형 OS는 그냥 다 비선점형이다.. ^^:

kim7463의 이미지

선점형과 비선점형을 인터럽트로 여부로 나누지는 않습니다.

인터럽트는 선점형과 비선점형 모두 발생합니다.

하지만 인터럽트가 실행되고 나서 태스크(프로세서)의 실행이 바로 이루어지는가 아닌가에 차이를 두면 됩니다.

비선점형 : 우선순위가 높은 프로세서가 실행이 요구될때 인터럽트가 발생하며, 우선순위가 높은 태스크를 단순히 "ready" 상태로 만들어줍니다.
선점형 : 우선순위가 높은 프로세서의 실행이 요구될 때 인터럽트가 발생하며, 우선순위 높은 태스크로 "컨텍스트스위칭"을 합니다.

그리고 비선점이라고 해서 멀티태스킹을 하지 않는다는 이야기는 아닙니다.
두 가지 운영체제 모두 멀티태스킹을 합니다. 그리고 하나의 태스크가 CPU를 놓을때까지 다른 태스크가 끼어들수 없다는 이야기도 하는데..
스케줄러에 의해서 time slice가 할당되면 선점형이나 비선점형 모두 정해진 time slice만 사용하게 되고요

여기서 비선점형과 선점형의 차이점이라면, 선점형의 경우 time slice를 전부 사용하지 못해도 끼어 들 수 있다는 차이가 존재합니다.

koseph의 이미지

저 위에 있는 분, 모르면 모른다고 할 일이지 우기시는 건 좀 그래 보이네요.

하나 물어보고 싶군요. Microsoft Windows 3.1이 운영체제인가요?
언제부터 이게 운영체제가 되었는지 알고 싶네요.

절대 아니죠!!!!

DOS상에서 돌아가는 응용프로그램이지.
Windows 3.1로 부팅을 바로 하시나보죠? DOS없이????
그 당시에는 이론이 바뀌어서 autoexec.bat로 운영체제를 부팅했나 보군요.
어이 상실입니다.
파일명에 kernel 어쩌고 저쩌고 되어 있으니깐 운영체제로 착각하신 모양이군요.
다 말 장난입니다.

그런 방식이 좋았다면 지금도 그렇게 쓰고 있겠죠.

선점형과 비선점형 커널은 진정한 멀티태스킹 운영체제에서 논해야 할 타픽입니다.

There's always another way, dear.

---------------------------------
There's always another way, dear.

ujinyang의 이미지

구글검색하다가 보게된 10년이 지난 글인데, 계속 읽다가 의견이 달라서 남겨봅니다.

해당 부분은 오랬동안 논의되었던 부분으로 결론이 나지 않는 질문입니다.
OS의 정의를 무엇으로 하느냐에 따라 결과가 다르기 때문이지요.

참고로, 윈도우 95 역시 MS-DOS 7.0과 윈도우 4.0의 조합으로
MS-DOS 로 부팅하였습니다. autoexec.bat의 가장마지막줄이 "WIN" 이었습니다.
단지, MS-DOS 로 부팅하는 부분이 일반사용자가 보기에 감추어져 있었다는 게 다릅니다.

익명 사용자의 이미지

오랜시간이 흘렀지만 jika 님께서
system_call 이 끝난후 interrupt 를 처리한다는 것이 논쟁의 시발점이었는데

소스코드의 예를 들어서 설명해주셨다면, 아마 많은 분들이 이해하셨을거 같네요.

논쟁의 쟁점은.
책으로 뭉뚱그레 이론을 아는 분 vs 소스코드로 세부적인 사항을 논하는 분
간의 사실여부 확인이었는데. 이런 경우는
세부적인 사항을 아는 분이, 소스코드를 예시로 들면서 설명을 해야 논쟁이 끝나지,
그냥 "내가 세부적으로 다 소스를 봤으니, 내 말을 믿어주시오" 하는 방법으로 인해
논쟁이 좀 길어진듯 합니다.

그러니까. 인터럽트 실행시점에 대해 다시 한번 정리하자면.
"비선점형에서는 systel_call() kernel 함수가 실행되는 중에 interrupt가 발생하면
interrupt 컨트롤러가 해당 interrupt 를 masking 한다. 그리고 system_call() 루틴이 끝나고,
유저모드로 복귀직전 masking 된 interrupt 를 실행한다"

이 와는 대비되는 선점형 (2.6이상)은
"선점형에서는 systel_call() kernel 함수 중간중간에 interrupt() 를 체크하는 구문이 있다.
따라서 그 구문에 의해. 그 사이 들어온 masking된 interrupt 를 실행하며, 그로 인해 context switching이 일어날수 있다."
라는 것 같군요.

결국 kernel이 수행중에 interrupt가 들어온다고 무조건 수행되는건 아닙니다.
일단 interrupt 컨트롤러에 의해 masking 될 뿐이죠

익명 사용자의 이미지

죄송합니다. 비선점형 커널(리눅스2.4)에 관해 보충설명 달겠습니다.
interrupt 는 masking 되는 interrupt 와 그렇지 않은 interrupt 가 있습니다.

jika 님과 다른분들의 논쟁의 쟁점이 되었던 부분인데, 결국 어떤 interrupt 이냐에 따라 다른겁니다.
masking 되지 않는 interrupt 는 kernel 코드에 상관없이 즉각 실행됩니다.
이 부분을 jika 님께서 헷갈리신것 같은데
"커널 코드에 존재하지 않는 것이 어떻게 실행되느냐" 라는 말씀에 대한 답변을 하자면
-> 커널 코드가 아닌 cpu가 interrupt 체킹을 합니다. 따라서 커널 코드와 관계없이 interrupt 실행이 가능합니다.
IRQ interrupt 는 즉시 실행이 아니라 masking이 될뿐이지만요.

그리고. 논쟁이 되었던 또다른 사항.
"비선점형 커널(2.4)에서 시스템 콜을 만들어서 delay 5초를 주고 interrupt 실행으로 printk를 찍으면 바로 찍힌다.
이것은 interrupt 가 system call 중간에 실행된다는 증거이다"
이건 interrupt 실행떄문에 printk 가 찍히는게 아닙니다. time-slice (기본값 0.1초)가 지났기 때문에 printk 가 찍히는 겁니다.
비선점형 커널이란건.. delay 5초 준다고 5초간 실행되는게 아니고 "time-slice 동안의 실행"을 보장하는게 비선점형 커널입니다.

페이지

댓글 달기

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