brunch

You can make anything
by writing

C.S.Lewis

by 김은지 Dec 03. 2018

멀티프로세스, 멀티쓰레딩, 멀티플렉싱 정복하기

엄청 헷깔리는 놈들...

나는 부끄럽게도 이 세 용어를 명확하게 이해하지 못했었다.. 

그래서 항상 컴플렉스를 가지고 있었는데 이번에 TCP/IP 책을 하나 사서 공부하며 조금이나마 이해를 하게 되었다. 그 내용을 정리해보고자 한다.


멀티 프로세스, 멀티 쓰레딩, 멀티 플렉싱의 핵심은 무엇일까?

그래 "멀티" 이다. 멀티 플레이어할때 그말!

동시에 무언가를 처리한다는 것이다. 그렇다면 무엇을, 왜?

(내가 본 책이 통신과 관련된 책이어서 그책을 기준으로 설명하려고 한다.)


이 모든것들은 전부 하나의 서버에서 여러개의 클라이언트의 요청을 처리하기 위해 고안된 방법이다.

우선 쉽게 하나하나 생각한 후, 발전시켜 나가보자.

맨처음에는 클라이언트 요청을 처리할 수 있는 프로그램하나 짜서 실행시켜 놓으면 처리는 할 수 있다. 

다행이 클라이언트도 한명이면은 별 상관이 없는데, 그런 경우는 거의 없을 것이다.

물론 클라이언트가 여러명이라도 처리할 수는 있을것이다. For문 같은걸 돌려서...

알겠지만 그런식으로 처리를 하면 앞의 사람의 일이 끝날때까진 다음사람 요청을 처리해줄 수가 없다.

(동시에 처리를 못한다.) 접속자가 수백 수천명으로 늘어난다면? 감당이 될까?


그래서 두번째 사람들이 생각해낸 방법이 멀티프로세싱이다. 

(프로세싱이란 단어가 어려워보이지만 별거 없다. 프로세싱은 프로그램이 운영 중, 즉 실행가능한 상태인 것을 의미한다.) 즉 여러개의 프로그램을 띄워놓고 각 프로그램에서 처리하게끔 하는 것이다. 

그래서 그 유명한 fork함수를 사용해서 같은 내용의 프로그램을 여러게 메모리에 띄워놓고 (복붙이라 생각하면 된다) 각각의 프로그램별로 처리하게 하는 것이다. 

프로그램을 짜다가 중간에 이제 여러개의 요청을 처리해야 하는 로직을 마주하면 fork함수를 수행하여 같은 내용을 이제 복사된 별도의 프로세스에서 실행하게 하는 것이다. 근데 여기서 주의해야 할 사실이 한가지 있다. 프로세스가 여러개가 되면 같은 내용으로 여러개 프로세스가 동시에 돌고 있는 것이다. 경우에 따라서 어떤것은 일찍 수행을 마칠 수 있는데 수행을 마치고, 반드시 제대로 종료(할당받은 자원들 메모리 등등을 반납) 할수 있도록 신경써야 한다는 것이다. (그렇지 않으면 좀비 프로세스가 된다)


근데 이 멀티프로세싱이 마냥 좋은것만은 아니다. 우선 많은 양의 연산을 해야하고 그래서 많은 양의 자원(메모리 등등)을 요구한다. 그래서 멀티플렉싱이란 기법이 등장한다. 멀티 플렉싱은 쉽게 말하면 하나의 프로세스로 여러개의 요청을 처리하는 것인데, select라는 함수를 이용하여 여러개의 클라이언트들을 구분한다. 

요것도 편하고 좋긴 한데, 동시에 접속하려는 클라이언트 수가 100개가 넘어가게되면 허덕이기 시작한다. 

(참고로 이걸 개선하는 방법으로 epoll - linux, IOCP - windows가 있다)


멀티 프로세싱, 멀티 플렉싱 말고도 이 상황을 해결할 수 있는 한가지 방법이 더 있다. 바로 멀테 쓰레딩을 이용하는 것이다. 멀티 프로세싱과 달리 멀티 쓰레딩은 하나의 프로세스에서 여러개의 쓰레드를 생성해 요청을 처리하는 방식이다. 멀티프로세싱은 기존의 프로세스가 완전히 새로운 별개의 프로세스로 복사되어 생성되는 것이기 때문에 자원 소모가 많다.  하지만 멀티 쓰레딩은 근본적으로 하나의 프로세스이다. 하지만 여러개의 쓰레드가 생성되어 실행흐름만 달라진다. 조금더 엄밀히 말하면 함수의 실행에 해당되는 스택영역은 독립적으로 가져가고 데이터와 힙 영역을 공유한다. 이제 장점이 되기도 하고 단점이 되기도 한다. 우선 장점으로는, 멀티프로세싱의 경우 프로세스간 같은 데이터를 공유하기가 꽤 어려웠다.(IPC라는 것을 이용해야 한다)

하지만 데이터영역과 힙영역을 공유하기 때문에, 예를들어 전역변수같은 것을 정의해놓고 같이 참조할 수 있다.  하지만, 이게 단점이 될 수 도 있다. 같은 메모리 영역을 같이 공유하다보니까, 같은 곳에 서로 동시에 접속하고 변경을 주려 해서 예상치 않게 수행될 수 있다. 이것을 임계영역에 접근한다고 표현하는것이고, 이를 방지하기 위해서 뮤텍스나 세마포어등을 이용한다. 


 

 


작가의 이전글 감정이 없으면
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari