윈도우의 프로세스와 스레드 (2)
윈도우의 프로세스와 스레드 (2)
스레드
스레드는 프로세스 내의 실행부 코드입니다.
유닉스에서는 굳이 스레드를 작성하지않으면 스레드가 만들어지지않지만
윈도우 경우에는 스레드를 작성하지않아도 스케쥴링 문제로 인해 최소한 하나의 스레드가 동작하게됩니다.
작업관리자에는 모든 프로세스에 할당된스레드를 볼수있게 나타나 있으며 이렇게
스레드를 별도로 제작하지 않은 상태에서 발생되는 스레드를 주 스레드(Primary Thread) 라고 말합니다.
주 스레드는 인스턴스 번호가 0번으로 나타납니다.
스레드는 보편적으로 함수 하나 정도의 규모이며 메모리나 자원의 할당과 같은 문제들을 생각하지않아도 되고 스레드 모두 프로세스의 전역변수를 공용으로
사용하고 있기 때문에 인수 전달에서 장점을 갖게됩니다.
예를 들어 하나의 프로그램에서 인쇄작업을 별도의 스레드로 제작하였을 경우
사용자들은 인쇄작업을 수행하면서 다른 작업을 같이 수행할수있습니다.
이때 인쇄 명령을 내리고 스풀러에 데이터가 전달되기 전에 해당 스레드를 호출한 프로세스를 닫아버리면
인쇄가 중단 되어버리는 사태가 발생합니다.
스레드가 참조하고있는 프로세스의 자원이 모두 사라져버리기 때문입니다.
프로세스간 데이터를 전달하기 위해서 별도의 작업이 필요하지않습니다. 하나의 프로세스 내에서 모든 인수를 가지고 있으므로 전역변수 같은 경우나 할당된 자원은 모두 스레드가 기본적으로 같이 사용하게 됩니다
인쇄와 같은 작업이 프로세스 사이에서 이루어 진다면 상대적으로 데이터 설계하기도 힘들고, DLL을 참조하여
통합 코드를 사용한 인쇄 등이 어렵게됩니다.
물론 굳이 멀티스레딩으로 제작하지않고 , 단일 프로세스에서 DLL 내의 인쇄루틴을 호출하는 방법도 생각해 볼수있겠지만 그런 명령을 내리면
인쇄작업이 끝나기 전까지(스풀러에 들어가기 전까지) 다른 작업을 수행할수없을 것입니다.(스레드는 경량으로 제작되어 동시에 많은 스레드가 작동해도 그렇게 많은 부하는 주지않습니다,
반면 윈도우 시스템에서는 프로세스가 여러게 동작하면 시스템은 상대적으로 심각한 부하를 받게됩니다.
이런 이유로 웹서버의 성능 테스트및 상호 성능 비교를 유닉스 계열과 윈도우 계열에서 동일한 방식으로 할수없습니다.
실행 프로세스 기반의 CGI 을 사용하면 윈도우의 백전 백패가 명백하기 때문입니다.
컨텍스트
많은 프로그래밍 서적에서 프로그래밍 도중 갑자기 “문맥” 과같은 엉뚱한 말이 등장하곤합니다.
이말은 컨텍스트를 직역하다가 생긴 용어입니다.
컨텍스트는 “문맥”보다는 “정황”으로 번역되는것이 더 적절합니다.
윈도우에서 컨텍스트는 운영중인 시스템에서 스레드가 동작하기 위한 정황정보, 즉 멀티 테스킹 환경에서는
시간에 따라 점유 하는 스레드가 달라지는데 미처 자신의 작업을 마무리 못하고 전환 시간을 맞이 하게 되었을경우
스레드가 다시 자신의 작업에 돌아왔을때 원래 동작하던 작업내용을 저장해놓은것을 컨텍스트라고 합니다.
따라서 컨텍스트에서는 레지스터 내용, 스택포인트, 스레드 주소공간, 운영변수등이 저장되어있으며 마무리 되지 못한
스레드가 원래 동작하던 정확한 지점으로 복귀할수있는 최소한의 정보가 들어갑니다.
컨텍스트 전환은 시분한 멀티 태스킹에 따라 현재 실행중인 스레드가 시간에 따라 자꾸 변하면서 관련된 정확한
컨텍스트를 연결해주는 작업입니다.
다시 말하면 스레드의 전환 그자체라고 생각해도 크게 다르지않습니다.
컨텍스트는 Win32에서 사용하는 구조체중 CPU 에 종속적인 부분 이기때문에 윈도우 멀티스레딩 방식의 프로그램을 다른 컴퓨터로
이전할경우 컨텍스트와 관계에서 여러 문제가 발생할수있습니다.
Reference
https://karfn84.tistory.com/entry/%ED%8E%8C%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%9C%88%EB%8F%84%EC%9A%B0%EC%9D%98-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C