프로세스와 쓰레드
쓰레드는 왜 만들었을까?
프로세스가 하나 시작하려면 많은 자원이 필요하다. 만약 하나의 작업을 동시에 수행하려고 할 때 여러 개의 프로세스를 띄워서 실행하면 각각 메모리를 할당하여 주어야만 한다. JVM은 기본적으로 아무런 옵션 없이 실행하면 OS마다 다르지만, 적어도 32MB~64MB의 물리 메모리를 점유한다. 그에 반해서, 쓰레드를 하나 추가하면 1MB 이내의 메모리를 점유한다. 그래서, 쓰레드를 “경량 프로세스”라고도 부른다. (출처: 자바의 신)
Process
-
주소 공간, 메모리 등 정상적인 실행을 위해 필요한 환경을 시스템으로부터 부여받은 존재
-
리소스와 쓰레드로 구성된다.
-
모든 프로세스는 하나 이상의 쓰레드를 가지고 있다.
Thread
-
프로세스 내 실행 단위이다.
-
프로세스 내에서 실제 작업을 수행한다.
프로세스와 쓰레드의 차이
Process
-
Code, Data, Heap, Stack 영역으로 이루어져 있으며 프로세스간에 독립된 메모리 영역을 할당 받는다.
-
각각의 Memory space를 차지한다.
Thread
-
프로세스 안에서 동작하며 Code, Data, Heap 영역을 공유하고 별도의 Stack만 가지고 있다.
-
Context switching시 Stack영역만 switching하면 되므로 프로세스 스위칭 보다 빠르다.
-
쓰레드 간 자원 공유가 가능하여 편리하지만 자원 동기화 의 문제가 있다.
관련 좋은 요약들(출처: OS? Oh Yes! 도서, 브런치 글)
-
큰 틀은 프로레스로, 세분된 작은 일 하나하나는 스레드라고 부른다.
-
프로세스는 부여된 자원의 소유자로서, 스레드는 스케줄링의 단위로서 존재한다.
-
프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이고, 스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위다.
쓰레드의 장단점
장점
-
메모리 공유로 인한 시스템 자원 소모가 줄어든다.
-
응답시간이 단축 된다.
-
Context switching에 대한 오버헤드가 줄어든다.
단점
-
서로 데이터를 사용하다가 충돌이 일어날 가능성이 있다.
-
디버깅이 다소 까다로워진다.