치춘짱베리굿나이스

[Rank 3] Philosophers - 프로세스와 스레드 본문

42/42s Cursus

[Rank 3] Philosophers - 프로세스와 스레드

치춘 2021. 9. 4. 11:08

프로그램

실행 가능한 코드라인들이 저장된 파일

모든 프로그램은 운영체제로부터 실행되기 위한 메모리 공간을 할당받아야 프로그램에 정의된 대로 동작을 수행할 수 있다

허나 이러한 자원을 할당받지 않았기 때문에 동작하지 않은 채로 저장소 어딘가에 잠들어 있다 (아직 메모리에는 올라가 있지 않은 정적인 상태)

  • 윈도우의 *.exe, 맥의 *.dmg가 이에 해당한다

프로그램을 실행시키면 ↓프로세스가 생성되며, 프로세스는 적절한 자원을 할당받고 이를 이용하여 프로그램에 저장되어 있던 코드라인들을 실행시키면서 우리가 원하는 동작을 하는 것

프로세스

메모리에 올라와 실행되고 있는 프로그램의 인스턴스 (독립적인 개체)

프로그램은 실행 가능한 파일을 일컫고, 프로세스는 이 프로그램을 실행시켰을 때 메모리에 올라가 운영체제로부터 자원을 할당받고 프로그램에 명시된 작업을 수행한다

뭐 이런것들.. 내가 프로그램 (노션, 카카오톡, 메일, 크롬 등...) 을 실행시키면 이렇게 프로세스 목록에 해당 프로그램에 대응하는 프로세스가 생성되며 운영체제로부터 자원을 할당받는다

  • CPU 시간
  • 동작에 필요한 메모리 주소 공간
  • Code, Data, Stack, Heap 구조로 되어 있는 독립된 메모리 영역

이처럼 메모리에 프로그램 파일을 올리면서 정적이었던 프로그램이 동적인 프로세스 상태로 바뀐다

프로세스는 각각 서로 다른 독립적인 메모리 영역을 할당받기 때문에 서로 다른 프로세스가 서로의 메모리 영역에 간섭할 수 없다

프로세스는 최소 1개의 스레드 (메인 스레드) 를 가지고 있다

스레드

과거에는 프로그램을 실행할 때 프로그램 하나당 프로세스 단 하나를 사용했다고 하는데, 시간이 지날 수록 프로그램은 고성능, 다양한 기능을 지원하면서 점차 복잡해져 결국 프로세스 하나로는 부족한 상황에 이르렀다

하지만 프로세스를 여러 개 만들자니 프로세스는 각 프로세스마다 할당된 자원에만 접근 가능한데 프로그램 하나 당 프로세스를 여러 개 생성할 경우 자원을 공유하지 못해 기능에 제약이 발생하기 때문에, 프로세스보다 더 작은 단위의 실행 개념이 필요하게 되었다

이렇게 해서 나오게 된게 스레드이다

각 프로세스마다 끼고 있는 스레드의 개수가 보인다

디스코드는 37개, 노션은 33개, 크롬은 30개 등....

스레드는 프로세스와 다르게 스레드끼리 프로세스의 자원을 서로 공유할 수 있으며, 프로세스 실행 흐름의 일부가 된다 (코드 내에 선언된 함수 각각이 스레드가 될 수 있는 것)...

스레드는 프로세스가 공유받는 메모리 영역 중 Stack을 나눠갖고, Code, Data, Heap 영역은 모든 스레드가 공유한다

스택 영역에 지역변수, 매개변수가 들어가고, 지역변수와 매개변수는 다른 함수에서 건드릴 수 없다는 것을 생각하면 각 함수별로 다른 스레드에서 구동된다는 것을 알 수 있다

또한 영역에서 메모리를 할당하여 접근가능한 변수, 데이터 영역에 들어가는 전역 / 정적 변수들은 모든 함수 (스레드) 에서 접근가능하단 점에서 공유 자원임을 알 수 있다

스레드와 프로세스 차이점

  1. 자원 할당 문제
    • 각 프로세스끼리는 데이터 영역을 공유할 수 없다.
    • 서로 다른 데이터 영역을 운영체제로부터 할당받아 사용하기 때문에, 서로 다른 프로세스는 서로의 영역에 침범할 수 없음
    • 같은 프로세스에서 생성된 스레드끼리는 데이터를 공유할 수 있다
    • 프로세스가 할당받은 스택 영역을 스레드끼리 나눠받아 사용하고, 코드, 데이터, 영역은 공유한다
  2. 오류 발생
    • 한 프로세스가 오류로 강제종료 된다고 해서 다른 프로세스에 영향을 끼치지 않는다
      • 서로 다른 프로세스가 같은 파일을 공유하여 사용하거나, 시스템 프로세스가 아니라면 영향을 미치진 않는다
    • 한 스레드가 오류로 강제종료되면, 같은 프로세스 내의 다른 모든 스레드가 강제종료되며, 프로세스 실행이 종료된다
      • 함수에서 Segmentation Fault, Bus Error 등이 발생하면 프로그램 동작 (프로세스) 이 뻑나는 것을 볼 수 있는데, 이것이 이 예시다
  3. 최소 작업 단위
    • CPU 입장에서는 스레드가 최소한의 작업 단위가 된다
    • 운영체제 입장에서는 프로세스가 최소한의 작업 단위가 된다
  4. 병렬 처리
    • 멀티태스킹은 여러 프로세스가 동시에 실행되는 것처럼 보이는 동작 방식
      • 사실 각 프로세스가 번갈아가면서 동작하는 것 (Context-Switching) 뿐, 실제로 동시에 동작하는 것은 아님
    • 멀티프로세스는 한 응용 프로그램에 대하여 자식 프로세스를 생성하는 등의 방식으로 여러 개의 프로세스가 하나의 작업을 수행하는 것
      • 장점
        • 자식 프로세스 중 하나가 죽는다고 해서 전체 응용 프로그램 실행 과정에 영향을 미치지 않는다
      • 단점
        • 프로세스는 각각의 독립된 메모리 영역을 할당받기 때문에 프로세스끼리 공유하는 메모리가 없어, Context-switching 시에 캐시 데이터를 전부 리셋하고 초기화하는 등의 작업이 필요하다
        • 프로세스간 데이터 공유 기법이 복잡하다
        • 프로세스간 Context-switching 과정에서 캐시 메모리 초기화 등 무거운 작업들이 반복되어 오버헤드가 발생한다
    • 멀티스레드는 하나의 프로세스 내에서 여러 작업을 여러 스레드를 이용하여 동시에 처리하는 것
      • 장점
        • 스레드끼리는 스택 영역을 제외한 모든 메모리 자원을 공유하기 때문에 통신 시의 응답 속도가 빠르다
        • 스레드간 Context-switching 시에 공유하고 있는 메모리만큼의 메모리 자원을 아낄 수 있다
      • 단점
        • 자원을 공유하고 있고, 어떤 스레드가 먼저 실행될 지 확실치 않기 때문에 동기화 문제가 발생 (데드락, 자원이 필요하지만 자원에 접근을 못함 등..)
        • 스레드 하나가 프로세스 내의 자원을 망쳐버리거나, 스레드가 오류 발생하면 프로세스 전체가 종료된다

기타

사실 프로세스간 자원 공유는 특수한 방법을 거치면 가능하다네요

(프로세스간 통신 - inter-process communication)

파이프, 파일, 소켓 등..

참고

https://velog.io/@raejoonee/프로세스와-스레드의-차이

https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

노션 이자식 복붙해오면 이미지는 다 엑박으로 바꿔버리는구나

Comments