운영체제의 메모리 관리 기법(페이징, 세그멘테이션)을 알기 위해선 이걸 먼저 알아야 합니다.
그러니까 바로 가봅시다 ㄱㄱ싱
물리 메모리, 가상 메모리
RAM보다 큰 용량의 프로세스는 어떻게 실행되는 걸까요? 고민해본 적이 있으신가요?
바로 운영체제가 메모리를 효율적이고, 더 많은 용량을 쓰고자 하기 위해물리 메모리와 가상메모리를 나눴기 때문입니다.
물리 메모리와 가상 메모리는 컴퓨터의 메모리 관리에서 중요한 개념입니다.
각각 무슨 역할을 하는지 알아봅시다.
물리 메모리 (Physical Memory)
프로세스가 실행되려면 메인메모리, 즉 RAM에 할당이 되어야 합니다. 물리 메모리는실제 하드웨어 메모리인 RAM을 의미합니다. CPU는 직접적으로 물리 메모리에 접근해 데이터를 읽고 쓰게 됩니다.
특징
제한된 메모리 용량때문에 여러 프로그램을 동시에 실행려면 물리 메모리만으로는 부족한 경우가 있습니다.
물리메모리는 CPU가 직접 접근 하기 때문에속도가 매우 빠릅니다.
가상 메모리 (Virtual Memory)
가상 메모리는디스크 저장 공간(HDD, SSD)의 일부를 실제 물리 메모리처럼 사용하기 위해 만들어진 메커니즘입니다. 이를 통해 제한된 물리 메모리의 크기에 제약을 받지 않고, 더 큰 주소 공간을 사용할 수 있습니다. 각 프로세스들은 자신만의 가상 메모리 공간을 가지게 됩니다.
특징
실제 물리 메모리보다 큰 메모리 공간을 사용할 수 있게 하여, 메모리 효율성을 높일 수 있습니다.
각 프로세스 메모리에 대해 독립적인 권한을 부여하여 메모리의 안정성을 높일 수 있습니다.
가상 메모리(Virtual Memory)와 가상 주소(Virtual Address)
가상 메모리와 가상 주소는 의미 차이가 있습니다.
가상 메모리는 각 프로세스에 자신만의 독립적인 가상 주소 공간을 제공하여 프로세스들이 필요한 메모리 이상을 사용하게 하는 기술적 개념입니다.
가상 주소는 논리 주소라고도 불리며, 프로세스의 가상 메모리에서 특정 위치에 접근할 때 사용하는 주소입니다. 가상 주소는 페이지 번호와 페이지 오프셋으로 구성되어있습니다.
페이징(Paging)은 운영체제의 가상 메모리 시스템에서 사용하는 메모리 관리 기법중 하나로, 메모리를 일정한 크기로 나눈 단위인 페이지와 프레임을 통해하는 메모리를 관리하는 방식입니다. 페이지와 프레임은 페이지 테이블을 통해 매핑하여 사용합니다. 이로 인해 메모리 단편화 문제를 줄이고, 프로세스가 사용하는 메모리 영역을 효율적으로 관리할 수 있습니다.
PCB(Process Control Block)는 프로세스가 생성될 때 운영체제에 의해 생성되는 것으로, 생성된 프로세스에 대한 메타데이터를 저장하고 있습니다. PCB는 프로세스의 중요한 정보를 포함하고 있기 때문에 유저 영역에서 접근하지 못하도록 커널 스택의 가장 앞부분에서 관리됩니다.
●PCB의 구조
프로세스 식별자 (PID: Process ID) 각 프로세스를 유일하게 구분하기 위한 고유 식별자입니다.
프로세스 상태 (Process State) 프로세스가 현재 어떤 상태에 있는지 나타냅니다. 프로세스는 다음과 같은 상태 중 하나에 있을 수 있습니다:
New: 프로세스가 생성되었지만 아직 실행되지 않음.
Running: 프로세스가 CPU에서 실행 중임.
Waiting (Blocked): 프로세스가 어떤 이벤트(입출력 등)를 기다리는 중임.
Ready: 프로세스가 실행 준비 상태이며, CPU를 사용할 수 있기를 기다리는 중임.
Terminated: 프로세스가 실행을 마치고 종료된 상태임.
프로그램 카운터 (Program Counter) 다음에 실행할 명령어의 주소를 저장합니다. 문맥 교환이 발생할 때 이 값을 이용해 이전 프로세스의 상태를 복구할 수 있습니다.
CPU 레지스터 상태 문맥 교환을 할 때, CPU 레지스터의 내용을 저장하고 복구하는 데 사용됩니다. 이를 통해 중단된 프로세스가 나중에 재개될 때 이전 상태를 유지할 수 있습니다.
메모리 관리 정보 프로세스의 메모리 공간과 관련된 정보들을 담고 있습니다. 예를 들어, 페이지 테이블, 세그먼트 테이블, 메모리 한계 레지스터 등이 포함될 수 있습니다.
프로세스 상태 (Process State) 프로세스의 실행 중, 대기 중, 종료 상태 등 프로세스의 현재 상태에 대한 정보입니다.
계정 정보 (Accounting Information) CPU 사용 시간, 프로세스의 우선순위, 실행된 시스템 호출 수 등 프로세스의 성능 및 자원 사용에 관한 정보입니다.
입출력 상태 정보 (I/O Status Information) 프로세스가 사용하는 입출력 장치, 열려 있는 파일 목록, 입출력 요청 큐 등의 정보를 담고 있습니다.
●PCB의 역할
운영체제는 PCB를 사용해서 여러 프로세스를 관리할 수 있습니다. CPU의 각 코어는 여러 프로세스를 동시에 처리할 수 없기 때문에 짧은 시간동안 여러 프로세스를 하나씩 빠르게 처리하게 되는데요, 프로세스의 전환 과정에서 다음 프로세스의 정보를 읽어와야 작업을 진행할 수 있기 떄문에 프로세스의 정보, 즉 PCB를 필요로 합니다.
Context Switching란 무엇인가
컨텍스트 스위칭은 운영체제(OS)에서 현재 실행 중인 작업의 상태(context)를 저장하고, 다른 작업의 상태를 복원하여 실행을 전환하는 과정을 말합니다. 운영체제에서 하는 작업이기 때문에 당연히 커널영역으로의 전환이 이루어집니다.
프로세스나 스레드와의 전환만이 컨텍스트 스위칭이 일어난다고 생각하실 수도 있는데, 뿐만 아니라 여러 상황에서 이루어집니다.
●Context Switching이 일어나는 상황
컨텍스트 스위칭은 여러 상황에서 일어날 수 있습니다. 대표적인 4가지 경우가 있는데요.
프로세스 전환: 하나의 프로세스가 실행 중일 때, OS가 다른 프로세스로 전환해야 하면, 현재 프로세스의 상태를 저장하고 다른 프로세스의 상태를 불러와 실행합니다.
스레드 전환: 멀티스레드 환경에서, 하나의 스레드에서 다른 스레드로 전환할 때도 컨텍스트 스위칭이 일어납니다.
시스템 호출: 프로그램이 시스템 리소스에 접근하기 위해 커널 모드로 전환하는 순간에도 컨텍스트 스위칭이 발생합니다. 이때는 사용자 모드에서 커널 모드로, 다시 커널 모드에서 사용자 모드로 돌아가는 과정에서 전환이 이루어집니다.
인터럽트 처리: 외부 장치나 타이머 등에서 인터럽트가 발생하면, 현재 작업의 상태를 저장하고 인터럽트 핸들러로 전환되면서도 컨텍스트 스위칭이 일어날 수 있습니다.
설명: 프로세스 또는 스레드가 멈췄던 지점에서 다시 실행을 재개하려면, 중단된 지점의 명령어 위치를 정확히 알아야 해. 프로그램 카운터는 이 위치 정보를 저장하고 있기 때문에, 이를 복원하여 다음 실행 지점에서부터 이어서 실행할 수 있어.
2. CPU 레지스터 (CPU Registers)
역할: 연산 중인 데이터와 결과 값을 저장.
설명: 프로세스나 스레드가 작업 중에 CPU 레지스터에는 여러 변수 값이나 중간 계산 결과가 담겨 있어. 컨텍스트 스위칭 시에 이 레지스터의 값을 저장하고, 전환된 작업의 레지스터 값을 복원하여 이어서 연산을 수행할 수 있도록 해.
3. 스택 포인터 (Stack Pointer) 및 프레임 포인터 (Frame Pointer)
역할: 함수 호출의 스택 정보와 지역 변수를 관리.
설명: 함수 호출 시 함수의 실행 정보를 스택에 쌓고, 함수가 끝나면 스택에서 꺼내는 구조야. 스택 포인터는 현재 스택의 최상단 위치를 가리키고, 프레임 포인터는 특정 함수 호출의 시작 지점을 가리켜. 이 정보가 저장되고 복원됨으로써 함수 호출이 끊김 없이 연결될 수 있어.
4. 메모리 관리 정보 (Memory Management Information)
역할: 프로세스의 메모리 맵 및 페이지 테이블 정보를 관리.
설명: 프로세스마다 사용하는 메모리 주소 공간이 다르기 때문에, 커널은 프로세스 전환 시 해당 프로세스의 가상 메모리 맵과 페이지 테이블을 관리해. 이를 통해 해당 프로세스가 접근해야 하는 메모리 자원을 올바르게 연결해줄 수 있어.
5. 프로세스 상태 (Process State)
역할: 프로세스가 현재 어떤 상태에 있는지를 저장.
설명: 프로세스는 실행 상태, 준비 상태, 대기 상태 등 다양한 상태를 가질 수 있어. 이 정보는 커널이 프로세스를 정확한 상태로 전환하고 처리할 수 있도록 해주는 중요한 정보야.
6. 파일 디스크립터 테이블 (File Descriptor Table)
역할: 프로세스가 열어둔 파일의 정보와 네트워크 소켓 등을 관리.
설명: 프로세스는 실행 중에 파일이나 소켓 같은 리소스를 열어 사용할 수 있어. 이러한 파일 디스크립터 정보는 전환된 프로세스에서도 동일하게 유지되어야 하기 때문에, 커널은 이 정보를 저장하고 복원해.
7. 입출력 상태 (I/O State)
역할: 프로세스가 대기 중인 입출력 작업의 상태 정보를 관리.
설명: 만약 프로세스가 어떤 입출력 작업(예: 파일 읽기/쓰기, 네트워크 통신 등)을 기다리는 상태라면, 커널은 해당 작업이 어느 단계에 있는지 그 상태를 기록하고 있어. 이를 통해 나중에 다시 프로세스를 복원할 때 그 입출력 작업을 이어서 수행할 수 있게 해.
8. 특권 레벨 (Privilege Level)
역할: 프로세스가 사용자 모드인지, 커널 모드인지를 저장.
설명: 시스템 호출이나 인터럽트가 발생할 때, CPU는 사용자 모드에서 커널 모드로 전환돼. 이 특권 레벨 정보가 정확하게 유지되어야 올바른 권한으로 작업을 수행할 수 있어.
●각 상황마다의 Context Switching
컨텍스트 스위칭은 작업의 전환이란 큰 틀에선 똑같지만, 상황에 따라 다루는 정보들이 달라집니다.
각각의 상황에서 커널이 어떤 정보를 읽고 저장하는지 알아봅시다.
1. 프로세스 전환 (Process Switching)
읽는 정보: 프로세스는 독립된 실행 단위이기 때문에 상태를 완전히 저장하고 복원해야 합니다.
프로그램 카운터 (Program Counter): 프로세스가 중단된 위치.
CPU 레지스터 (CPU Registers): 프로세스에서 사용 중이던 모든 레지스터 값.
스택 포인터 (Stack Pointer) 및 프레임 포인터 (Frame Pointer): 프로세스의 함수 호출 및 지역 변수 상태.
메모리 관리 정보 (Memory Management Information): 가상 메모리 주소 공간, 페이지 테이블 정보.
프로세스 상태 (Process State): 실행 상태, 준비 상태, 대기 상태 등의 현재 상태.
파일 디스크립터 테이블 (File Descriptor Table): 프로세스가 열어 둔 파일 및 소켓 정보.
입출력 상태 (I/O State): 프로세스가 기다리고 있는 입출력 작업의 상태.
프로세스 전환은 완전히 다른 메모리 주소 공간과 자원을 사용하는 독립적인 작업을 전환하는 것이기 때문에, CPU 레지스터 및 메모리 관련 정보 전부를 저장 및 복원해야 합니다.
2. 스레드 전환 (Thread Switching)
읽는 정보: 스레드는 같은 프로세스 내에서 실행되므로 프로세스의 정보는 공유되지만, 스레드 고유의 정보는 저장 및 복원해야 합니다.