개발을 하며 가장많이 듣는 단어들인 프로세스, 스레드가 정확히 어떠한 일은 하는지, 또한 어떠한 차이가 있는지
설명을 하려고 하면 막막하다. 해서 해당 역할이 무엇인지, 어떠한 차이가 있는지 알아본다.
해당 설명을 위해 찾아본 주소는 다음과 같다.
운영체제로부터 자원을 할당받은
작업
의 단위, 프로그램이 실행되는 순간, 해당 파일은 컴퓨터 메모리에 올라가게 되고 동적인 상태가 된다.
이 상태의 프로그램을 프로세스라고 한다.
프로세스가 할당받은 자원을 이용하여 실행하는
흐름
의 단위, 프로세스 특성의 한계를 해결하기 위해 더 작은 실행 단위 개념이 필요 하게 되었다.
이 개념을 쓰레드라고 하며, 프로세스 코드의 정의된 수행경로에 따라 동작한다. 즉, 쓰레드는 프로세스 안에 포함되어 있는 완전히 다른 개념이다.
쓰레드는 프로세스와 다르게 쓰레드간 메모리를 공유하며 작동한다. 즉, 쓰레드끼리의 자원 공유는 프로세스 실행의 일부가 된다. 일반 Java의 main함수도 쓰레드의 종류이다. ( 보통 메인쓰레드라고 부른다. )
그렇다면 멀티쓰레드는 무엇일까?
멀티태스킹이 하나의 운영체제 안에서 여러 프로세스가 실행되는 것이라면, 멀티쓰레드는 하나의 프로세스가 여러 쓰레드를 사용하여 동시에 처리하는것을 의미한다. 위의 서술한것과 마찬가지로 Stack영역을 제외한 영역을 공유하고 있으므로 응답시간이 빠르고, 메모리 자원을 절약할 수 있다.
단, 조심할 수 밖에 없는 단점이 있는데 그 이유로는 다음과 같다.
- 자원을 공유하기 때문에 필연적으로
동기화 문제
가 발생한다.
프로젝트 개발을 할때, 기본적으로 "Thread safe하는가, 안하는가"에 대해 생각을 하고 개발을 해야할 경우가 있다.
예) 단순 예로 문자열처리 관련 로직을 개발
단일 쓰레드일 경우, StringBuffer를 사용하는 경우보다, StringBuilder를 사용하는것이 효율적이며 직관적
이다.
멀티쓰레드를 통하여 개발을 진행하는데 static으로 선언한 HashMap을 사용하는경우, 문제가 발생하게 된다.
멀티쓰레드를 하지 않을 때는 속도의 차이만 있을 뿐이지만, 멀티쓰레드를 할때 잘못 개발을 하게되면 프로세스는 심각한 오류를 가진채로 수행이 되므로 조심히 다루어야 한다.