HDD의 실행파일이 메모리에 올라가 작동되고 있는 프로그램
프로세스에 할당된 메모리는 Code, Data, Stack, Heap
의 형식으로 할당된다.
프로세스는 위와 같은 메모리 구조를 가진다.
code
: 사용자가 작성한 프로그램 함수data
: 프로그램이 사용하는 데이터 공간 (전역 변수 등)heap
: 프로그래머가 필요할 때 사용되는, 동적으로 할당되는 공간stack
: 함수의 수행을 마치고 복귀할 주소 및 데이터 (지역 변수, 리턴 값 등)여러개의 CPU를 사용해 여러 프로세스를 동시에 수행
하는 것
OS가 매우 빠르게 PCB(Process Control Block)에 담긴 정보를 참고하면서
컨텍스트 스위칭을(Context Switching)
하고 있기 때문에 여러 작업이 실행되고 있는 것처럼 느끼게 되는 것이다.
PCB (Process Control Block)
프로세스를 컨트롤하기 위한 정보이다. PID(process id), 프로세스 상태, 다음에 실행할 명령어의 주소, 이전에 작업하던 내용, CPU 스케줄링 정보, 프로세스의 주소 공간 등이 담겨 있으며, 이들을
컨텍스트(Context)
라고 부른다.
독립적
이기 때문에 문제가 생겨도 다른 프로세스에 영향을 주지 않는다.독립적 메모리 영역
을 가지기 때문에 작업량이 많아지면 오버헤드가 발생한다.기존 프로세스의 Context를 저장하고, 다음 프로세스를 실행할 수 있도록
Context를 교체하는 작업
이며, 이는 앞에서 본 PCB의 정보를 토대로 이루어진다.
좀 더 구체적으로, 다음 우선 순위인 프로세스가 실행 되어야 할 때 레지스터(register) 값, 즉 컨텍스트(context)를 저장하고 CPU가 다음 프로세스를 수행하도록 프로세스의 상태 혹은 컨텍스트를 교체하는 작업이다.
context switching은 다른 프로세스가 실행될 때, 즉
기존 프로세스에 대한 interrupt가 일어날때 발생
한다.
입출력 요청
CPU 사용시간 만료
자식 프로세스 생성
interrupt 처리를 기다릴 때
context switching이 일어날 때, 프로세스를 올리고 내리는 작업 (MEM <-> HDD)은 많은 비용
이 들고, context switching 중에는 CPU가 아무런 일을 하지 못하기 때문에 비효율적이다.
멀티 스레드
를 사용하면 이러한 비효율적인 컨텍스트 스위칭을 보완할 수 있다.
Thread란 프로세스 내에 존재하는 하나의 작업 흐름이다.
스레드는 프로세스와 달리 하나의 프로세스의 자원(stack 제외)을 공유하기 때문에, context switching 비용을 줄일 수 있다
.
즉, 스레드에서는 code, data, stack, heap 중에서 stack만 교체
하면 되는 것이다.
스레드간에는 프로세스의 주소/자원을 공유할 수 있다.
스레드는 Thread ID
, PC
, register 집합
, stack
으로 구성된다.
스레드 간에는 각자 독립적으로 작업을 수행해야 하기 때문에, 각각 stack과 PC 레지스터를 할당 받는다.
비용 절감
캐시 메모리를 비울 필요가 없다
-> 빠르다동기화 필요
다른 스레드도 영향을 받을 수 있다.
사진 출처
https://charlezz.medium.com/process%EC%99%80-thread-%EC%9D%B4%EC%95%BC%EA%B8%B0-5b96d0d43e37
https://www.javatpoint.com/process-vs-thread