Dev
동기화와 병렬 처리 둘의 상관 관계 그리고 Java
친환경사과
2023. 4. 3. 15:04
🍎 많은 곳에서 등장하는 Keyword인 동기화와 병렬 처리를 이번 기회에 확실하게 하고자 정리합니다. 나아가 사용하고 있는 Java 라는 언어, 특히 JVM 위에서 어떤 방식으로 동기화와 병렬 처리를 수행하는지 알아보고자 해당 글을 작성합니다.
❓동기화란?
- 동시다발적으로 실행되는 프로세스들은 공동의 목적을 올바르게 수행하기 위해 서로 협력하며 영향을 주고 받기도 합니다. 협력하여 실행되는 프로세스들은 실행 순서와 자원의 일관성을 보장해야 하기 때문에 반드시 “동기화” 되어야 합니다.
- 프로세스 동기화란 프로세스들 사이의 수행 시기를 맞추는 것을 의미합니다. 또한 실행의 흐름을 갖는 모든 것은 동기화의 대상입니다.
- 동기화에는 실행 순서 제어를 위한 동기화가 있고, 상호 배제를 위한 동기화가 존재합니다.
❓병렬 프로그래밍이란?
- 병렬 프로그래밍은 프로그래밍의 한 종류로서 동시에 많은 일을 할 수 있습니다. 프로그램의 성능과 속도를 향상시키기 위해, 컴퓨터에서 사용할 수 있는 여러 프로세서나 코어를 활용하는 데 사용됩니다.
- (❗내가 몰랐던 부분) 병렬 프로그래밍을 수행하는 여러 방법이 존재합니다.
Using multiple threads: A single program can create multiple threads of execution, which can run concurrently on different processors or cores.
Using multiple processes: A program can spawn multiple processes, which can run concurrently on different processors or cores.
Using parallel libraries: There are various libraries available that provide parallel versions of common algorithms and data structures. These can be used to parallelize existing programs without the need to write explicit parallel code.
→ 이처럼 병렬 프로그램을 사용하는 방법은 다양하게 존재합니다.
❓그렇다면 병렬 프로그램을 이야기할 때 왜 동기화가 같이 이야기되는 것일까요?
- 만약 스레드들이(멀티 스레드의 환경일 때) 서로 침범하는 영역없이 동작한다면 동기화 문제를 고려하지 않아도 됩니다. 아주 중요한 포인트입니다.
- 바꿔 이야기하면 “서로 영역을 공유한다”는 것이 병렬 프로그래밍을 이야기할 때 동기화 키워드가 같이 등장하는 것입니다.
🍏 JVM 환경을 알아보기 이전 더 아랫단인 OS에선 어떤 방식으로 처리하는지 알아보겠습니다.
- 프로세스들 간에 대해선 OS가 별도의 프로그램으로 동작하도록 알아서 처리해주고 있습니다.
- 각 프로세스들은 자기만의 Address Space를 갖고 있고, 각 프로세스들은 공유할 수 없습니다.(편법으로 공유할 수 있는 방법이 있긴 합니다.)
- 한 프로세스 안에서 실행되는 여러개의 스레드들은 서로 공유할 수 있는 메모리 부분이 있습니다. 공유할 수 있는 부분이 있으므로, 이 때 동기화 문제가 발생할 수 있습니다.
❓JVM 환경에서는 어떤 방식으로 처리가 되나요?
- JVM은 하나의 프로세스 입니다. 또한 이 프로세스는 다수의 스레드를 보유하고 있습니다.
- JVM의 동기화 문제는 스레드들간의 공유자원에 접근하는 것을 한 번에 한 스레드만 가능하게 함으로써 해결할 수 있습니다. 자바 런타임 시에는 스레드들 간 아래의 영역이 공유됩니다다.
- 공유되는 영역
- 힙 영역 : 생성된 자바의 객체들이 저장되는 부분. 모든 스레드들이 접근 가능합니다.
- 메소드 영역 : 함수 영역으로 각 클래스 또는 인터페이스에 런타임 컨텍스트 풀 영역, 메소드 생성자를 저장하는 영역으로로 모든 스레드에 의해서서 공유되는 영역
- 런타임 컨텍스트 풀 영역 : 클래스 또는 인터페이스의 클래스 변수, 스태틱 변수, 클래스 객체의 래퍼런스를 저장하는 영역으로 공유되는 영역
- 데이터와 메소드 스택 영역 : 위와 마찬가지로 스레드들간 공유되는 영역입니다.
- 공유되지 않는 영역
- Program Counter 영역 : 스레드 각각이 갖고 있는 부분
- JVM Stack 영역 : 지역변수, 파라미터, 리턴값, 객체 래퍼런스들이 저장되어어 있는 공간, 스레드드 각각이 갖고 있는 따로 관리되는 독립적인 영역
- 동기화를 하기 위해서는 공유되는 영역을 보호해줄 수 있는 장치가 필요합니다. 다시 말해, 일부 실행되는 코드에서 여러 스레드들이 실행가능한 경우에 이 부분을 한 스레드만 실행되도록 만들어주는 장치가 필요합니다.
❓어떤 장치로 동기화를 만들 수 있을까요?
- 멀티 스레드가 공유 자원이 참조할 수 있는 코드 범위인 “임계 영역”에 한 스레드만 접근할 수 있게 하면 됩니다.
- 이를 위해, JVM에서 모든 객체를 생성할 때 LOCK을 포함시킵니다.
🍏 LOCK이란 공유 객체에 여러 스레드가 동시에 접근하지 못하도록 하기 위한 것으로 모든 객체가 힙 영역에 생성될 때 자동으로 만들어 집니다.
❗이젠 알았습니다. 왜 자바 최상단 객체인 Object에 wait(), notify(), notifyAll() method가 존재하는지 알았습니다.
- 이 모든 메소드는 멀티 스레드 환경에서 동기화를 이루기 위한 목적으로 존재하는 메소드입니다.
📚 Reference
📘 혼자 공부하는 컴퓨터구조 + 운영체제