이번 챕터에서 공부하게 될 thread는 프로세스와 비견이 되서 또 다른 실행의 단위에 해당하는 개념
하나의 프로세스는 기본적으로 메모리상의 이미지인 code, data, stack 으로 구성된다. 실행중인 프로세스일 경우 프로그램 카운터를 포함한 각종 레지스터를 가지고 있게된다. 프로세스가 소유한 자원에 해당하는 open file도 가지고 있음. (동일한 프로그램을 여러번 실행하면 여러개의 프로세스가 생성)
그림에 3개의 독립적인 프로세스가 있음.
3개가 독립적인 프로세스라고 해도 같은 프로그램을 3번 실행시킨 결과이다. 이들간에는 비슷하거나 동일한 부분이 있을 수도… 이 세개를 어떻게 합칠 수 있을까? code는 모두 동일하므로 실행중에 바뀌지 않음 3개중에 한개만 있어도됨. data나 file는 각 실행마다 다르긴 하지만 공유가 가능함.
반면 register과 stack은 실행시 마다 달라서 3개를 합치더라도 공유하는 것이 불가능.
여기서 실행시마다 달라지는 부분을 thread라고 한 다. thread = register + stack
멀티스레드 프로세스는 전통적인 프로세스와 유사하지만 동일한 프로그램이 여러번 실행되는 경우각 실행을 나타내는 regiset와 stack의 쌍 즉, 스레드가 프로세스안에서 추가가 되는 형식
앞장에서는 실행의 기본 단위가 프로세스라고 했음 . 프로세스가 os의 스케줄링 대상이라고 했음. 이제 멀티스레드 프로세스를 지원하는 운영체제에서는 실행의 기본 단위가 스레드가 된다. 그리고 스케줄링의 대상도 전체 프로세스가 아닌 개별 스레드가 된다. 3장에서 다룬 전통적인 포로세스는 프로세스안에 스레드가 하나인 single threaded process이다. 앞으로 프로세스라고 하면 스레드가 하나만 있는 멀티스레드 프로세스를 떠올리도록
요즘의 대부분의 응용프로그램들은 멀티스레딩 방식으로 동작, 하나의 응용은 여러개의 실행 흐름을 가진 독립적인 프로세스로 구현. 하나의 응용이 수행해야하는 여러개의 기능들은 개별 스레드로 구현. 예를 들어서 웹 브라우저라는 하나의 프로그램은 네트워크를 통해 데이터를 가져오는 스레드, 가져운데이터를 화면에 display하는 스레드 등.. 워드 프로세스 같은 응용프로그램은 그래픽을 표시하는 스레드, 키보드로 입력을 받는 스레드 , 백그라운드에서 스펠링 체크하는 스레드 등..
프로세스 하나를 생성하는 데 많은 비용이 든다. 프로세스는 생성하고 관리하는데 비용이 많이 드는 무거운 단위이지만 스레드 하나를 생성하는 것은 간단해서 스레드를 부를때 light weight 프로세스라고도 하고 같음 맥락으로 전ㅌ통적인 기존의 프로세스를 heavy weight라고 하기도 함.
멀리스레드 프로세스를 사용하면 프록램의 전체 코드 구성을 단순화하고 실행의 효율 증가.
현대의 운영체제 커널 자체가 여러개의 스레드로 이루어지기도함. 커널 내에서 여러개의 스레드가 동작. 각 스레드마다 메모리 관리 스레드, 인터럽트 처리 스레드 등, 특정 작업만을 수행 하기도 함.
멀티 스레딩이 사용되는 전현적인 예
그림은 멀티 스레드 프로세스로 구현하기 적합한 네트워크 서버 프로그램의 동작이다. 전형적인 웹 서버가 이 경우에 해당한다.
request: 클라이언트로부터 서버로 서비스 요청이 오면 사용자 요청을 대기하고 있던 스레드가 이를 받아서
2: 이 요청을 처리할 수 있는 서비스 스레드 생성해서 처리를 넘김