내가 이해하려고 정리하는 프로세스와 스레드...
프로세스를 먼저 이해해보려하기 전에, 프로그램 이라는 것에 대해 먼저 알아보자
프로그램
프로그램이란, 작업을 위해 실행할 수 있는 파일
을 말한다.
더 쉽게 이해하자면 프로그램은 파일이 저장 장치에는 저장되어 있지만, 메모리에는 올라가 있지 않은 정적인 상태이다.
프로그램을 실행하는 순간, 해당 파일은 컴퓨터 메모리에 올라가고 이 상태를 동적인 상태라고 하는데
이 상태의 프로그램을 바로 프로세스라고 한다.
그래서 프로세스와 스레드는..🧐
다시 정리해보자면, 프로세스는 결국 실행되고 있는 컴퓨터 프로그램
이라고 할 수 있다.
스케줄링 단계에서는 이를 작업 과 같은 단어라고 봐도 무방하다.
이전에는 프로그램을 실행할 때, 실행 시작부터 끝까지 프로세스 하나만을 사용해서 진행을 했다.
하지만 프로그램이 복잡해지고 프로세스 하나만으로 프로그램을 실행시키기 버거워지면서 프로세스보다 더 작은 실행 단위
가 필요해지게 되면서 나온 것이 스레드 이다.
프로세스의 구조
프로세스는 어떤 구조를 가지고 있을까?
프로세스는
총 네가지 영역의 구조로 이루어져 있다.
이런 주소 공간을 가상 메모리
라고 한다.
사용자가 작성한 프로그램 함수들의 코드가 CPU에서 수행할 수 있는 기계어 명령 형태로 변환되어 저장되는 공간
컴파일 타임에 결정되고, 중간에 코드를 바꿀 수 없도록 Read-Only
로 되어있다.
전역 변수 또는 정적 변수 등 프로그램이 사용하는 데이터를 저장하는 공간
전역 변수 또는 정적 변수 값을 참조한 코드는 컴파일이 완료되면, data 영역의 주소값을 가리키도록 바뀐다.
전역 변수가 변경될 수도 있기 때문에 Read-Write
로 되어있다.
호출된 함수의 수행을 마치고 복귀할 주소 및 데이터(매개변수, 지역변수, 리턴 값 등)을 임시로 저장하는 공간
이 영역은 함수 호출 시 기록하고 함수 수행이 완료되면 사라진다.
컴파일 시 stack 영역의 크기가 결정되기 때문에 무한정 할당 할 수 없다.
따라서 재귀함수가 반복해서 호출되거나 함수가 지역변수를 메모리를 초과할 정도로 너무 많이 가지고 있다면, stack overflow가 발생한다.
stack overflow ?
- Stack 영역의 메모리가 지정된 범위를 넘어갈 때 발생한다.
📕 stack overflow가 발생하면 어떻게 해결해야 할까?
- 컴파일러 옵션에서 Stack 영역의 크기를 늘리거나, 함수에서 사용하는 지역변수의 크기를 줄이거나, 지역 변수를 전역 변수로 바꾸어 해결이 가능하다.