BASIC의 개발 노트

Concurrency - Multi Processing vs Multi Threading 본문

OS

Concurrency - Multi Processing vs Multi Threading

B2SIC 2021. 6. 5. 01:46

사람이 기계에게 일을 시킬 때 한 가지 일만 시킬 수도 있지만, 여러 가지 일을 시킬 수도 있다.

사람이 원하는 것은 동시에 일을 진행하는 것이고 다행스럽게도 CPU가 굉장히 빠르기 때문에

Concurrent 하게 실행이 가능하다. 다만 일1과 일2가 있을 때 이들이 Switching 되면서 일이 처리되는데

이 과정이 워낙 빠르다 보니 사람이 볼 때는 거의 동시에 일을 하는 것처럼 보인다.

기계의 관점에서 보면 물론 동시에는 아니고 단일 흐름으로 엄청나게 빠르게 흘러간다.

 

그래서 지금부터 이러한 일들을 처리하는 방법에 대해서 살펴볼 것이다.

가정은 두 가지 일을 사람이 볼 때 기준으로 동시에 처리하고자 한다.

또한 하고자 하는 일은 일1을 시키면 일1이 알아서 일2를 시키고 끝나기를 기다렸다가 일1도 끝나는 형태이다.

 

첫 번째 방법은 Process에 의존하는 방법이다.

첫 번째 일1이 실행되고 일1에서 fork()를 통해서 일2를 생성한다.

이때 fork는 memory copy 역할을 하기 때문에 메모리에 새로운 일2에 대한 영역을 할당하게 된다.

이 영역에 일2에 해당하는 코드를 loading 하고 execution을 하는 것이다.

이를 통해 새로운 실행 흐름을 만들게 된다.

코드를 통해서 그 과정을 보자.

 

fork()를 하면 child가 생기는데 여기가 일2에 해당하는 부분이다.

그러면 자연스럽게 main함수 부분이 일1에 해당한다.

fork()를 통해 생성된 child는 wc라는 일로 execvp 함수에 의해서 바뀌게 된다.

 

두 번째 방법은 Thread에 의존하는 방법이다.

역시 마찬가지로 일1를 실행하면 일2가 불려 와 져서 자신의 일을 하고 끝내는 일이 될 것이다.

하지만 Thread의 경우 새로운 Process를 생성하는 것이 아닌, 하나의 Process에서 새로운 실행 흐름을 만드는 것이다.

처음에 시작된 실행 흐름이 있고, 이 실행 흐름이 새로운 실행 흐름을 만들게 되는 방식이다.

실행 흐름 별로 Stack이 각각 필요하고 Control Block도 필요하다.

이에 대한 코드는 이미 우리가 봤던 코드이다.

 

main이 시작되면 2개의 일을 생성하고 이들이 끝나기를 기다렸다가 두 개의 일이 다 끝나면 끝나는 흐름이다.

 

Process와의 차이를 조금 볼 필요가 있다.

우선 fork 하고 나면 Process의 id 값이 리턴됐는데, Thread도 마찬가지로 p1, p2에 생성된 Thread의 id 값이 담긴다.

또한 Process는 일을 지정할 때 그 실행파일이 어디에 있는지 PATH를 알려주는 방식이었지만,

Thread는 코드 내부에서 일을 지정해준다. 예시의 경우 mythread가 된다.

 

게다가 Thread는 Data 영역을 모든 Thread가 서로 공유할 수 있는데, 이러한 공유 자원을 Process 안에서 볼 수 있다.

하지만 Process를 여러 개를 만들 경우 각각의 Process 안에서는 공유하는 Data라는 것이 있을 수가 없다.

따라서 공유하고자 할 경우 그 Data는 Process 밖에 있어야 하고 각각의 Process가 접근할 수 있는 형태여야 한다.

 

정리해보자면..

일을 시키려고 할 때 공유 자원이 많을 경우 Multi Threading 환경을, 별로 없다면 Multi Processing을 고려할 수 있다.

 

이들의 구조를 각각 그림으로 그려서 추상화해보면

Multi Processing

 

Multi Threading

 

앞으로 우리가 소프트웨어를 개발할 때 이러한 내용을 고려해서 개발하는 것이 좋을 것 같다.

'OS' 카테고리의 다른 글

Lock  (0) 2021.06.05
Concurrency - Quiz  (0) 2021.06.05
Concurrency - Race Condition  (0) 2021.06.04
Concurrency  (0) 2021.06.04
File System - Read & Write + Directory  (0) 2021.05.26
Comments