-
Java Multithreading [0] - 스레드와 프로세스의 차이Java/Multi Threading 기초 2022. 8. 12. 08:52
Java Multithreading
멀티스레딩의 개념과 Java에서의 활용법을 공부하고 정리하는 시리즈입니다.
0) 스레드의 사용 이유 - 스레드와 프로세스의 차이
스레드는 성능을 위해서 사용합니다.
요즘 데스크탑에서 여러 프로그램을 사용하는 건 이상하지 않습니다. 병렬적으로 처리가 가능하기 때문입니다.
엄밀히 말하자면 두 가지 방식이 있습니다. 병렬적으로 처리하는 것과, 병렬적으로 처리하는 것처럼 보이게 하는 것(사실은 용어가 나뉘지만 지금은 이 정도로 표현하겠습니다).
좀 이상하죠? 동시에 처리하는 방법이 있는데(프로세스), 왜 굳이 '그래 보이는' 방법(스레드)이 따로 있을까요?다른 이유는 아니고, 프로세스가 스레드에 비해 생성비용이 크기 때문입니다. 조금만 더 자세히 요약해볼게요.
스레드는 하나의 프로세스 안에서, 스택과 명령어 포인트(실행할 내용을 담고 있는)만을 자체적으로 가지고, 나머지 자원들(힙, 파일들, 프로세스 정보, 코드)은 프로세스 내의 다른 스레드들과 공유합니다.
프로세스는 어떨까요? 스레드가 공유하는 자원들은 '프로세스 안에서' 공유된다고 했습니다. 즉, 프로세스는 각각이 별도의 자원을 가지고 실행됩니다.그렇다고 해서 병렬처리를 할 때에 새 프로세스를 생성하지 않고 무조건 스레드로만 구현해야 하는 것은 아닙니다.
0.5) 스레드와 프로세스의 차이 2
앞서 병렬적으로 보이는 것에 대한 이야기를 했는데요. 병렬적이면 병렬적이지 '그래보이는 거'란 건 뭘까요?
작업을 하는데 마치 두 사람 이상의 여러 사람이 동시에 한다면 그 작업 처리를 병렬적이라고 할 수 있을 거에요.
그러면 작업을 하는데 마치 한 사람이 여러 사람처럼 빠르게 왔다갔다하며 이 작업 조금, 저 작업 조금, 하면서 조금씩 처리한다면 어떨까요? 병렬적이라고 할 수 있을까요?
아니죠. 하지만 한 사람이 병행하며 진행하고 있다고는 할 수 있을 것입니다. 결과물로만 보았을 때는 병렬로 진행한 작업과 병행으로 진행한 작업의 차이를 알기가 어려울 것이고요.
병렬의 예) 진짜 여러 작업자가 처리를 한다.
병행의 예) 그건 제 잔상입니다만? 한 명의 작업자가 빠르게 왔다갔다 하며 여러 작업을 처리한다.모든 작업을 여러 작업자가 참여해주면 가장 쾌적하겠지만 그건 비용이 크다고 앞서 말씀드렸죠. 스레드를 이용한 멀티태스킹은 상대적으로 비용이 적습니다. 상대적으로 말이죠. 즉, 이것도 남용해서는 안된다는 의미입니다. 어떤 점을 고려하고 주의해야 할까요?
첫째. 작업을 옮기는 데(컨텍스트 스위칭)에도 비용이 듭니다. 작업을 옮기는 시점을 정하는 기준이 적절치 않아서 스위칭이 엄청나게 많이 일어나게 된다면, 스레드가 프로그램을 실행하는 시간보다 스위칭 하는데 걸린 시간이 더 오래 걸리게 되는 경우도 있습니다(스레싱).
이런 일이 어지간하면 일어나지 않도록 운영체제는
에포크epoch
라는 단위에 맞게 실행할 프로그램들을 적절히 분배하여 담고 실행하는데요. 여기에 담는 기준은 기본적으로는 운영체제에 달렸습니다. 동적 우선순위라고 해요. 즉각적인 반응성이 중요한 프로그램들이 높은 가산점을 받아요(예를 들면 마우스포인터의 이동을 화면에 그리는 작업이라든지...).
프로그램을 개발한 사람이 설정하는 우선순위도 있는데요. 이것은 정적 우선순위라고 합니다.
물론 이렇게 에포크를 계획하고 실행하더라도 특정 작업이 생각보다 더 오래 실행되어서 미처 실행되지 못한 작업들이 생길 수 있는데, 이런 것까지 반영해서 운영체제가 빠뜨리지 않고 다음 에포크에 챙깁니다. 빠지는 작업이 없도록, 너무 과하게 스위치가 일어나지도 않도록 적절한 작업 순서를 가져갑니다. OS의 이러한 스레드 작업 순서 조정을 스케줄링이라고 합니다.'Java > Multi Threading 기초' 카테고리의 다른 글
[Java Multithreading] 메모리 영역 - Stack과 Heap (3) 2022.10.25 [Java Multithreading] 성능 최적화의 두 관점 - 처리량과 http 서버 (0) 2022.10.24 Java Multithreading [4] - 성능 최적화의 두 관점 - 지연 시간 (0) 2022.08.29 Java Multithreading [3] - Thread#join() : Thread 간을 조정하는 방법 (0) 2022.08.23 Java Multithreading [2] - Java에서 Thread를 종료하는 법 (0) 2022.08.18 Java Multithreading [1] - Java에서 Thread를 생성하는 법 (0) 2022.08.16