[운영체제] 스레드, 프로세스 vs 스레드 본문

CS/운영체제

[운영체제] 스레드, 프로세스 vs 스레드

미니모아 2022. 4. 18. 00:31
반응형
반응형

스레드

프로세스의 실행 단위라고 할 수 있다. 프로세스 안에서 실행 되는 여러단위를 스레드라고 하며 기본적으로 프로세스마다 메인 스레드를 포함하여 최소 1개의 스레드를 갖는다.

스레드는 스레드 ID, 프로그램 카운터, 레지스터 집합 그리고 스택으로 구성된다. 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션 그리고 열린 파일이나 신호와 같은 운영체제 자원을 공유한다.

하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상 시키는 것을 멀티 스레딩이라고 한다. 이 경우 각각의 스레드는 독립적인 작업을 수행해야하기 때문에 각자의 스택과 PC 레지스터 값을 가지고 있다.

스택을 스레드마다 할당하는 이유

스택은 함수 호출시 전달되는 인자, 되돌아갈 주소 및 함수 내에서 선언한 변수 등을 저장하기 위해 사용되는 메모리 공간이므로 스택 메모리 공간이 독립적이어야 독립적인 함수 호출이 가능하다. 따라서 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당한다.

PC register를 스레드 마다 할당하는 이유

PC 값은 스레드가 명령어의 어디까지 수행하였는지를 나타낸다. 만약 스레드가 CPU를 할당 받았다가 스케줄러에 의해 선점 당했을 경우, 다시 되돌아가 명령어를 마쳐야하기 때문에 어디까지 수행했는지를 저장할 필요가 있다.

멀티 스레드

장점

프로세스를 이용하여 동시에 처리하던 일을 스레드로 구현할 경우 메모리 공간과 시스템 자원 소모가 줄어들게 된다. 스레드는 할당 자원들을 내부 스레드끼리 공유하면서 실행하기 때문이다.

스레드끼리 통신이 필요할 경우에도 별도의 자원을 이용하는 것이 아니라 전역 변수의 공간 혹은 heap 영역을 이용하여 데이터를 주고 받을 수 있기 때문에 시스템 콜과 통신 비용도 줄어들게 된다. 게다가 프로세스의 context switch 와 달리 스레드의 context switch는 캐시 메모리를 비울 필요가 없기 때문에 더 빠르다. 따라서 시스템의 처리능력(throughput)이 향상되고 자원 소모가 줄어들어 프로그램의 응답 시간도 단축된다.

  • 응답성 Responsiveness: 대화형 어플리케이션에서 background에서 어떤 이벤트를 기다리고 있는 상태이거나 응용프로그램이 긴 작업 을 수행하더라도 프로그램이 계속 수행되도록 해 사용자에 대한 응답성을 높인다.
  • 규모적응성 Scalability: 각각의 스레드가 다른 CPU에서 병렬로 처리될 수 있기 때문에 병렬성을 높일 수 있다.
  • 경제성 Economy: PCB를 새로 만들지 않아도 되기 때문에 빠르고 공간 비용도 줄어든다.
  • 자원 공유 Resource sharing: 코드와 데이터를 고유하므로써 같은 주소 공간 내에 여러 개의 다른 작업을 하는 스레드를 가질 수 있다.

단점

멀티 프로세스 기반으로 프로그래밍할 때에는 프로세스 간에 공유하는 자원이 없기 때문에 동일한 자원에 동시에 접근하는 일이 없었지만, 멀티 스레딩을 기반으로 프로그래밍 할 때에는 서로 다른 스레드가 데이터와 힙 영역을 공유하기 때문에 어떤 스레드가 다르 스레드에서 사용 중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있다. 따라서 동기화 문제에 신경 써야한다. 작업의 처리 순서를 컨트롤 하거나 공유 자원에 대한 접근을 컨트롤 한다. 하지만 이로 인해 병목 현상이 발생하여 성능이 저하될 수도 있기 때문에 과도한 락으로인한 병목 현상이 생기지 않도록 주의해야한다.

멀티 스레드 vs 싱글 스레드

싱글 스레드는 하나의 프로세스에서 하나의 스레드를 실행한다. 그렇기 때문에 자원 접근이나 context switch에 신경쓰지 않아도 된다. 하지만 여러 CPU를 활용하지 못하고 여러 작업을 동시에 처리하지 못한다.

멀티스레드는 하나의 프로세스에서 여러 스레드를 실행하며 자원을 공유한다. context switch에 시간이 걸릴 수 있기 때문에 단순 작업은 오히려 싱글 스레드보다 느릴 수 있다.

Case Study

멀티 쓰레드의 예시

여러 요청을 동시에 처리하는 웹 서버의 대부분이 멀티 쓰레드를 사용한다.여러 client들에게 요청이 날아왔을 때 사용자가 원하는 작업을 바로 할 수 있는 이유는 멀티쓰레드 환경이기 때문이다. 대표적으로 스프링이 이에 속한다.

사용자 요청이 올 때마다 스레드를 만들기 때문에 요청이 너무 많으면 오버헤드가 발생한다. 따라서 스프링에서 beans을 싱글톤으로 제공하는 이유도 이러한 오버헤드를 막기 위해 사용자의 스레드를 공유하기 위함이다.

 

동기화 문제

스레드들은 공유 자원을 사용하기 때문에 동기화 문제가 일어날 수 있다. race condition은 실행 결과가 접근이 발생한 특정 순서에 의존하는 상황을 말한다. 이를 방지하기 위해서 한번에 하나의 프로세스만 공유 자원에 접근할 수 있도록 해야하며, 이를 위해 프로세스들이 동기화 되어야한다.

스레드의 실행

ULT (User Level Thread)

스레드 관리를 라이브러리 형태로 어플리케이션 레벨에서 구현한 형태이다. 커널은 메인 스레드 하나를 가지고 유저 레벨에서 멀티 플렉싱하여 함수 형태로 콜하여 사용한다.

스레드 사이의 스위칭 시에 커널의 개입 없이 유저 레벨에서 이루어지기 때문에 빠르다.

커널에서 쓰레드 정보를 전부 알지 못하기 때문에 하나만 block되어도 전체가 block되는 문제가 있다.

KLT(Kernerl Level Thread)

가장 직관적인 방식으로 PCB를 커널 내부에서 만들어주고 리턴해주는 형태이다. 스레드의 관리(생성, 종료, 제어)가 커널에서 이루어진다. 스레드 간의 context switching이 일어나면 커널 모드에서 context를 TCB에 저장하고 새로운 스레드를 선택한 후 restore한다. 모드 스위칭이 필요하기 때문에 스레드 opreation시 시스템 콜이 필요하고 때문에 유저 레벨보다 느리고 오버헤드가 크다.

프로세스와 스레드의 차이

프로세스는 운영체제로부터 자원을 할당 받는 작업의 단위이고 쓰레드는 프로세스가 할당 받은 자원을 이용하는 실행 단위이자 스케줄링의 단위이다.

프로세스는 각각 별도의 주소 공간을 할당 받는데 반해 스레드는 stack만 할당 받고 나머지 자원은 내부 스레드들끼리 공유할 수 있다. 따라서 스레스의 생성이 프로세스보다 더 빠르다. 프로세스는 fork() 시에 프로세스 이미지 전체가 복사되기 때문이다.

switching 측면에서도 한 프로세스에서 스레드를 스위칭하는데 걸리는 오버헤드가 더 적다.

멀티 프로세스 vs 멀티 스레드

멀티 프로세스는 하나의 컴퓨터에 여러 CPU를 장착하여 하나 이상의 프로세스들을 동시에 처리한다. 멀티 스레드는 하나의 응용 프로그램에서 여러 스레드를 구성해 각 스레드가 하나의 작업을 처리하는 것이다.

멀티 스레드는 멀티 프로세보다 적은 메모리 공간을 차지하고 context switching 이 빠르다는 장점이 있다. 하지만 오류로 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있으며 동기화 문제가 생길 수 있다.

반면에 멀티 프로세스는 하나의 프로세스가 죽더라도 다른 프로세스에는 영향을 끼치지 않기 때문에 정상적으로 수행될 수 있다. 하지만 멀티 스레드보다 메모리 공간과 CPU 시간을 차지한다는 단점이 있다.

따라서 이 둘은 동시에 여러 작업을 수행한다는 점에서 같지만 적용해야하는 시스템의 특성에 따라 적합한 동작 방식을 선택하여 적용해야한다.

 

반응형

'CS > 운영체제' 카테고리의 다른 글

[운영체제] 프로세스 동기화  (0) 2022.04.19
[운영체제] 스케줄러  (0) 2022.04.18
[운영체제] 프로세스  (0) 2022.04.17
[운영체제] 운영체제  (0) 2022.04.17
[운영체제] 캐시 Cache  (0) 2022.04.17
Comments