프로세스와 쓰레드(process & thread)
프로세스 : 실행 중인 프로그램, 자원(메모리, 씨피유)과 쓰레드로 구성-프로그램을 실행하면 OS로 부터 실행에 필요한 자원(메모리)를 할당 받아 프로세스가 된다. 프로세스의 자원을 이용해서 실제로 작업을 수행하는 것이 바로 쓰레드
쓰레드 : 프로스세스 내에서 실제 작업을 수행
모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다,
프로세스 : 쓰레드 = 공장 : 일꾼
그럼
싱글 쓰레드 프로세스(일꾼 한명!) = 자원 + 쓰레드
멀티 쓰레드 프로세스(일꾼 여러명!) = 자원+쓰레드+쓰레드 ... + 쓰레드
멀티쓰레드로 프로그램을 작성하면 여러작업을 나누어서 동시에 수행할 수 있고 보다 작업을 효율적으로 할 수있고, 우리프로그램은 대부분 멀티 쓰레드로 되어있다.
이친구들은 멀티쓰레드
이친구들이 싱글 쓰레드
하나의 새로운 프로세스를 생성하는 것보다
하나의 새로운 쓰레드를 생성하는 것이 더 적은 비용이 든다.
즉
2개의 프로세스에 한명씩 일하는것보다 한개의 프로세스에 2개의 노동자가 일하는것이 비용이 덜든다는 것이다.
메신저로 채팅하면서 파일을 다운받고 음성대화를 나눌 수 있는 것이 가능한 이유가 멀티쓰레드로 작성 되어 있기 때문이다. 만일 싱글쓰레드로 작성되어있다면 불가능 하다.
만일 싱글 쓰레드로 서버 프로그램을 작성한다면 사용자의 요청 마다 새로운 프로세스를 생성해야하는데 프로세스를 생성하는 것은 쓰레드를 생성하는 것에 비해 더 많은 시간과 메모리 공간이 필요하기 때문에 많은 수의 사용자 요청을 서비스 하기 어렵다.
멀티쓰레드의 장단점
대부분의 프로그램이 멀티쓰레드로 작성되어있다.
그러나 멀티쓰레드 프로그래밍이 장점만 있는것이 아니다.
장점 -여러모로 좋군ㅋ |
1. 응답성 : 예를 들어 채팅프로그램을 멀티스레드화 하면, 채팅의 일부분이 전송이 되지 않거나 큰 파일을 전송하고 있어도, 사용자는 다른 스레드를 통해서 다른 사용자와 대화가 가능하다. |
2. 자원공유 : 스레드는 자동적으로 그들이 속한 프로세스의 자원들과 메모리를 공유한다. 코드 공유의 이점은, 한 응용프로그램 같은 주소공간내에서 여러개의 다른 활동성 스레드를 가질 수 있기 때문입니다. | |
3. 경제성 : 멀티 프로세스처럼 여러개의 프로세스에 메모리와 자원을 할당하면 비용이 많이 발생하지만, 스레드는 한 프로세스 내에서 자원 ( 데이터, 메모리 등 의 자원)을 공유하기 때문에 경제적입니다. | |
4. 쓰레드 간의 통신이 필요한 경우에도 별도의 자원을 이용하는 것이 아니라 전역 변수의 공간 또는 동적으로 할당된 공간인 힙(Heap) 영역을 이용하여 데이터를 주고받을 수 있다. 또한 멀티쓰레드에서는 쓰레드간에 스택영역(메모리의 값이 아닌 주소만 보관)과 힙 영역을 공유합니다. | |
5. 데이터 영역과 힙 영역을 통해 데이터 교환이 가능하다. 쓰레드 사이에서의 데이터 교환에서는 특별한 기법이 필요없다. | |
단점 -프로그래밍 할때 고려해야 할 사향들이 많다. |
1. 멀티스레드를 기반으로 할 경우, 동일한 자원에 접근할 수 있기 떄문에 프로그래밍시 신경써줘야한다. |
2. 서로 다른 쓰레드가 데이터와 힙 영역을 공유하기 때문에 어떤 쓰레드가 다른 쓰레드에서 사용중인 변수나 자료구조에 접근하여, 엉뚱한 값을 읽어오거나 수정할 수 있습니다. 그렇기 멀티스레드 환경에서는 동기화 작업이 필요합니다. | |
3. 동기화 작업을 제대로 하지 않으면, 락 문제가 일어날 수 있고, 데이터 병목 현상이 일어날수있습니다 |
멀티쓰레드로 프로그램짜는건 그렇게 어렵지 않지만, 그것들이 효율적으로 돌아가도록 하는것이 어려운것이다.
마찬가지로 우리가 코드짜는건 쉽다. 그러나 잘짜고 잘동작하도록 하는게 어렵듯이...
'JAVA공부 > 2-쓰레드' 카테고리의 다른 글
쓰레드 제어문(1) (0) | 2021.10.13 |
---|---|
데몬 쓰레드와 쓰레드의 상태(실행제어) (0) | 2021.10.12 |
쓰레드의 우선순위, 그룹 (0) | 2021.10.12 |
싱글쓰레드와 멀티쓰레드 (0) | 2021.10.08 |
쓰레드의 구현과 실행 (0) | 2021.10.07 |
댓글