프로세스와 스레드의 차이는?
프로세스는 메인 메모리에 적재되어 실행되는 프로그램을 의미합니다.
스레드는 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위를 의미합니다.
메모리 영역을 공유하는 모습에 차이가 있습니다.
메모리 구조는 스택, 힙, 코드, 데이터(static) 영역으로 나누어져 있는데,
프로세스는 독립적인 메모리 공간에서 동작하는 반면,
스레드는 스택을 제외한 나머지 공간을 공유한다는 차이점이 있습니다.
코드, 데이터, 힙 메모리 영역을 공유하기 때문에 어떤 스레드 하나에서 오류가 발생하면 같은 프로세스 내에 다른 스레드가 모두 강제로 종료됩니다.
메모리의 힙과 스택의 차이는?
스택은 정적 메모리 할당에 사용되며, 컴파일 시간에 크기가 결정됩니다.
함수가 호출되면 지역변수와 매개변수가 저장되는 곳으로, 함수가 종료되면 할당된 메모리가 자동으로 해제됩니다.
반면, 힙은 동적 메모리 할당(new 연산자)에 사용되며, 프로그램 실행 중(런타임)에 메모리 크기가 결정됩니다.
힙에 할당된 메모리는 개발자가 직접 관리하며, 명시적으로 해제해야 합니다.
멀티프로세싱, 멀티프로그래밍, 멀티태스킹, 멀티스레딩을 구분해주세요.
멀티프로세싱은 여러 개의 CPU 코어가 동시에 작업을 처리하는 것을 말합니다.
멀티프로그래밍은 단일 프로세스 시스템의 단점을 보완하기 위해 등장하였습니다. 여러 개의 프로그램이 CPU에서 동시에 실행된다는 의미로, CPU 사용률을 극대화시키는 것이 목적입니다.
멀티태스킹은 프로그램을 아주 작은 단위로 번갈아 처리하며 작업 응답 시간을 최소화하는 방법입니다. 이로서 유저는 동시에 실행되는 것처럼 느끼게 되고 여기서, 컨텍스트 스위칭이 발생하게 됩니다. 프로세스 간에 서로 자원을 공유하지 못하므로 IPC(Inter-Process Communication)를 구현해야 합니다.
멀티 스레딩은 하나의 프로세스가 동시에 여러 작업(스레드)를 실행하는 방법입니다. 멀티태스킹과 달리 서로 간의 자원 공유가 가능합니다.
IPC란?
프로세스들끼리 서로 데이터를 주고받는 행위 또는 그에 대한 방법을 이야기합니다. 커널 영역에서 IPC라는 내부 프로세스간 통신을 제공하게 되고, 프로세스는 커널이 제공하는 IPC 설비를 이용해서 프로세스산 통신을 할 수 있습니다.
IPC의 종류에는 메세지 전달(Message Passing)과 메모리 공유(Shared Memory)가 있습니다.
메세지 전달은 프로세스들이 커널을 통해 메세지를 전달하는 방법입니다.
커널에서 제어해주기 때문에 별도의 동기화가 필요다는 장점이 있습니다.
반대로 커널을 경유하기 때문에 속도가 상대적으로 느리다는 단점을 가지고 있습니다.
(메세지 전달에는 파이프, 메세지 큐, 소켓 등이 있습니다.)
메모리 공유는 프로세스 간 공유된 메모리를 생성하여 이용하는 방법입니다.
컨텍스트 스위칭이란?
CPU에서 실행할 프로세스 또는 스레드를 교체하는 기술입니다.
여러 프로세스나 스레드를 동시에 실행(멀티태스킹)하기 위해서 필요하고
주어진 timeslice(작업 시간)을 다 사용했거나, I/O 작업을 해야하거나, 다른 리소스를 기다려야 하는 등의 경우에 사용됩니다.
커널에 의해 실행되고 프로세스 스위칭과 스레드 스위칭이 있습니다.
이때, PCB라는 별도 공간에 프로세스 상태값을 저장하고 다시 찾아서 실행됩니다.
스레드 컨텍스트 스위칭이 더 빠른 이유는?
스레드는 메모리 영역을 공유하기 때문에 메모리에 관련된 처리 과정이 필요 없기 때문입니다.
프로세스 스위칭은 주소 체계가 다르기 때문에 가상 메모리 주소 관련 처리를 추가로 진행합니다.
(MMU가 P2 메모리를 참조, TLB(버퍼) 초기화, 캐시 비워주기의 과정이 필요합니다.)
페이징과 세그멘테이션의 차이는?
멀티프로그래밍 시스템에서 다수의 프로세스를 수용하기 위해
주기억장치를 동적으로 분할하는 메모리 관리 방법입니다.
페이징은 프로세스를 일정한 크기의 페이지로 분할해서 메모리에 적재하는 방식입니다.
논리 메모리가 물리 메모리에 저장될 때 연속되어 저장할 필요가 없고,
남는 프레임에 적절히 배치되기에 외부 단편화가 생기지 않습니다.
반면, 프로세스가 사용하는 메모리 공간이 남는 경우인 내부 단편화가 일어날 수 있습니다.
(내부단편화는 여백)
세그멘테이션은 가상 메모리를 서로 크기가 다른 논리적 단위로 분할한 방법입니다.
총 메모리 공간은 충분하지만 실제로 할당할 수 없는 경우 외부 단편화가 일어날 수 있습니다.
(외부단편화는 적재되지 못한 공간)
메모리가 고갈되면 일어나는 현상은?
메모리가 고갈되고 프로세스들의 swap이 활발해지면서(페이지 부재 자주 일어남) CPU 이용률이 하락하게 되고, 낮아진 CPU 이용률에 OS는 오히려 프로세스를 추가하는 쓰레싱 현상이 발생합니다.
쓰레싱이 해소되지 않을 경우, Out of Memory 상태로 판단되어 중요도가 낮은 프로세스를 찾아 강제로 종료하게 됩니다.
이를 해결하기 위해 Page Fault Frequency 알고리즘을 통해 Page Fault 퍼센트의 상한과 하한을 두고 너무 자주 일어나면 메모리를 더 주고, 너무 덜 일어나면 메모리르 뺏는 방법이 있습니다. 또는 물리적인 메모리(RAM) 추가하여 해결할 수 있습니다.