schedule()함수와 스택

syia의 이미지

schedule() 도 하나의 함수죠.

그렇다면 이 스케쥴 함수를 실행할때도 스택에 RET와 OFP등이 들어가고 할것인데..

이 부분은 커널의 스택에 들어가는건가요? 아니면 프로세스가 가지는 1G의 커널 스페이스에 들어가는건가요?...

그리고 또하나의 의문점은

schedule()함수는 커널코드 곳 곳 에서 실행되는데
그렇다면 이 schedule함수의 여러차례 호출이 중복되어

마치 재귀함수 호출처럼 스택에 쌓이지 않을까요?

예를들어 write시스템 콜을 호출했다면 해당 파일시스템 루틴에서
파일에 쓰기를 하고 프로세스를 wait queue에 넣겠죠?

그럼 write루틴이 끝나기전에 schedule()이 실행되고
wirte 루틴은 중간에 멈춘채로 남아있을텐데..

그렇게되면 여러개의 schedule()호출이 중복되어 꼬이지 않는건지 궁금합니다.;

어디 설명도 변변한걸 못찾겠고 혼자 골머리썩는중;;

고수님들의 한수 지도 부탁드려두 될까요 ^^;

raymundo의 이미지

syia wrote:
그리고 또하나의 의문점은

schedule()함수는 커널코드 곳 곳 에서 실행되는데
그렇다면 이 schedule함수의 여러차례 호출이 중복되어

마치 재귀함수 호출처럼 스택에 쌓이지 않을까요?

예를들어 write시스템 콜을 호출했다면 해당 파일시스템 루틴에서
파일에 쓰기를 하고 프로세스를 wait queue에 넣겠죠?

그럼 write루틴이 끝나기전에 schedule()이 실행되고
wirte 루틴은 중간에 멈춘채로 남아있을텐데..

그렇게되면 여러개의 schedule()호출이 중복되어 꼬이지 않는건지 궁금합니다.;

리눅스에서 정확히 schedule()함수가 그러는지 그 안에서 불리는 다른 함수가 그러는지는 모르겠는데, Unix 옛날 소스를 가지고 수업을 들었을 때의 기억으로는 스택이 쌓이지 않게 됩니다. 아예 리턴 어드레스와 스택 포인터 등의 값을 바꿔 버리거든요. 호출은 하는데 리턴은 되지 않는 셈이죠.

좋은 하루 되세요!

moonhyunjin의 이미지

schedule()은 유저가 호출하는게 아닌걸로 압니다. 프로세스가 어느 정도 시간을 실행하면 cpu에서 스케쥴러 쪽으로 넘기는 걸로 알고 있습니다. 물론 schdule()에서 자원할당 문제까지 다 해결을 하고요. ts_io_bitmap을 저장할겁니다.

그리고 리눅스가 32bit일때는 사용자 3G, 커널 1G사용하는 것으로 압니다. http://lxr.linux.no/source/include/asm-i386/thread_info.h#L28

저도 공부하는 입장이라 확답은 아닙니다. 고수가 낚이길 바랍니다. ^^

<- 이거면 안 되는 게 없어~
정품 소프트웨어 사용 캠패인

정태영의 이미지

moonhyunjin wrote:
schedule()은 유저가 호출하는게 아닌걸로 압니다. 프로세스가 어느 정도 시간을 실행하면 cpu에서 스케쥴러 쪽으로 넘기는 걸로 알고 있습니다. 물론 schdule()에서 자원할당 문제까지 다 해결을 하고요. ts_io_bitmap을 저장할겁니다.

정확하겐 cpu 에서 타이머가 인터럽트가 발생할 때마다 (tick) 카운트를 세고 일정 카운트 이상이 되면 schedule 을 호출할 겁니다 :)

그외엔 I/O 를 요청하게 됐을 때도 schedule 을 호출하게 되구요

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

owlet의 이미지

syia wrote:
schedule() 도 하나의 함수죠.

그렇다면 이 스케쥴 함수를 실행할때도 스택에 RET와 OFP등이 들어가고 할것인데..

이 부분은 커널의 스택에 들어가는건가요? 아니면 프로세스가 가지는 1G의 커널 스페이스에 들어가는건가요?...


schedule()이 호출된 프로세스의 스택에 들어가겠지요.
syia wrote:

그리고 또하나의 의문점은

schedule()함수는 커널코드 곳 곳 에서 실행되는데
그렇다면 이 schedule함수의 여러차례 호출이 중복되어

마치 재귀함수 호출처럼 스택에 쌓이지 않을까요?

예를들어 write시스템 콜을 호출했다면 해당 파일시스템 루틴에서
파일에 쓰기를 하고 프로세스를 wait queue에 넣겠죠?

그럼 write루틴이 끝나기전에 schedule()이 실행되고
wirte 루틴은 중간에 멈춘채로 남아있을텐데..

그렇게되면 여러개의 schedule()호출이 중복되어 꼬이지 않는건지 궁금합니다.;

어디 설명도 변변한걸 못찾겠고 혼자 골머리썩는중;;

고수님들의 한수 지도 부탁드려두 될까요 ^^;


schedule()을 호출한 프로세스는 schedule()이 리턴되기 전까지 잠들어있습니다. 따라서 schedule()이 중복호출되는 경우는 없겠지요.
syia의 이미지

아아 그런것이군요. 이제 이해가 됩니다. 감사합니다 ^.^

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.