본문 바로가기

프로그래밍(TA, AA)/JVM 언어

[병렬프로그래밍] 프로세스, 스레드 개념

프로세스란 무엇인가?

- 프로세스 : 자기 자신만의 주소 공간을 갖는 독립적인(Self-Contained) 실행 프로그램

- 멀티 프로세스 : 두 개 이상의 프로세스가 실행되는 것. 프로그램이 여러개 띄워져 있는 형식.

- 멀티 태스킹 : 두 개 이상의 프로세스를 실행하여 일을 처리하는 것


프로그램 : 스태틱하게 머신에 인스톨되어있는 인스트럭션(코드, 커맨드, 실행해야할 명령)등의 집합

프로세스 : 프로그램이 실행중(프로그램 안의 인스트럭션들이 실행되고 있는 중)인 것.


스레드란 무엇인가?

- 스레드(경량 프로세스) : 프로세스 내의 독립적인 순차흐름 또는 제어

- 멀티 스레드 : 하나의 프로세스에서 여러 개의 스레드가 병행적으로 처리



프로세스 내에 스레드란 개념이 포함되어 있으므로 스레드와 프로세스는 서로 연관이 되어 있습니다. 프로세스는 실행중인 프로그램 객체 자체를 말하고, 하나의 실행흐름 자체를 스레드라고 말합니다. 하나의 프로세스안에 스레드가 여러개 있는 것을 멀티 스레드라고 말합니다. 


네트워크 프로그래밍을 할때에는 멀티 쓰레딩이 필요합니다. 게임프로그래밍에서 특히 멀티 스레드를 많이 사용하게 됩니다. 예를 들면, 사용자가 게임을 하려면 크게 1.사용자의 input, 2.네트워크로부터 전송되는 input 두개의 input이 있게 됩니다. 1,2는 동시에 병렬적으로 일어나야 합니다.


한 프로세스에 스레드가 2개있다는 말은 해단 프로세스 내 실행흐름이 2개 존재한다는 의미와 동일합니다. 한 프로그램 안에서 여러가지 태스크를 동시 수행하고 싶을때, 쓰레드를 사용하게 됩니다. 네트워크 프로그래밍에서는 반드시 필요합니다. 예를 들면, 가장 간단한 네트워크 프로그래밍인 채팅 프로그램에서는 채팅메시지에서 채팅을 쓰는 부분(키보드 input), 상대방의 채팅메시지를 전달받는 부분(network input) 결과적으로 single thread에서는 부자연스럽게 돌아가게 될 것입니다.


하나의 실행중인 프로세스 안에 여러개의 태스킹을 동시에 실행하고 싶을때 스레드를 이용하게 됩니다.




스레드의 활용

1) 게임 프로그래밍

    - 게임에 등장하는 캐릭터를 움직이게 하는 스레드

    - 여러 캐릭터들이 동시에 움직인다 (대부분의 게임에서 각 캐릭터는 각각의 스레드를 가짐)

2) N/W 프로그래밍

    - 프로그램의 흐름을 담당하는 스레드

    - 네트워크로부터 데이터를 기다리는 스레드


멀티 프로그래밍

- 여러 개의 프로그램들이 단일 CPU 상에서 동시에 실행되는 것

- 컴퓨터에는 한 개의 CPU내에 존재하기 때문에 진정한 의미로는 여러개의 프로그램이 동시에 실행된다고 볼 수는 없습니다.

- 한 프로그램이 일부 실행되고 나서 또 다른 프로그램이 일부 실행되는 방식입니다.

- 모든 프로그램이 동시에 수행되는것처럼 보이게 됩니다.



궁극적으로 프로세스간에도 스위치가 일어나고 있고, 스레드 안에서도 스위치가 일어나고 있는 모습(CPU를 갖고있는 동안)이 됩니다. 그리고 프로그래밍시에는 스레드는 각각 별도의 함수로 구성되어 있습니다.




스레드의 생명주기

스레드의 생명주기는 프로세스의 생명주기와 유사합니다. java에서 프로세스 생명주기를 나타내는 그림입니다.


프로그램이 실행되면 메인부터 시작하여 하나하나씩 개발자가 짠 함수들이 순차적으로 실행됩니다. 이때 a(), b()라는 함수가 있는데, 동시에 실행하고 싶을때 쓰레드를 이용하게 됩니다. 각 함수별로 해당 함수를 실행하는 스레드를 생성합니다. 


자바에서 실행되는 모든 엔티티는 객체입니다. 쓰레드 역시 마찬가지로 객체입니다. 쓰레드를 실행하는 메소드(start()) 실행하면 쓰레드가 동작하면서 CPU가 점유된 상태가 됩니다.


스레드 이후 커리큘럼은 파일 IO에 대한 설명이 이루어지는데, 파일 IO 역시 네트워크 프로그래밍과 연결되어 있습니다. 왜냐하면 네트워크 프로그래밍은 결국 네트워크 IO를 사용하겠다는 의미이기 때문입니다.