커널의 schedule() 함수에서....
글쓴이: swhong / 작성시간: 화, 2003/02/25 - 9:22오후
커널소스중,
/linux/kernle/sche.c 의 schedule()함수중 다음 부분...
. . switch_to(prev, next, prev); . .
요기서 흐름이 조금 헤깔립니다.
움, 즉 switch_to 함수 호출전에 process의 task_struct를 접근하려면,
prev-> 요렇게 접근하는 것이 맞는지요?
그리고, switch_to 함수 호출후에 새로 올라온 process의 task_struct 를 접근하려면,
next-> 요렇게 접근하는 것이 또한 맞는지요?
움, 소스를 보면 맞는것 같은데...
워낙에 조심스러운지라...
고수님들의 조언이 필요합니다....
Forums:
Re: 커널의 schedule() 함수에서....
네, 맞습니다.
아닙니다. 이때에도 prev->로 접근해야 합니다.
next는 schedule하고자 하는 process입니다.
즉, 이번에 switch_to에 의해 실행되는 process의 context에서는,
prev가 자기자신이고 next가 자신이 switched out될때 schedule된
process입니다.
이 process가 다시 switched in된 상황에서는 next는 별 의미가 없겠죠.
그리고 prev-> 대신 current->로 해도 같을 겁니다.
그렇다면,
그러니까 A와 B의 prev는 서로 다른 프로세스라는 이야기죠?
즉 A는 switched out되는 process이고, B는 switched in된 process라고 이해해도 되나요?
- by swhong in jgdr.net -
Re: 그렇다면,
어떻게 해석하냐에 따라 헷갈릴 수가 있을 거 같아서.. :)
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.
도움이 되었길..
아~
그러니까....
하나의 process context입장에서 보면,
prev변수는 현재 cpu에 올라가 있는 process의 stack을 가리킨다는 말씀이군요...(switch_to 매크로 전후해서)
아... 정말 감사합니다.
전 지금까지 prev와 next를 OS의 입장에서 바라보다 보니....
schedule()이란 함수를 수행을 하는 process가 호출한 다는 생각을
못하고 있었네요...아니 몰랐네요....
감사합니다. 열씸히 해서 님처럼 고수가 돼어야지....^^
- by swhong in jgdr.net -
결과
커널을 수정하면서 로그를 찍어 본 결과,
current macro를 사용하면, (current macro는 현재 프로세스의 stack pointer를 반환하므로....)
요렇게 하면 스케쥴링이 일어나면서 프로세스가 어떤 순서대로 수행을 하는지 알 수 있습니다.
이것은 prev, current, next 모두를 이용하여 로그를 찍어본 노가다의 산물입니다....카카...무식하죠?
움, 제가 하고 싶었던 것은 말이죠....
수행을 하는 프로세스들이 있는데, 요 프로세스들이 switched out될때 시간을 저장해 두고... 다시 switched in될때 저장해 두었던 시간값과 현재의 시간을 비교해서 그 프로세스가 얼마 동안이나 runque에서 대기를 했는지 알아 보고 싶었던 것이었습니다.
암튼, current macro로 접근하면 항상 현재의 process 의 stack을 가리킨다는 것을 확인한 기회였습니다....
sliver님 정말 깊은 감사를 드립니다.
- by swhong in jgdr.net -
별 말씀을..덕분에 저도 공부되고 좋습니다..^^;
별 말씀을..
덕분에 저도 공부되고 좋습니다..^^;
댓글 달기