티스토리 뷰

CS/OS

[Thread chapter.01] Thread에 대해서

DEV_GOLF 2022. 11. 20. 16:07
반응형

컴퓨터는 하나의 프로그램을 실행하여 사용자들로 하여금 서비스를 이용할 수 있게 하는데 이를 Process 라고 한다. 이 프로세스는 안에 작업을 하는 주체가 따로 존재하는데 우리는 이를 Thread라고 부른다. 

 

Thread를 알기 위해서는 프로세스에 대해 알아야할 필요가 있다. 프로세스를 시작으로 멀티스레드 동시성 까지 천천히 알아가보도록 하자 

 

Process

Process는 CPU 자원을 할당 받아 프로그램을 실행시킨다. Process안에는 프로그램을 실행시키기 위한 여러 주체가 존재하는데 안을 간단하게 살펴보자.

 

1. PCB

프로세스 제어 블록이라 불리는 PCB는 프로세스 고유 식별자(PID)와 레지스터 프로세스 상태등을 저장하고 있다. 프로세스가 생성과 동시에 고유한 PCB가 생성되고 OS는 PCB를 통해 프로세스를 식별하고 제어할 수 있다.

 

2. memory

프로세스 실행 중 쌓이는 정보들을 담기 위해 프로세스마다 메모리가 할당되는데 data 특성 마다 다른 영역에 저장되는 특징이 있다.

 

  • code 영역
    • 기계어로 번역된 코드들이 저장되는 공간이다. CPU는 이 영역에 존재하는 명령어들을 해석하고 명령어에 맞는 기능이 실행된다.
    • Java나 Go 같은 컴파일 언어들은 컴파일이 되어 영역에 담기게 되고 python shell script 같은 스크립트 언어는 인터프리터에 의해 해석되어 영역에 담긴다. (물론 자바는 고차원 언어이므로 한 단계 더 해석 되며 인터프리터도 존재하는 하이브리드 형이다.)
  • data 영역
    • 전역 변수나 정적 변수가 존재하는 영역으로 프로그램 실행과 동시에 메모리에 올라간다. 프로그램이 종료가 될 때 까지 생명 주기가 이어지며 종료와 동시에 사라진다.
  • stack 영역 
    • 호출된 함수나 함수의 매개변수 지역변수가 쌓이는 영역으로 함수가 호출되는 시점에 쌓여서 종료가 되는 시점에 메모리에서 제거된다. 이 때 stack형태로 삭제 추가 되기 때문에 stack 영역이라고 부른다.
  • heap 영역
    • 동적으로 메모리가 할당되고 사라지는 영역이다. 사용자가 원하는 시점에 메모리를 할당한다. 하지만 이 영역에 오류로 인해 할당된 영역이 반환이 안되거나 너무 과도한 메모리 사용으로 인해 메모리 초과가 날 수 있는 영역인데 이 때 Java JVM에서는 GC를 지원하여 사용하지 않는 오래된 데이터는 삭제해주고 C언어에서는 직접 메모리 관리를 하여 heap 메모리 용량 관리를 해줘야한다.

 3. Thread

  • thread는 Process에서 작업을 하는 주체가 된다. 하나의 process에 여러 thread가 존재할 수도 있으며 이를 Multi-Threading이라고 한다. 이렇게 만들어진 여러 thread는 context-switching을 통해 동시에 실행하는 것 처럼 보여지는 동시성 프로그래밍이 가능하며 cpu를 할당 받아 병렬 프로그래밍도 가능하다. 

 

자 그러면 Process에 대해 알아보았으니 진짜 주제인 Thread에 대해 알아보도록 하자 

 

Thread가 중요한 이유?

요즘은 다양한 프로그램을 띄워놓고 작업을 하는 시대이다. 스트리머들은 방송을 하기 위해 게임과 방송용 프로그램 등 여러개를 띄워놓고 개발자는 개발을 위해 chrome, IDE, Infra tool 등 여러가지를 띄워놓고 작업을 한다. 이 과정에서 Process를 좀 더 효율적으로 쓰기위해 현재 많은 개발자들이 흔히 말하는 multi-thread 방식을 사용한다.

Multi-Thread vs Muti-Process

multi-thread는 Proccess에서 여러 thread를 생성하여 thread간 context-switching을 통해 동시성 프로그래밍을 한다. 이를 통해 성능 향상을 얻을 수 있다. 대표적으로 자바에서는 muti-thread를 지원하고 있다. 이를 통해 여러 요청을 여러 thread가 동시에 처리가 가능하다.

 

하지만 이건 thread 뿐만 아니라 proccess에서도 가능하다. process는 cpu를 할당받아 context-switching을 하며 동시성 프로그래밍이 가능해진다. 하지만 multi-thread를 많이 사용하고 있는데 이유는 다음과 같다.

 

  • 자원 공유
    • thread간 공유 자원을 갖고 있는데 이는 shared-memory나 messege-passing 방식 보다 자원 낭비가 덜하다.
  • 경제성
    • Process의 경우 context-switch를 하기 위해 많은 정보가 들어있는 PCB에 많은 정보가 담겨 있는데 이를 저장하고 캐시를 비우는 과정에서 너무 많은 자원이 소모 된다. thread는 비교적 적은 자원으로 context-switching이 가능하다.
    • Process의 경우 cpu 자원을 할당 받기 때문에 thread에 비해 비교적 많은 자원을 할당 받는다. 
  • 확장성
    • Process는 확장을 위해 너무 많은 비용이 발생하는 반면에 thread는 process안에서 thread를 하나만 더 생성하여 주면 되기 때문에 확장에 용이하다고 할 수 있다.

 

하지만 마냥 multi-thread가 좋다곤 할 수 없다. multi-thread는 결국 하나의 process에서 실행되기 때문에 하나의 thread가 문제가 생겨도 전체 thread에 영향을 미친다. 
하지만 process는 하나의 process에 문제가 생기더라도 속도가 좀 느려질 순 있어도 크게 영향을 받지 않는다는 점이 존재한다. 이는 process는 각각 독립된 cpu에서 동작하기 때문에 그렇다.

 

또한 multi-thread 환경에서 개발을 하다보면 concurrency 한 프로그래밍 중에 공유 자원에서 race-condition이 발생하여 데이터 일관성에 문제가 생길 수 있다. 

또한 연산의 원자성에도 문제가 발생하기 때문에 이를 신경 써야할 필요성이 있다. 

 

다음 챕터에서 알아보도록 하자. 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함