Process VS Thread

midas·2022년 9월 1일
0

Process vs Thread

✨  감명깊게 본 영상

[10분 테코톡] 🌷 코다의 Process vs Thread

🚀  잘 정리된 자료 링크

[OS] 프로세스와 스레드의 차이 - Heee's Development Blog

Process vs Thread


Program 이란?

그저 실행가능한 코드가 구현된 파일

이것이 실행되기 위해서는 메모리에 적재되어야 합니다.

이렇게 메모리에 적재되어 실행되고 있는 프로그램을 프로세스(Process)라고 합니다.

🚗  Process

  • 실행파일(program)이 memory에 적재되어 CPU를 할당받아 실행되는 것을 process라고 합니다.
  • 운영체제로부터 자원을 할당 받아 실행되는 작업의 단위 입니다. (메모리의 독립된 영역인 Code, Data, Stack, Heap 을 각각 할당 받습니다.)
  • 하나의 프로세스는 다른 프로세스의 자원에 접근이 불가능 합니다.
  • 하나의 프로세스는 최소 하나 이상의 스레드(Thread)를 가집니다.

🛞 Thread

  • 프로세스 내에서 실행되는 실행 단위이고 독립적인 기능을 수행합니다.
  • 프로세스의 Code, Data, Heap을 영역을 공유하고, Stack만 따로 할당받아 실행됩니다.

💡  메모리 영역

  • Code : 실행 명령을 포함하는 코드들
  • Data : static 변수
  • Heap : 동적 메모리 영역
  • Stack : 지역변수, 매개변수, 반환값 등의 일시적인 데이터

Multi Process vs Multi Thread


Multi Process

🤔 2개의 Process가 실행된다면? (슬랙, 크롬)

Slack 실행 → Slack 멈춤 → Chrome 실행 → Chrome 멈춤 → Slack 실행...

→ CPU는 한번에 하나의 프로세스만 실행가능!

→ 이렇게 반복하지만 사용자 입장에서는 동시에 실행하는 것처럼 보임.

→ 이렇게 여러 프로세스가 돌아가면서 작업을 처리하는 것을 Context Switcing 이라고 합니다.

✨  Context Switcing

  • Context란? 이전에 어디까지 명령을 수행했고, register에는 어떤 값이 저장되어 있었는지 정보가 필요합니다.
    process가 현재 어떤 상태로 수행되고 있었는지에 대한 총체적인 정보가 바로 context입니다.
    context 정보는 PCB(Process Control Block)에 저장을 합니다.
  • PCB(Process Control Block)
    • 운영 체제(kernel : 하나의 프로세스)가 프로세스를 표현한 자료구조
      • 커널??
        • 하나의 프로세스
        • 운영체제의 프로세스가 돌아갈 때도, 어떤 정보들이나 코드들이 메모리에 올라가야 프로세스가 실행된다.
        • 커널 영역은 항상 컴퓨터를 켜는 그 순간부터 메모리에 적재되어 실행이 된다!
    • 프로세스의 중요한 정보가 포함되어 있음 → 일반 사용자가 접근하지 못하도록 보호된 메모리 영역 안에 저장
    • 일부 운영체제 에서는 PCB는 커널 스택에 위치
      • 이 메모리 영역은 보호 받으면서도 비교적 접근이 용이
    • 어떤 정보가 있을까?
      • Process State
        • 이 프로세스가 실행되고 있는지? 멈춰 있는지? 등
        • new, running, waiting, halted 등
      • Process Number
      • Program counter(PC)
        • 다음에 실행할 명령어의 주소
      • Registers
      • Memory limits
      • ...
  • Context Switch
    • 한 프로세스가 다른 프로세스로 CPU 제어권을 넘겨주는 것.
    • 이 때, 이전의 프로세스 상태를 PCB에 보관하고 새로운 프로세스의 PCB를 읽어서 보관된 상태를 복구하는 작업이 이루어진다.

🧨  Multi Process의 단점은?

  • Context Switching = 무거운 작업
    • 캐시 메모리 초기화 등으로 매우 느림! (다른 프로세스를 시작 할때, 메모리영역도 완전히 달라지고 많은 것들을 교체를 해야 되서 느림!)

⚡️ Multi Process의 장점은?

  • 하나의 Process가 죽더라도 다른 Process에 영향을 주지 않아 안정성이 높다!
  • 메모리 구분이 필요할 때는 Multi Process가 유리하다.

🤔 Process간의 통신(IPC : Inter-Process Communication)

Process는 자신만의 독립적인 주소공간을 가지고, 다른 Process가 참조하는것을 허용하지 않습니다.

(→ 다른 Process와 데이터를 주고 받을 수 없다!)

이를 해결하기 위해 IPC기법을 사용합니다.

⚡️ 공유 메모리(shared memory) & 메시지 전달(message passing)

  • 공유 메모리(shared memory)
    • process가 공유 메모리를 할당을 kernal에 요청하면 process 메모리 공간을 할당해줍니다.
    • 각 process들이 할당받은 메모리 영역을 접근(read/write)할 수 있습니다.
    • 한번 할당을 받은 후에 커널의 관여 없이 통신할 수 있으므로 속도가 빠릅니다!
    • 하지만 동시에 같은 메모리 위치에 접근하면서 생기는 일관성 문제가 있습니다. → process들이 직접 공유 메모리 접근에 대한 동기화 문제를 책임져야 합니다.
    • ex) POSIX
  • 메시지 전달(message passing)
    • system call을 사용되어 구현됩니다.
    • 커널을 통해 send & receive 두가지 연산을 제공받아 사용합니다.
    • 공유메모리 보다는 속도가 느리지만, 충돌을 회피할 필요가 없기 때문에 데이터 교환에 유용!
    • 구현하기가 쉽다.
    • ex) socket, pipe, message queue 등

Multi Thread

  • 하나의 프로세스에서 여러개의 Thread로 나누어 각각 작업을 처리하도록 하는 것
  • 캐시 메모리를 초기화할 필요가 없어 빠르다!
  • 스레드 사이의 작업량이 작아서 Context Switcing이 빠르다!
  • 독립적인 Stack MemoryPC Register가 필요하다.

Stack Memory & PC register

  • Thread가 함수를 호출 시 전달되는 인자, Return Address, 함수 내의 지역변수 등 독립적인 Memory가 필요! 즉슨, 각각의 Thread가 Process내에서 “독립적인 기능을 실행한다 == 독립적으로 함수를 호출한다” 를 의미합니다. 나머지 Code, Data, Heap 영역은 공유하는 형태.
  • 한 프로세스 내에서도 thread끼리 Context Switch가 일어나게 되는데, PC register에 code address가 저장되어 있어야 실행할 수 있기 때문!

🧨  Multi Thread의 단점은?

  • 하나의 스레드가 문제가 생기면 전체 프로세스가 영향을 받는다! (웹에서 여러 탭이 사용 중에 하나의 탭에 문제가 생겼을 시 전부 종료된다.)
  • 동기화 문제! 서로 다른 thread가 메모리 영역을 공유하기 때문에, 여러 thread에서 동일한 자원에 동시에 접근하여 엉뚱한 값을 읽거나 수정하는 문제

→ 프로그램 설계 시 주의가 필요!

⚡️ Multi Process의 장점은?

  • 메모리 공간과 시스템 자원 소모가 줄어듭니다.
  • Process를 생성하고 자원을 할당하는 등 system call을 생략할 수 있기 때문에 자원을 효율적으로 관리
  • Context Switching 시, 캐시 메모리 초기화 필요가 없어 속도 빠름!
  • process 간의 통신(IPC)보다 통신 비용이 적음 == 오버헤드가 적다!
profile
BackEnd 개발 일기

0개의 댓글