[TIL] 프로세스와 스레드

woonie·2022년 4월 6일
0

TIL

목록 보기
62/64

0. 선행지식

CPU : 중앙처리장치

  • 초기의 컴퓨터는 멀티 태스킹이 불가능했다. 그러나 CPU 성능이 개선됨에 따라 Context Switching을 통해서 동시성을 구현하는 것이 가능해졌다.

동시성(Concurrency) : 동시에 실행되는 것 같이 보이는 것

  • 2000년대 초반, 한계치 이상까지 CPU의 쿨럭을 끌어올리던 CPU 제조회사들은 2002년에 3Ghz 쿨럭을 돌파했다.
  • 그러나 이로 인해 발생하는 발열, 엄청난 전력 소모로 인해 CPU의 작업 속도를 높이는데에 한계가 있음을 발견한다.
  • 이에 쿨럭을 올리는 방향이 아닌, 코어의 면적을 넓히는 방향, 즉 멀티 코어 프로세서의 방향으로 나아가기 시작한다.
  • 즉 코어 하나를 극한까지 끌어올리는 것이 아닌, 하게 된 것이다.
    코어의 수를 늘려서 더 쉽게 CPU 전체의 성능 향상을 도모하는 쪽으로 발전
  • 그리고 이러한 발전은 프로세서의 숫자를 늘리는 것에서 그치지 않고, 스레드까지 나아가게된다.

1. 프로세스(Process)

1-1 프로그램(Program)

  • 프로세스를 이해하려면 먼저 프로그램의 정의를 알아야한다.

프로그램(Program) :

작업을 위해서 실행할 수 있는 파일 (An executable file)

  • 프로그램은 바이너리 파일로 되어있다. 그렇다면 이 프로그램을 어떻게 실행시킬까?
  • 바로 한다.
    프로세스로 프로그램을 실행

1-2 프로세스(Process)

프로세스(Process) :
실행되고 있는 컴퓨터 프로그램 (computer program in execution)

  • 프로그램(실행 가능한 파일)을 실행 시킨 것이 바로 프로세스이다.
  • 프로세스는 메모리에 올라와 실행되고 있는 프로그램의 인스턴스이다.(독립적인 개체)
  • 운영체제(OS)로부터 시스템 자원을 할당 받는다.
  • 각 프로세스는 최소 1개의 스레드를 가지고 있다.
  • 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
    • 만약 한 프로세스가 다른 프로세스의 자원에 접근하려면, 프로세스 간의 통신(IPC, inter process communication)을 사용해야한다.

1-3 프로세스 구성 요소**

OS로부터 할당받는 자원(메모리 영역) /프로세스의 구성 요소

  • 하나의 프로세스는 각각 받는다. 독립된 메모리 영역을 할당
    • Code
      • 실행할 프로그램의 코드 및 매크로 상수가 기계어 형태로 저장되는 영역이다.
      • CPU는 코드 영역에 저장된 명령어를 하나씩 처리한다.
    • Data
      • 코드에서 선언한 전역 변수와 정적(static) 변수가 저장되는 영역이다.
      • 데이터 영역은 프로그램의 시작과 함께 할당되어 종료될 때 소멸된다.
    • Stack
      • 함수 안에서 선언된 지역 변수, 매개변수, 리턴 값 등이 저장되고 함수 호출 시 기록하고 종료되면 제거한다.
      • 스택은 LIFO(후입선출) 매커니즘을 따른다.
    • Heap
      • 관리가 가능한 데이터 이외의 다른 형태의 데이터를 관리하기 위한 공간(Free Space)이다.
      • 이 공간은 동적 메모리 할당 공간이므로 끝나면 운영체제가 쓸 수 있도록 반납해야한다.

2. 스레드(Thread)

스레드(Thread) : 프로세스 내의 실행 단위 (The unit of execution within a process)

  • 프로세스 안에는 여러개의 스레드가 있을 수 있다.
  • 스레드는 프로세스 내에서 Stack만 할당 받고, 나머지는 스레드들끼리 공유한다.
  • 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드도 그 변경 결과를 즉시 볼 수 있다.
  • 독립적인 스택을 가졌다는 것은, 독립적인 함수 호출이 가능하다는 뜻이다. 그리고 독립적인 함수 호출이 가능하다는 것은, 독립적인 실행 흐름이 추가된다는 것이다.
  • 즉 스레드는 스택을 가짐으로서 독립적인 실행 흐름을 갖는다.

3. 멀티 프로세스 (Multi Process)

  • 하나의 어플리케이션을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 병렬적으로 수행하는 것을 의미한다.
  • 부모 프로세스가 fork하여 자식 프로세스를 생성하면, 자식 프로세스는 독립적인 메모리 영역을 가지면서 하나의 프로그램을 처리할 수 있다.
  • 장점
    • 독립된 구조로 높은 안정성 : 각 프로세스가 독립된 영역(Code,Data, Stack, Heap)을 가지고 있기 때문에, 여러 자식 프로세스 중 하나에 문제가 발생하여도 해당 프로세스에만 영향을 미친다.
    • 메모리 침범 문제를 OS 차원에서 해결하므로 안전하다.
  • 단점
    • 독립된 메모리 영역이기 때문에, 작업량이 많을수록 더 많은 Context Switching이 일어난다.
    • Context Switching 과정에서 캐쉬 메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등의 오버헤드가 발생하여 성능 저하를 불러올 수 있다.
    • 프로세스 간의 복잡한 통신(IPC)가 필요하다.

4. 멀티 스레드(Multi Thread)

  • 하나의 어플리케이션을, 한 프로세스 안에 여러 스레드로 자원을 공유하여 작업을 처리하는 것을 의미한다.
  • 장점
    • 자원의 효율성 증대
      • 멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
      • Context Switching시 스레드는 Stack 영역만 처리하면 되기 때문에, 전환 속도가 빠르고 이를 위한 시스템 자우너 소모가 줄어든다.
    • 쓰레드들은 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적고, 프로그램 응답 시간이 단축된다.
  • 단점
    • 서로 다른 스레드가 Stack을 제외한 메모리 공간을 공유하기 때문에 동기화 문제가 발생할 수 있다.
    • 스레드 간의 자원 공유는 전역 변수(Data)를 이용하므로 다른 스레드가 동시에 사용할 때 충돌이 발생 할 수 있다.
    • 이는 하나의 스레드에 문제가 생기면 전체 스레드가 영향을 받는다는 것을 의미하고, 이로 인해 디버깅이 어려울 수 있다.
    • 디버깅이 잘 안되는 정도가 아니라, 공유하는 데이터 공간이 망가질 수도 있다..
    • 리스크 부담으로 인하여 주의 깊은 설계가 필요하다.

[참고]

https://www.youtube.com/watch?v=RrfASw-jfZ4

https://kyun2da.dev/CS/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C/

https://steady-coding.tistory.com/502

https://charlezz.medium.com/process%EC%99%80-thread-%EC%9D%B4%EC%95%BC%EA%B8%B0-5b96d0d43e37

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

profile
동료들과 함께하는 개발의 중요성에 관심이 많습니다. 언제나 호기심을 갖고 꾸준히 노력하는 개발자로서 성장하고 있습니다.

0개의 댓글