21.06.19 11:36 작성
·
266
1
안녕하세요 선생님 좋은 강의 찍어주셔서 항상 감사합니다.
Sleep 강의를 듣다가 time slace와 context switching에 대해 궁금한게 생겨서 질문드립니다.
1.
time slace가 1초라고 가정하고 0.5초 정도에 어떤 이유로(sleep, system call, i/o..등등) thread가 중단되게 된다면 나머지 0.5초는 아무것도 안하고 1초가 됐을 때 context switching이 일어나는 건가요?
그게 아니라면 thread가 중단될 때 바로 context switching이 바로 발생해서 1초가 되면 시작되는 건가요?
2.
예전에 timeBeginPeriod 라는 함수를 사용해서 timer interrupt를 바꾼적이 있었는데 timeBeginPeriod(1)을 사용하게되면 context Switching이 자주 일어나게 되는건가요??
그게 맞다면 thread가 특정 상황(system call, io.. 등등)이 되면 block이 자동으로 되는것으로 알고있는데 timeBeginPeriod를 써서 더 자주 체크하는게 어떤 의미가 있는건가요??
답변 2
2
2021. 06. 19. 13:49
사실 위 질문에 대한 핵심 고찰은
[운영체제 코드는 누가, 언제 실행하지 ?]에 관련된 부분입니다.
사람들이 종종 헷갈려 하는 부분이,
유저레벨에서 동작하는 프로그램은 CPU가 실행해주는 것을 대부분 인지하지만
막상 커널 레벨 (운영체제 코드)는 누가/언제 실행하는지를 모호해 합니다.
그리고 정답은 당연히 커널레벨 코드도 CPU 상에서 돌아가야 한다는 것이고,
유저레벨에서 실행되던 CPU 소유권을
주기적으로 반환받아 운영체제 코드를 실행해야 합니다.
Context-Switching은 단순히 유저레벨->커널레벨 변환이 일어나는 상황이며
이 때 실행 상태와 관련된 정보(Context)를 저장해서 추후 복원할 수 있게 준비해둡니다.
따라서 1초의 timeslice를 0.5초만 사용하고 반납한다고 해서
0.5초를 정말 멍때리다가 반납하면 너무 극심한 낭비가 생기게 되니 합리적이지 않습니다.
그 시간에라도 얼마든지 실행할 코드는 (커널 코드 포함)있기 때문에
즉시 Context-Switching이 일어나게 됩니다.
파일 입출력, 콘솔 로그 찍기 등 다양한 상황에서
유저레벨에서 처리할 수 없는 기능이 필요할 때
운영체제에서 제공하는 API를 호출해서 커널의 도움을 받게 되는데
이 때도 마찬가지로 Context-Switching이 일어납니다.
그래서 실제로 간단한 로그 찍는 것 조차도 큐를 이용해 특정 쓰레드에 전달하고,
그 쓰레드가 전담해서 찍게 만들어서 게임 로직 쓰레드의 부담을
극한으로 줄이는 프로젝트도 더러 본 적 있습니다.
마지막으로 timeBeginPeriod은 사용해본 적이 없는데
검색해보니 시간 정밀도와 관련된 것으로 보이며
Context-Switching 횟수와는 무관할 것으로 보입니다.
0
2021. 06. 19. 15:43
매번 스케줄링에 대해 나올때 마다 헷갈린 부분이었는데.. 자세한 답변 너무 감사합니다.
열심히 해서 강의 잘 따라가도록 하겠습니다.