관련 책 읽으며 옮겨둔 것들.

모든 운영체제는 기본적으로 추상 개념 중 하나인 ‘프로세스(Process)’ 를 활용한다. 프로세스는 실행 상태에 있는 프로그램의 instance 또는 실행 중인 프로그램의 execution context 라는 말로 정의할 수 있다. 전통적인 운영채제의 한 프로세스는 1개의 주소공간(Address Space) 에서 연속된 명령어 하나를 실행한다. 주소 공간이란 프로세스가 참조할 수 있도록 허가된 메모리 주소의 집합을 말한다. 최근 운영체제에는 프로세스가 여러 실행의 흐름, 즉 같은 주소 공간에서 연속된 여러 개의 명령어를 실행할 수 있다.

프로세스를 프로그램 실행이 얼마나 진행되었는지를 완전하게 기술하는 자료 구조의 집합이라고 생각해도 된다.

스레드는 프로세스의 특정한 수행 경로이다. 보통 프로세스는 하나의 제어 줄기를 가진다.(=각 프로세스는 한 시점에서 하나의 일만 수행한다.) 그러나 하나의 프로세스에 여러 개의 제어 줄기를 둔다면, 프로세스가 동시에 여러 개의 일을 하도록 프로그램을 설계할 수 있다.

다중 스레드로 짤 때의 장점. 프로세스가 여러 개의 작업을 처리하고 있다고 해보자. 그 작업들이 서로 독립적이더라도, 단일 스레드로 프로그래밍한다면 암묵적으로 그 작업들을 어떤 순서에 따라 배치해서 짜게 된다. 그러나 실행 줄기가 여러개라면(멀티스레드) 독립적인 과제들을 각각의 스레드에 배정해서 과제들을 동시에 진행하는 것이 가능하다. 비동기적인 사건들을 처리하는 코드를 짤 때도 비슷한 방식으로, 특정 스레드마다 특정 사건을 처리하게 하는 식으로 코드를 단순하게 만들 수가 있다.

프로세스는 실행되고 있는 프로그램 개체이다. 프로세스는 CPU 시간이나 메모리 등이 시스템 자원이 할당되는 독립적인 개체이다. 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다. 어떤 프로세스는 다른 프로세스의 자원을 접근하려면 IPC(프로세스간 통신) 을 사용해야 한다. 프로세스 간 통신 방법으로는 파이프나 파일, 소켓 등이 있다.

스레드는 프로세스와 같은 스택공간을 사용하며, 여러 스레드는 그 상태의 일부를 서로 공유한다. 각각의 스레드에는 별도의 레지스터와 스택이 배정되고, 다른 스레드가 남의 스레드의 스택 메모리를 읽고 쓰는 것이 허용된다. 한 스레드가 프로세스 자원을 변경하면, 다른 sibling thread 들도 그 변경 결과를 즉시 볼 수 있다. 프로세스의 경우 다른 프로세스의 메모리를 직접 접근할 수 없다.

리눅스는 멀티스레드 애플리케이션을 효율적으로 지원하기 위해 ‘lightweight process’ 를 사용한다. 기본적으로 두 lightweight process는 주소 공간이나 열린 파일 등 여러 자원을 공유할 수 있다. 그리고 둘 중 하나가 공유하는 자원에 어떤 변경을 가하면 다른 쪽에서도 변경된 부분을 바로 알 수 있다. 당연히 두 프로세스는 공유 자원을 접근할 때 서로 동기화를 해야 한다.

(출처 : 코딩 인터뷰 완전 분석, Unix 고급 프로그래밍, 리눅스 커널의 이해)