커널 모드와 컨텍스트 스위칭.. 어떻게 봐야 할까요?

jude1064의 이미지

공부를 하다 보니 헷갈려서 확실한 개념을 잡고자 질문 합니다.

커널 모드로 진입함으로서 생기는 비용(?)은 어떤게 있을까요? 여기서 발생

하는 비용이 컨텍스트 스위칭에서의 비용과 같다고 봐야 하나요?

커널모드 진입과 컨텍스트 스위칭은 다르다고 생각하는데.. 명확하게 어떤식이

되는지 에메합니다.

한 프로세스가 유저모드에서 커널모드로 진입하면서 생기는 비용(스위칭)과

프로세스간 문맥교환이 일어나는것을 어떻게 봐야 할까요..?

그럼 부탁드립니다.

익명 사용자의 이미지

제가 분석한 상황으로는 다음과 같습니다.
잘못 분석하여 실제와 다를수도 있으니 틀린부분 지적해부세요.

우선 커널은 INTR에 대한 처리를 하고
전체 모든 INTR에 의해 동작하는 iret부분에
Scheduler가 호출됩니다.

그리고 커널은 부팅후의 초기화이후에는
곧바로 유저모드로 진입합니다.

즉, 아무런 INTR에 없다면
커널모드로의 진입은 없다고 생각됩니다.

main.c 에서 마지막에 init를 실행하는 것이 그 시점으로 보여집니다.

그러면 언제 커널모드로 진입이 가능한가?

System call 호출시 또는 Timer interrupt 발생시등
INT명령에 의한것이든 Interrupt발생에 의한
커널모드의 진입이 된다고 생각됩니다.

그렇다면 어떻게 컨텍스트 스위칭은 언제 일어나는가?

Interrupt수행후 모든 Interrupt의 리턴은 iret에 의에 돌아가도록 되어
있습니다.

커널에서 보면 그 iret하는 부분에 항상 Scheduler를 실행하게 되어 있습니다.

이미 Interrupt가 수행되었다는 예기는 발생된 시점의 해당 프로세스의
모든 Register가 자신의 stack에 저장되었다는 것을 의미합니다.

그러므로 태스크 스위칭은 iret하기전에 return address를 스택에서
수정하면 current = current->next에 해당하는 프로세스 환경을
꾸민후에 해당 다음 프로세스로 실행시점이 감쪽같이 넘어가는 것이죠.

마찬가지로 그 프로세스에서 다시 그 무언가 Interrupt발생이 일어나므로
계속 그런식으로 다음 프로세스로 재진입이 되는것이죠.

Interrupt가 수행되면 Kernelmode로 진입하고 iret시에
Kernel mode이건 User mode이건 원하는 쪽으로
분기해버릴수 있겠죠.

기타 핸들과 여러 정보들은 이러한 분기가 이뤄지기전에
즉, iret전에 정보를 해당 프로세스가 필요한 정보로 바꾸는 것이
이뤄지겠죠.

Timer는 항상 주기적으로 발생하는 것이므로 적어도 Timer호출기간에
따르는 태스크 전환이 이뤄지겠죠.

그리고 특정 interrupt에서 처리량이 많으면 블록이 되겠죠 프로세스들은...

그래서 interrupt에서는 요청에 따른 응답이 직렬로 이뤄질 필요가 없다면

다음 interrupt에서 이를 수행하도록 꾸미고 곧바로 iret으로 가도록

설계가 되겠죠.

그 밖에 여러 많은 사항들이 있는데
그건 제가 설명할 수준은 아닌듯 합니다.

이상. 제가 분석하고 이해한 내용이었습니다.
틀린부분 있으면 가차없이 지적해주시길...

참고로 일반 유저 프로그램수행중에는 아무때가 Interrupt가 걸려도
무관하여 마치 동시에 실행되는 착각을 일으키는것처럼 보이지만
커널모드에서는 Interrupt가 발생되는경우가 거의 없으므로
커널모드에서는 thread가 마치 1->2->3-> 이런식으로 실행되는것처럼
비동기적으로 수행되지 않는것처럼 보입니다.

sleepon 함수를 추적해보면 제가 설명할 필요가 없을거 같구요.
꼭 sleepon은 파헤쳐 보심이....

댓글 달기

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