kernel과 process관계

rootuser7의 이미지

process란 일반적으로 실행중인 program이라고들 합니다.
가장 간단한 프로그램인 hello.c의 실행파일도 하나의 program이고,
linux kernel도 하나의 program입니다.

그렇다면, linux kernel이 실행중에 있다면, 이것은 하나의 process인가요 ?

또한, linux kernel에서 여러 sub system(ex: VFS/스케쥴러/기타 등등)이 동시에 실행된다면,
이는 multi process가 아닌 multi thread에 의한 구현이라고 할 수 있습니까?

그럼...좋은 하루 되시구요...^^

unixii의 이미지

물론 Thread는 여러가지 다른 기능도 있기는 하지만은.
Thread는 기본적으로 최소의 자원을 이용한 최대의 효과를 발휘해야 하는 제약 조건이 있습니다.
이말은 하면 저사양 Device에서 다양한 기능을 만들고자 할때 Thread가 대안이 될 수 있다는 말이 되죠(물론 다른것도 많습니다.)

리눅스를 개발한 리누즈 토발츠가 리눅스 개발 본래 목적인 고사양의 장비(당시에는 워크스테이션급 이상)에서 작동하는 UNIX를
저사양의 PC에서 작동하도록 UNIX를 축소했다 하더라도.
그것은 단지 KERNEL의 여러 기능을 단축시켜 KERNEL의 규모를 축소했던 것에 지나지 않습니다.
그리고 그렇게 축소한 KERNEL 이라 하더라도 요즘 나오는 제품들(ex. 핸드폰) 기준으로는 여전히 엄청 대용량을 필요로 하게 되죠.
왜냐? 기본적으로 PROCESS라는게 엄청 많은 RESOURCE를 차지하게 되니까요.

그러나 PC가 (이젠 워크스테이션과의 구별이 모호해 질 정도로) 발전하면서 저런 RESOURCE의 제약조건이 걸리지 않게 되었고.
이로 인하여 리눅스의 KERNEL 크기가 점점 증대되는 단점을 낳고 있다고 본인은 생각합니다.(뭐 저 혼자만의 생각일 지도 모르지만요...ㅠㅠ)

어쨌든 그런 DEVICE의 발전에 힘입어 리눅스는 더이상 RESOURCE를 걱정하지 안아도 될 정도가 되었고.
필요없이 작업도 엄청 힘들고 복잡할 뿐 아니라. 시간도 엄청 소요되는 Thread 프로그래밍을 할 필요성이 없기 때문에
리눅스든 UNIX든 간에 모두 Process화 되어 있는 것이죠.

뭐 약간 관점을 달리해서 설명 드렸지만요........
모두다 Process로 처리되어 있다는 이야기를 이리도 복잡하게 했네요.

- 추 신 -
100% Process라는 이야기는 아닙니다.
요즘은 Process 내부에서 Process의 기능을 향상시키기 위해 Thread를 사용하는것이 보편적이기 때문에
KERNEL에서 작동하는 PROCESS들이 Thread를 하나도 사용하지 않는다는 말은 아닙니다.

prether의 이미지

Kernel은 간단히 process manager 라고 말할 수 있습니다.

/***************************************
Being the one is just like being in love.
***************************************/

/***************************************
Being the one is just like being in love.
***************************************/

ganadist의 이미지

커널 기능의 일부는 프로세스처럼 목록에 표시되는 것도 있습니다.

ps 로 확인해보면 []로 감싸져있는 프로세스가 있는데 죽여도 죽지 않는 프로세스가 있습니다.

커널의 특정 역할을 프로세스처럼 보이게 해놨는데, 커널 쓰레드라고 부릅니다.
----
Do not feed troll!

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

anfl의 이미지

kernel은 address space가 일반 application에 분리되기 때문에 하나의 process라 볼수 있습니다.
ps할 때 나오는 kernel-thread들은 kernel과 같은 address space를 공유하기 때문에 말 그대로 kernel thread라 볼수 있고요.

그리고 질문하신분이 말씀하신 sub system(ex: VFS/스케쥴러/기타 등등)들은 동시에 수행되긴 하지만 kernel의 address space가 아닌 application의 address space에서 수행되고 application의 context라 보아야 맞기 때문에 multi-process는 맞지만 의도하신 kernel의 multi-thread는 아닙니다.

다소 혼돈의 소지가 있을수 있는 주제이기는 하나 process와 thread의 정의와 관계에 대해 보다 명확히 알아보시는게 좋을듯 합니다.


ssehoony의 이미지

프로세스란 커널이 유저 레벨 프로그램을 관리하기 위한 추상화 개념입니다.
그래서 커널은 프로세스라고 할 수 없습니다. 그냥 최하 레벨의 프로그램이라고 보시면 되며
커널이 유저레벨 프로그램의 관리를 위해 프로세스라는 추상화 단위를 만들어서 관리한다고 보시면 됩니다.
프로세스는 Stack, Heap, Data section, Instruction section 과 커널이 관리하기 위한 추가적인 자원(fd 등)을 포함한 하나의 단위입니다.

커널은 프로세스는 아니고 병렬로 작동하지도 않습니다. 그래서 현재의 리눅스는 cpu가 8개라고 할지라도 커널은 이중 cpu 1개에서만 작동합니다.
(동시에 2개의 cpu에서 작동하지 않는 다는 의미입니다.)

최근 마이크로 커널이라는 개념이 도입이 됐는데, 위의 문제 (cpu 1개에서만 커널이 작동하는)를 해결하기 위한 것으로 기존을 커널을
좀 더 작은 단위로 쪼갠 후 가장 중요한 core 만 기존 커널과 동일한 레벨에서 작동하고 나머지 부분은 user level 수준으로 낮추어 병렬로 작동하도록 하는 것인데요.
user level 파트는 복수의 cpu에서 병렬로 작동이 가능하게 됩니다.
이런 구조는 단일 CPU 시스템에서는 오히려 성능 저하를 불러일으키지만 멀티 CPU에서는 성능 향상이 있으며, 커널 core의 기능을 줄이므로서 커널의 안정성이 증가합니다.

그래서 ms-windows vista의 경우 그래픽 드라이버등을 변경하더라도 리붓없이 변경이 가능하다고 하던데, 그래서 재 짐작으로 vista 가 마이크로 커널의 개념을 사용한게 아닌가 짐작해 봅니다. (이부분을 다른 고수님이 첨언해 주시면 감사하겠습니다.)

anfl의 이미지

kernel은 단지 하나의 layer이며 추상화개념이다?
그럴듯하게 보이시죠?

엄밀한 의미에서 kernel은 process입니다.

여러 OS에서 process의 개념이 매우 미묘하게 차이가 나기도 하지만,
학계에서 일반적으로 정의 내리는 process는 program의 instance라는것,
그리고 하나 이상의 archtecture state로 이루어진 context(thread)가있고,
별도의 address space를 가진다는것입니다.

이게 일반적인 process의 정의입니다.

약간 논외로 process와 thread를 구분하는 가장 중요한 기준은 별도의 address space의 유무이고
이 기준에 의해 process가 될지 thread가 될지 결정되죠.

그럼 kernel은 무엇인가?
linux를 예를들면 linux kernel 역시 프로그램으로 이루어져 있고, swapper로 대변되는 idle thread와
기타 여러일들을 수행하는 kernel thread들로 이루어져 있죠.
kernel의 thread들은 각자의 context를 가지고 있으며 swapper의 주소공간을 공유하죠.

kernel은 프로그램이고, 일반 process와는 별도의 주소 공간을 가지며 여러 thread로 이루어져 있습니다.
때문에 kernel은 일반적인 process의 정의와 부합하며
그런 의미에서 process라 할수 있고 실제로 그렇게 정의내립니다.
많은 RTOS들이 multi-thread model을 띄고 있는데 엄밀한 의미에서 one-process, multi-thread model이라
부르는것도 바로 이 때문입니다.

============== 인용 ==========================
그래서 현재의 리눅스는 cpu가 8개라고 할지라도 커널은 이중 cpu 1개에서만 작동하면
(동시에 2개의 cpu에서 작동하지 않는 다는 의미입니다.)
=============================================

대부분의 SMP architecutre에서 OS들은 모두 여러 CPU에서 동작합니다.
대표적으로 linux, windows가 그렇고, 거의 모든 SMP를 지원하는 OS가 그러하다고 보시면 되겠네요.
OS model도 processor의 구조가 AMP이냐 SMP이냐 혹은 heterogeneous하냐, homogeneous하냐에 따라
여러 model로 나뉠수 있는데 말씀하신 구조는 그중 한 model 뿐입니다.
말씀하신 OS model의 대표적인 case가 IBM cell architecture에 포팅되어 있는 linux 같은 mdel일것 같네요.
IBM cell은 AMP구조에 heterogeneous해서 PPU라고 하는 main processor에만 OS가 올라가죠.
물론 이건 IBM이 취하고 있는 일반적인 model의 경우이고, 어떻게 구성하냐에 따라 같은 cell이라할지라도
여러 OS model로 구성하는게 가능하죠.

============== 인용 ==========================
최근 마이크로 커널이라는 개념이 도입이 됐는데, 위의 문제 (cpu 1개에서만 커널이 작동하는)를 해결하기 위한 것으로 기존을 커널을
좀 더 작은 단위로 쪼갠 후 가장 중요한 core 만 기존 커널과 동일한 레벨에서 작동하고 나머지 부분은 user level 수준으로 낮추어 병렬로 작동하도록 하는 것인데요.
user level 파트는 복수의 cpu에서 병렬로 작동이 가능하게 됩니다.
=============================================

micro kernel은 아주 오래전에 나온 개념이고, 도입된지도 한참이 넘었습니다.
대표적인 case가 L4, QNX, symbian등이 이에 해당하죠.
micro kernel과 monolithic kernel의 가장 큰 차이점은 OS의 각 sub system이 kernel의 code에 포함되는가
아니면 별도의 process 또는 thread로 존재하며 kernel core와 통신하며 service를 제공해주는가에 따라 분류가 나뉘어집니다.
여기까지는 말씀하신 내용과 동일하고,,,,

micro kernel의 각 sub system이 process 혹은 thread level로 동작한다고해서
monolithic kernel에 비해 multi-processor에서 parallel processing이 더 잘되는건 아닙니다.
왜냐하면 multi-processor에서 동작하는 대부분의 monolithic kernel들 역시 여러 processor에
분산되어 kernel의 각 부분을 parallel하게 처리하기 때문이죠.
그 대표적인 case가 linux입니다.

============== 인용 ==========================
이런 구조는 단일 CPU 시스템에서는 오히려 성능 저하를 불러일으키지만 멀티 CPU에서는 성능 향상이 있으며, 커널 core의 기능을 줄이므로서 커널의 안정성이 증가합니다.
=============================================

micro-kernel 구조는 uni-processor 뿐만 아니라 multi-processor에서도
core와 sub system간의 통신 overhead가 발생하기 때문에 성능 저하를 가져오게 됩니다.
multi-process model의 특성상 여러 process는 하나의 자원에 대해 경쟁하게 되며
이를 해결할 방법은 lock과 자원할당 순서를 통할수 밖에 없습니다.
때문에 micro-kernel의 각 sub system이 process로 존재해서 multi-processor에 분산하기
좋은 구조를 가지고 있을지라도 multi-process model을 사용하는한
process간 경쟁에 의해 overhead가 발생하는것은 어쩔수 없습니다.
여기에 kernel core와 sub system간의 통신 overhead가 더해지기
때문에 monolithic kernel보다 성능이 떨어질수 밖에 없습니다.

그렇지만 각 sub system은 여러 processor에 parallel processing이 잘되지 않냐고 하신다면...
컴퓨터를 사용하는 목적은 application을 사용하기 위한것으로써 user가 원하는 일을
효율적으로 처리하기 위한것이 목적이고, OS의 목적은 남아도는 processor 자원을
보다 효율적으로 사용하기 위한것으로써 결국 컴퓨터와 OS를 사용하는 목적은
application을 사용하기 위한 목적이지 OS의 sub system을 돌리기 위한것이 아니기 때문에
그런 의미에서 micro-kernel이 parallel processing이 잘된다고 말하기는 어려울것 같네요.
오히려 monolithic kernel 구조에서의 parallel processing이 더 application의 수행에
충실하지 않을까 쉽네요.

그럼 micro-kernel은 단점만있나? 아뇨. 말씀하신바대로 kernel의 안정성이 향상되고, 설계 모델이 깔끔하죠.
하지만 overhead는 어쩔수 없죠.

(사실 저는 설계 모델이 깔끔한지는 그다지 잘모르겠네요. monolithic kernel의 설계가 지저분하다고 지금껏 생각해본적이 없기 때문에.)

============== 인용 ==========================
그래서 ms-windows vista의 경우 그래픽 드라이버등을 변경하더라도 리붓없이 변경이 가능하다고 하던데, 그래서 재 짐작으로 vista 가 마이크로 커널의 개념을 사용한게 아닌가 짐작해 봅니다. (이부분을 다른 고수님이 첨언해 주시면 감사하겠습니다.)
=============================================

그래픽 드라이브 변경은 윈도우즈 xp도, linux도 재부팅 없이 변경 가능합니다.
그건 micro-kernel의 특화된 기능이 아닙니다. 나원 쌍팔년도에 사시는분도 아니시고....
이런 이야기는 win98 이후로 처음듣네요.


eungkyu의 이미지

마지막에서 1.5줄만 없었으면 더더욱 괜찮을뻔 했습니다. ^^

댓글 달기

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