컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load) 되어야 한다. 또한 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다. 따라서 위의 그림과 같이 하나의 프로세스는 운영체제로부터 각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당받는다. 따라서 한 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다.
Code
: 실행할 프로그램의 코드가 저장되는 영역. CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다.Data
: 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역. 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다. Heap
: 동적 할당 시 사용 (new(), malloc() 등). 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다. 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.Stack
: 함수의 호출과 관계되는 지역 변수와 매개변수, 리턴값이 저장되는 영역. 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.최대한 데이터를 공유함으로써 메모리 사용량을 줄이기 위해서!
Code
영역을 공유한다.어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위
쓰레드는 프로세스 내에서 동작되는 흐름이므로, 프로세스 내에서 각각 stack만 따로 할당받고, 프로세스 내의 쓰레드끼리 부모 프로세스의 Code, Data, Heap 영역은 공유한다.
즉, 프로세스 내에서 쓰레드들은 서로 주소 공간이나 자원들을 공유하며 실행할 수 있다. 각각의 쓰레드는 별도의 레지스터와 스택을 가지고 있지만, 힙 메모리를 서로 읽고 쓸 수 있다.
스택은 함수 호출 시 전달되는 인자
, 되돌아갈 주소값
및 함수 내에서 선언하는 변수
등을 저장하기 위해 사용되는 메모리 공간이므로 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것과 같다.
즉, 이는 독립적인 실행 흐름이 추가되는 것이다. 따라서 스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당한다.
프로세스
는 자신만의 고유 공간과 자원을 할당받아 사용하는데 반해, 스레드
는 다른 스레드와 공간, 자원을 공유한다.두개 이상의 프로세서(CPU)가 협력적으로 하나 이상의 작업(Task)을 동시에 처리하는 것 (병렬처리)
여러 개의 프로세서를 사용하는 것을 멀티프로세싱이라고 하며 같은 시간에 여러 개의 프로그램을 띄우는 시분할 방식을 멀티태스킹이라고 한다. 프로세스 관리는 운영 체제의 중요한 부분이다.
하나의 프로세스를 여러 스레드로 자원을 공유하며 작업을 나누어 수행하는 것
일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.
스레드들은 공유 메모리를 통해 다수의 작업(Task)을 동시에 처리하도록 해준다.
장점
1. 자원의 효율성 증대
2. 시스템 처리율 향상 (처리비용 감소)
3. 프로그램 응답시간 단축 (스레드는 메모리 영역을 공유하기 때문)
단점
1. 동기화 문제 (병목현상, 데드락 등)
2. 안정성 문제 (하나의 스레드에 문제가 생기면 전체 프로세스에 영향)
https://velog.io/@jsj3282/thread-%EC%99%80-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%9D%98-%EC%B0%A8%EC%9D%B4%EB%8A%94
https://wooody92.github.io/os/%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C/