프로세스와 쓰레드, 멀티쓰레드의 장단점
프로세스와 쓰레드 (process & thread)
- 프로세스 : 실행 중인 프로그램, 자원(resources)과 쓰레드로 구성
- 쓰레드 : 프로세스 내에서 실제 작업을 수행. 모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다.
프로세스는 공장, 쓰레드는 일꾼이라고 생각할 수 있다.
왼쪽 그림은 일꾼이 1명이다. 이것을 싱글 쓰레드 프로세스 라고 한다.
오른쪽 그림은 일꾼이 여러명이다. 이것을 멀티 쓰레드 프로세스라고 한다.
지금까지 우리가 작성해온 프로그램은 싱글스레드 프로세스였다.
이제는 우리가 멀티 프로세스 프로그램을 작성해보려고 하는 것이다.
멀티 쓰레드로 프로그램을 작성하면,
한 프로세스 내에 일꾼이 여러명이기 때문에, 여러 작업을 나눠서 동시에 수행할 수 있고,
작업을 보다 효율적으로 처리할 수 있다.
우리가 사용하는 대부분의 프로그램들은 멀티 프로세스로 작성되어 있다.
한번확인해보자.
이렇게 대부분 멀티 쓰레드 프로세스이다.
하나의 새로운 프로세스를 생성하는 것보다, 하나의 새로운 쓰레드를 생성하는 것이 더 적은 비용이 든다.
그림으로 살펴보자.
왼쪽은 프로세스가 2개이다. 그리고 프로세스당 쓰레드가 1개이다.
싱글쓰레드 프로세스가 2개이다.
오른쪽은, 멀티 쓰레드 프로세스가 1개있다. 쓰레드는 2개이다.
왼쪽과 오른쪽 둘다 결국 작업을 수행하는 쓰레드는 2개이다.
그런데 싱글 프로세스가 2개인 경우에는 공장이 2개이므로 어떤작업을 돌릴 때,
공장을 새로 짓고 일꾼을 쓰는 것 보다,
단순히 공장은 짓지 않고, 일꾼만 고용해서 하는 것이 더 적은 비용이 드는 것은 당연하다.
예전에 웹서버에서 웹 프로그램을 작성할 때,
CGI라는 방식과 JavaServlet이 있었는데,
CGI가 왼쪽 방식이었다.
CGI는 멀티쓰레드를 지원하지 않았기 때문에,
사용자가 요청할 때마다, 프로세스가 하나씩 만들어지는 것이다.
JavaServlet은 멀티쓰레드를 지원하기 때문에, 사용자가 새로 요청해도, 공장을 새로 지을필요 없이 쓰레드1개만 추가하면 되었다. 그래서 자바쪽이 더 효율적이었다.
같은 자원을 가지고 더 많은 사용자의 요청을 처리할 수 있었던 것이다.
멀티쓰레드의 장단점
대부분의 프로그램이 멀티쓰레드로 작성되어 있다.
그러나, 멀티쓰레드로 프로그램밍하는 것이 장점만 있는 것은 아니다.
일단, 장점을 살펴보면,
- 시스템 자원을 보다 효율적으로 사용할 수 있다.
- 사용자에 대한 응답성(responseness)이 향상된다.
- 작업이 분리되어 코드가 간결해진다.
메신저 프로그램을 생각해보자.
싱글쓰레드 프로그램에서는 한번에 한가지 일밖에 못하기 때문에,
우리가 파일을 전송했을 때, 파일전송을 마치기 전까지는 채팅을 할 수 없다.
파일전송이 조금 늦게 끝나더라도 동시에 채팅이 가능한 것이 더 좋을 것이다.
멀티쓰레드로 작성된 프로그램에서는 가능하다.
그리고, 작업을 각 쓰레드별로 나눠서 작성하기 때문에 코드가 간결해 진다.
단점을 살펴보면,
- 동기화(synchronization)에 주의해야 한다.
- 교착상태(dead-lock)가 발생하지 않도록 주의해야 한다.
- 각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야 한다.
단점의 대부분은 공유로부터 비롯된다.
같은 공장 내에서 여러가지 자원이 있을 때,
이것을 여러 쓰레드가 공유함으로서 생기는 문제점들이 있다.
그중에 하나가 동기화이다.
그리고 교착상태가 발생할 수 있다.
그리고 기아(굶어죽는 것)문제가 발생할 수 있다. 쓰레드가 여러개 있다보니까, 특정 쓰레드는 자신의 작업을 진행할 기회를 얻지 못하여 작업을 수행하지 못할 수 있다.
'JAVA' 카테고리의 다른 글
싱글 쓰레드와 멀티 쓰레드, 쓰레드의 I/O 블락킹 (0) | 2022.06.11 |
---|---|
쓰레드의 구현과 실행 (0) | 2022.05.30 |
애너테이션 타입 정의하기, 애너테이션의 요소 (0) | 2022.05.21 |
메타 애너테이션 (0) | 2022.05.11 |
표준 애너테이션 (0) | 2022.05.11 |
댓글
이 글 공유하기
다른 글
-
싱글 쓰레드와 멀티 쓰레드, 쓰레드의 I/O 블락킹
싱글 쓰레드와 멀티 쓰레드, 쓰레드의 I/O 블락킹
2022.06.11 -
쓰레드의 구현과 실행
쓰레드의 구현과 실행
2022.05.30 -
애너테이션 타입 정의하기, 애너테이션의 요소
애너테이션 타입 정의하기, 애너테이션의 요소
2022.05.21 -
메타 애너테이션
메타 애너테이션
2022.05.11