때로는 순차적 실행이 병렬실행보다 빠른 경우가 있다. 동시 실행에 따른 오버헤드가 없고 단일 CPU 알고리즘은 하드워드 작업에 더 친화적일 수가 있기 때문이다.
암달의 법칙(Amdahl's law)
암달의 저주라고도 불리며 컴퓨터 시스템의 일부를 개선할 때 전체적으로 얼마만큼의 최대 성능 향상이 있는지를 계산할때에 사용된다.
병렬 컴퓨팅을 할 경우 일부 병렬화 가능한 작업들은 사실상 계산에 참여하는 컴퓨터의 갯수에 비례하여 속도가 늘어난다. 이러한 경우 암달의 법칙에 의해 전체 수행시간의 개선효과는 병렬화가 불가능한 작업들의 비중에 크게 영향을 받게 된다. 즉 아무리 컴퓨터의 갯수가 늘어나도 속도의 한계는 정해져 있다는 것이다.
병렬 vs 병행
병행(Concurrent)은 멀티스레드 프로그래밍을 의미
병렬(Parallel)은 멀티코어 프로그래밍을 의미
이 장에서 살펴볼 것은 쓰레드임으로 병행 프로그래밍(동시성 프로그래밍, 멀티쓰레드 프로그래밍)
Process
각각의 프로세스는 메모리 공간에서 독립적으로 존재한다.
각각의 프로세스는 자신만의 메모리구조를 가진다.
프로세스 A,B,C가 있을 경우 각각 프로세스는 모두 같은 구조의 메모리 공간을 가진다.
독립적인 만큼 다른 프로세스의 메모리 공간에 접근할 수 있다.
IPC
프로세스 A에서 B로 직접 접근할 수 없기 때문에 프로세스 간 통신을 하는 특별한 방식이 필요함. 메일슬록(mailslot),파이프(pipe)등이 바로 프로세스 간 통신, 즉 IPC의 예시이다.
프로세스는 독립적인 메모리 공간을 지니기 때문에 IPC를 통하지 않고 통신할 수 없다.
프로세스가 여럿이 병렬적으로 실행되기 위해서는 필연적으로 컨텍스트 스위칭이 발생할 수 밖에 없다. 이 것을 해결할 수 있는 것이 스레드(Thread)이다.
스레드(Thread)
스레드는 하나의 프로그램 내에 존재하는 여러 개의 실행 흐름을 위한 모델
우리가 생각하는 프로그램이 실행하기 위해서는 하나의 실행흐름으로 처리할 수도 있겠지만, 다수의 실행흐름으로 처리할 수도 있다.
스레드는 프로세스와 별개가 아닌 프로세스를 구성하고 실행하는 흐름이다.
스레드 vs 프로세스
스레드는 프로세스 안에 존재하는 실행흐름이다.
스레드는 프로세스의 heap, static, code영역등을 공유한다.
스레드는 stack영역을 제외한 메모리 영역은 공유한다.
스레드가 code영역을 공유하기 때문에 프로세스 내부의 스레드들은 프로세스가 가지고 있는 함수를 자연스럽게 모두 호출 할 수 있다.
스레드는 IPC 없이도 스레드 간의 통신이 가능하다. A, B 스레드는 통신하기 위해 heap영역에 메모리 공간을 할당하고, 두 스레드가 자유롭게 접근할 수 있다.
스레드는 프로세스처럼 스케쥴링의 대상이다. 이 과정에서 컨텍스트 스위칭이 일어난다. 하지만 스레드는 공유하고 있는 메모리 공간 덕분에 컨텍스트 스위칭 때문에 발생하는 오버헤드가 프로세스에 비해 작다.
동작 중인 프로세스가 바뀔 때 프로세스는 현재 자신의 상태(context정보)를 일단 보존한 후, 새롭게 동작 개시되는 프로세스는 이전에 보존해 두었던 자신의 context 정보를 다시 복구한다. 이를 컨텍스트 스위칭이라고 한다.
스레드의 컨텍스트 정보는 프로세스보다 작기 때문에 스레드의 컨텍스트 스위칭은 가볍게 행해지는 것이 보통이다.
하지만 실제로 스레드와 프로세스의 관계는 JVM구현에 크게 의존한다.
참고로 플랫폼이 같아도 JVM의 구현방법에 따라 프로세스와 스레드의 관계는 달라질 수 있다.
댓글