CS

[CS] 프로그램, 프로세스, 쓰레드

Joonfluence 2022. 6. 18.

서론

오늘은 프로그램, 프로세스, 쓰레드의 차이점에 대해서 알아보도록 하겠습니다.

본론

프로그램과 프로세스의 차이

프로그램이란 저장장치에 저장되어 있어 언제든지 실행 가능한 파일을 말합니다. 모든 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해줘야 실행될 수 있는데, 프로그램은 아직 메모리에 올라가 있지는 않은 상태입니다.

반면, 프로세스란 컴퓨터에서 실행되고 있는 컴퓨터 프로그램을 말합니다. 이는 프로그램과는 다르게, 메모리에 올라와 있는 상태입니다. 즉, 프로세스란 메모리에 올라와 있는 프로그램을 말합니다.

프로세스와 쓰레드의 차이

과거에는 프로그램을 실행할 때 실행 시작부터 실행 끝까지 프로세스 하나만을 사용해서 진행했다고 합니다. 그러나 프로그램이 더이상 하나의 작업 만을 수행하지 않게 되면서, 프로세스 하나로 프로그램을 제어하기 어려워졌습니다.

그러면 프로세스를 여러 개 만들면 되지 않을까요? 그러나 이는 불가능한 일입니다. 왜냐면 운영체제는 안전성을 위해서 프로세스마다 자신에게 할당된 메모리 내의 정보에만 접근할 수 있도록 제약을 두고 있고, 이를 벗어나는 정보에 접근하려면 오류가 발생하기 때문입니다.

쓰레드란 위에 언급한 문제점의 한계를 해결하기 위해 나온 개념으로, 스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동합니다. 쓰레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되는 것을 말합니다.

또 한 가지 중요한 차이가 있습니다. 하나의 프로세스가 오류로 인해 강제종료 되더라도, 다른 프로세스의 상태엔 영향을 주지 않습니다. 그러나 스레드의 경우에는 하나의 스레드에서 발생된 오류가 연쇄작용으로 다른 스레드에도 영향을 주게 됩니다.

이러한 방식으로 메모리를 공유하는 까닭은?

CPU는 작업을 처리할 때 스레드를 최소 단위로 삼고 작업을 합니다. 반면 운영체제는 프로세스를 최소 단위로 삼습니다. 이 때 하나의 프로세스는 하나 이상의 스레드를 갖으므로 운영체제 관점에선 프로세스 소속의 스레드끼리 메모리를 공유하지 않을 수 없습니다.

멀티태스킹, 멀티스레드란?

멀티태스킹이란 하나의 운영체제 안에서 여러 프로세스가 실행되는 것을 말합니다. 여러 프로세스가 동시에 실행되는 것처럼 보이지만, 실제론 하나의 프로세스를 중단하고 다른 프로세스를 실행하는 방식이 사람이 인지하기 어려울 정도로 짧은 시간에 이뤄져 동시에 실행되는 것처럼 보일 뿐입니다. 이러한 작업을 처리하는 것은 프로세스 스케쥴링과 관련됩니다.

멀티스레드란 하나의 프로세스가 여러 작업을 복수의 스레드를 사용하여 동시에 처리하는 것을 말합니다.

멀티스레드의 장점과 단점

  1. 장점
  • 멀티태스킹을 위해 프로세스 간 작업 전환(Context-Switching)을 하는 경우에 비해, 메모리 자원을 아낄 수 있습니다. 멀티스레드는 하나의 프로세스의 메모리를 서로 공유하기 때문입니다.
  • 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리(Code, Data, Heap)를 공유하기 때문에 통신 부담이 적고 응답 시간이 빠릅니다.
  1. 단점
  • 스레드 하나가 프로세스 내 자원을 망쳐, 모든 프로세스가 종료될 수 있습니다.
  • 자원을 공유하기 떄문에 필연적으로 동기화 문제(Synchronization Issue)가 발생할 수 밖에 없습니다.

동기화 문제

멀티스레드를 사용하면 각각의 스레드의 실행 순서를 파악하기 어렵습니다. 만약 A 스레드가 C라는 자원을 사용하다, B 스레드에서 C를 수정했을 때 A 스레드는 해당 자원에 접근하지 못하거나 바뀐 자원에 접근하게 되는 오류가 발생될 가능성이 있습니다. 이처럼 여러 스레드가 같은 전역 변수를 사용할 경우 발생할 수 있는 충돌을 동기화 문제라고 합니다. 이처럼 스레드 스케쥴링은 운영체제가 자동으로 해주지 않기 때문에 프로그래머가 적절한 기법을 직접 구현해야 하므로 프로그래밍할 때 멀티스레드를 사용하려면 신중해야 합니다.

한 프로세스에서 다른 프로세스의 정보에 접근하는 방법

사실 프로세스 간 정보를 공유하는 것은 불가능한 일은 아닙니다. 아래 방법들을 사용하면 프로세스 간에도 정보를 공유할 수 있습니다.

  1. IPC(Inter-Process Communication)을 사용한다.
  2. LPC(Local inter-Process Communication)을 사용한다.
  3. 별도로 공유 메모리를 만들어서 정보를 주고받도록 설정해주면 된다.

참고한 사이트

프로세스와 스레드의 차이

반응형

댓글