리눅스 커널에 대한 질문입니다..

살자의 이미지

안녕하세요..
지금 "understanding the linux kernel" 이란 책으로 공부하고 있는데여..
책에서
"리눅스 커널은 비선점형이다. 리눅스 프로세스는 선점형이다" 라는
문구가 있는데.. 무슨 말인지 이해가 가지 않습니다..
우선
1 .비선점 , 선점형이 이해가 안가구여..
2. 커널의 비선점형과 선점형의 차이점과.
3. 프로세스의 선점형과 비선점형의 차이점을 알고 싶습니다.

그럼 고수님들의 조언 부탁드립니다.. ^^

스파이크의 이미지

간략하게 얘기하면 비선점형은 시스템에서 정한 일정한 시간동안만 CPU를 사용하고 다시 다른 프로세스에게 사용권을 넘겨주는 방법입니다. 물론 선점형은 반대이겠지요. 맞나요 ? :D

OS 관련 책을 같이 두고 보시면서 공부하시면 좀 더 편하실 것 같습니다.

장비병 이씨

newmania의 이미지

커널 모드에서 동작하는 코드는 정상적으로 마쳐지지 않는한 CPU 를 계속 사용하게 됩니다. 유저 모드에서 동작하는 코드는 time tick 간격으로 스케줄되어 multi-tasking 에 참여하게 됩니다.

따라서 유저모드에서의 프로그래밍은 비교적 안전하다고 볼 수 있습니다. 대신 커널 모드에서의 프로그래밍(디바이스 드라이버, 커널 수정 등)은 효율적이고 안전하게 작업할 필요가 있습니다.

요즘 커널은 커널모드에서 preemtion 될 수 있도록 옵션을 제공하고 있지만 정확히 알고 사용하지 않으면 위험할 수도 있습니다. 커널 모드에서 비선점형, 유저 모드에서 선점형이라는 특징을 잘 이용하면 경우에 따라 편하게 작업할 수 있습니다.

잘 모르지만 도움되시길... ^^;

freezm7의 이미지

살자 wrote:

"리눅스 커널은 비선점형이다. 리눅스 프로세스는 선점형이다" 라는

조금 이상하군요.

마치, 커널은 프로세스를 선점할 수 없고,
프로세스는 선점할 수 있다는 것 처럼 들리네요.

커널은 비선점 모드에서 돌고,
프로세스는 선점 모드에서 돈다고 해야 맞는 것 같은데...

저도 그 책을 가지고 있는데, 몇 페이지에 그런 이야기가 나오죠?

즐겁게 살아 볼까나~*

익명 사용자의 이미지

먼저, 선점형이니 비선점형이니 하는 말들은 시분할형 멀티태스킹을 구현하기 위한 방법으로 나온말인데요. 선점형 멀티태스킹은 프로세서의 실행루틴과는 상관없이 강제적으로 스케줄러에 의해서 여러 프로세서가 번갈아 수행됨을 뜻하고, 비선점형은 각 프로세서들은 적당히 작업을 수행하고 리턴해주어야만 다른 프로세서가 수행될 수 있게 하는 방법입니다. 따라서 비선점형일 경우는 비협조적인 프로세서가 있으면 멀티태스킹이 안되죠.
최근의 OS들은 모두 선점형 멀티태스킹을 사용하는데요. 아무래도 안정성이나 프로세서간의 독립성을 위해서 당연하다고도 볼 수 있겠습니다.
이제 까지의 설명은 유저 프로세서의 관점이고, OS 커널 자체를 말할때는 좀 틀려 지겠습니다. 리눅스의 커널은 유저프로세서들을 강제로 스케줄링하므로 선점형 멀티태스킹을 지원하는 커널이지만, 커널이나 디바이스 드라이버를 만드는 사람의 입장에서 그 커널자체는 비선점형이라고 말할 수 있겠네요. 커널은 유저프로세서들의 실행을 지배할 수 있지만, 커널을 지배할 그 상위는 없쟎아요? 요즘은 몇가지 이유로 디바이스 드라이버를 일반 유저 프로세서처럼 커널에 의해 선점당하도록 할 수도 있도록 한 커널버젼도 있다고 하네요.

gurugio의 이미지

선점인지 비선점인지 용어는 잘 모르겠습니다

대부분 일단 커널 모드로 들어가면 해당 처리를 끝낼때까지

중단되서는 안됩니다. 그래야 커널 데이터나 스택의 불완정해지지

않습니다. 커널 소스를 보시면 spinlock이나 세마포어에 신경을 많이 쓰는데요

이건 인터럽트와 SMP를 위해서있는 것이고

대부분 커널 함수는 한번 실행되기 시작하면 끝까지 진행되는 것을 가정하고

있습니다.

윈도우즈는 반대로 많은 경우에 커널 모드에서 동작하다가도 스케줄링되도록

(이런걸 reentrance라고 한다고 들었습니다만 용어는 잘 모르겠습니다)

그래서 좀더 유연하게 동작할 수 있도록 설계됬지만

덩치가 커지고 불안정해졌다고 들었습니다.

2.6부터는 리눅스도 윈도우즈의 이런 특성을 많이 따르기 위해

개선되었다고 들었습니다.

우선 hard real-time 상황에서는 커널 모드에서 시간이 지체되면

안되므로 이런 특성이 필요하다고 들었습니다.

preemtive인지 cooperative인지 하도 용어가 많아서

OS 이론책을 봐도 많이 헷갈립니다.. oops

익명 사용자의 이미지

능력 부족이지만.. 아는 대로만 말씀드릴께요. 저도 설명하면서 배우는 차원에서~~

1 .비선점 , 선점형이 이해가 안가구여..
----
기본적으로 선점형이라는 것은 CPU 를 어떤 프로세스가 사용하고 있을 때, 그 프로세스가 스스로 CPU 를 놓지 않아도, 커널이 강제로 CPU 를 다른 프로세스에게 넘겨 줄 수 있다는 것을 뜻합니다.

비선점형은 그 프로세스가 CPU 를 자기자신이 놓아야만, 다른 프로세스가 쓸 수 있는 것이구요.

2. 커널의 비선점형과 선점형의 차이점과.
3. 프로세스의 선점형과 비선점형의 차이점을 알고 싶습니다.
----
정확하게 말하면 커널 모드에서의 비선점형과 선점형의 차이라고 하는 편이 낫겠습니다. 한 프로세스는 유저 모드에 있다가 필요할 때 마다 커널 모드로 돌입합니다. 이 때 커널 모드로 진입한 프로세스가 스스로 schedule() 함수를 호출해서 자신이 CPU 를 놓기 전까지, 커널이 그 CPU 를 되찾지 못하면 비선점형입니다.

예를 들어서 어떤 프로세스가 fork() 라는 시스템콜을 불러서 프로세스가 커널 모드로 진입하게 되었을 때, 커널이 강제적으로 시스템 콜 도중에 CPU 를 뺐어 올 수 있으면 선점형, 그렇지 않다면 비선점형입니다. 비선점형의 경우 fork() 시스템콜의 커널 코드에 무한 루프가 있다면, CPU 를 되찾아 올 방법이 없습니다. 거기에 비해서 선점형 코드는 무한 루프가 있다고 하더라도, 타이머 인터럽트의 서비스 루틴에 schedule() 함수가 불리는 등의 방법으로 CPU 를 되 찾아올 수 있습니다.

리눅스의 경우 초기에는 커널모드에서 완전 비선점형이었지만, 현재의 경우 선점형 옵션도 있는 것으로 압니다.

유저모드에서는 당연히 선점형이겠죠. 저도 이 용어는 좀 헷갈리는데, 유저 모드에서 비선점형인 커널도 있을 지는 의문입니다. 어떤 유저 프로세스가 커널 모드로 진입하지 않고 계속 유저 모드로 실행 되는데, 이걸 끝도 없이 허용하는 커널이 얼마나 될 지는 잘 모르겠습니다. 아니면 제가 개념을 좀 혼동하고 있는 지도 모르겠네요(윈도우 3.1 은 유저모드에서도 비선점형이었다고 알 고 있습니다) 따라서 유닉스는 전부 유저모드에서 선점형이라고 봐도 맞을 것입니다.

커널 모드에서 비선점성이 보장되면 커널 내의 많은 함수가 재진입 가능하지 않아도 상관 없습니다. 그래서 커널 만들기가 많이 간단해지죠. 물론.. SMP 가 되면 이 이야기는 또 달라집니다. CPU 가 2개 이상이면 비선점형이더라도, 함수들이 재진입 가능해야 되기 때문입니다. 동시에 커널모드에서 2개가 돌아갈 수 있기 때문입니다.

도움이 되었으면 좋겠습니다 ~

익명 사용자의 이미지

그리고 understanding linux kernel 책 보시면서 그런 OS 일반적인 개념을 잡기란... 참으로 힘들다고 생각합니다.

이 책 저도 지금 보고 있는 중이지만, 오에스 전반에 대한 설명은 거의 없습니다. 게다가 ia32 아키텍쳐도 동시에 다뤄서... 머리가 매우 복잡해지는 경향이 많습니다.

그럼 도움이 되었기를 ^^:;

sangwoo의 이미지

수원 wrote:

커널 모드에서 비선점성이 보장되면 커널 내의 많은 함수가 재진입 가능하지 않아도 상관 없습니다. 그래서 커널 만들기가 많이 간단해지죠. 물론.. SMP 가 되면 이 이야기는 또 달라집니다. CPU 가 2개 이상이면 비선점형이더라도, 함수들이 재진입 가능해야 되기 때문입니다. 동시에 커널모드에서 2개가 돌아갈 수 있기 때문입니다.

아니면, SMP 환경에서도, '한번에 한 CPU만이 커널로 진입할 수 있다' 라고
정해 놓으면 재진입 가능하지 않아도 SMP 환경을 구축할 수 있습니다.
물론 이때는 시스템 콜이 많은 프로그램은 극도로 효율이 떨어지겠지만요.
(버전 4까지의 FreeBSD가 그러했습니다 -_ㅠ)

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