본문 바로가기

운영체제

[운영체제]5. Process(2)

Thread란 무엇일까요 ?


음.. 이렇다고 한다.


전 포스팅에서 올렸듯이. 프로세스가 생성되면 아래처럼 stack, data, code영역이 생성된다.



[스레드의 탄생 이유]


그리고.. 이 만들어진 프로세스를 관리하기 위해서 운영체제 data 부분에 PCB(Process Control Block)을 하나 만들어두어서 관리를 한다고 했었다.

이 프로세스의 상태와 프로세스 ID, 프로그램 카운터(메모리 어느부분을 실행하는가?)등이 이 PCB에 존재한다.

만약에, 동일한 일을 처리하는 프로세스가 여러개 있다고 가정할경우, 이러한 주소공간이 그 프로세스의 수만큼 만들어지게 될것이고, 이것은 결국 메모리의 낭비를 가져오게 된다.


[스레드 탄생 결과]


같은일을 하는 프로세스를 여러개 띄워놓고 싶으면 주소공간은 하나만 띄워놓고, 프로세스마다 서로 다른 부분의 코드를 실행할 수 있게 해주면 될것.(스레드라는놈이)

그래서 결과적으로 code, data, stack은 하나만 띄워놓은 후 CPU가 코드의 어느 부분을 실행하고 있는가. 즉 프로그램 카운터만 여러개 두는 것이다.

(= 프로세스 하나에 cpu 수행단위만 여러개 두고있다)

스레드에서는 인스트럭션을 실행하기 위해서 현재 코드의 어느부분을 실행하는지를 가르키는 프로그램 카운터가 있어야 될것.

cpu에서 실행되면서 메모리에 어떠한 레지스터 값들을 셋팅해서 실행하고 있을것이다.

그래서 각 스레드마다 레지스터나 코드 어느부분을 실행중인지 프로그램 카운터가 개별적으로 존재할것

스레드 하나가 코드 어느 부분을 실행하다가 함수호출을 하면 그 함수를 호출하고 리턴한 관련 정보를 stack에 쌓아두니, 스레드마다 별도의 stack이 존재할것


결과적으로 스레드안에는 프로세스가 사용하는 각종 자원들을 서로간에 공유하고 ( 이 공유하는 자원들을 task라고 부른다.),

CPU수행과 관련된 PC나, 레지스터, 스택같은 것들만 별도로 보관한다.




보통 멀티스레드 = lightweight process, 다중스레드 = heavyweight process 라고 부른다.


-다중 스레드로 구성된 테스크 구조에서는 하나의 서버스레드가 blocked(waiting)상태인 동안에도, 동일한 태스크 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있다 (응답처리가 빨라진다)


-동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율과 성능 향상을 얻을 수 있다.


-스레드를 사용하면 병렬성을 높일 수 있다




스레드의 장점 4가지


1. 응답성 - 사용자 입장에서 빠르다!

예를들어, 다중스레드일 경우, 웹 브라우저를 띄워놓고 어떤 포털사이트의 홈페이지 주소를 치게 되면 제일먼저 그 홈페이지에서 html문서가 날라오면, 웹 브라우저에 호면에 디스플레이를 한다. 그러나, 하려고 봤더니 그 문서 안에는 여러가지 이미지파일들이 있고, 그 이미지 파일들을 웹브라우저가 해석해서 다시 웹서버에게 요청을한다. 그래서 그 이미지들이 날아오면 한번에 웹 브라우저에 출력해서 그 이미지 파일들이 날아오기 전까지는 blocked를 해놓을것인데, 다중스레드의 경우 이미지 파일들을 웹서버에게 요청할때, 요청한 순간 프로세스를 블록시키지 않고, 요청한 스레드만 블럭되고, 나머지는 일을 처리해서 이미지 도착 전, html문서만 먼저 보여주기 때문에 사용자 입장에서는 답답하지 않을 것이다. 그래서 더 빨리 결과를 볼수 있어서 응답성이 좋다.


2. 자원 공유

똑같은 일을 하는 프로그램이 여러개 있는데, 그것을 별도로 프로세스로 사용하는 거 보다는 하나의 프로세스를 만들고 그 안에 cpu수행 단위만 여러개 두게되면 코드, 데이터, 각종 자원들은 스레드들이 공유하게 된다. 그렇게 되면 자원을 좀더 효율적으로 쓸 수 있다.


3. 경제성 (좀더 빠르다라는 의미)

프로세스를 하나 만드는것은 오버헤드가 상당히 크다. 그런데 프로세스 하나에 스레드를 추가하는것은 오버헤드가 크지 않다.

컨텍스트 스위치처럼 다른 프로세스로 CPU 넘어갔을때는 (문맥교환) 오버헤드가 상당히 컸으나 스레드 같은 경우는 동일한 주소공간을 쓰는거기 때문에 대부분의 문맥은 그대로 사용가능하여 좋다.


================================위에까지는 하나의 CPU 상황, 아래는 멀티프로세서 ==================================


4. Multi Processer 아키텍쳐의 경우

프로세스는 하나지만 그 안에 스레드가 여러개 있으면 각각의 스레드가 서로 다른 cpu에서 병렬적으로 일을 처리할 수 있다.

그렇게되면 결과를 더욱 빨리 얻을 수 있다.


위 그림은 스레드를 구현하는 법이다.

1. 어떤 스레드는 운영체제의 커널을 지원받고 있다 => 커널스레드

2. 다른법은 라이브러리 형태로 스레드를 지원한다 => 유저스레드


커널스레드는 스레드가 여러개있다는 사실을 운영체제 커널이 알고있다.

그래서 하나의 스레드에서 다른 스레드로 넘어갈때도 cpu스케쥴링 하듯이 커널이 넘겨주게 되는것이다.

유저스레드는 프로세스 안에 스레드가 여러개 있다는 사실을 운영체제가 모르고, 유저 프로그램이 스스로 여러 스레드를 관리하는것이다.

이렇게 되면 약간의 구현상의 제약점은 있을 수 있다.

real-time threads도 있다.


개념상으로 커널스레드, 유저스레드, 실시간스레드 개념만 알아두자!!



Today :
Yesterday :
Total :