운영체제는 컴퓨터 시스템의 핵심 소프트웨어로, 컴퓨터 하드웨어와 응용 프로그램 간의 상호작용을 관리하고 제어하는 역할을 합니다.
사용자와 하드웨어 사이의 인터페이스를 제공해 효율적으로 응용 프로그램이 동작하도록 지원하고, 시스템 자원을 효율적으로 관리하여 응용 프로그램이 원활하게 동작할 수 있도록 합니다.
운영체제는 커널, 인터페이스, 시스템콜, 드라이버 총 4가지 구성요소로 이루어져 있는데, 이 중 가장 중요한 요소가 바로 커널입니다.
모든 운영체제를 메모리에 올리는 것이 아니라, 운영체제의 필요한 부분을 메모리에 올려 사용하는데, 메모리에 상주하는 운영체제의 부분을 커널이라고 합니다.
프로세스 관리, 메모리 관리, 저장공간 관리, 연결된 장치 관리 등 컴퓨터에 속한 모든 자원을 관리하는 역할을 합니다.
코드 영역은 실행한 프로그램의 코드가 저장되고,
데이터 영역은 전역 변수, 정적 변수 등이 할당되며 프로그램 시작과 동시에 할당되고 프로그램이 종료될 때 메모리가 소멸합니다.
힙 영역은 동적할당된 변수 등이 저장되고 사용자에 의해 메모리 공간이 동적으로 할당되고 해제되며 런타임시에 크기가 결정됩니다.
스택 영역은 지역변수, 매개변수, 포인터 등이 저장되며 함수 호출이 완료되면 저장된 메모리도 해제됩니다. 컴파일시에 크기가 결정됩니다.
힙 영역은 동적으로 생성된 변수를 저장하고, 스택 영역은 지역변수나 매개변수를 저장한다는 점에서 차이가 있습니다.
힙 영역과 스택 영역은 사실 같은 공간을 공유하고 있는데 힙이 메모리 위쪽부터 할당된다면 스택은 아래쪽부터 할당되는 방식을 사용한다는 점에서 차이가 있습니다.
힙 영역은 크기가 제한되어 있지 않아 동적으로 늘어날 수 있으나 스택 영역은 크기가 제한되어 있다는 점에서 차이가 있습니다.
힙 영역은 스택 영역에 비해 느리고 직접 힙 영역 관리가 필요하지만 스택 영역은 힙에 비해 빠르고 함수 종료에 따라 소멸되기에 별다른 관리가 필요없다는 점에서 차이가 있습니다.
힙 영역은 런타임 시 변수를 직접 생성하고 제거하기에 너무 힙 영역을 크게 잡으면 동적 변수들이 넓은 힙 영역에 존재하게 되며 참조 여부를 확인해야 하여 필요없는 변수를 제거하여 메모리 관리를 수행하는 GC의 수행 시간이 길어진다는 단점이 있습니다.
따라서 Java JVM에서도 힙 영역을 처음부터 크게 잡기보다는 꽉 찼을 때 확장해나가는 방식을 사용합니다.
힙 영역의 객체의 메모리 주소를 참조하고 있는 참조 변수가 삭제되는 현상이 발생하면, 더이상 참조되는 곳이 없는 이 객체를 Unreachable이라고 하며 주기적으로 GC가 실행되며 제거해줍니다.
프로세스는 실행 중인 프로그램을 말하며 완벽히 독립적이어서 메모리 영역을 다른 프로세스와 공유하지 않습니다. 프로세스는 최소 1개의 쓰레드를 가집니다.
쓰레드는 프로세스의 실행 단위라고 할 수 있으며 한 프로젝스 내에서 동작되는 여러 실행 흐름입니다. 프로세스 내에서 스택만 따로 할당받고 그 외의 메모리 영역은 공유합니다. 쓰레드는 프로세스 내에 존재하며 다른 쓰레드들과 프로세스가 할당받은 자원을 이용하여 실행됩니다.
컨텍스트 스위칭은 CPU/코어에서 실행중이던 스레드가 다른 스레드가 교체되는 것으로 여러 프로세스/스레드를 동시에 실행시키기 위해 필요합니다.
주로 time slice를 다 사용했거나, I/O 작업이 필요하거나, 다른 리소스를 기다려야할 때 발생합니다.
프로세스 제어 블록은 운영체제가 프로세스를 제어하기 위해 정보를 저장해놓는 곳으로 프로세스의 상태 정보를 저장하는 구조체입니다.
위의 컨텍스트 스위칭 과정에서 잠시 중단되었던 프로세스에 대한 정보들을 PCB에 저장해두었다가 다시 재개할 때 사용합니다.
만약 크롬 브라우저가 쓰레드라면 하나의 탭이 생겼을 때, 공통된 프로세스 자체에 오류가 생겼다면 모든 탭이 멈췄을테지만 크롬은 그렇지 않기에 별개의 프로세스라고 말할 수 있습니다.
멀티 스레딩은 하나의 프로세스 내의 작업을 서로 자원을 공유하는 여러개의 스레드로 처리하는 기법이고, 멀티 프로세싱은 여러개의 프로세스로 동시에 두가지 이상의 일을 수행하는 것을 말합니다.
멀티 스레딩은 Context Switching이 빠르고, 적은 메모리 공간을 차지하고지만 멀티 프로세싱은 Context Switching이 느리고, 많은 메모리 공간을 차지합니다.
스레드마다 스택과 PC Register는 독립적으로 할당됩니다.
스택은 함수 호출시 사용되는 메모리 공간으로 독립적으로 할당된다는 말은 독립적인 함수 호출이 가능하다는 것을 의미하기에 스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당합니다.
PC Register값은 스레드가 명령어의 어디까지 수행하였는지 나타내게 됩니다. CPU를 할당받았다가 스케쥴러에 의해 선점당해서 명령어에 수행하지 못하기에 어디까지 수행했는지 기억할 필요가 있기에 독립적으로 할당합니다.
스레드는 별도로 실행되는 하나의 실행이므로 동시에 여러 스레드가 실행되면 스레드들이 공유하는 자원에 대해 동기화 문제가 발생할 수 있습니다.