[운영체제] 프로세스와 스레드의 차이

hyyyynjn·2021년 8월 25일
0

면접대비

목록 보기
3/31
post-thumbnail
post-custom-banner

✅프로세스와 스레드의 차이

👏프로세스

프로그램

어떤 작업을 위해 실행할 수 있는 파일
파일이 저장 장치에 저장되어 있지만, 메모리에는 올라가 있지 않은 정적인 상태

  • 메모리에는 올라가 있지 않은 : 운영체제가 프로그램에게 독립적인 메모리 공간을 할당해주지 않았기 때문
  • 그냥 코드 덩어리 (*.exe 파일)

프로세스

코드 덩어리 파일인 프로그램을 실행한 것 (동적인 상태의 프로그램)

  • 메모리에 올라와(운영체제로부터 시스템 자원을 할당받음) 실행되고 있는 프로그램의 인스턴스로 독립적인 개체이다.
    • 할당받는 시스템 자원으로 👉 CPU 시간, 운영에 필요한 주소 공간, code, data, stack, heap 구조의 독립된 메모리 영역
  • 실행파일을 클릭했을 때, 메모리(RAM)할당이 이루어지고, 이 메모리공간으로 코드가 올라간다. 이 순간부터 이 프로그램은 '프로세스'라 불리게 된다

📢특징

  • 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 운영체제로부터 할당 받는다. (프로세스 끼리 변수나 자료구조에 직접 접근 불가)
  • 프로세스는 기본적으로 최소 1개의 스레드 (= main 스레드)를 가지고 있다
  • 다른 프로세스의 자원에 접근하기 위해서 IPC(프로세스 간 통신; Inter-Process Communication)을 사용해야한다. (ex. Pipe, File, Socket 등)

프로그램이 복잡해 질수록 하나의 프로세스만 사용하기에 벅차게 되었다.
그렇다고 프로세스를 여러 개 만들 수 없다. (운영체제의 안정성을 위해 각각의 프로세스는 자원을 공유하지 못하기 때문)
👉 프로세스보다 더 작은 실행 단위 개념인 스레드가 필요해졌다.

👏스레드

프로세스의 코드에 정의된 절차에 따라 실행되는 특정한 수행 경로
프로세스가 할당받은 자원을 이용하는 실행 단위

📢특징

  • 스레드는 프로세스 안에서 Stack따로 할당 받고, Code, Data, Heap 영역은 공유한다. (별도의 Stack을 가지지만 Heap은 서로 공유한다)
  • 스레드는 같은 프로세스 내주소 공간, 자원을 공유한다.
    프로세스 내의 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드 (Sibling Thread)도 그 변경 결과를 즉시 확인할 수 있다.

📢자바 스레드

  • JVM이 운영체제의 역할을 할 뿐, 일반적인 스레드와 비슷하다.
  • 자바에는 프로세스가 존재하지 않고 스레드만 존재한다.
  • 자바 스레드JVM에 의해 스케쥴링되는 실행 단위 코드 블록이다.
  • 개발자는 자바 스레드로 동작할 스레드 코드를 작성하고 스레드 코드가 생명을 가지고 실행하도록 JVM에 요청한다.

👏프로세스와 스레드 차이점

  • 스레드프로세스안에 포함되어 있기에 개념 범위가 다르다.
  • 스레드는 같은 프로세스 안에서 다른 스레드끼리 Heap 공간을 공유하기 때문에 정보 공유가 쉽다.
    프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없고 번거롭게 IPC를 통해 정보 공유를 한다.
  • 프로세스가 강제 종료되면 다른 프로세스에 아무런 영향을 주지 않는다.
    스레드Code, Data, Heap 메모리 영역을 서로 공유하기 때문에 하나의 스레드에 오류가 발생하면 같은 프로세스 내의 Sibling Thread들도 모두 강제 종료된다.
  • 스레드CPU 입장에서의 최소 작업 단위이고
    프로세스운영체제 관점에서의 최소 작업 단위이다.

✅ 멀티 프로세스와 멀티 스레드

👏멀티 프로세스

하나의 프로그램을 여러 개의 프로세스로 구성하여, 각 프로세스가 하나의 작업(task)를 처리하는 것
하나의 운영체제 안에서 여러 프로세스가 실행되는 것

📢특징

  • 📌장점 : 하나의 프로세스에 오류가 발생하여도 프로그램은 동작한다.
  • 📌단점 : Context-Switching 비용이 발생한다. 프로세스 간 정보를 공유하기 위해서 복잡한 통신 기법 (IPC)을 사용한다.
    • Context Switching : CPU에서 여러 프로세스들이 돌아가며 작업을 처리하는 과정
      • 동작 중인 프로세스가 실행을 중단하고 다른 프로세스가 실행을 재개할 때, 재개에 필요한 환경을 다시 복구하는 비용(시간)이다.
      • 운영체제 오버헤드의 큰 요인 중 하나이다. 그 이유는 프로세스끼리의 공유 메모리가 없어 모든 데이터를 리셋하고 다시 캐시 정보를 불러와야 하기 때문이다.

👏멀티 스레드

프로그램을 여러 개의 스레드로 구성하여, 각 스레드가 작업(task)를 처리하는 것
하나의 프로세스가 여러 작업을 여러 스레드를 사용하여 동시에 처리하는 것

📢특징

  • 📌장점 : 스레드간 자원(Code, Data, Heap) 공유로 응답 시간이 빠르고 시스템 자원 소모처리 비용이 감소(실행 속도 향상)한다.
    • 시스템 자원 소모 감소 : 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어 들기 때문이다.
    • 처리 비용 감소 : 스레드 간에 데이터를 공유하므로 Context Switching이 빠르다. (Stack 영역만 Context Switching)
    • 응답 시간 단축 : Stack을 제외한 모든 메모리를 공유하기 때문에 스레드간의 간단한 통신 방법으로 통신 부담이 적다.
  • 📌단점 : 하나의 스레드 오류로 전체 프로세스에 문제가 발생한다. 자원을 공유하기 때문에 동기화 이슈 (Synchronization Issue)가 있다.
    • 동기화 이슈 : 여러 스레드가 전역 변수 하나(자원)를 공유할 경우 발생할 수 있는 충돌
      • 운영체제가 직접 스케쥴링하지 않기에 프로그래머가 스케쥴링을 직접 구현해야하므로 디버깅 과정이 까다롭다

📢Thread Safe

여러 스레드가 동시에 사용되어도 안전하다는 것

  • 특정 함수와 특정 변수가 여러 스레드에서 호출되어 나온 결과와 하나의 스레드에서 호출되어 나온 결과가 같음을 보장한다는 의미이다.
  • 특정 함수가 전역 변수를 참조하면 Thread Safe하지 않은 결과가 나올 수 있다.
    • MUTEX, SEMAPHORE를 이용한 동기화 방법으로 Thread Safe를 지킬 수 있다. 참고

👏멀티 프로세스 대신 멀티 스레드를 사용하는 이유

여러 개의 프로그램을 실행하는 것 (멀티 프로세스) 대신 하나의 프로그램 안에서 여러 작업을 해결 (멀티 스레드) 하는 이유 ❓
👉 멀티 스레드의 장점 & 멀티 프로세스의 단점

  • 📌자원 효율 증대
    • 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다
    • Stack을 제외한 모든 메모리를 공유하기 때문에 스레드간의 간단한 통신 방법으로 통신 부담이 적다
  • 📌처리 비용 감소응답 시간 단축
    • 프로세스 간의 통신(IPC)보다 스레드 간의 통신의 비용이 적으므로 작업들 간의 통신의 부담이 줄어든다.
    • 프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 빠르다. (Stack 영역만 Context Switching 하기 때문에 Context Switching이 빠르다)
post-custom-banner

0개의 댓글