[완료]OS 커널을 잘 모르겠습니다.

adison777의 이미지

공부하다 제 이해력에 이렇게 좌절합니다.

제가 책을 보고 느낀거는

CPU에서 연산을 하려면 결국 커널을 거쳐야하는데

커널을 가기 위해선 소프트웨어 경우 연속된 시스템콜(?)로 구성되고

그렇게 구동된다라고 이해하고있습니다.

그리고 커널 부분도 궁금한데요.

질문은

1. 어플리케이션은 API로 작성되도 이게 결국 시스템콜로 다 일일히 전환되어서 CPU에서 처리하는 건가요.

2. 라이브러리는 그럼 어떤 개념인가요? 결국 다 시스템콜로 구동된다면 라이브러리를 통해 오버헤드를 줄인다라는 개념을 모르겠어요.

3. 쓰레드를 cpu안에 쓰레드 처리기로 보내기 위해 유저레벨 쓰레드를 커널 쓰레드로 바꾸는가??

내가 컴퓨터에서 하는 모든행위가 결국 유저레벨에서 작성하거나 시작될지라도 모드게 커널을 통해서 하드웨어로 뿌려지는데 이 과정에서 모든게 시스템콜로 구성된다. 라는게 지금 머릿속의 주 개념입니다. 근데 이게 책 읽다보니 이상해요.
기본 개념을 잘 잡아야했는데 점차 꼬이는 이 느낌 도와주세요 기본 개념만 잘잡고 싶습니다.

jachin의 이미지

분명 여기에 답글을 달면, 누군가 득달같이 달려들어 답글을 달리라 생각합니다.
그래도, 일단 달 수 있는 답변글을 달아보고자 하니, 너무 보기 싫으시면 그냥 무시하시면 좋겠습니다.

저는 adison777님과 반대의 관점에서 한 번 바라보겠습니다.

CPU에서는 실제 하드웨어 명령어 대로 동작하고, 메모리 상의 자료를 내부 캐쉬메모리와 교환하고 있습니다.
프로그램 카운터(PC) 레지스터를 통해, 현재 CPU가 처리할 명령어를 가리키고 있을 터이고,
스택 포인터(SP) 레지스터는 현재 CPU에서 처리가 프로시져를 다 처리한 후,
혹은 함수의 return 에 해당하는 부분까지 돌아갔을 때,
pop 명령으로 되돌아갈 본래의 프로그램이 있을 것입니다.

OS도 CPU상에서 돌아가는 일률적인 프로그램이나 다름 없습니다.
프로세스 정의와 프로세스 스케쥴링은 OS에서 정한대로 움직입니다.
컴퓨터 종료까지 마지막까지 제어하기 때문에,
대부분의 프로그램이 종료하며 마지막으로 회귀하는 지점이 될 것입니다.

메모리 상에 상주하고 있는 OS의 내용대로 CPU가 동작하면서,
인터럽트를 통해 외부로부터 들어오는 명령(쉘을 통한 명령
혹은 fork로 인한 프로세스 추가 명령)이 전달되면,
비어있는 메모리 영역에 해당 프로그램를 할당하고,
프로세스로 등록하여, 프로세스 스케쥴링 방식대로 재해석합니다.
프로그램 내에서도 라이브러리를 동적 연결으로 연결할 때,
소프트웨어적으로 선언한 인터럽트를 통해 라이브러리 호출이 일어납니다.

질문에 답변 드리자면,

1. 프로그램 내에서 OS가 관리하는 자원에 접근할 때마다 시스템 콜은 일어납니다.
즉, 모든 프로그램이 화면 출력이나, (힙 같은) 메모리 영역 할당, 키보드 입출력,
하드디스크 파일 접근 등의 기능을 사용하려 할 때마다 일어납니다.
API 내부에는 시스템 콜 정의가 되어 있을 것이고,
사용자가 자연스럽게 인자를 전달할 수 있도록,
사용자 수준에 맞춘 데이터 변환 작업을 할 것입니다.

2. 시스템 콜은 라이브러리보다 하위(커널과 하드웨어 쪽의) 개념이라, 비교하는 것은 이상하다고 생각합니다.

만약 라이브러리를 통해 오버헤드를 줄일 수 있다고 한다면, 공유 라이브러리 형태가 아닐까 생각합니다.
메모리 상에 여러번 중복된 프로그램 내용이 들어있는 것 보다는, 단일 프로그램 내용이 들어있고,
프로그램마다 관련 함수가 호출될 때, 매번 다른 주소를 찾는 번거로움 대신,
미리 등록되어 있는 라이브러리 주소로 이동하면 될 것입니다.

그렇게 되면, CPU내의 캐쉬 정책에 따라,
자주 쓰는 메모리 영역으로 캐쉬 메모리에 상주되어,
CPU에서 프로그램을 처리할 때,
주 메모리로의 접근시간과 메모리 내용 교체 시간을 줄여주는 효과가 있습니다.

3. CPU 내부에는 스레드 처리기가 따로 존재하지는 않습니다.
커널 스레드의 구성이나 동작 단위 등은 하드웨어 정보에 의거하여 OS에서 정의합니다.
커널 스레드라면, 커널 내의 스레드 정책에 따라 처리를 합니다.
사용자 스레드는 스레드 라이브러리마다 정책이 다릅니다.
스레드 라이브러리가 커널 스레드를 사용하여서, 처리하도록 되어 있다면 모르지만,
대부분의 사용자 스레드는 소프트웨어 최적화를 통한 스레드 처리로 되어 있습니다.
공유 라이브러리로 CPU와 메모리 간 자료 교환 시간을 줄이고, 효율적인 처리를 이루는 것처럼,
사용자 스레드도 스레드의 내용을 캐쉬에 저장하고,
데이터 부분만을 교환하며 한꺼번에 처리하는 것으로
사용자 스레드 처리가 효율적인 방법이 되는 것입니다.
커널은 사용자 스레드도 하나의 프로세스로 처리합니다.

제 답글에 어떤 부연설명이 남겨질지는 모르겠지만,
제가 이해하고 있는 부분은 이렇습니다.

이해에 도움이 되시길 바랍니다. :)

jachin의 이미지

분명 여기에 답글을 달면, 누군가 득달같이 달려들어 답글을 달리라 생각합니다.
그래도, 일단 달 수 있는 답변글을 달아보고자 하니, 너무 보기 싫으시면 그냥 무시하시면 좋겠습니다.

저는 adison777님과 반대의 관점에서 한 번 바라보겠습니다.

CPU에서는 실제 하드웨어 명령어 대로 동작하고, 메모리 상의 자료를 내부 캐쉬메모리와 교환하고 있습니다.
프로그램 카운터(PC) 레지스터를 통해, 현재 CPU가 처리할 명령어를 가리키고 있을 터이고,
스택 포인터(SP) 레지스터는 현재 CPU에서 처리가 프로시져를 다 처리한 후,
혹은 함수의 return 에 해당하는 부분까지 돌아갔을 때,
pop 명령으로 되돌아갈 본래의 프로그램이 있을 것입니다.

OS도 CPU상에서 돌아가는 일률적인 프로그램이나 다름 없습니다.
프로세스 정의와 프로세스 스케쥴링은 OS에서 정한대로 움직입니다.
컴퓨터 종료까지 마지막까지 제어하기 때문에,
대부분의 프로그램이 종료하며 마지막으로 회귀하는 지점이 될 것입니다.

메모리 상에 상주하고 있는 OS의 내용대로 CPU가 동작하면서,
인터럽트를 통해 외부로부터 들어오는 명령(쉘을 통한 명령
혹은 fork로 인한 프로세스 추가 명령)이 전달되면,
비어있는 메모리 영역에 해당 프로그램를 할당하고,
프로세스로 등록하여, 프로세스 스케쥴링 방식대로 재해석합니다.
프로그램 내에서도 라이브러리를 동적 연결으로 연결할 때,
소프트웨어적으로 선언한 인터럽트를 통해 라이브러리 호출이 일어납니다.

질문에 답변 드리자면,

1. 프로그램 내에서 OS가 관리하는 자원에 접근할 때마다 시스템 콜은 일어납니다.
즉, 모든 프로그램이 화면 출력이나, (힙 같은) 메모리 영역 할당, 키보드 입출력,
하드디스크 파일 접근 등의 기능을 사용하려 할 때마다 일어납니다.
API 내부에는 시스템 콜 정의가 되어 있을 것이고,
사용자가 자연스럽게 인자를 전달할 수 있도록,
사용자 수준에 맞춘 데이터 변환 작업을 할 것입니다.

2. 시스템 콜은 라이브러리보다 하위(커널과 하드웨어 쪽의) 개념이라, 비교하는 것은 이상하다고 생각합니다.

만약 라이브러리를 통해 오버헤드를 줄일 수 있다고 한다면, 공유 라이브러리 형태가 아닐까 생각합니다.
메모리 상에 여러번 중복된 프로그램 내용이 들어있는 것 보다는, 단일 프로그램 내용이 들어있고,
프로그램마다 관련 함수가 호출될 때, 매번 다른 주소를 찾는 번거로움 대신,
미리 등록되어 있는 라이브러리 주소로 이동하면 될 것입니다.

그렇게 되면, CPU내의 캐쉬 정책에 따라,
자주 쓰는 메모리 영역으로 캐쉬 메모리에 상주되어,
CPU에서 프로그램을 처리할 때,
주 메모리로의 접근시간과 메모리 내용 교체 시간을 줄여주는 효과가 있습니다.

3. CPU 내부에는 스레드 처리기가 따로 존재하지는 않습니다.
커널 스레드의 구성이나 동작 단위 등은 하드웨어 정보에 의거하여 OS에서 정의합니다.
커널 스레드라면, 커널 내의 스레드 정책에 따라 처리를 합니다.
사용자 스레드는 스레드 라이브러리마다 정책이 다릅니다.
스레드 라이브러리가 커널 스레드를 사용하여서, 처리하도록 되어 있다면 모르지만,
대부분의 사용자 스레드는 소프트웨어 최적화를 통한 스레드 처리로 되어 있습니다.
공유 라이브러리로 CPU와 메모리 간 자료 교환 시간을 줄이고, 효율적인 처리를 이루는 것처럼,
사용자 스레드도 스레드의 내용을 캐쉬에 저장하고,
데이터 부분만을 교환하며 한꺼번에 처리하는 것으로
사용자 스레드 처리가 효율적인 방법이 되는 것입니다.
커널은 사용자 스레드도 하나의 프로세스로 처리합니다.

제 답글에 어떤 부연설명이 남겨질지는 모르겠지만,
제가 이해하고 있는 부분은 이렇습니다.

이해에 도움이 되시길 바랍니다. :)

댓글 달기

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