woodadang.io
로그인
woodadang.io
로그인
Thread
무삭이의 개발일지
·
2023년 4월 23일
팔로우
0
Java
0
병렬 vs 병행
병행(Concurrent)은 멀티 스레드 프로그래밍을 의미
병렬(Parallel)은 멀티 코어 프로그래밍을 의미
우리가 살펴볼 것은 병행 프로그래밍(동시성 프로그래밍, 멀티스레드 프로그래밍)
Process
각각의 프로세스는 메모리 공간에서 독립적으로 존재한다.
각가의 프로세스는 다음 페이지 그림과 같이 자신만의 메모리 구조를 가진다.
프로세스 A,B,C가 있을 경우 각각 프로세스는 모두 같은 구조의 메모리 공간을 가진다.
독릭적인 만큼 다른 프로세스의 메모리 공간에 접근할 수 없다.
IPC
프로세스 A에서 프로세스 B를 직접할 수 없기 때문에 프로세스 간의 통신을 하는 특별한 방식이 필요하다. 메일슬록(mailslot), 파이프(pipe)등이 바로 프로세스 간의 통신 즉, IPC의 예들이다.
프로세스는 독립적인 메모리 공간을 지니기 때문에 IP를 통하지 않고 통신할 수 없다.
프로세스가 여럿이 병렬적으로 실행되기 위해서는 필연적으로 컨텍스트 스위칭이 발생할 수 밖에 없다. 이것을 해결할 수 있는 것이 Thread이다.
Thread
스레드는 하나의 프로그램 내에 존재하는 여러 개의 실행 흐름을 위한 모델이다.
우리가 생각하는 프로그램이 실행되기 위해서 하나의 실행흐름으로 처리할 수도 있지만 다수의 실행흐름으로 처리할 수도 있다.
뒤에 나오는 그림과 같이 스레드는 프로세스와 별개가 아닌 프로세스를 구성하고 실행하는 흐름이다.
스레드 vs 프로세스
스레드는 프로세스 안에 존재하는 실행흐름이다.
스레드는 프로세스의 heap, static, code영역 등을 공유한다.
스레드는 stack영역을 제외한 메모리 영역을 공유한다.
스레드는 code영역을 공유하기 때문에 프로세스 내부의 스레드들은 프로세스가 가지고 있는 함수를 자연스럽게 모두 호출할 수 있다.
스레드는 IPC없이도 스레드 간의 통신이 가능하다. A, B 스레드는 통신하기 위해 heap 영역에 메모리 공간을 할당하고, 두 스레드가 자유롭게 접근할 수 있다.
스레드는 프로세스처럼 스케줄링의 대상이다. 이 과정에서 컨텍스트 스위칭이 발생한다. 하지만 스레드는 공유하고 있는 메모리 영역 덕분에 컨텍스트 스위칭 때문에 발생하는 오버헤드가 프로세스에 비해 작다.
동작중인 프로세스가 바뀔 때 프로세스는 현재 자신의 상태(contex정보)를 일단 보존한 후, 새롭게 동작 개시하는 프로세스는 이전에 보존해 두었던 자신의 컨텍스트 정보를 다시 복구한다. 이와 같은 현상을 컨텍스트 스위칭이라 말한다.
스레드의 컨텍스트 정보는 프로세스보다 적기 때문에 스레드의 컨텍스트 스위칭은 가볍게 행해지는 것이 보통이다.
하지만, 실제로 스레드와 프로세스의 관계는 JVM구현에 크게 의존한다.
참고로 플랫폼이 같아도 JVM의 구현방법에 따라 프로세스와 스레드의 관계는 달라질 수 있다.
참고
부부개발단 - 즐겁게 프로그래밍 배우기
무삭이의 개발일지
No. Try not. Do or Do not. There is no try.
팔로우
이전 포스트
static, final
다음 포스트
인터넷 네트워크
0개의 댓글
댓글 작성