프로세스와 스레드

이원석·2022년 4월 5일
1

OS

목록 보기
1/8

1. 프로세스와 스레드



1-1. 프로세스

프로그램이란 어떤 작업을 위해 실행할 수 있는 파일입니다. 이러한 파일들이 컴퓨터속에서 연속적으로 실행되고 있다면 프로세스라고 합니다.

프로세스는 메모리에 실행되고 있는 프로그램의 인스턴스(메모리가 할당된 독립개체) 이며, 동적인 개념으로는 실행되고있는 프로그램을 의미합니다.

프로세스는 운영체제로부터 CPU 시간, 주소공간, (Code, Data, Stack, Heap)의 구조로 되어있는 메모리를 할당받습니다.



프로세스의 특징

프로세스는 기본적으로 최소 1개의 스레드(메인 스레드)를 가지고 있습니다. 각 프로세스는 별도의 주소 공간을 할당받아 실행되며 완전히 독립된 실행객체이며, 다른 프로세스의 변수나 자료구조에 접근할 수 없습니다.

다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC) 을 사용해야합니다.





1-2. 스레드

스레드란 프로세스 내에서 실제로 작업을 수행하는 주체입니다. 모든 프로세스는 한 개 이상의 스레드가 존재하여 작업을 수행하며, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고 합니다.



스레드의 특징

프로세스를 구성하는 스레드들은 독립적인 잡업의 수행을 위해 프로세스 내에서 각각의 Stack과 PC(Program Counter) Register를 가지며, 다른 Code, Data, Heap 영역은 공유받습니다. 하나의 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드도 그 변경 결과를 즉시 확인할 수 있습니다.



스택과 PC Register를 쓰레드마다 독립적으로 할당하는 이유

스택은 함수 호출 시 전달되는 인자, Recurse할 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이기 때문에 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이며, 이는 독립적인 실행 흐름이 가능하게 합니다.

따라서 독립적인 샐행 흐름을 위한 최소 조건으로 독립된 스택을 할당합니다.


PC(Program Counter) Register는 다음 인출될 명령어의 주소를 가지고 있는 레지스터 입니다. 스레드는 CPU를 할당받았다가 스케줄러에 의해 다시 선점당합니다. 그렇기 때문에 명령어가 연속적으로 수행되지 못하고 어느 부분까지 수행했는지를 기억해야 합니다.

따라서 PC Register를 독립적으로 할당합니다.



1-3. 프로세스와 스레드의 차이점!?

프로세스는 운영체제로부터 자원을 할당받는 연속된 프로그램의 작업의 단위이며
스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위이다.

프로세스는 생성하는데 많은 시간과 자원을 소비하기 때문에, 생성및 종료시간이 짧은 스레드가 프로세스 내에서 실행 단위로서 역활을 합니다.






2. 멀티 프로세스와 멀티 스레드



2-1. 멀티 프로세스

두 개 이상의 프로세서(CPU)가 협력적으로 하나 이상의 작업을 동시에 처리(병렬처리) 하는 것 입니다. 각 프로세스간의 메모리 구분이 필요하거나 독립된 주소 공간을 가져야 할 경우에 사용합니다.



멀티 프로세스의 특징

프로세스는 프로그램의 인스턴스로서 독립 개체입니다. 독립된 구조때문에 멀티 프로세스의 프로세스 중 하나에 문제가 생겨도 다른 프로세스에 영향을 주지 않아, 작업속도가 느려지는 등의 이슈는 생기지만 프로그램이 정지되거나 하는 문제는 발생하지 않기때문에 안정성이 높다는 장점이 있습니다.

여러개의 프로세스가 처리되어야 할 때 동일한 테이터를 사용하고, 이러한 데이터를 하나의 디스크에 두고 모든 프로세서가 이를 공유하면 비용적으로 저렴하다는 장점이 있습니다.


멀티 프로세스의 문제점

하지만 독립된 메모리 영역이기 때문에 작업량이 많을 수록 (Context Switching이 자주 일어나 주소 공간의 공유가 잦을 경우) 오버헤드가 발생하여 성능저하가 발생 할 수 있습니다.

Context Switching 과정에서 캐시 메모리 초기화 등 무거운 작업이 진행되기 때문에 시간과 비용의 소모로인해 오버헤드가 발생한다.





2-2. 멀티 스레드

멀티스레드란 하나의 프로세스에 여러 스레드로 자원을 공유하며 작업을 나누어 수행하는 것입니다.



멀티 스레드의 특징

프로세스를 생성하여 자원을 할당하는 과정이 줄어 자원을 효율적으로 관리할 수 있습니다. 스레드 간 데이터를 주고 받는 것이 간단해지며 시스템 자원 소모가 줄어듭니다. 스레드 사이 작업량이 적어 Context Switching이 빠릅니다 (캐시 메모리를 초기화 할 필요가 없기 때문에).

또한 스레드는 프로세스 내 스택영역을 제외한 메모리 영역을 모두 공유하기 때문에 통신 비용이 적으며 힙 영역을 공유하므로 데이터를 주고 받을 수 있습니다.



2-3. 멀티 프로세스 대신 멀티 스레드를 사용하는 이유

쉽게 이해하자면, 프로그램을 여러개 키는 것 보다 하나의 프로그램 안에서 여러 작업을 해결하는 것이다.

  1. 자원의 효율성 증대
    멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있습니다 (본문에 기제한 Context Switching 이슈).
    스레드는 프로세스 내의 메모리(Stack을 제외한 모든 메모리) 를 공유하기 때문에 독립적인 프로세스와 달리 스레드 간 데이터를 주고 받는것이 간단해지고 시스템 자원 소모가 줄어들게 됩니다.
  1. 처리 비용 감소 및 응답 시간 단축
    프로세스 간의 통신(IPC) 보다 스레드 간의 통신의 비용이 적기때문에 작업들간의 통신 부담이 줄어듭니다.
    또한 프로세스 간의 전환 속도보다 스레드 간의 전환속도가 빠릅니다. (Context Switching 시 스레드는 Stack 영역만 처리하기 때문)

멀티 스레드의 문제점

프로세스 내에서 실행의 흐름을 담당하기 때문에 스레드 하나에 문제가 생기게 되면 전체 프로세스가 영향을 받습니다.

또한 스레드는 별도로 실행되는 하나의 실행으로 동시에 여러 스레드가 실행되면 스레드들이 공유하는 자원에 대한 동기화 문제가 발생할 수 있습니다.



동기화 문제

스레드가 프로세스 처럼 프로그램의 인스턴스로서 독립된 개체로 동작한다면 동기화 문제를 고려하지 않아도 됩니다. (프로세스는 자신만의 주소 범위를 가지고있기 때문에 다른 프로세스들이 차지하는 메모리 영역을 침범할 수 없다)

하지만, 한 프로세스 안에서 실행되는 여러개의 스레드 들은 서로 공유할 수 있는 메모리(Code, Data, Heap) 가 있습니다. 공유될 수 있는 부분이 있기 때문에 동기화 문제가 발생할 수 있습니다. (스레드가 다른 스레드에서 사용중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정하는 경우)



2-4. 멀티 스레드의 동기화 문제를 해결하는 방법

동기화 문제가 발생하는 이유는 프로세스 내의 메모리 영역을 공유하기 때문에, 스레드가 해당 자원에 동시 접근하는 경우 입니다.

따라서 이러한 문제를 방지하기 위해 스레드들에게 하나의 자원에 대한 처리 권한을 주거나 순서를 조정하는 기법을 사용합니다.

멀티 스레드를 안전하게 활용하는 기법들은 후술문서에서 알아보겠습니다.





3.


IPC(Inter Process Communication)

프로세스는 완전히 독립된 실행객체이기 때문에, 서로 독립되어 있는 다른 프로세스의 영향을 받지 않는다는 장점이 있는 반면에 독립되어 있는 만큼 별도의 설비 없이는 서로간의 통신이 어렵다는 문제점이 존재합니다.

따라서 커널 영역에서 IPC라는 내부 프로세스간 통신(IPC) 를 제공하며 이를 이용해서 프로세스간의 통신을 할 수 있습니다.



Context Switching

CPU는 한번에 하나의 프로세스만 실행이 가능하므로 CPU에서 여러 프로세스를 동라가며 작업을 처리하는 과정을 뜻합니다.

동작 중이던 프로세스가 대기를 하게되면 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 뜻합니다.





[참고문헌]
https://goodgid.github.io/What-is-Thread/
https://jwprogramming.tistory.com/54
https://technote.kr/310
https://github.com/WeareSoft/tech-interview/blob/master/contents/os.md#%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4

0개의 댓글