본문 바로가기
개발자로서의 자기계발/CS 기본지식

프로세스와 스레드

by 도툐리 2024. 2. 27.

 

(1) 프로세스

  • 실행 중인 프로그램의 인스턴스.
  • 운영 체제에서는 프로세스를 시스템의 기본 실행 단위로 취급함.
  • 노드, 웹브라우저 같은 프로그램 → 개별적인 프로세스
  • 각 프로세스는 독립적인 메모리 주소 공간을 가지며, 다른 프로세스의 리소스에 직접 접근할 수 없음(프로세스 간 통신을 통해 간접적으로만 가능).
  • -> Process안에는 Code 영역, Stack 영역, Heap 영역, Data 영역이 있다.
  • Code : 
    • 프로그램 실행을 위한 코드
    • 프로그램 시작부터 끝까지 메모리에 남아있다.
  • Stack : 
    • 함수 호출 및 로컬 변수 저장
    • 컴파일(소스코드를 작성하고 기계어로 변환되어 실행 가능한 프로그램이 되는 과정) 시에 크기가 결정된다. 
  • Heap : 
    • 동적 메모리. 데이터, 객체 등을 만들면 동적으로 Heap에 저장된다.
    • 런타임(컴파일 과정을 마치고 사용자에 의해 실행되는 과정)시에 크기가 결정된다.
  • Data : 
    • 전역, static 변수, 상수 등이 저장된다. 

 

(2) 스레드

: 프로세스 내에서 실행되는 실행의 흐름 단위.

  • 모든 프로세스는 하나 이상의 스레드(주 스레드)를 가지며, 추가적으로 더 많은 스레드를 생성할 수 있음.
  • 스레드는 프로세스의 자원과 메모리 공간(Code, Data, Heap 영역 등)을 공유하지만, 각각 별도의 콜 스택을 가지고 실행 상태를 독립적으로 관리함.
  • 프로세스 내 자원 및 메모리 공간에 공통적으로 접근/업데이트가 가능하여 프로세스가 효율적으로 일할 수 있게 도와줌. 다만, 이로 인한 동시성 문제(예: 데이터 경쟁, 데드락)를 관리해야 함.
멀티 스레드
 하나의 프로그램을 여러 스레드로 구성, 각 스레드는 하나의 작업을 처리한다. 효율적이며 Stack 영역을 제외한 모든 메모리를 공유하여 통신의 부담이 적다. 다만, 주의 깊은 설계를 필요로 하고 자원을 공유하기 때문에 공유 영역의 동기화 문제가 발생할 수 있다.
그런데 왜 JS는 싱글 스레드를 사용하는 건데?
 멀티 스레드는 공유 자원이 존재하여 동기화에 신경을 써줘야 한다. 따라서 프로그래밍 난이도가 높다. JavaScript는 기본적으로 가벼운 경량 프로그래밍 언어를 지향했고, 멀티 스레드 환경에서 발생하는 문제들을 신경 쓰지 않는 싱글 스레드 언어가 되었다.

 

 


 

💡 면접 단골질문

: 프로세스와 스레드의 차이점은?

  1. 메모리 공간:
    1. 프로세스는 독립적인 메모리 공간(코드, 데이터, 힙, 스택)을 가지며, 다른 프로세스와 정보를 공유하지 않습니다.
    2. 반면에, 같은 프로세스에 속한 스레드들은 메모리 공간을 공유하고, 데이터와 자원을 서로에게 접근할 수 있습니다.
  2. 통신:
    1. 프로세스 간 통신(IPC)은 상대적으로 복잡하고 비용이 많이 듭니다.
    2. 이에 비해 스레드 간 통신은 같은 메모리 공간을 공유하기 때문에 더 간단하고 빠릅니다.
  3. 독립성:
    1. 프로세스는 완전히 독립적인 실행 단위로, 하나의 프로세스 오류가 다른 프로세스에 영향을 주지 않습니다. ( 각 프로세스가 하나의 작업을 처리하기에 문제가 발생해도 해당 프로세스만 죽어 다른 프로세스에게 영향을 주지 않음.)
    2. 스레드는 프로세스 내에서 더 높은 연결성을 가지며, 하나의 스레드 오류가 같은 프로세스 내의 다른 스레드에 영향을 줄 수 있습니다.

 


참고자료

https://youngju-js.tistory.com/28

 

[JavaScript] 이벤트 루프(Event loop) 정리

🍀 목차 글의 목적 프로세스와 스레드? 자바스크립트의 런타임 환경 이벤트 루프 Task Queue Microtask Queue Render 큰 그림으로 이해 마치며 글의 목적 자바스크립트 언어 자체는 싱글 스레드(단일 스

youngju-js.tistory.com

 

댓글