프로세스

OS에서 어떤 프로그램을 실행했을때, 그 프로그램에대한 인스턴스를 프로세스라고 한다. 프로세스는 운영체제로부터 자원을 할당받은 작업의 단위이다. 다만 프로그램을 여러개 띄웠다고 해서 하나의 프로세스를 공유하는 것은 아니다. 프로세스는 운영체제로부터 주소공간, 파일, 메모리 등을 할당 받는다.

기존에는 OS에서 하나의 프로그램만 작동할 수 있었으며, 이럴 경우 프로세스는 하나만 사용하게 된다. 하지만 시대가 발전함에따라 멀티 태스킹이 가능하게 되었고 다수의 프로세스를 동시에 작업하는 일이 가능해졌다. (시분할, 협력형 and 선점형) 처음에는 동일한 자료를 다수의 프로세스가 공유하는 방식에서(시스템 자원을 엄청 잡아먹고 비용도 비싼방법) 단일 프로세스 안에서 멀티 스레드로 자료를 공유하는 방식으로 발전하였다.

결론적으로 프로세스는 자체적으로 실행 가능한 객체가 아니며 스레드에게 필요한 자원(주소 공간, 접근 권한등)을 제공해 주는 하나의 컨테이너 박스에 불과하며, 스레드가 작동하기 위한 환경에 불과하다. 따라서 스레드 같은 경우 실행하는데 필요한 프로세스 정보가 필요하다.

스레드

스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위(실행의 흐름)이다. 프로세스 내의 주소 공간이나 자원들을 대부분 공유하면서 실행된다. 기본적으로 하나의 프로세스가 생성되면 하나의 스레드가 생성되며 메인스레드라고 부른다. 프로세스는 여러개의 스레드를 가질 수 있는데 이럴경우 멀티 스레드라고 한다. 또한, 프로세스의 경우 자신만의 고유 공간과 자원을 할당 받아 사용하는데 스레드는 다른 스레드와 공간과 자원을 공유할 수 있다. 따라서 다수의 프로세스를 사용하는 것 보다 한 프로세스 안에서 멀티스레드로 작업을 진행하는게 효율적이며 시스템 자원 소모도 현저히 줄어든다.

스레드의 장점으로는 시스템의 자원소모가 줄어들고, 프로그램 응답 시간이 단축되며 스레드간 통신비용이 적으므로 작업들 간의 통신비용이 줄어들게 됩니다. 물론 스레드도 단점이 있습니다. 단점으로는, 자원 공유로 인해 전역 변수를 이용하므로 동기화 관련된 문제가 발생할 수 있으며 잘못된 변수를 사용하거나 미묘한 시간차로 인해 프로그램에 오류가 발생할 수도 있다. 덕분에 프로그래머의 각별한 주의가 필요한 방법이다. 또한 싱글 프로세서 시스템에서는 큰 효과를 보기 어렵다.

Node.js가 싱글 스레드로 작동한다고 한다.

동기화

스레드, 특히 멀티 스레드에 대해 배우다 보면 나오는 문제가 동기화 문제이다. 동기화란 코드의 실행 순서를 정하는 일이며, 어떤 코드를 먼저, 혹은 나중에 실행할지 정하는 것이다. 개별 실행 흐름은 순차적으로 진행되지만, 이런 흐름들이 섞이게 되면 예상치도 못한 문제가 발생하게 된다. codewiz 님의 블로그(http://www.jiniya.net/wp/archives/5856)에서 참고한 결과 이런 동기화 문제는 동시성, 병렬성의 개념을 숙지하고 있어야 한다고 한다.

동시성, 병렬성

동시성이란 우리가 보기에 동시에 실행되는듯한 프로그램을 모두 포함한다. 시분할 기법을 사용해서 동시에 작업하는것 또한 동시성에 포함된다. 병렬성이란 실제로 코드가 동시에 실행되는 상황을 나타낸다. 따라서 동시성이란 물리적 동시성을 나타낸다고 보면 되겠다.

으음…. 동기화문제는 아직 확실하게 이해하기가 어렵다. 스레드를 알기위해서는 컨텍스트도 배워야한다는데.. 뭐가 이렇게 많은거야.. 일단 동기화 문제에 대해서는, 내가 알고있는건 버전 문제(의존성 문제)때문에 알고 있는게 전부인데, ‘동기화가 코드의 실행 순서를 정하는 일이라니…’ 이건 또 무슨 개념인지 모르겠다. 천천히 배워보자…..

PS. 2017년 3월 27일 작성된 블로그 포스트를 옮겨왔습니다.

참고: 진형아빠이야기 블로그, 강관우님 브런치 포스트, 괴짜 프로그래머의 일상사 블로그