운영체제 Thread - 반효경 교수님

김소희·2024년 11월 8일
3

Thread

프로세스 내부에 CPU 수행 단위가 여러개 존재하는 경우에 이를 쓰레드라고 부른다.

보통 프로세스가 하나 주어지면 code, data, stack으로 구성된 주소 공간이 프로세스마다 만들어지는데 이 프로세스를 관리하기 위해서 운영체제 내부에는 PCB가 있어서 프로세스의 상태나 메모리의 어디 부분을 실행중인지 가리키는 프로그램 카운터나 레지스터 등등을 알고있다.
동일한 일을 하는 프로세스가 여러개 있다면 프로세스 마다 별도의 주소공간이 만들어져서 메모리가 낭비되게 되는데 이를 극복하기 위해 메모리 공간은 1개만 띄우면서 각각의 프로세스마다 다른 부분의 코드를 실행시킬 수 있게 프로그램 카운터만 여러개 두어 CPU 수행단위만 여러개 두고 있는 것을 쓰레드라고 할 수 있다.
인스트럭션을 시키려면 프로그램 카운터가 필요하고 각각의 쓰레드마다(각각의 CPU수행 단위마다) 프로그램 카운터가 코드 어느부분을 가르키면서 실행하고 있었는지를 별로도 유지하고 있음을 확인된다.

만약 코드에서 함수를 호출하고 결과값을 stack에 쌓게 되는데 CPU수행단위가 여러개이므로 스택도 여러개를 두어야 할 것이다.

즉 프로세스 하나에서 공유할 수 있는 것은 최대한 공유하고(메로리 주소공간, 프로세스 상태, 자원도 공유하고있다.) 다만 CPU수행에 필요한 프로그램 카운터나 레지스터나 스택은 쓰레드들이 별도로 가지고 있는다.

  • "A thread (or Lightweight process) is a basic unit of CPU utilization"
    쓰레드는 CPU를 구성하는 단위이다. 쓰레드를 이용하는 것이 프로세스를 여러개 사용하는 것보다 가볍기 때문에 쓰레드를 이용하는 프로세스를 Lightweight process라고 부르기도 한다.

  • Thread의 구성
    쓰레드가 독립적으로 가지고 있는 것은 program counter, register set, stack space이다.

  • Thread들이 공유하는 부분(=task)
    code와 data section, OS resources(운영체제 각종 자원)은 공유한다.

  • 전통적인 프로세스는 heavyweight process는 하나의 thread를 가지고 있다고 볼 수 있다.

Thread의 장점

만약 네트워크를 통해서 네이버에 들어가면 웹브라우저가 페이지를 불러오는 동안 blocked 상태가 되어 아무일도 못하는 상황이 발생한다. 사용자 입장에서는 웹페이지를 다 읽어오기 전까지 화면이 하얗게 보이기 때문에 답답한데 쓰레드를 여러개 활용한다면 하나의 스레드가 html을 읽고 텍스트를 뿌려주는 등의 작업을하고 인베드된 사진이 있는 경우에는 웹서버에 다시 요청을 하고 이미지를 받아서 뿌려줘야한다. 이때 여러개의 스레드가 이미지 부분을 담당하면 이미지 쓰레드만 blocked 상태가 되기에 텍스트라도 빠른 응답성을 주어 사용자의 답답함을 어느정도 해소할 수 있을 것이다.

비동기식 관점으로 본다면 이미지 때문에 기다리면서 blocked 상태가 되는 것이 아니라 할 수 있는 다른 작업을 수행할 수 있도록 처리하고 있다고도 볼 수 있다.

동일한 일을 수행하는 프로세스를 여러개 수행 할 때 자원을 절약할 수 있다. 예를 들어 아래한글 파일을 여러개 띄워놓을 때 쓰레드를 여러개 사용하여 사용된다.

CPU가 여러개 달린 컴퓨터를 이용할 때, 1000개의 행과 1000의 열을 곱하는 일을 수행한다고 할 때 이는 독립적인 연산이지만 서로 다른 CPU가 수행을 하고 결과를 합친다면 빠를 것 이다. 이럴 때 두개의 쓰레드가 각각의 CPU에서 작업하는 식으로 병렬적인 작업이 가능케 된다.

  • 다중 스레드로 구성된 테스크 구조에서는 하나의 서버 쓰레드가 blocked(waiting) 상태인 동안에도 테스크 내의 다른 쓰레드가 실행(running)되어 빠른 처리를 할 수 있다.

  • 자원을 아낀다.

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

  • (CPU가 여러개인 환경에서만 적용) 쓰레드를 사용하면 병렬성을 높일 수 있다.

쓰레드를 구현할 수 있는 방법

간략하게만 살펴보자.

  • 어떤 스레드는 운영체제 커널의 지원을 받고 있고(커널 스레드) 이 경우에는 쓰레드가 여러개라는 것을 운영체제가 알고 있다. 그래서 하나의 쓰레드에서 다른 쓰레드로 넘어갈 때 스케쥴링을 넘기듯 쉽게 동작한다.

  • 라이브러리를 통해 구현을 하는 경우도 있다.(유저스레드) 이 경우에는 운영체제가 여러개의 쓰레드임을 모르고 있고 프로세스가 쓰레드들을 관리한다. 그렇기 때문에 커널이 볼 때는 일반적인 프로세스로 인식하는데 그 때문에 약간의 구현상의 제약사항이 있을 수 있다.

  • 리얼타임 쓰레드라는 것도 있다.

<참고자료>
교보문고 책 구입처
이화여대 반효경 교수님 강의

profile
백엔드 개발자의 노트

0개의 댓글