글 수 83
전 전산과 커리큘럼으로 익힌게 아니라서 교과서적인 내용으로는 설명드리기 어렵습니다.제 스타일로 간단히 설명을 해보겠습니다.
모든 실행파일(Windows에서는 .exe, .com, 그 외 os의 실행가능한 모든 파일)은 os위에서 프로세스라는 단위로 리소스를 할당받고 실행됩니다.
하나의 exe는 하나의 프로세스라고 봐도 됩니다.
모든 프로세스는 하나 이상의 스레드를 가지고 있습니다.
예로 main()으로 시작하는 어플리케이션의 엔트리포인트는 기본 스레드의 시작점이라 할 수 있습니다.멀티스레드의 경우 이 엔트리 포인트를 여러개 주는 것입니다.
모든 스레드는 각각 Thread Context라 불리는 자료구조를 가지고 있습니다.해당 스레드의 스케쥴링할 당시의 상태를 저장해놓은것이죠.ip레지스터(코드의 어드레스를 가리키는 레지스터),sp레지스터(스택 포인터레지스터)를 비롯한 모든 레지스터 상태와 기타 정보를 가지고 있습니다.따라서 각 스레드는 독립적인 상태를 유지할수 있습니다.
그럼 스레드는 어떻게 스케쥴링(수행)되느냐?
os는 메인보드의 타이머 칩에 인터럽트 주기를 세팅해놓고 타이머 인터럽트를 주기적으로 받습니다.이로서 어플리케이션이 cpu운영권을 os에 반납하거나 특정 io인터럽트등을 이용하지 않고서도 cpu운영권을 정해진 시간 주기로 얻어낼수 있습니다.
스레드가 100개쯤 있다고 치면 타이머 인터럽트가 발생할때마다 os에서 어떤 스레드를 스케쥴링할지 결정하는것입니다.
타이머 인터럽트가 발생했을때, 이전 스레드를 비활성화 시키고 다른 스레드를 또 활성화시키고, 또 다음번 타이머 인터럽트가 발생했을때 다른 스레드를 활성화시키고..이런식으로 짧게 짧게 여러 스레드를 돌려가며 스케쥴링 시키면 동시에 여러개의 스레드가 돌아가는것으로 보이게 됩니다.
개념적으로 한 스레드당 20ms씩스케쥴링하기로 했다면 20ms마다 타이머 인터럽트를 받고 그때마다 한번씩 스케쥴링할 스레드를 바꿔준다면 20*100ms가 지났을 시점에서 100개의 스레드는 모두 조금씩 실행된 상태겠죠.
멀티 프로세스도 마찬가지인데 Windows의 경우는 실제 프로세스단위의 스케쥴링은 없고 내부적으론 모두 스레드 단위로 스케쥴링을 시킵니다.
도움이 되셨는지? 이해 안되는 부분은 추가 질문해주세요.그리고 질문은 리플로 달지 마시고 바로 게시물로 써주시기 바랍니다.
모든 실행파일(Windows에서는 .exe, .com, 그 외 os의 실행가능한 모든 파일)은 os위에서 프로세스라는 단위로 리소스를 할당받고 실행됩니다.
하나의 exe는 하나의 프로세스라고 봐도 됩니다.
모든 프로세스는 하나 이상의 스레드를 가지고 있습니다.
예로 main()으로 시작하는 어플리케이션의 엔트리포인트는 기본 스레드의 시작점이라 할 수 있습니다.멀티스레드의 경우 이 엔트리 포인트를 여러개 주는 것입니다.
모든 스레드는 각각 Thread Context라 불리는 자료구조를 가지고 있습니다.해당 스레드의 스케쥴링할 당시의 상태를 저장해놓은것이죠.ip레지스터(코드의 어드레스를 가리키는 레지스터),sp레지스터(스택 포인터레지스터)를 비롯한 모든 레지스터 상태와 기타 정보를 가지고 있습니다.따라서 각 스레드는 독립적인 상태를 유지할수 있습니다.
그럼 스레드는 어떻게 스케쥴링(수행)되느냐?
os는 메인보드의 타이머 칩에 인터럽트 주기를 세팅해놓고 타이머 인터럽트를 주기적으로 받습니다.이로서 어플리케이션이 cpu운영권을 os에 반납하거나 특정 io인터럽트등을 이용하지 않고서도 cpu운영권을 정해진 시간 주기로 얻어낼수 있습니다.
스레드가 100개쯤 있다고 치면 타이머 인터럽트가 발생할때마다 os에서 어떤 스레드를 스케쥴링할지 결정하는것입니다.
타이머 인터럽트가 발생했을때, 이전 스레드를 비활성화 시키고 다른 스레드를 또 활성화시키고, 또 다음번 타이머 인터럽트가 발생했을때 다른 스레드를 활성화시키고..이런식으로 짧게 짧게 여러 스레드를 돌려가며 스케쥴링 시키면 동시에 여러개의 스레드가 돌아가는것으로 보이게 됩니다.
개념적으로 한 스레드당 20ms씩스케쥴링하기로 했다면 20ms마다 타이머 인터럽트를 받고 그때마다 한번씩 스케쥴링할 스레드를 바꿔준다면 20*100ms가 지났을 시점에서 100개의 스레드는 모두 조금씩 실행된 상태겠죠.
멀티 프로세스도 마찬가지인데 Windows의 경우는 실제 프로세스단위의 스케쥴링은 없고 내부적으론 모두 스레드 단위로 스케쥴링을 시킵니다.
도움이 되셨는지? 이해 안되는 부분은 추가 질문해주세요.그리고 질문은 리플로 달지 마시고 바로 게시물로 써주시기 바랍니다.