본문 바로가기
프로그래밍/운영체제

스레드(Thread)란

by bantomak 2023. 7. 31.
반응형

스레드

오늘날의 운영체제들은 프로세스를 효율적으로 사용하고, 작업의 유연성을 얻기 위해 멀티스레드를 지원한다.

 

스레드의 정의

프로세스가 생성되면 CPU 스케줄러는 프로세스가 해야 할 일을 CPU에 전달하고, 실제 작업은 CPU가 수행한다. 이때 CPU 스케줄러가 CPU에 전달하는 일 하나가 스레드이다.

 

그러므로 CPU가 처리하는 작업 단위는 프로세스로부터 전달받은 스레드인 것이다.

 

운영체제의 입장에서 작업 단위는 프로세스이고, CPU입장에서의 작업 단위는 스레드인 것이다.

따라서 프로세스 입장에서는 스레드를 다음과 같이 정의할 수 있다.

 

스레드 : 프로세스의 코드에 정의된 절차에 따라 CPU에 작업 요청을 하는 실행 단위.

 

작업(job)의 크기

크기 순서로 나열하면 다음과 같다.

Thread(operation) < Process(task) < Job

 

여러 개의 스레드가 모여 프로세스를 만들고, 여러 개의 프로세스가 모여 일괄처리하는 방법을 일괄 작업(job)이라고 한다.

가령, 집 짓기는 job이고, 인테리어, 바닥 시공, 수도관 설치 등은 프로세스이다. 이 각각 속에서 하나하나의 작은 일들(수도관 설치에서 배수관 설치, 수로 연결 등)은 스레드라고 한다.

 

멀티태스크, 멀티스레드, 멀티프로세싱, CPU 멀티스레드

  1. 멀티스레드 : 멀티스레드는 프로세스 내의 작업을 여러 개의 스레드로 분할함으로써 작업의 부담을 줄인다.
  2. 멀티태스킹(시간 공유) : 운영체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기업이다. 이렇게 여러 개의 스레드에 시간을 잘게 나누어주는 시스템을 시분할 시스템이라고 한다. 따라서, 시분할 시스템에서 처리하는 작업의 단위는 프로세스가 아니라 스레드이다.
  3. 멀티프로세싱 : CPU를 여러 개 사용하여 여러 개의 스레드를 동시에 처리하는 작업 환경을 말한다. 여러 개의 CPU 혹은 하나의 CPU 내의 여러 개의 코어에 스레드를 배정하여 동시에 작동하도록 하는 것이다.
  4. CPU 멀티스레드 : 한 번에 하나씩 처리해야 하는 스레드를 파이프라인 기법을 이용하여 동시에 여러 스레드를 처리하도록 만든 병렬 처리 기법이다. 이는 위의 소프트웨어적 기법인 멀티스레드와 달리 하드웨어적 기법이다.

즉, 멀티프로세싱은 processor(CPU)와 관련 있는 것으로 CPU의 수와 코어에 관련된 것이고, 멀티태스크는 시분할 운영체제의 운영방식을 이야기하는 것이다.

 

멀티스레드의 구조

스레드가 없던 이전에는 프로세스에서 여러 개의 작업을 동시에 처리하기 위해서는 fork(), exec()을 사용할 수밖에 없었다. 그러나 이는 프로세스를 만드는 것이므로 부하가 컸고, 서로 중복되는 영역도 많았다. 가령 fork()로 자식 프로세스를 만드는 경우 사실상 PID, PPID, CID 말고는 다를 게 없지만, code, 일부 영역이나, data 영역 등은 서로 정말 똑같았지만 따로 만들어서 관리해야 했다. 이러한 메모리의 중복은 비효율을 초래했고, 멀티태스킹에서의 낭비 요소로 자리 잡았다.

 

스레드는 이러한 멀티태스킹의 단점을 해결하려고 했다. 비슷한 일을 하는 2개의 프로세스를 만드는 대신, 코드, 데이터 등은 공유하면서 일을 하나의 프로세스 내에서 하는 것이다.

 

프로세스 내부의 영역은 크게 두 가지로 정적 영여과 동적 영역으로 나눌 수 있다.

 

  1. 정적영역 : 정적 영역은 프로세스가 실행되는 동안 바뀌지 않는 영역이다.
  2. 동적영역 : 스레드가 작업을 하면서 값이 바뀌거나 새로 만들어지거나 사리지는 영역이다.

 

이제 스레드가 정적 영역은 프로세스에서 공유하고, 동적 영역은 따로 갖게 되면 이전의 fork(), exec()으로 프로세스를 하나 더 만들어 비효율을 초래하는 일을 막을 수 있게 된다.

 

다음 그림은 멀티태스킹과 멀티스레드의 차이를 보여준다.

멀티태스킹은 fork()를 통해 하나의 프로세스를 추가로 생성한다. 이들은 동일한 정적 영역을 여러 개 만들게 됨으로써 부하를 일으킨다. 이 문제를 해결하기 위해서 프로세스 내에 여러 개의 스레드를 생성하는 멀티스레드는 코드, 파일 데이터 영역 등의 자원을 공유함으로써 자원의 낭비를 막고 효율성을 향상한다.

 

이런 의미에서 스레드는 가벼운 프로세스(Light Weight Process, LWP)라고 하고, 일반 프로세스는 무거운 프로세스(Heavy Weight Process, HWP)라고 부른다.

 

스레드와 프로세스의 차이

  1. 프로세스끼리는 서로 독립적이기 때문에 코드 실행의 순서가 영향을 미치지 않는다. 반면 스레드는 프로세스 내부의 영역 일부분을 공유하기 때문에 순서가 영향을 미친다.
  2. 프로세스끼리 통신하기 위해서는 주로 IPC(Inter Process Communication)를 사용한다. 반면 스레드는 변수(데이터 영역), 파일 등을 공유하고 있기 때문에 함수 호출이나, 전역 변수로 스레드 간 통신이 가능하다.
  3. 프로세스의 생성으로 fork()는 정적 영역(data, code, files)을 공유한다. 반면, 스레드의 경우에는 정적 영역은 공유하고, 동적 영억(stack, heap, register)은 따로 갖고 있어 더 효율적이다.

 

멀티스레드의 장단점

장점

  1. 응답성 향상 : 하나의 스레드만 사용하면 하나의 연산에 block 되지만 여러 스레드를 사용하면 하나가 오래 걸려도 block 되지 않아 응답성이 향상된다.
  2. 자원 공유 : 프로세스가 가진 자원을 모든 스레드가 공유함으로써 원활하게 진행이 가능하다.
  3. 효율성 향상 : 여러 개의 프로세스를 만드는 것보다 여러 개의 스레드를 만드는 것이 처리 시간이 단축된다.
  4. 다중 CPU 지원 : 2개 이상의 CPU를 가진 컴퓨터에서 멀티스레드를 이용하면 다중 CPU가 멀티스레드를 동시에 처리하여 CPU 사용량이 증가하고 프로세스 처리시간이 단축된다.

단점

  1. 스레드들이 프로세스의 자원을 공유하기 때문에 한 스레드의 영향이 다른 모든 스레드에 영향을 준다.
  2. 하나의 스레드로 구현하는 프로그램보다 훨씬 더 구현 난이도가 높아진다. 동기화 문제가 발생한다.

 

출처

 

OS는 할껀데 핵심만 합니다. 3편 스레드, 스레드와 프로세스

오늘날의 운영체제들은 프로세스를 효율적으로 사용하고, 작업의 유연성을 얻기 위해 멀티스레드를 지원한다. 프로세스가 생성되면 CPU 스케줄러는 프로세스가 해야 할 일을 CPU에 전달하고, 실

velog.io

댓글