정보처리기사를 공부할 때나 학교에서 시스템 소프트웨어 수업을 들을 때 프로세스
라는 단어를 많이 볼 수있다. 제일 헷갈렸던 것은 프로그램
과 프로세스
, 멀티 프로세싱
과 멀티 쓰레드
이었다.
가장 알아듣기 쉬운 표현은
실행중인 프로그램
이었다.
프로세스는 프로그램이 실행될 때 생성되며 RAM(주기억장치)에 위치한다. 물론, 한번에 여러개의 프로세스를 실행할 수 있으며 프로세스가 여러 개 실행되고 있는 것을 멀티프로세싱
이라 한다.
프로세스의 대표적인 상태는 다음과 같다.
위에서 말하는
프로세서
란 CPU를 의미한다.
PCB(Process Control Block)는 운영체제가 프로세스에 대한 중요한 정보들을 저장하는 곳으로 프로세스의 상태, 식별자같은 여러가지 정보를 가지고 있다.
이 외에도 프로세스에 대한 정보들을 가지고 있으며 PCB는 프로세스가 생성될 때 프로세스 고유의 PCB가 생성되며 프로세스가 소멸되면 PCB도 사라진다.
프로세스와 함께 묶이는 개념은 역시 쓰레드
라고 생각한다. 쓰레드는 프로세스 내의 독립적인 작업단위로 같은 프로세스 내의 다른 쓰레드와 프로세스의 메모리, 자원을 공유할 수 있다.
알고리즘 문제를 풀 때나 학교를 다니면서 평상시에 만든 과제들을 모두 싱글 쓰레드
로 작동 되었다고 할 수 있다. 물론 연산 순서나 처리 순서를 따라갈 수 있고 다른 교착상태
와 같은 문제상황을 고려하지 않아도 된다는 장점이 있다. 하지만, 여러 쓰레드를 사용할 수 있는데 싱글 쓰레드를 사용한다는 것은 매우 큰 낭비가 될 수 있다.
쓰레드는 각각의 호출스택을 가지고 있다. 호출스택은 쓰레드가 실행할 함수에 대한 정보를 저장하기 위한 스택이다. 리턴주소나 로컬 변수, 파라미터와 같은 내용들이 이에 포함된다.
하나의 프로세스에 여러개의 쓰레드를 사용하는 상황은 아래 그림과 같이 나타낼 수 있다. 앞에서 말한 호출스택과 다르게 힙은 모든 쓰레드가 공유하는 메모리 영역으로 특정 메모리 공간을 여러 쓰레드가 동시에 접근할 수 있다.
멀티 쓰레드는 싱글 쓰레드와 다르게 동시에 여러 작업을 수행할 수 있다. 즉, 특정작업에 병렬성을 향상시킬 수 있다. 또한, 멀티 쓰레드 환경에서 작동하는 프로그램을 사용하는 사용자는 짧은 응답시간을 보장받을 수 있고 이용 효율이 증가한다.
물론, 경쟁조건이나 교착상태와 같은 문제상황을 방지해야 한다.
만약, 서버나 하드디스크에 존재하는 파일을 불러오는 시간동안 화면이 멈춰있는다면 이를 이용하는 사용자는 지루해 할 것이다.
게임이나 SNS메신저 같은 경우 연결하고 있을 때 특정 애니메이션이나 진행상황을 화면에 출력하곤 하는데, 여기에 멀티 쓰레드가 사용된다. 어떤 쓰레드는 데이터를 가져올 것을, 또 다른 쓰레드는 진행상황을 출력하는 방식으로 구현할 수 있다.
멀티 쓰레드를 사용할 때 발생하는 문제점이 있는데 여러 쓰레드가 동시에 실행될 때 공유 자원에 동시에 접근하거나 수정하는 상황에서 주로 발생한다.
위의 문제점들은 처음에 말한 동시성
과 자원 공유
에 더해서 쓰레드 스케줄링
과 우선순위
에 의해서 발생한다.
Mutex, Semaphore와 같은 공유 자원 접근제어 방법과 ThreadPool과 같은 쓰레드 수를 조절하는 방법 등 여러 방법이 존재한다.
쓰레드를 동시에 실행한다는 말을 할 때, 다음과 같은 의문이 들 수도 있다.
쓰레드가 수백개여도 동시에 실행할 수 있나?
동시에 실행되는것은 CPU의 코어 개수와 실행될 쓰레드수에 달려있다. 요즘 CPU에는 쿼드코어, 옥타코어와 같이 코어가 많이 있다. 코어는 연산을 진행할 프로세서를 의미하고 프로세스나 쓰레드는 작업을 의미하므로 개수관계가 동시에 진행되는지에 영향을 미친다.
CPU는 여러 쓰레드를 일정 시간마다 번갈아 가면서 실행하게 되는데 각 쓰레드를 실행하던 중 다른 쓰레드를 실행하는 과정을 Context Switch
라고 한다. 이때 Context Switch
가 발생하는 시간단위를 Time Slice
라고 한다. 즉, 단위시간마다 쓰레드는 일정한 처리율을 보장받을 수 있다.
Context Switch하는데는 시간이 걸리지 않는 것이 아니다. 쓰레드 수가 많아질 수록 Context Switch가 더 자주 발생하게 되고 전체 프로세스의 성능에 좋지 않은 영향을 미칠 수 있다.