3-1. Process 2, 3

운영체제 – 이화여대 KOWC 공개강의

 

Thread. 프로세스 내부에 CPU 수행 단위가 여러 개 있는 경우에 그것을 Thread라고 부른다.
프로세스는 하나만 띄워놓고 현재 CPU가 이 프로그램의 어느 부분을 실행하고 있는가 즉, 프로그램 카운터(PC)만 여러개를 두는 것이다. 각 쓰레드마다(각 CPU 수행 단위마다) 레지스터에 어떤 값을 넣고 PC가 코드의 어느 부분을 가리키면서 실행하고 있었는가를 개별적으로 유지하고 있다. CPU의 수행단위가 별도로 있기 때문에 각 쓰레드를 위한 Stack도 별도로 두어야 한다. 쓰레드라는 것은 프로세스 하나에서 공유할 수 있는 것은 최대한 공유하고(메모리 주소 공간, process state, 프로세스가 사용하는 각종 자원들을 쓰레드 간에 공유하고 있다) 별도로 가지고 있는 것은 CPU 수행과 관련된 정보들이다.(PC, register, stack)

쓰레드를 이용하는 것의 장점
예를 들면 웹브라우저에서 네트워크를 통해 네이버를 여는 것은 IO 작업이다. 웹페이지를 읽어오는 동안에는 오래걸리기 때문에 웹브라우저는 blocked 상태가 된다. 이렇게 되면 사용자는 웹브라우저를 읽어오는 동안 아무것도 하지 못하기 때문에 답답한 상태가 된다. 웹브라우저를 여러개의 쓰레드를 사용해서 만들어놓게 되면 하나의 쓰레드가 네이버 웹페이지의 그림을 불러오는 동안에 이 프로세스를 블록시키지 않고 또다른 쓰레드가 이미 읽어온 텍스트를 화면에 디스플레이 해주면 사용자 입장에서는 결과를 더 빨리 볼 수 있기 때문에 더 효과적이다.

같은 일을 하는 프로세스를 여러개 띄워 놓으면 각각이 메모리에 올라가야 하기 때문에 메모리 낭비가 심해진다. 그런데 만약에 웹브라우저를 여러개 띄우거나 아래한글 프로그램을 여러 개 띄워놓는다고 했을 때 그것을 각각의 서로 다른 프로세스로 만들게 되면 각각이 메모리에 별도의 코드 데이터 스택을 가지고 올라가야 하기 때문에 메모리 낭비가 심해진다. 이렇게 하지 않고 하나의 프로세스 안에 쓰레드만 여러개를 두게 되면 성능 향상, 자원 절약의 효과가 있다. 쓰레드를 사용하면 병렬성을 높일 수 있다.(CPU가 여러개인 컴퓨터만 얻을 수 있는 장점)

웹브라우저를 띄워놓고 어떤 사이트 주소를 치게 되면 제일 먼저 html 문서가 날아온다. 그러면 그 문서를 웹 브라우저를 화면에 디스플레이하려고 했더니 이 문서 안에는 여러가지 엠베디드된 이미지 들이 있었다. 그러면 웹브라우저가 해석을 해서 다시 이미지를 웹서버에 요청을 한다. 그래서 이미지들이 다 도착하면 html 화면에 텍스트도 집어넣고 이미지도 넣고 해서 하나의 페이지를 완성하여 사용자에게 보여주게 된다. 이러한 과정에서 제일먼저 html 문서를 읽어온 다음에 이미지들을 다시 웹서버에 요청을 한다. 그러면 이것이 오래걸리는 작업이기 때문에 보통은 이 프로세스를 블록시킨다. 사용자 입장에서는 답답해진다.. 프로세스가 블록되어 화면에 디스플레이가 안된다.. 웹브라우저를 여러개의 쓰레드를 사용해서 프로그램을 만들게 되면 먼저 html 문서를 가져오고 다시 이미지를 요청하는 순간에 원래는 프로세스는 블록이 되는데 네트웍 요청한 쓰레드만 블록이 되고 다른 쓰레드가 이미 읽어온 html 문서라도 화면에 먼저 디스플레이를 해주게 되면 사용자 입장에서는 responsiveness가 더 보장된다.

이것을 비동기식 입출력이라고도 볼 수 있다. 그림을 읽어오는 작업은 오래걸리지만 읽어오는 결과를 보고 다음 인스트럭션을 실행하는 것이 아니라 읽어온 결과와 무관하게 실행할 수 있는 것. 화면에 텍스트라도 보여주는 작업을 먼저 하게 되면 이것을 일종의 비동기식 입출력이라고 볼 수 있다. IO 결과를 보는 것이 아니라 IO 요청을 던져놓고 이 프로세스가 먼저 할 수 있는 다른 작업을 먼저 실행한다.

세번째 장점(Economy) 첫번째 장점의 responsiveness와는 다른 의미인데 좀 더 빠르다는 뜻이다. 프로세스를 하나 만드는 것은 오버헤드가 상당히 크다. 그런데 프로세스 하나 안에 쓰레드를 하나 추가하는 것은 오버헤드가 크지 않다. 컨텍스트 스위치가 일어날 때 하나의 프로세스로부터 또다른 프로세스로 CPU가 넘어가는 것은 오버헤드가 상당히 크다. 그런데 프로세스 내부에서 쓰레드간의 CPU 스위치가 일어나는 것은 간단한 일이다.(동일한 주소 공간 사용) 대부분의 문맥은 그대로 사용한다.
솔라리스(유닉스 계열) 운영체제의 경우에 쓰레드 하나 생성하는 것보다 프로세스를 생성하는 것이 오베헤드가 30배가 크고 CPU 스위치가 일어날 때도 쓰레드 하나를 스위치 하는 것보다 프로세스를 스위치 할때 오버헤드가 5배 크다.

앞의 세 가지 장점은 CPU 가 하나있는 환경에서도 적용할 수 있는 일반적인 이야기이고 마지막 내용은 CPU가 여러 개 있는 환경에서 쓰레드가 얻을 수 있는 장점이다. MP(MultiProcessor) 프로세스 안의 각각의 쓰레드가 서로 다른 CPU에서 병렬적으로 일을 할 수가 있다. 결과를 더 빨리 얻을 수 있는 장점이다.

쓰레드를 구현할 수 있는 방법
어떤 쓰레드는 운영체제 커널의 지원을 받고 있고, 또 다른 쓰레드 구현 방식은 라이브러리 형태로 구현하고 있다. 각각을 커널쓰레드, 유저 쓰레드라고 부른다. 커널 쓰레드는 쓰레드가 여러 개 있다는 사실을 커널이 알고 있다. 그래서 하나의 쓰레드에서 다른 쓰레드로 넘어가는 것도 커널이 CPU 스케줄링을 하듯이 넘겨주게 된다. 유저 쓰레드는 프로세스 안에 여러개의 쓰레드가 있다는 사실을 운영체제는 모른다. 유저 프로그램이 스스로 여러개의 쓰레드를 관리하는 것이다. 그렇기 때문에 유저레벨 쓰레드는 커널이 볼 때는 일반적인 프로세스로 보이는데 프로세스 본인이 내부에서 CPU 수행단위를 여러개 두면서 관리를 하는 것이기 때문에 구현사항의 제약점이 있을 수 있다.

댓글 남기기

Close Menu