커널의 schedule() 함수에서....

swhong의 이미지

커널소스중,

/linux/kernle/sche.c 의 schedule()함수중 다음 부분...

.
.
switch_to(prev, next, prev);
.
.

요기서 흐름이 조금 헤깔립니다.

움, 즉 switch_to 함수 호출전에 process의 task_struct를 접근하려면,

prev-> 요렇게 접근하는 것이 맞는지요?

그리고, switch_to 함수 호출후에 새로 올라온 process의 task_struct 를 접근하려면,

next-> 요렇게 접근하는 것이 또한 맞는지요?

움, 소스를 보면 맞는것 같은데...

워낙에 조심스러운지라...

고수님들의 조언이 필요합니다....

sliver의 이미지

swhong wrote:
커널소스중,

/linux/kernle/sche.c 의 schedule()함수중 다음 부분...

.
.
switch_to(prev, next, prev);
.
.

요기서 흐름이 조금 헤깔립니다.

움, 즉 switch_to 함수 호출전에 process의 task_struct를 접근하려면,

prev-> 요렇게 접근하는 것이 맞는지요?


네, 맞습니다.

Quote:

그리고, switch_to 함수 호출후에 새로 올라온 process의 task_struct 를 접근하려면,

next-> 요렇게 접근하는 것이 또한 맞는지요?


아닙니다. 이때에도 prev->로 접근해야 합니다.

next는 schedule하고자 하는 process입니다.

즉, 이번에 switch_to에 의해 실행되는 process의 context에서는,

prev가 자기자신이고 next가 자신이 switched out될때 schedule된

process입니다.

이 process가 다시 switched in된 상황에서는 next는 별 의미가 없겠죠.

그리고 prev-> 대신 current->로 해도 같을 겁니다.

swhong의 이미지

prev->     // A
switch_to()
prev->     // B

그러니까 A와 B의 prev는 서로 다른 프로세스라는 이야기죠?

즉 A는 switched out되는 process이고, B는 switched in된 process라고 이해해도 되나요?

- by swhong in jgdr.net -

sliver의 이미지

swhong wrote:
prev->     // A
switch_to()
prev->     // B

그러니까 A와 B의 prev는 서로 다른 프로세스라는 이야기죠?

즉 A는 switched out되는 process이고, B는 switched in된 process라고 이해해도 되나요?

어떻게 해석하냐에 따라 헷갈릴 수가 있을 거 같아서.. :)

process A -> process B -> process A가 되는 과정을 나타내면:

*process A의 context*
1. prev는 process A.
2. schedule함수가 schedule하려는 process는 process B.
3. 따라서 next는 process B.
4. switch_to 매크로 호출(이 과정에서 process B의 스택으로 change)
여기서 process A의 context에서는 switch_to매크로 중간에서 멈춤.

*process B의 context*
5. process B는 switch_to매크로의 중간까지 실행이 되었을 것임.
switch_to매크로 전의 prev는 process B.
6. prev변수는 자동변수(스택상에 존재하는 변수)이므로 당연히 switch_to매크로 후에도 prev는 process B.
7. schedule함수를 빠져나가고 process B 고유의 코드 실행
8. 다시 schedule함수 진입
9. prev는 process B.
10. next는 process A.
11. switch_to 매크로 호출(process A의 스택으로 change)

*process A의 context*
12. 4번과정에서 중단되었던 switch_to매크로 빠져나옴.
13. 전과 같은 이유로, prev는 여전히 process A, next또한 여전히 process B.

도움이 되었길..

swhong의 이미지

그러니까....

하나의 process context입장에서 보면,

prev변수는 현재 cpu에 올라가 있는 process의 stack을 가리킨다는 말씀이군요...(switch_to 매크로 전후해서)

아... 정말 감사합니다.

전 지금까지 prev와 next를 OS의 입장에서 바라보다 보니....

schedule()이란 함수를 수행을 하는 process가 호출한 다는 생각을

못하고 있었네요...아니 몰랐네요....

감사합니다. 열씸히 해서 님처럼 고수가 돼어야지....^^

- by swhong in jgdr.net -

swhong의 이미지

커널을 수정하면서 로그를 찍어 본 결과,

current macro를 사용하면, (current macro는 현재 프로세스의 stack pointer를 반환하므로....)

printk("PID : [%d]\n", current->pid);

switch_to();

printk("PID : [%d]\n", current->pid);

요렇게 하면 스케쥴링이 일어나면서 프로세스가 어떤 순서대로 수행을 하는지 알 수 있습니다.

이것은 prev, current, next 모두를 이용하여 로그를 찍어본 노가다의 산물입니다....카카...무식하죠?

움, 제가 하고 싶었던 것은 말이죠....

수행을 하는 프로세스들이 있는데, 요 프로세스들이 switched out될때 시간을 저장해 두고... 다시 switched in될때 저장해 두었던 시간값과 현재의 시간을 비교해서 그 프로세스가 얼마 동안이나 runque에서 대기를 했는지 알아 보고 싶었던 것이었습니다.

암튼, current macro로 접근하면 항상 현재의 process 의 stack을 가리킨다는 것을 확인한 기회였습니다....

sliver님 정말 깊은 감사를 드립니다.

- by swhong in jgdr.net -

sliver의 이미지

별 말씀을..

덕분에 저도 공부되고 좋습니다..^^;

댓글 달기

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