프로세스, 스레드

양동혁·2021년 5월 31일
0

OS

목록 보기
1/1

프로그램

특정 작업을 수행하는 일련의 명령어 및 작업들의 모음이다.

프로세스

실행중인 프로그램을 말하며 os로부터 할당받은 메모리에서 실행되고 있는 프로그램의 인스턴스다.
os로부터 자원을 할당받는 작업의 단위이다.
프로세스는 한 개 이상의 스레드를 가지고 있고 스레드 단위로 스케줄링을 한다. 기본적으로 프로세스 당 하나의 스레드가 같이 생성된다.

프로세스 메모리 구조

  • 코드 영역
    프로그램의 코드가 저장되며 읽기전용이다.

  • 데이터 영역
    전역변수, static변수가 할당된다.

  • 힙 영역
    사용자가 동적으로 할당하는 영역으로 인스턴스 생성시 할당되며 자바에서는 GC에 사용되고 있지 않는 메모리는 회수된다. 낮은주소에서 높은주소로 데이터를 쌓아 올린다.

  • 스택 영역
    지역변수, 매개변수가 할당되며 함수 종료시 반환된다. 높은주소에서 낮은주소로 데이터를 쌓아올린다.

코드영역과 데이터영역은 컴파일 시에 위치와 크기가 결정되는 정적할당영역으로 프로세스가 종료될 때 까지 계속 유지된다.
힙영역과 스택영역은 런타임동안 위치와 크기가 결졍되는 동적할당 영역으로 사용이 종료되면 메모리를 반환한다.

스레드

프로세스의 실행단위다. 하나의 프로세스에 스레드가 한 개 일땐 싱글스레드, 두 개 이상일땐 멀티스레드라고 한다.

스레드 메모리 구조

스레드는 각각의 스택과 레지스터를 가지며 코드, 데이터, 힙영역은 서로 공유한다.
스레드마다 각각의 스택을 가지고 있기 때문에 독립적인 함수 호출이 가능하고 따라서 스레드가 독립적으로 실행될 수 있다.
또한 스레드마다 각각의 프로그램 카운터를 가지고 있기 때문에 스케줄러에 의해 스레드가 context switching되었을 때 어떤 명령어 까지 수행했는지 기억할 수 있다.

스레드가 가지고 있는 레지스터 종류

  • stack pointer
    스택의 top을 가리킨다.
  • fram pointer
    함수 호출 이전의 sp위치를 가리킨다.
  • program counter
    다음에 실행할 명령어의 주소를 가리킨다.

스레드: CPU관점에서의 최소 작업단위
프로세스: OS관점에서의 최소 작업단위

멀티스레드 vs 멀티프로세스

  • 멀티스레드는 멀티프로세스보다 적은 메모리를 사용하며 context switching이 빠르다.
    - 스레드는 스택을 제외한 모든 메모리를 공유하기 때문에 교체할 영역이 적다.
    - 프로세스의 경우 공유하는 메모리가 없기 때문에 교체할 영역이많고 캐시도 비우고 새로 쌓아햐 한다. 따라서 context switching 비용이 높다.

  • 스레드간의 통신비용이 프로세스간 통신 비용보다 작다. 스레드간에는 메모리를 공유하기 때문에 값을 공유할 수 있지만, 프로세스는 독립된 메모리 영역을 사용하므로 다른 프로세스의 메모리에 직접 접근할 수 없다. (통신하기 위해서는 IPC사용)

  • 멀티프로세스는 하나의 프로세스에서 오류가 나더라도 다른 프로세스에 영향을 주지 않아 안정성이 높지만, 멀티스레드는 하나의 스레드에서 오류가 나면 전체 스레드에 영향을 끼칠수 있다.

  • 멀티 스레드는 자원을 공유하기 때문에 동기화 문제가 발생한다. 따라서 주의 깊은 설계가 필요하고 디버깅이 어렵다.

추가할것: context switching, multi thread, 프로세스 상태변화, 동시성/병렬성, thread-safe

profile
BackEnd Developer, Business Driven Development

0개의 댓글