[CS] 멀티쓰레드

이정석·2023년 7월 24일
0

CS

목록 보기
1/7

프로세스

정보처리기사를 공부할 때나 학교에서 시스템 소프트웨어 수업을 들을 때 프로세스라는 단어를 많이 볼 수있다. 제일 헷갈렸던 것은 프로그램프로세스, 멀티 프로세싱멀티 쓰레드이었다.

가장 알아듣기 쉬운 표현은 실행중인 프로그램이었다.

1. 프로세스의 위치와 상태

프로세스는 프로그램이 실행될 때 생성되며 RAM(주기억장치)에 위치한다. 물론, 한번에 여러개의 프로세스를 실행할 수 있으며 프로세스가 여러 개 실행되고 있는 것을 멀티프로세싱이라 한다.

프로세스의 대표적인 상태는 다음과 같다.

  • 준비(Ready): 프로세스가 프로세서를 할당받기 위해 기다리는 상태
  • 실행(Run): 프로세스가 프로세서를 사용해 명령을 실행하고 있는 상태
  • 대기(Wait)상태: 프로세스가 특정한 이벤트를 기다리는 동안 프로세서를 사용할 수 없는 상태

위에서 말하는 프로세서란 CPU를 의미한다.

2. PCB

PCB(Process Control Block)는 운영체제가 프로세스에 대한 중요한 정보들을 저장하는 곳으로 프로세스의 상태, 식별자같은 여러가지 정보를 가지고 있다.

  1. 프로세스 식별자
  2. 프로세스 상태
  3. CPU 레지스터 정보: Context Switching에 사용된다.
  4. 각종 포인터

이 외에도 프로세스에 대한 정보들을 가지고 있으며 PCB는 프로세스가 생성될 때 프로세스 고유의 PCB가 생성되며 프로세스가 소멸되면 PCB도 사라진다.


쓰레드

프로세스와 함께 묶이는 개념은 역시 쓰레드라고 생각한다. 쓰레드는 프로세스 내의 독립적인 작업단위로 같은 프로세스 내의 다른 쓰레드와 프로세스의 메모리, 자원을 공유할 수 있다.

싱글 쓰레드

알고리즘 문제를 풀 때나 학교를 다니면서 평상시에 만든 과제들을 모두 싱글 쓰레드로 작동 되었다고 할 수 있다. 물론 연산 순서나 처리 순서를 따라갈 수 있고 다른 교착상태와 같은 문제상황을 고려하지 않아도 된다는 장점이 있다. 하지만, 여러 쓰레드를 사용할 수 있는데 싱글 쓰레드를 사용한다는 것은 매우 큰 낭비가 될 수 있다.


멀티 쓰레드

쓰레드는 각각의 호출스택을 가지고 있다. 호출스택은 쓰레드가 실행할 함수에 대한 정보를 저장하기 위한 스택이다. 리턴주소나 로컬 변수, 파라미터와 같은 내용들이 이에 포함된다.

하나의 프로세스에 여러개의 쓰레드를 사용하는 상황은 아래 그림과 같이 나타낼 수 있다. 앞에서 말한 호출스택과 다르게 힙은 모든 쓰레드가 공유하는 메모리 영역으로 특정 메모리 공간을 여러 쓰레드가 동시에 접근할 수 있다.

멀티 쓰레드는 싱글 쓰레드와 다르게 동시에 여러 작업을 수행할 수 있다. 즉, 특정작업에 병렬성을 향상시킬 수 있다. 또한, 멀티 쓰레드 환경에서 작동하는 프로그램을 사용하는 사용자는 짧은 응답시간을 보장받을 수 있고 이용 효율이 증가한다.

물론, 경쟁조건이나 교착상태와 같은 문제상황을 방지해야 한다.

1. 멀티쓰레드는 언제 사용하는가

  1. 긴 시간이 필요한 작업을 진행함과 동시에 다른 일을 진행하고자 할 때
  2. 동시에 여러 요청을 처리하고자 할 때
  3. CPU와 같은 컴퓨터자원을 모두 활용하고자 할 때

만약, 서버나 하드디스크에 존재하는 파일을 불러오는 시간동안 화면이 멈춰있는다면 이를 이용하는 사용자는 지루해 할 것이다.

게임이나 SNS메신저 같은 경우 연결하고 있을 때 특정 애니메이션이나 진행상황을 화면에 출력하곤 하는데, 여기에 멀티 쓰레드가 사용된다. 어떤 쓰레드는 데이터를 가져올 것을, 또 다른 쓰레드는 진행상황을 출력하는 방식으로 구현할 수 있다.

2. 멀티쓰레드를 사용할 때의 문제점

멀티 쓰레드를 사용할 때 발생하는 문제점이 있는데 여러 쓰레드가 동시에 실행될 때 공유 자원에 동시에 접근하거나 수정하는 상황에서 주로 발생한다.

  • 경쟁상태(Race condition)
  • 교착상태(Deadlock)
  • 기아상태(Starvation)
  • 우선순위 역전(Priority Inversion)

위의 문제점들은 처음에 말한 동시성자원 공유에 더해서 쓰레드 스케줄링우선순위에 의해서 발생한다.

Mutex, Semaphore와 같은 공유 자원 접근제어 방법과 ThreadPool과 같은 쓰레드 수를 조절하는 방법 등 여러 방법이 존재한다.

3. 쓰레드를 동시에 실행?

쓰레드를 동시에 실행한다는 말을 할 때, 다음과 같은 의문이 들 수도 있다.

쓰레드가 수백개여도 동시에 실행할 수 있나?

동시에 실행되는것은 CPU의 코어 개수와 실행될 쓰레드수에 달려있다. 요즘 CPU에는 쿼드코어, 옥타코어와 같이 코어가 많이 있다. 코어는 연산을 진행할 프로세서를 의미하고 프로세스나 쓰레드는 작업을 의미하므로 개수관계가 동시에 진행되는지에 영향을 미친다.

  • CPU코어가 쓰레드수보다 많다면 쓰레드가 동시에 실행된다.
  • CPU코어가 쓰레드수보다 적다면?

CPU는 여러 쓰레드를 일정 시간마다 번갈아 가면서 실행하게 되는데 각 쓰레드를 실행하던 중 다른 쓰레드를 실행하는 과정을 Context Switch라고 한다. 이때 Context Switch가 발생하는 시간단위를 Time Slice라고 한다. 즉, 단위시간마다 쓰레드는 일정한 처리율을 보장받을 수 있다.

Context Switch하는데는 시간이 걸리지 않는 것이 아니다. 쓰레드 수가 많아질 수록 Context Switch가 더 자주 발생하게 되고 전체 프로세스의 성능에 좋지 않은 영향을 미칠 수 있다.


참고자료

  1. 길벗알앤디. 정보처리기사 필기 - 시나공. 길벗, 2021
  2. 배현직. 게임 서버 프로그래밍 교과서. 길벗, 2020
profile
게임 개발자가 되고 싶은 한 소?년

0개의 댓글