운영체제에 대해 공부하다 보면 Multi process & thread에 대해서 만나게 된다. 멀티 프로세스, 멀티 쓰레드... 대강의 느낌은 알겠는데... 설명하려면 힘들다...
그래서 이 포스팅을 통해 정리를 해 보고자 한다.
운영체제로 부터 자원을 할당 받은 작업의 단위
정의는 위에 나와있는 대로 이나, process는 program과의 관계가 있다.
프로그램 이란,
파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태를 의미한다.
위의 프로그램에 대한 내용도 함께 알고 가야 한다. 왜냐하면, 프로그램은 실행되지 않은 파일 그 자체를 가리키지만, 실행이 된 프로그램을 프로세스라고 하기 때문이다.
아래 그림은 프로그램과 프로세스 사이의 관계를 간단하게 나타내었다.
Program이 메모리에 올라가 실행이 되어 process가 될 때, 운영체제로 부터 자원을 할당 받는다. 이 때 운영체제는 process에 각각 독립된 메모리를 할당해 주는데 Code/Data/Stack/Heap 형식으로 할당된다.
구조는 아래 그림과 같다.
각각 독립된 구조의 메모리를 할당 받기 때문에 process는 다른 process의 변수나 자료에 접근할 수 없다.(process들간 통신을 하기 위해서는 특별한 설비가 필요로 한다.)
Process 내에는 기본적으로 최소 1개의 thread(main thread)가 있다.
Process간 정보를 공유하는 방법에는 아래와 같은 방법이 있다. 이 경우 CPU register 교체 뿐만이 아니라 RAM과 CPU 사이의 cache memory까지 초기화되기에 자원 부담이 크다. 하지만 알아보자!
1. IPC(Inter-Process Communication)을 사용한다.
2. LPC(Local inter-Process Communication)을 사용한다.
3. 별도 공유 메모리를 만들어서 정보를 주고 받을 수 있도록 설정 한다.
프로세스가 할당 받은 자원을 이용하는 실행 흐름의 단위
Thread는 왜 필요할까? 예전에는 프로그램을 시작할 때 process 하나로만 순차적으로 진행했었다. 하지만 시간이 흐르면서 프로그램이 복잡해지고, 하나의 process로만 처리하기는 힘들어지게 되었다.
이러한 문제를 해결하기 위해 더 작은 단위의 실행 단위를 필요로 하게 되었고, 그로 인해 thread란 실행 단위의 개념이 생겨나게 되었다.
Thread는 process와는 다르게 thread간 메모리를 공유하며 작동한다. Thread 끼리 process의 자원을 공유하면서 process의 실행 흐름 일부가 된다.
즉, thread는 process의 code에 정의된 절차에 따라 실행되는 특정한 수행 경로이다.
Thread는 위에서 언급했듯 process 내에서 메모리를 공유한다. 자세히 말하면 각 thread는 stack 형식으로 할당된 메모리 영역을 할당 받고, code/data/heap 형식으로 할당된 메모리 형태를 공유하며 작동한다.
Thread는 process와 달리 메모리를 공유하기 때문에 한 thread에 오류가 발생했을 때 전체 thread가 영향을 받아 같은 process 내의 모든 thread가 종료가 된다.
CPU(Central processing unit)과 운영체제의 최소 단위는 다르다. CPU는 작업을 처리할 때 최소 단위가 thread이다. 하지만 운영체제의 관점에서는 process가 최소 단위 이다. 그렇기 때문에 thread는 process에 할당된 메모리를 공유해서 작동할 수 밖에 없다.
그럼 여러 개의 process와 여러 개의 thread가 작동할 때는 어떻게 될까?
Multi-tasking
하나의 운영체제 안에서 여러 process가 실행되는 것을 의미한다.
각 process는 동시에 실행되는 것은 아니며, scheduling 방식에 따라 순차적으로 진행되어 동시에 진행되는 것처럼 보이게 효율적으로 진행된다.
Multi-threading
하나의 process 내에서 여러 thread로 작업을 하여 효율적으로 하나의 작업을 처리하는 것을 의미한다.
현재 진행하고 있는 task(process, thread)의 상태를 저장하고 다음 진행할 task의 값을 읽어 적용하는 과정을 말한다.
📖 출처 :
이번 posting을 통해서 process와 thread에 대해서 알아보았다. 이 요소들을 알아보면서 멀티 프로세싱, 멀티 프로그래밍, 멀티 태스킹 그리고 멀티 스레딩에 대해서도 알게 되었다. 이 개념들에 대해 다음 포스팅에서 정리해 보도록 해야겠다!