프로그램
특정한 작업을 실행하기 위한 명령어들의 모음
프로세스
실행되고 있는 프로그램.
메모리에 올라와 실행되는 프로그램의 개체.
명령어들이 올라가는 영역 : Code 영역
전역변수, static 변수가 할당되는 영역 : Data 영역
함수 매개변수, 지역변수가 할당되는 영역 : Stack 영역
동적으로 할당되는 영역(런타임에 크기가 결정) : Heap 영역
스레드
프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위.
프로세스 메모리
운영체제는 프로세스마다 각각 독립된 Code, Data, Stack, Heap 영역으로 메모리를 할당. 각각 독립적으로 할당되기 때문에 서로 공유되지 않음.
스레드 메모리
스레드는 각각 Stack영역은 따로 할당받고 나머지 영역은 공유.
스레드
프로세스 내부에서의 여러 실행흐름
싱글 스레드
싱글 스레드
: 프로세스가 단일 스레드로 동작하는 방식이다. 하나의 레지스터, 스택으로 표현한다. 가장 대표적으로 자바스크립트가 싱글스레드 언어이다. (정확히 자바스크립트는 싱글스레드지만, 자바스크립트 런타임은 싱글스레드가 아니다!)
자원의 동기화를 신경 쓸 필요가 없음
멀티스레드의 경우, 스택과 레지스터는 따로 갖지만 자원을 공유한다. 이로 인해 자원의 동기화를 항상 고려해야 한다. 하지만 싱글스레드의 경우 자원의 동기화를 전혀 신경쓸 필요가 없다.
문맥교환(Context Switching)이 필요없음
단일 스레드로 동작하기 때문에 문맥을 교환할 필요가 전혀 없음.
**문맥교환 (Context Switching)
CPU가 한 개의 Task를 실행하고 있는 상태에서 다른 Task로 실행이 전환되는 과정에서 기존의 Task 상태 및 Register 값들에 대한 정보(context)를 저장하고 새로운 Task의 정보(context) 로 교체하는 작업을 말한다.
이떄 Task(프로세스or스레드)의 정보는 레지스터에 저장되며 PCB로 관리된다.**
CPU 코어를 모두 활용하지 못함
싱글스레드는 하나의 물리적 코어밖에 사용하지 못해 멀티코어 머신에서 CPU사용을 최적화할 수 없다.
멀티 스레드
멀티 스레드
: 두 개 이상의 스레드가 프로세스 내부에서 자원을 공유하며 작업을 수행. 각 스레드는 고유 레지스터와 스택을 가짐
일을 동시에 처리 할수 있음
듣고 싶은 음악 리스트가 있다. 단일 스레드라면, 첫번째 음악을 다운로드 받은 다음에 그 음악을 실행하고, 그 음악 실행이 끝난 뒤에 두번째 음악을 다운로드 받을 수 있다.
그런데 만약 멀티스레드를 사용한다면, 일단 첫번째 음악을 다운로드한 뒤에, 이 첫번째 음악을 재생하면서 두번째 음악을 미리 다운로드할 수 있게 된다. 이렇게, 동시에 처리하고 싶은 일이 있을 때 스레드를 사용하면 된다.
CPU를 최대한 활용할 수 있음
싱글 스레드와 달리 다중 CPU구조에서 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있다.
문맥교환(Context Switching)이 빠름 프로세스보다 빠르고 적은 비용
동시에 일을 처리하기 위해서, 프로세스를 두 개 띄울 수도 있다. 예를 들어, 프로그램을 두 개 실행시키는 것이다. 이렇게 프로그램을 두개 실행시키는 것은, 스레드를 두개 실행하는 것보다 느리고, 많은 자원을 필요로 하게 된다.
레지스터와 스택만 스레드별로 각각 할당 받고, 공유자원을 공유하여 사용하기 때문에 더 빠르게 문맥교환이 가능하다. 멀티프로세스는 모두를 다 각각 할당받기 때문에 문맥교환이 느리다.
동기화 문제
둘 이상의 스레드에서 공유자원에 접근할 때 다른 스레드에서 사용중인 경우 값을 읽어올 때 동기화 문제가 발생할 수 있다.
프로세스와 스레드의 중요한 차이
프로세스의 경우 프로세스 오류가 발생해 종료된다면 특별한 경우가 아니라면 다른 프로세스에는 영향을 주지 않음. 하지만 스레드의 경우, 하나의 스레드에서 오류가 발생한다면 프로세스의 다른 스레드도 모두 강제종료됨.