질문 리스트
- 쓰레드(Thread)란 무엇인가요?
- 멀티스레드 환경에서는 어떤 문제가 발생할 수 있나요?
- 데드락을 방지하려면 어떻게 해야 하나요?
- 프로세스 간 독립적이라면 서로 통신은 어떻게 하나요?
- 공유 메모리와 메시지 큐의 차이는?
- 텍스와 세마포어에 대해서 설명해주세요
- 세마포어 카운트가 0이 되면 어떻게 되나요?
- 멀티 쓰레드의 동시성과 병렬성이 무엇인가요??
- 레이스 컨디션(동기화 문제)가 무엇인가요??
- 은행원 알고리즘이 무엇인가요??
- Safe State란 무엇인가요?
- Deadlock을 해결하는 방법은?
- Deadlock과 Starvation 차이를 설명해주세요.
- 인터럽트가 무엇인가요?
- 인터럽트와 폴링(Polling)의 차이는 뭔가요?
- 하드웨어 인터럽트와 소프트웨어 인터럽트 차이를 설명해주세요.
- 인터럽트 발생했을 때 어떻게 동작하나요?
- 유저 영역과 커널 영역에 대해서 설명해주세요.
- 시스템 콜이 무엇인가요?
- PCB가 무엇인가요?
- PCB는 메모리에 어떤 형식으로 저장되나요?
- PCB와 TCB(Thread Control Block)의 차이를 설명해주세요.
- 컨텍스트 스위칭이 무엇인가요?
- CPU 스케줄링이 무엇인가요?
- 운영체제 에이징(aging) 는 무엇입니까?
- 가상 메모리가 무엇인가요?
- 페이징 기법에 대해서 설명해주세요
- 페이징의 장점과 단점을 설명해주세요.
- 내부 단편화와 외부단편화가 무엇인가요?
- 페이지 폴트가 무엇인가요?
- 페이지 교체 알고리즘이 무엇인가요?
- 세그먼테이션은 무엇인가요?
- 멀티 프로세싱, 멀티 프로그래밍, 멀티 태스킹의 차이점을 설명해주세요.
쓰레드(Thread)란 무엇인가요?
Thread는 프로세스(Process) 안에서 실제 작업을 수행하는 최소 실행 단위입니다.
여러 쓰레드가 하나의 프로세스 안에서 메모리를 공유하며 독립적으로 실행됩니다.
쓰레드는 가볍고, 병렬 처리와 비동기 작업을 가능하게 만들어 프로그램 성능을 높일 수 있습니다.
여러 쓰레드가 하나의 프로세스 안에서 메모리를 공유하며 독립적으로 실행됩니다.
쓰레드는 가볍고, 병렬 처리와 비동기 작업을 가능하게 만들어 프로그램 성능을 높일 수 있습니다.
멀티스레드 환경에서는 어떤 문제가 발생할 수 있나요?
1) 경쟁 조건(Race Condition)
두 개 이상의 스레드가 동시에 같은 데이터를 읽거나 쓰면서 예상치 못한 결과가 나오는 현상입니다.
Ex. 은행 계좌 잔액 업데이트 시 두 스레드가 동시에 출금 요청을 보내서 잔액이 틀어지는 경우.
2) 데드락(Deadlock)
서로 자원이 잠긴 상태로 스레드들이 영원히 대기하는 상황입니다.
Ex. 스레드1이 자물쇠1을 잡고 자물쇠2를 기다리고, 스레드2는 자물쇠2를 잡고 자물쇠1을 기다릴 때
3) 라이브락(Livelock)
데드락처럼 멈추지는 않지만, 서로 양보만 하다가 아무것도 진행되지 않는 상황입니다.
상태는 바뀌지만 결과적으로 작업이 진행되지 않습니다.
4) 기아 상태(Starvation)
특정 스레드가 자원이나 CPU 사용 기회를 거의 얻지 못하고 계속 기다리기만 하는 상황입니다.
높은 우선순위 스레드에 밀려서 낮은 우선순위 스레드가 실행되지 않는 경우입니다.
5) 데이터 불일치(Data Inconsistency)
적절한 동기화 없이 여러 스레드가 데이터를 수정하면서, 일관성 없는 잘못된 데이터가 저장될 수 있습니다.
두 개 이상의 스레드가 동시에 같은 데이터를 읽거나 쓰면서 예상치 못한 결과가 나오는 현상입니다.
Ex. 은행 계좌 잔액 업데이트 시 두 스레드가 동시에 출금 요청을 보내서 잔액이 틀어지는 경우.
2) 데드락(Deadlock)
서로 자원이 잠긴 상태로 스레드들이 영원히 대기하는 상황입니다.
Ex. 스레드1이 자물쇠1을 잡고 자물쇠2를 기다리고, 스레드2는 자물쇠2를 잡고 자물쇠1을 기다릴 때
3) 라이브락(Livelock)
데드락처럼 멈추지는 않지만, 서로 양보만 하다가 아무것도 진행되지 않는 상황입니다.
상태는 바뀌지만 결과적으로 작업이 진행되지 않습니다.
4) 기아 상태(Starvation)
특정 스레드가 자원이나 CPU 사용 기회를 거의 얻지 못하고 계속 기다리기만 하는 상황입니다.
높은 우선순위 스레드에 밀려서 낮은 우선순위 스레드가 실행되지 않는 경우입니다.
5) 데이터 불일치(Data Inconsistency)
적절한 동기화 없이 여러 스레드가 데이터를 수정하면서, 일관성 없는 잘못된 데이터가 저장될 수 있습니다.
데드락을 방지하려면 어떻게 해야 하나요?
* 데드락이란?
여러 스레드가 서로 상대방의 자원을 점유하고 해제를 기다리면서 영원히 대기 상태에 빠지는 문제입니다.
데드락 발생 4가지 조건 ( 이 중 하나라도 깨면 데드락을 방지할 수 있습니다)
- 상호 배제(Mutual Exclusion): 자원은 한 번에 하나의 스레드만 사용할 수 있다.
- 점유 대기(Hold and Wait): 자원을 점유한 채로 다른 자원을 기다린다.
- 비선점(No Preemption): 다른 스레드가 점유한 자원을 강제로 뺏을 수 없다.
- 순환 대기(Circular Wait): 스레드들이 자원을 순환적으로 기다린다.
데드락 방지 방법
1. 자원 획득 순서를 일관되게 정하기
항상 동일한 순서로 자원을 획득하도록 강제합니다.
예를 들어, 항상 Lock A → Lock B 순서로만 잠그도록 규칙을 정하면 순환 대기를 방지할 수 있습니다.
2. 타임아웃 설정
일정 시간 안에 락을 획득하지 못하면 포기합니다.
Java에서는 tryLock(long timeout, TimeUnit unit) 같은 메서드를 사용할 수 있습니다.
3. 락을 최소화하고 필요한 만큼만 사용
락을 오래 잡고 있으면 데드락 가능성이 높아집니다.
꼭 필요한 범위 안에서만 락을 걸고, 빨리 해제하는 것이 중요합니다.
4. 데드락 탐지와 회복 (Deadlock Detection)
데드락이 발생할 수도 있다고 가정하고, 주기적으로 상태를 검사합니다.
데드락이 감지되면, 강제로 일부 스레드를 종료하거나 자원을 회수해서 풀어버리는 방법입니다.
프로세스 간 독립적이라면 서로 통신은 어떻게 하나요?
프로세스는 운영체제에 의해 메모리가 분리되어 독립적으로 실행됩니다.
하지만 협력 작업이 필요한 경우, 프로세스 간 통신(IPC, Inter-Process Communication) 방식을 통해 데이터를 주고받을 수 있습니다.
대표적인 IPC 방법으로는 파이프(PIPE), 소켓(SOCKET), 공유 메모리(SHARED MEMORY), 메시지 큐(MESSAGE QUEUE) 등이 있습니다.
예를 들어, 네트워크 서버 개발에서는 소켓을 사용해 서로 다른 프로세스 간 데이터를 주고받는 경우가 많습니다.
즉, 프로세스는 기본적으로 독립적이지만, IPC 기술을 사용해 필요한 경우 데이터를 주고받으며 협업할 수 있습니다.
하지만 협력 작업이 필요한 경우, 프로세스 간 통신(IPC, Inter-Process Communication) 방식을 통해 데이터를 주고받을 수 있습니다.
대표적인 IPC 방법으로는 파이프(PIPE), 소켓(SOCKET), 공유 메모리(SHARED MEMORY), 메시지 큐(MESSAGE QUEUE) 등이 있습니다.
예를 들어, 네트워크 서버 개발에서는 소켓을 사용해 서로 다른 프로세스 간 데이터를 주고받는 경우가 많습니다.
즉, 프로세스는 기본적으로 독립적이지만, IPC 기술을 사용해 필요한 경우 데이터를 주고받으며 협업할 수 있습니다.
공유 메모리와 메시지 큐의 차이는?
공유 메모리(Shared Memory)와 메시지 큐(Message Queue)는 모두 프로세스 간 통신을 위한 방법입니다.
하지만 작동 방식과 특징에 차이가 있습니다.
공유 메모리
두 프로세스가 하나의 메모리 공간을 공유하여 데이터를 주고받는 방식입니다.
메모리에 직접 접근하기 때문에 속도가 매우 빠른 장점이 있습니다.
다만 동시에 접근하면 데이터 충돌이 발생할 수 있기 때문에,
별도로 동기화(뮤텍스, 세마포어 등)를 관리해야 합니다.
메시지 큐
운영체제가 메시지를 큐 형태로 관리해주는 방식입니다.
프로세스는 운영체제에 메시지를 보내거나 받아서 통신합니다.
공유 메모리보다 속도는 느릴 수 있지만,
운영체제가 데이터 순서를 보장하고 충돌을 방지해주기 때문에 안전하고 구현이 간편합니다.
하지만 작동 방식과 특징에 차이가 있습니다.
공유 메모리
두 프로세스가 하나의 메모리 공간을 공유하여 데이터를 주고받는 방식입니다.
메모리에 직접 접근하기 때문에 속도가 매우 빠른 장점이 있습니다.
다만 동시에 접근하면 데이터 충돌이 발생할 수 있기 때문에,
별도로 동기화(뮤텍스, 세마포어 등)를 관리해야 합니다.
메시지 큐
운영체제가 메시지를 큐 형태로 관리해주는 방식입니다.
프로세스는 운영체제에 메시지를 보내거나 받아서 통신합니다.
공유 메모리보다 속도는 느릴 수 있지만,
운영체제가 데이터 순서를 보장하고 충돌을 방지해주기 때문에 안전하고 구현이 간편합니다.
텍스와 세마포어에 대해서 설명해주세요
뮤텍스(Mutex)와 세마포어(Semaphore)는 모두 공유 자원의 동시 접근을 제어하는 동기화 도구입니다.
뮤텍스
한 번에 하나의 프로세스나 스레드만 자원에 접근할 수 있도록 제한합니다.
소유권 개념이 있어서, 락을 획득한 스레드만 락을 해제할 수 있습니다.
그래서 뮤텍스는 배타적 접근을 보장합니다.
세마포어
특정 자원에 접근할 수 있는 동시 접근 수를 정수 형태로 관리합니다.
값이 1이면 뮤텍스처럼 동작하지만, 값이 2 이상이면 여러 스레드가 동시에 접근할 수도 있습니다.
특히 소유권 개념이 없고, 락을 걸거나 푸는 주체가 달라도 됩니다.
뮤텍스
한 번에 하나의 프로세스나 스레드만 자원에 접근할 수 있도록 제한합니다.
소유권 개념이 있어서, 락을 획득한 스레드만 락을 해제할 수 있습니다.
그래서 뮤텍스는 배타적 접근을 보장합니다.
세마포어
특정 자원에 접근할 수 있는 동시 접근 수를 정수 형태로 관리합니다.
값이 1이면 뮤텍스처럼 동작하지만, 값이 2 이상이면 여러 스레드가 동시에 접근할 수도 있습니다.
특히 소유권 개념이 없고, 락을 걸거나 푸는 주체가 달라도 됩니다.
세마포어 카운트가 0이 되면 어떻게 되나요?
세마포어의 카운트는 자원이 얼마나 사용 가능한지를 나타냅니다.
세마포어 카운트가 0이 되면, 자원이 모두 사용 중이라는 의미입니다.
이때, 추가로 자원을 요청하는 프로세스나 스레드는 대기(Blocking) 상태에 들어갑니다.
즉, 카운트가 0인 동안에는 새로운 접근이 허용되지 않고, 자원을 반환해서 카운트가 증가할 때까지 블로킹됩니다.
이후 다른 프로세스가 자원을 반납하여 카운트가 1 이상이 되면, 대기 중이던 프로세스가 깨어나서 자원 접근을 시도할 수 있습니다.
세마포어 카운트가 0이 되면, 자원이 모두 사용 중이라는 의미입니다.
이때, 추가로 자원을 요청하는 프로세스나 스레드는 대기(Blocking) 상태에 들어갑니다.
즉, 카운트가 0인 동안에는 새로운 접근이 허용되지 않고, 자원을 반환해서 카운트가 증가할 때까지 블로킹됩니다.
이후 다른 프로세스가 자원을 반납하여 카운트가 1 이상이 되면, 대기 중이던 프로세스가 깨어나서 자원 접근을 시도할 수 있습니다.
멀티 쓰레드의 동시성과 병렬성이 무엇인가요??
동시성(Concurrency)
여러 작업을 번갈아가며 처리하는 것을 말합니다.
실제로 동시에 실행되진 않더라도, 스케줄링을 통해 빠르게 작업을 전환하면서 겉으로는 동시에 처리되는 것처럼 보이는 상태입니다. 대표적으로 하나의 CPU 코어에서 여러 스레드가 번갈아 실행되는 경우입니다.
병렬성(Parallelism)
여러 작업이 실제로 동시에 실행되는 것을 의미합니다.
이는 여러 CPU 코어를 활용해서 각각의 작업이 진짜로 동시에 처리되는 경우입니다.
여러 작업을 번갈아가며 처리하는 것을 말합니다.
실제로 동시에 실행되진 않더라도, 스케줄링을 통해 빠르게 작업을 전환하면서 겉으로는 동시에 처리되는 것처럼 보이는 상태입니다. 대표적으로 하나의 CPU 코어에서 여러 스레드가 번갈아 실행되는 경우입니다.
병렬성(Parallelism)
여러 작업이 실제로 동시에 실행되는 것을 의미합니다.
이는 여러 CPU 코어를 활용해서 각각의 작업이 진짜로 동시에 처리되는 경우입니다.
레이스 컨디션(동기화 문제)가 무엇인가요??
레이스 컨디션(Race Condition)
둘 이상의 스레드나 프로세스가 동시에 같은 자원에 접근할 때,
실행 순서나 타이밍에 따라 결과가 달라지는 문제를 말합니다.
주로 공유 자원에 대한 읽기-쓰기 작업이 동기화 없이 이루어질 때 발생합니다.
예를 들어, 두 개의 스레드가 동시에 같은 변수의 값을 읽고, 각각 수정한 후 저장하면,
수정한 값 중 하나가 덮어써져 원래 의도와 다른 결과가 발생할 수 있습니다.
레이스 컨디션은 프로그램의 동작을 예측할 수 없게 만들고, 심각한 버그나 데이터 손상을 초래할 수 있기 때문에, 뮤텍스, 세마포어 같은 동기화 기법을 사용해서 반드시 제어해야 합니다.
둘 이상의 스레드나 프로세스가 동시에 같은 자원에 접근할 때,
실행 순서나 타이밍에 따라 결과가 달라지는 문제를 말합니다.
주로 공유 자원에 대한 읽기-쓰기 작업이 동기화 없이 이루어질 때 발생합니다.
예를 들어, 두 개의 스레드가 동시에 같은 변수의 값을 읽고, 각각 수정한 후 저장하면,
수정한 값 중 하나가 덮어써져 원래 의도와 다른 결과가 발생할 수 있습니다.
레이스 컨디션은 프로그램의 동작을 예측할 수 없게 만들고, 심각한 버그나 데이터 손상을 초래할 수 있기 때문에, 뮤텍스, 세마포어 같은 동기화 기법을 사용해서 반드시 제어해야 합니다.
은행원 알고리즘이 무엇인가요??
은행원 알고리즘(Banker's Algorithm)
교착 상태(Deadlock)를 예방하기 위해 고안된 자원 할당 알고리즘입니다.
이 알고리즘은 은행원이 대출을 관리하는 방식에서 착안한 것으로,
프로세스의 자원 요청을 즉시 승인하는 것이 아니라,
요청을 승인했을 때 시스템이 안전한 상태(Safe State)를 유지할 수 있는지 먼저 확인합니다.
만약 요청을 승인한 이후에도 모든 프로세스가 필요한 자원을 eventually 얻어 종료될 수 있다면 요청을 승인하고, 그렇지 않으면 요청을 거부하거나 대기시킵니다.
교착 상태(Deadlock)를 예방하기 위해 고안된 자원 할당 알고리즘입니다.
이 알고리즘은 은행원이 대출을 관리하는 방식에서 착안한 것으로,
프로세스의 자원 요청을 즉시 승인하는 것이 아니라,
요청을 승인했을 때 시스템이 안전한 상태(Safe State)를 유지할 수 있는지 먼저 확인합니다.
만약 요청을 승인한 이후에도 모든 프로세스가 필요한 자원을 eventually 얻어 종료될 수 있다면 요청을 승인하고, 그렇지 않으면 요청을 거부하거나 대기시킵니다.
Safe State란 무엇인가요?
Safe State(안전 상태)
현재 자원 할당 상황에서 모든 프로세스가 차례로 자신의 최대 요구량까지 자원을 얻고 정상적으로 종료할 수 있는 상태를 의미합니다.
즉, 현재 자원 상황이 아무리 복잡하더라도 적절한 실행 순서만 정하면 모든 프로세스가 자원을 얻어 끝낼 수 있다면, 시스템은 Safe State에 있다고 말합니다.
은행원 알고리즘에서는 자원 요청이 들어올 때, 요청을 수락한 후에도 시스템이 Safe State를 유지할 수 있는지 시뮬레이션해서, 교착 상태를 사전에 예방합니다.
현재 자원 할당 상황에서 모든 프로세스가 차례로 자신의 최대 요구량까지 자원을 얻고 정상적으로 종료할 수 있는 상태를 의미합니다.
즉, 현재 자원 상황이 아무리 복잡하더라도 적절한 실행 순서만 정하면 모든 프로세스가 자원을 얻어 끝낼 수 있다면, 시스템은 Safe State에 있다고 말합니다.
은행원 알고리즘에서는 자원 요청이 들어올 때, 요청을 수락한 후에도 시스템이 Safe State를 유지할 수 있는지 시뮬레이션해서, 교착 상태를 사전에 예방합니다.
Deadlock을 해결하는 방법은?
Deadlock(교착 상태)을 해결하는 방법은 크게 4가지로 나눌 수 있습니다.
1. Deadlock Prevention (교착 상태 예방)
교착 상태가 발생할 조건 중 하나를 미리 차단해서 Deadlock을 아예 발생시키지 않는 방법입니다.
예를 들어, 자원을 항상 순서대로 할당하거나, 점유 대기 조건을 없애는 방법 등이 있습니다.
2. Deadlock Avoidance (교착 상태 회피)
자원 요청이 들어올 때 시스템이 Safe State를 유지할 수 있을지 시뮬레이션하고, 위험할 경우 요청을 거부하는 방법입니다. 대표적인 방법이 은행원 알고리즘(Banker's Algorithm) 입니다.
3. Deadlock Detection and Recovery (교착 상태 탐지 및 복구)
Deadlock이 발생할 가능성을 허용하고, 주기적으로 검사해서 발생하면 프로세스를 종료하거나 자원을 회수해 복구하는 방법입니다. 예를 들어, 프로세스 중 하나를 강제로 종료시켜서 교착을 풀 수 있습니다.
4. Ignore the Problem (문제를 무시하기)
실제로는 운영체제나 시스템이 Deadlock 발생 확률이 낮은 경우, 복잡한 처리를 하지 않고 그냥 무시하는 경우도 있습니다. 대표적으로 UNIX나 Linux에서는 Deadlock 방지보다 복구, 무시 전략을 선택하기도 합니다.
1. Deadlock Prevention (교착 상태 예방)
교착 상태가 발생할 조건 중 하나를 미리 차단해서 Deadlock을 아예 발생시키지 않는 방법입니다.
예를 들어, 자원을 항상 순서대로 할당하거나, 점유 대기 조건을 없애는 방법 등이 있습니다.
2. Deadlock Avoidance (교착 상태 회피)
자원 요청이 들어올 때 시스템이 Safe State를 유지할 수 있을지 시뮬레이션하고, 위험할 경우 요청을 거부하는 방법입니다. 대표적인 방법이 은행원 알고리즘(Banker's Algorithm) 입니다.
3. Deadlock Detection and Recovery (교착 상태 탐지 및 복구)
Deadlock이 발생할 가능성을 허용하고, 주기적으로 검사해서 발생하면 프로세스를 종료하거나 자원을 회수해 복구하는 방법입니다. 예를 들어, 프로세스 중 하나를 강제로 종료시켜서 교착을 풀 수 있습니다.
4. Ignore the Problem (문제를 무시하기)
실제로는 운영체제나 시스템이 Deadlock 발생 확률이 낮은 경우, 복잡한 처리를 하지 않고 그냥 무시하는 경우도 있습니다. 대표적으로 UNIX나 Linux에서는 Deadlock 방지보다 복구, 무시 전략을 선택하기도 합니다.
Deadlock과 Starvation 차이를 설명해주세요.
Deadlock(교착 상태)
여러 프로세스가 서로 자원을 점유한 채, 서로의 자원을 기다리면서 모두 멈춰버리는 상태입니다.
이 경우, 관련된 프로세스들 모두가 영원히 진행할 수 없습니다.
Starvation(기아 상태)
어떤 프로세스가 필요한 자원을 계속 기다리지만, 다른 프로세스에 밀려서 자원을 계속 할당받지 못하는 상황을 말합니다. 시스템은 돌아가고 있지만, 특정 프로세스만 영원히 대기하게 됩니다.
여러 프로세스가 서로 자원을 점유한 채, 서로의 자원을 기다리면서 모두 멈춰버리는 상태입니다.
이 경우, 관련된 프로세스들 모두가 영원히 진행할 수 없습니다.
Starvation(기아 상태)
어떤 프로세스가 필요한 자원을 계속 기다리지만, 다른 프로세스에 밀려서 자원을 계속 할당받지 못하는 상황을 말합니다. 시스템은 돌아가고 있지만, 특정 프로세스만 영원히 대기하게 됩니다.
인터럽트가 무엇인가요?
인터럽트(Interrupt)
프로세서가 현재 작업을 중단하고, 급한 처리를 먼저 수행하도록 요청하는 신호를 말합니다.
CPU는 일반적으로 프로그램을 순차적으로 실행하지만, 외부나 내부에서 인터럽트가 발생하면
현재 작업을 잠시 멈추고, 인터럽트 핸들러(Interrupt Handler) 라는 특별한 루틴을 실행합니다.
인터럽트를 처리한 후에는 다시 원래 작업으로 돌아갑니다.
대표적인 예로, 키보드 입력, 마우스 클릭, 네트워크 패킷 수신 같은 이벤트가 발생했을 때 CPU가 즉시 반응하는 것은 인터럽트 덕분입니다.
이렇게 인터럽트를 통해 CPU는 예외 상황이나 외부 이벤트에 빠르게 대응할 수 있습니다.
프로세서가 현재 작업을 중단하고, 급한 처리를 먼저 수행하도록 요청하는 신호를 말합니다.
CPU는 일반적으로 프로그램을 순차적으로 실행하지만, 외부나 내부에서 인터럽트가 발생하면
현재 작업을 잠시 멈추고, 인터럽트 핸들러(Interrupt Handler) 라는 특별한 루틴을 실행합니다.
인터럽트를 처리한 후에는 다시 원래 작업으로 돌아갑니다.
대표적인 예로, 키보드 입력, 마우스 클릭, 네트워크 패킷 수신 같은 이벤트가 발생했을 때 CPU가 즉시 반응하는 것은 인터럽트 덕분입니다.
이렇게 인터럽트를 통해 CPU는 예외 상황이나 외부 이벤트에 빠르게 대응할 수 있습니다.
인터럽트와 폴링(Polling)의 차이는 뭔가요?
인터럽트
외부 장치나 프로그램이 직접 CPU에게 알리는 방식입니다.
이벤트가 발생하면 CPU는 즉시 현재 작업을 중단하고, 인터럽트 핸들러를 실행해 해당 이벤트를 처리합니다. 따라서 CPU 자원을 효율적으로 사용할 수 있고, 대기 시간이 짧습니다.
폴링
CPU가 주기적으로 외부 장치에 상태를 직접 확인하는 방식입니다.
이벤트가 발생했는지 계속 체크(질문)해야 하기 때문에, 이벤트가 없더라도 CPU 자원이 낭비될 수 있습니다. 하지만 구조가 단순하기 때문에 간단한 시스템에서는 폴링이 오히려 유리할 때도 있습니다.
외부 장치나 프로그램이 직접 CPU에게 알리는 방식입니다.
이벤트가 발생하면 CPU는 즉시 현재 작업을 중단하고, 인터럽트 핸들러를 실행해 해당 이벤트를 처리합니다. 따라서 CPU 자원을 효율적으로 사용할 수 있고, 대기 시간이 짧습니다.
폴링
CPU가 주기적으로 외부 장치에 상태를 직접 확인하는 방식입니다.
이벤트가 발생했는지 계속 체크(질문)해야 하기 때문에, 이벤트가 없더라도 CPU 자원이 낭비될 수 있습니다. 하지만 구조가 단순하기 때문에 간단한 시스템에서는 폴링이 오히려 유리할 때도 있습니다.
하드웨어 인터럽트와 소프트웨어 인터럽트 차이를 설명해주세요.
하드웨어 인터럽트
외부 하드웨어 장치가 CPU에게 직접 신호를 보내 발생하는 인터럽트입니다.
예를 들어, 키보드 입력, 마우스 클릭, 네트워크 수신 등이 하드웨어 인터럽트입니다.
CPU는 하드웨어의 요청에 즉시 응답하여 처리합니다.
소프트웨어 인터럽트
프로그램 코드 내부에서 명령어를 통해 의도적으로 발생시키는 인터럽트입니다.
주로 시스템 콜(System Call)이나 예외(Exception) 처리에 사용됩니다.
예를 들어, 프로그램이 파일 입출력을 요청할 때 커널에 요청하기 위해 소프트웨어 인터럽트를 발생시킵니다.
외부 하드웨어 장치가 CPU에게 직접 신호를 보내 발생하는 인터럽트입니다.
예를 들어, 키보드 입력, 마우스 클릭, 네트워크 수신 등이 하드웨어 인터럽트입니다.
CPU는 하드웨어의 요청에 즉시 응답하여 처리합니다.
소프트웨어 인터럽트
프로그램 코드 내부에서 명령어를 통해 의도적으로 발생시키는 인터럽트입니다.
주로 시스템 콜(System Call)이나 예외(Exception) 처리에 사용됩니다.
예를 들어, 프로그램이 파일 입출력을 요청할 때 커널에 요청하기 위해 소프트웨어 인터럽트를 발생시킵니다.
인터럽트 발생했을 때 어떻게 동작하나요?
1. 현재 작업 중단
CPU는 지금 실행 중인 명령어를 잠시 멈추고, 현재 상태(Program Counter, 레지스터 값 등)를 저장합니다.
2. 인터럽트 원인 식별
어떤 종류의 인터럽트가 발생했는지 식별합니다. (하드웨어 인터럽트, 소프트웨어 인터럽트 등)
3. 인터럽트 핸들러 호출
해당 인터럽트에 대응하는 인터럽트 핸들러(Interrupt Service Routine, ISR) 로 제어를 넘깁니다.
4. 인터럽트 처리
핸들러는 필요한 작업을 수행합니다. (예: 키보드 입력 처리, 네트워크 패킷 수신 등)
5. 이전 작업 복구 및 재개
인터럽트 처리가 끝나면, 저장해두었던 CPU 상태를 복구하고, 중단했던 작업을 이어서 계속 실행합니다.
CPU는 지금 실행 중인 명령어를 잠시 멈추고, 현재 상태(Program Counter, 레지스터 값 등)를 저장합니다.
2. 인터럽트 원인 식별
어떤 종류의 인터럽트가 발생했는지 식별합니다. (하드웨어 인터럽트, 소프트웨어 인터럽트 등)
3. 인터럽트 핸들러 호출
해당 인터럽트에 대응하는 인터럽트 핸들러(Interrupt Service Routine, ISR) 로 제어를 넘깁니다.
4. 인터럽트 처리
핸들러는 필요한 작업을 수행합니다. (예: 키보드 입력 처리, 네트워크 패킷 수신 등)
5. 이전 작업 복구 및 재개
인터럽트 처리가 끝나면, 저장해두었던 CPU 상태를 복구하고, 중단했던 작업을 이어서 계속 실행합니다.
유저 영역과 커널 영역에 대해서 설명해주세요.
유저 영역
일반 애플리케이션(프로그램)이 실행되는 공간입니다.
사용자가 작성한 프로그램은 유저 영역에서 실행되며, 시스템 자원에 직접 접근할 수 없습니다.
대신, 시스템 콜(System Call)을 통해 커널에 요청을 보내야만 파일, 네트워크, 메모리 같은 자원을 사용할 수 있습니다.
커널 영역
운영체제 커널이 실행되는 보호된 영역입니다.
하드웨어 제어, 메모리 관리, 프로세스 관리 같은 핵심 기능을 담당합니다.
커널 영역은 시스템 안정성과 보안을 위해 외부에서 직접 접근할 수 없고, 커널 코드만 접근할 수 있습니다.
일반 애플리케이션(프로그램)이 실행되는 공간입니다.
사용자가 작성한 프로그램은 유저 영역에서 실행되며, 시스템 자원에 직접 접근할 수 없습니다.
대신, 시스템 콜(System Call)을 통해 커널에 요청을 보내야만 파일, 네트워크, 메모리 같은 자원을 사용할 수 있습니다.
커널 영역
운영체제 커널이 실행되는 보호된 영역입니다.
하드웨어 제어, 메모리 관리, 프로세스 관리 같은 핵심 기능을 담당합니다.
커널 영역은 시스템 안정성과 보안을 위해 외부에서 직접 접근할 수 없고, 커널 코드만 접근할 수 있습니다.
시스템 콜이 무엇인가요?
시스템 콜(System Call)
유저 영역의 프로그램이 커널 영역의 기능을 요청할 때 사용하는 인터페이스입니다.
일반 애플리케이션은 직접 하드웨어나 시스템 자원에 접근할 수 없습니다.
대시스템 콜을 통해 파일 입출력, 프로세스 생성, 네트워크 통신, 메모리 관리 같은 커널 기능을 요청합니다.
시스템 콜이 호출되면 CPU는 유저 모드(User Mode) 에서 커널 모드(Kernel Mode) 로 전환되어,
커널이 요청을 처리한 후 다시 유저 모드로 돌아와 실행을 이어갑니다.
예를 들어, 파일을 읽기 위해 read() 시스템 콜을 호출하거나, 새로운 프로세스를 생성하기 위해 fork() 시스템 콜을 호출하는 것이 대표적인 사례입니다.
유저 영역의 프로그램이 커널 영역의 기능을 요청할 때 사용하는 인터페이스입니다.
일반 애플리케이션은 직접 하드웨어나 시스템 자원에 접근할 수 없습니다.
대시스템 콜을 통해 파일 입출력, 프로세스 생성, 네트워크 통신, 메모리 관리 같은 커널 기능을 요청합니다.
시스템 콜이 호출되면 CPU는 유저 모드(User Mode) 에서 커널 모드(Kernel Mode) 로 전환되어,
커널이 요청을 처리한 후 다시 유저 모드로 돌아와 실행을 이어갑니다.
예를 들어, 파일을 읽기 위해 read() 시스템 콜을 호출하거나, 새로운 프로세스를 생성하기 위해 fork() 시스템 콜을 호출하는 것이 대표적인 사례입니다.
PCB가 무엇인가요?
PCB(Process Control Block)
운영체제가 각 프로세스에 대해 정보를 관리하기 위해 사용하는 데이터 구조입니다.
프로세스가 생성될 때 운영체제는 그 프로세스에 대한 정보를 PCB에 저장합니다.
CPU가 여러 프로세스를 스케줄링하고, 상태를 관리할 수 있는 것은 모두 PCB 덕분입니다.
PCB에 포함되는 정보
1. 프로세스 상태 (Running, Waiting, Ready 등)
2. 프로그램 카운터 (다음 실행할 명령어 주소)
3. CPU 레지스터 값
4. 프로세스 식별자(PID)
5. 메모리 관리 정보 (페이지 테이블, 세그먼트 정보 등)
6. 입출력(I/O) 상태 정보
7. 프로세스 우선순위
운영체제가 각 프로세스에 대해 정보를 관리하기 위해 사용하는 데이터 구조입니다.
프로세스가 생성될 때 운영체제는 그 프로세스에 대한 정보를 PCB에 저장합니다.
CPU가 여러 프로세스를 스케줄링하고, 상태를 관리할 수 있는 것은 모두 PCB 덕분입니다.
PCB에 포함되는 정보
1. 프로세스 상태 (Running, Waiting, Ready 등)
2. 프로그램 카운터 (다음 실행할 명령어 주소)
3. CPU 레지스터 값
4. 프로세스 식별자(PID)
5. 메모리 관리 정보 (페이지 테이블, 세그먼트 정보 등)
6. 입출력(I/O) 상태 정보
7. 프로세스 우선순위
PCB는 메모리에 어떤 형식으로 저장되나요?
PCB(Process Control Block)는 운영체제 커널 영역의 메모리 공간에 구조체(Struct) 형태로 저장됩니다.
운영체제는 각 프로세스마다 하나의 PCB를 생성하고, 이 PCB들은 연속된 메모리에 배열처럼 저장되거나,
링크드 리스트, 해시 테이블 같은 자료구조로 관리될 수 있습니다.
PCB 내부는 일반적으로 구조체(Struct) 형식으로 정의되어 있으며,
프로세스 ID, 상태, 프로그램 카운터, CPU 레지스터 값, 메모리 매핑 정보, 파일 디스크립터 목록 같은 다양한 필드를 가집니다.
이처럼 PCB는 커널 메모리(Kernel Space) 에 위치하기 때문에,
사용자 프로그램은 직접 접근할 수 없고, 운영체제만이 PCB를 읽거나 수정할 수 있습니다.
운영체제는 각 프로세스마다 하나의 PCB를 생성하고, 이 PCB들은 연속된 메모리에 배열처럼 저장되거나,
링크드 리스트, 해시 테이블 같은 자료구조로 관리될 수 있습니다.
PCB 내부는 일반적으로 구조체(Struct) 형식으로 정의되어 있으며,
프로세스 ID, 상태, 프로그램 카운터, CPU 레지스터 값, 메모리 매핑 정보, 파일 디스크립터 목록 같은 다양한 필드를 가집니다.
이처럼 PCB는 커널 메모리(Kernel Space) 에 위치하기 때문에,
사용자 프로그램은 직접 접근할 수 없고, 운영체제만이 PCB를 읽거나 수정할 수 있습니다.
PCB와 TCB(Thread Control Block)의 차이를 설명해주세요.
PCB(Process Control Block)와 TCB(Thread Control Block)는 모두 운영체제가 실행 단위를 관리하기 위해 사용하는 데이터 구조입니다.
하지만 관리 대상이 다릅니다.
PCB
프로세스 전체에 대한 정보를 관리합니다.
프로세스의 상태, 프로세스 ID(PID), 메모리 정보, 열린 파일 정보, 프로그램 카운터, CPU 레지스터 값 등이 저장됩니다.
TCB
스레드 하나에 대한 정보를 관리합니다.
스레드 ID, 스레드 상태, 프로그램 카운터, CPU 레지스터 값, 스택 포인터 같은 정보가 포함됩니다. 스레드는 프로세스 내에서 생성되기 때문에, TCB는 메모리 정보나 파일 정보 같은 것은 따로 갖지 않고,
PCB에 저장된 프로세스의 자원을 공유합니다.
하지만 관리 대상이 다릅니다.
PCB
프로세스 전체에 대한 정보를 관리합니다.
프로세스의 상태, 프로세스 ID(PID), 메모리 정보, 열린 파일 정보, 프로그램 카운터, CPU 레지스터 값 등이 저장됩니다.
TCB
스레드 하나에 대한 정보를 관리합니다.
스레드 ID, 스레드 상태, 프로그램 카운터, CPU 레지스터 값, 스택 포인터 같은 정보가 포함됩니다. 스레드는 프로세스 내에서 생성되기 때문에, TCB는 메모리 정보나 파일 정보 같은 것은 따로 갖지 않고,
PCB에 저장된 프로세스의 자원을 공유합니다.
컨텍스트 스위칭이 무엇인가요?
텍스트 스위칭(Context Switching)
CPU가 현재 실행 중인 프로세스나 스레드의 상태를 저장하고,
다른 프로세스나 스레드의 상태를 복원하여 실행하는 과정을 말합니다.
운영체제는 여러 프로세스를 동시에 실행하는 것처럼 보여야 하기 때문에,
하나의 프로세스를 잠시 멈추고 다른 프로세스를 실행해야 합니다.
이때 각 프로세스의 CPU 상태(Program Counter, 레지스터 값 등)를 PCB나 TCB에 저장하고,
다음에 실행할 프로세스의 상태를 복원하는 작업이 바로 컨텍스트 스위칭입니다.
컨텍스트 스위칭은 멀티태스킹, 멀티프로세싱, 스케줄링을 가능하게 해주는 핵심 메커니즘이지만,
상태 저장과 복원에 시간이 소요되어 오버헤드가 발생할 수 있습니다.
CPU가 현재 실행 중인 프로세스나 스레드의 상태를 저장하고,
다른 프로세스나 스레드의 상태를 복원하여 실행하는 과정을 말합니다.
운영체제는 여러 프로세스를 동시에 실행하는 것처럼 보여야 하기 때문에,
하나의 프로세스를 잠시 멈추고 다른 프로세스를 실행해야 합니다.
이때 각 프로세스의 CPU 상태(Program Counter, 레지스터 값 등)를 PCB나 TCB에 저장하고,
다음에 실행할 프로세스의 상태를 복원하는 작업이 바로 컨텍스트 스위칭입니다.
컨텍스트 스위칭은 멀티태스킹, 멀티프로세싱, 스케줄링을 가능하게 해주는 핵심 메커니즘이지만,
상태 저장과 복원에 시간이 소요되어 오버헤드가 발생할 수 있습니다.
CPU 스케줄링이 무엇인가요?
CPU 스케줄링은 여러 프로세스나 스레드가 CPU 사용을 요청할 때,
어떤 프로세스에 CPU를 할당할지 운영체제가 결정하는 과정을 말합니다.
시스템은 한정된 CPU 자원을 여러 프로세스가 공유해야 하기 때문에,
공정성(Fairness), 효율성(Efficiency), 응답 시간(Response Time), 처리량(Throughput) 같은 목표를 고려해 어떤 프로세스를 우선 실행할지 스케줄링 정책을 적용합니다.
CPU 스케줄링 알고리즘
1. FCFS (First-Come, First-Served): 먼저 온 프로세스부터 순서대로 실행
2. SJF (Shortest Job First): 실행 시간이 짧은 프로세스부터 실행
3. Priority Scheduling: 우선순위가 높은 프로세스부터 실행
4. Round Robin (RR): 모든 프로세스에 정해진 시간만큼 CPU를 번갈아 할당
5. MLFQ (Multi-Level Feedback Queue): 프로세스의 특성에 따라 레벨로 나누어 우선순위를 조정
어떤 프로세스에 CPU를 할당할지 운영체제가 결정하는 과정을 말합니다.
시스템은 한정된 CPU 자원을 여러 프로세스가 공유해야 하기 때문에,
공정성(Fairness), 효율성(Efficiency), 응답 시간(Response Time), 처리량(Throughput) 같은 목표를 고려해 어떤 프로세스를 우선 실행할지 스케줄링 정책을 적용합니다.
CPU 스케줄링 알고리즘
1. FCFS (First-Come, First-Served): 먼저 온 프로세스부터 순서대로 실행
2. SJF (Shortest Job First): 실행 시간이 짧은 프로세스부터 실행
3. Priority Scheduling: 우선순위가 높은 프로세스부터 실행
4. Round Robin (RR): 모든 프로세스에 정해진 시간만큼 CPU를 번갈아 할당
5. MLFQ (Multi-Level Feedback Queue): 프로세스의 특성에 따라 레벨로 나누어 우선순위를 조정
운영체제 에이징(aging) 는 무엇입니까?
에이징(Aging)
우선순위 기반 스케줄링에서 낮은 우선순위를 가진 프로세스가 기아 상태(Starvation)에 빠지는 것을 방지하기 위한 기법입니다.
시스템에서는 우선순위가 높은 프로세스에게 CPU를 먼저 할당합니다.
그런데 우선순위가 낮은 프로세스는 계속 밀려서 실행되지 못하고 대기할 수 있는데, 이를 기아 상태라고 합니다.
에이징은 이런 문제를 해결하기 위해, 오래 기다리는 프로세스의 우선순위를 시간이 지남에 따라 점진적으로 높여주는 방법입니다.
시간이 지나면 기다리던 프로세스가 우선순위가 올라가면서 결국 CPU를 할당받을 수 있게 되어, 기아 상태를 방지할 수 있습니다..
우선순위 기반 스케줄링에서 낮은 우선순위를 가진 프로세스가 기아 상태(Starvation)에 빠지는 것을 방지하기 위한 기법입니다.
시스템에서는 우선순위가 높은 프로세스에게 CPU를 먼저 할당합니다.
그런데 우선순위가 낮은 프로세스는 계속 밀려서 실행되지 못하고 대기할 수 있는데, 이를 기아 상태라고 합니다.
에이징은 이런 문제를 해결하기 위해, 오래 기다리는 프로세스의 우선순위를 시간이 지남에 따라 점진적으로 높여주는 방법입니다.
시간이 지나면 기다리던 프로세스가 우선순위가 올라가면서 결국 CPU를 할당받을 수 있게 되어, 기아 상태를 방지할 수 있습니다..
가상 메모리가 무엇인가요?
가상 메모리(Virtual Memory)
물리적인 메모리(RAM)보다 더 큰 메모리 공간을 사용하는 것처럼 프로그램을 실행할 수 있게 해주는 운영체제 기술입니다.
프로그램은 자신에게 충분한 메모리가 할당된 것처럼 동작하지만, 실제로는 일부만 물리 메모리에 적재되고, 나머지는 디스크(보조 저장장치)에 저장됩니다.
운영체제는 페이지(Page) 단위로 메모리를 관리하면서, 필요한 데이터만 물리 메모리로 불러오고,
필요 없는 데이터는 디스크에 스와핑(Swapping)해 저장합니다.
가상 메모리를 통해 얻을 수 있는 이점
1. 프로그램 크기 제한 완화 (RAM보다 큰 프로그램도 실행 가능)
2. 메모리 보호 (프로세스끼리 서로의 메모리를 침범하는 것을 방지)
3. 효율적인 메모리 사용 (실제로 필요한 부분만 메모리에 적재)
물리적인 메모리(RAM)보다 더 큰 메모리 공간을 사용하는 것처럼 프로그램을 실행할 수 있게 해주는 운영체제 기술입니다.
프로그램은 자신에게 충분한 메모리가 할당된 것처럼 동작하지만, 실제로는 일부만 물리 메모리에 적재되고, 나머지는 디스크(보조 저장장치)에 저장됩니다.
운영체제는 페이지(Page) 단위로 메모리를 관리하면서, 필요한 데이터만 물리 메모리로 불러오고,
필요 없는 데이터는 디스크에 스와핑(Swapping)해 저장합니다.
가상 메모리를 통해 얻을 수 있는 이점
1. 프로그램 크기 제한 완화 (RAM보다 큰 프로그램도 실행 가능)
2. 메모리 보호 (프로세스끼리 서로의 메모리를 침범하는 것을 방지)
3. 효율적인 메모리 사용 (실제로 필요한 부분만 메모리에 적재)
페이징 기법에 대해서 설명해주세요
페이징(Paging)
가상 메모리와 물리 메모리를 같은 크기의 고정된 블록 단위로 나누어 관리하는 메모리 관리 기법입니다.
가상 메모리는 페이지(Page) 라는 작은 단위로 나뉘고,
물리 메모리는 프레임(Frame) 이라는 같은 크기의 단위로 나뉩니다.
프로그램이 실행될 때 운영체제는 필요한 페이지를 프레임에 적재하고,
페이지와 프레임 간의 매핑 정보는 페이지 테이블(Page Table) 에 저장됩니다.
페이징 기법을 사용하면, 연속된 물리 메모리 공간을 확보할 필요가 없어 메모리 단편화(Fragmentation) 문제를 줄일 수 있습니다.
또한, 프로그램 전체를 메모리에 올릴 필요 없이 필요한 부분만 적재할 수 있어 메모리 효율성이 향상됩니다.
다만, 페이지가 메모리에 없는 경우(페이지 폴트)에는 디스크에서 페이지를 가져오는 추가 작업이 필요해 성능 저하가 발생할 수 있습니다.
가상 메모리와 물리 메모리를 같은 크기의 고정된 블록 단위로 나누어 관리하는 메모리 관리 기법입니다.
가상 메모리는 페이지(Page) 라는 작은 단위로 나뉘고,
물리 메모리는 프레임(Frame) 이라는 같은 크기의 단위로 나뉩니다.
프로그램이 실행될 때 운영체제는 필요한 페이지를 프레임에 적재하고,
페이지와 프레임 간의 매핑 정보는 페이지 테이블(Page Table) 에 저장됩니다.
페이징 기법을 사용하면, 연속된 물리 메모리 공간을 확보할 필요가 없어 메모리 단편화(Fragmentation) 문제를 줄일 수 있습니다.
또한, 프로그램 전체를 메모리에 올릴 필요 없이 필요한 부분만 적재할 수 있어 메모리 효율성이 향상됩니다.
다만, 페이지가 메모리에 없는 경우(페이지 폴트)에는 디스크에서 페이지를 가져오는 추가 작업이 필요해 성능 저하가 발생할 수 있습니다.
페이징의 장점과 단점을 설명해주세요.
페이징(Paging)은 메모리를 고정 크기의 블록으로 나누어 관리하는 방식입니다.
장점
1. 외부 단편화(External Fragmentation) 해결
물리 메모리가 고정 크기의 프레임 단위로 할당되기 때문에, 남는 공간 없이 효율적으로 메모리를 사용할 수 있습니다.
2. 프로세스 연속성 필요 없음
가상 메모리 상에서는 연속된 공간이 필요해도, 실제 물리 메모리에서는 떨어진 프레임에 페이지를 할당할 수 있습니다.
3. 가상 메모리 구현에 유리
필요한 페이지만 메모리에 올리고 나머지는 디스크에 둘 수 있어, 물리 메모리보다 큰 프로그램도 실행할 수 있습니다.
단점
1. 내부 단편화(Internal Fragmentation)
마지막 프레임에 프로세스 데이터가 다 채워지지 않을 경우, 남은 공간이 낭비될 수 있습니다.
2. 페이지 테이블 관리 오버헤드
페이지-프레임 매핑 정보를 관리하기 위해 별도의 페이지 테이블이 필요하고, 이 테이블 자체가 추가 메모리를 소모합니다.
3. 페이지 폴트(Page Fault) 발생 가능성
장점
1. 외부 단편화(External Fragmentation) 해결
물리 메모리가 고정 크기의 프레임 단위로 할당되기 때문에, 남는 공간 없이 효율적으로 메모리를 사용할 수 있습니다.
2. 프로세스 연속성 필요 없음
가상 메모리 상에서는 연속된 공간이 필요해도, 실제 물리 메모리에서는 떨어진 프레임에 페이지를 할당할 수 있습니다.
3. 가상 메모리 구현에 유리
필요한 페이지만 메모리에 올리고 나머지는 디스크에 둘 수 있어, 물리 메모리보다 큰 프로그램도 실행할 수 있습니다.
단점
1. 내부 단편화(Internal Fragmentation)
마지막 프레임에 프로세스 데이터가 다 채워지지 않을 경우, 남은 공간이 낭비될 수 있습니다.
2. 페이지 테이블 관리 오버헤드
페이지-프레임 매핑 정보를 관리하기 위해 별도의 페이지 테이블이 필요하고, 이 테이블 자체가 추가 메모리를 소모합니다.
3. 페이지 폴트(Page Fault) 발생 가능성
내부 단편화와 외부단편화가 무엇인가요?
내부 단편화와 외부 단편화는 모두 메모리 낭비 현상
내부 단편화 (Internal Fragmentation)
메모리를 고정 크기로 할당할 때, 할당받은 공간보다 실제로 사용하는 공간이 작아서 남는 부분이 낭비되는 현상입니다.
예를 들어, 4KB 프레임을 할당했는데 실제 데이터가 3.2KB만 쓴다면, 나머지 0.8KB가 낭비됩니다.
외부 단편화 (External Fragmentation)
메모리를 가변 크기로 할당할 때, 전체 메모리 공간은 충분하지만, 연속된 큰 블록이 부족해서 할당할 수 없는 현상입니다.
예를 들어, 메모리 여기저기에 작은 빈 공간들이 흩어져 있어, 큰 프로세스를 올릴 수 없는 상황입니다.
내부 단편화 (Internal Fragmentation)
메모리를 고정 크기로 할당할 때, 할당받은 공간보다 실제로 사용하는 공간이 작아서 남는 부분이 낭비되는 현상입니다.
예를 들어, 4KB 프레임을 할당했는데 실제 데이터가 3.2KB만 쓴다면, 나머지 0.8KB가 낭비됩니다.
외부 단편화 (External Fragmentation)
메모리를 가변 크기로 할당할 때, 전체 메모리 공간은 충분하지만, 연속된 큰 블록이 부족해서 할당할 수 없는 현상입니다.
예를 들어, 메모리 여기저기에 작은 빈 공간들이 흩어져 있어, 큰 프로세스를 올릴 수 없는 상황입니다.
페이지 폴트가 무엇인가요?
페이지 폴트(Page Fault)는 프로그램이 접근하려는 페이지가 물리 메모리(RAM)에 없는 경우 발생하는 예외 상황입니다.
가상 메모리 시스템에서는 프로그램이 모든 데이터를 한 번에 메모리에 올리지 않고, 필요한 데이터만 페이지 단위로 가져옵니다.
CPU가 참조하려는 주소의 페이지가 메모리에 없는 경우, 운영체제는 페이지 폴트 예외를 발생시킵니다.
이때 운영체제는 다음과 같은 과정을 거칩니다:
디스크(보조 저장장치)에서 해당 페이지를 찾아 메모리로 가져옵니다.
페이지 테이블을 업데이트하여 새로운 매핑을 등록합니다.
다시 CPU가 명령어를 재실행하여 정상적으로 프로그램을 이어갑니다.
페이지 폴트는 정상적인 가상 메모리 동작 과정 중 하나이지만,
너무 자주 발생하면 디스크 I/O 비용이 커져서 성능 저하가 심각해질 수 있습니다.
가상 메모리 시스템에서는 프로그램이 모든 데이터를 한 번에 메모리에 올리지 않고, 필요한 데이터만 페이지 단위로 가져옵니다.
CPU가 참조하려는 주소의 페이지가 메모리에 없는 경우, 운영체제는 페이지 폴트 예외를 발생시킵니다.
이때 운영체제는 다음과 같은 과정을 거칩니다:
디스크(보조 저장장치)에서 해당 페이지를 찾아 메모리로 가져옵니다.
페이지 테이블을 업데이트하여 새로운 매핑을 등록합니다.
다시 CPU가 명령어를 재실행하여 정상적으로 프로그램을 이어갑니다.
페이지 폴트는 정상적인 가상 메모리 동작 과정 중 하나이지만,
너무 자주 발생하면 디스크 I/O 비용이 커져서 성능 저하가 심각해질 수 있습니다.
페이지 교체 알고리즘이 무엇인가요?
페이지 교체 알고리즘(Page Replacement Algorithm)
메모리에 빈 프레임이 없을 때, 어떤 페이지를 제거하고 새로운 페이지를 적재할지 결정하는 방식입니다.
가상 메모리 시스템에서는 한 번에 모든 페이지를 메모리에 올릴 수 없기 때문에,
새로운 페이지를 불러와야 하는데 공간이 부족하면 기존에 있던 페이지 중 하나를 교체해야 합니다.
이때 운영체제는 교체할 페이지를 선택하기 위해 여러 가지 알고리즘을 사용합니다.
페이지 교체 알고리즘 종류
FIFO (First-In, First-Out): 가장 먼저 들어온 페이지를 가장 먼저 제거합니다.
LRU (Least Recently Used): 가장 오랫동안 사용되지 않은 페이지를 제거합니다.
Optimal (OPT): 앞으로 가장 오랫동안 사용되지 않을 페이지를 제거합니다.
LFU (Least Frequently Used): 사용 빈도가 가장 낮은 페이지를 제거합니다.
메모리에 빈 프레임이 없을 때, 어떤 페이지를 제거하고 새로운 페이지를 적재할지 결정하는 방식입니다.
가상 메모리 시스템에서는 한 번에 모든 페이지를 메모리에 올릴 수 없기 때문에,
새로운 페이지를 불러와야 하는데 공간이 부족하면 기존에 있던 페이지 중 하나를 교체해야 합니다.
이때 운영체제는 교체할 페이지를 선택하기 위해 여러 가지 알고리즘을 사용합니다.
페이지 교체 알고리즘 종류
FIFO (First-In, First-Out): 가장 먼저 들어온 페이지를 가장 먼저 제거합니다.
LRU (Least Recently Used): 가장 오랫동안 사용되지 않은 페이지를 제거합니다.
Optimal (OPT): 앞으로 가장 오랫동안 사용되지 않을 페이지를 제거합니다.
LFU (Least Frequently Used): 사용 빈도가 가장 낮은 페이지를 제거합니다.
세그먼테이션은 무엇인가요?
세그먼테이션(Segmentation)
메모리를 고정된 크기가 아닌, 의미 있는 논리적 단위(세그먼트)로 나누어 관리하는 메모리 관리 기법입니다.
프로그램은 코드, 데이터, 스택 등으로 구성되는데, 세그먼테이션은 이러한 구성 요소를 각각 별도의 세그먼트로 나누어 관리합니다.
예를 들어, 코드 세그먼트, 데이터 세그먼트, 스택 세그먼트가 각각 별도의 영역을 갖게 됩니다.
세그먼트는 각각 크기가 다를 수 있으며, 세그먼트마다 세그먼트 번호(segment number) 와 오프셋(offset) 으로 접근합니다.
세그먼테이션의 장점은 프로그램 구조에 맞춰 메모리를 관리할 수 있다는 점입니다.
하지만, 크기가 다양한 세그먼트들을 메모리에 배치하다 보면 외부 단편화(External Fragmentation) 가 발생할 수 있습니다.
메모리를 고정된 크기가 아닌, 의미 있는 논리적 단위(세그먼트)로 나누어 관리하는 메모리 관리 기법입니다.
프로그램은 코드, 데이터, 스택 등으로 구성되는데, 세그먼테이션은 이러한 구성 요소를 각각 별도의 세그먼트로 나누어 관리합니다.
예를 들어, 코드 세그먼트, 데이터 세그먼트, 스택 세그먼트가 각각 별도의 영역을 갖게 됩니다.
세그먼트는 각각 크기가 다를 수 있으며, 세그먼트마다 세그먼트 번호(segment number) 와 오프셋(offset) 으로 접근합니다.
세그먼테이션의 장점은 프로그램 구조에 맞춰 메모리를 관리할 수 있다는 점입니다.
하지만, 크기가 다양한 세그먼트들을 메모리에 배치하다 보면 외부 단편화(External Fragmentation) 가 발생할 수 있습니다.
멀티 프로세싱, 멀티 프로그래밍, 멀티 태스킹의 차이점을 설명해주세요.
멀티프로세싱(Multiprocessing)
여러 개의 CPU(코어) 를 이용해 여러 작업을 물리적으로 동시에 수행하는 방식입니다.
예를 들어, 쿼드코어 CPU에서는 네 개의 프로세스가 진짜 동시에 실행될 수 있습니다.
멀티프로그래밍(Multiprogramming)
메모리에 여러 개의 프로그램을 동시에 올려두고, CPU가 하나라도 쉬지 않고 작업을 번갈아 가며 실행하는 방식입니다.
즉, 하나의 CPU를 여러 프로그램이 효율적으로 나누어 사용하는 구조입니다. (CPU 중심 관점)
멀티태스킹(Multitasking)
사용자 입장에서 여러 작업이 동시에 실행되는 것처럼 보이게 하는 방식입니다.
실제로는 운영체제가 아주 빠르게 CPU를 번갈아 할당해서, 사용자가 체감하기에 여러 프로그램이 동시에 돌아가는 것처럼 느껴집니다. (사용자 중심 관점)
여러 개의 CPU(코어) 를 이용해 여러 작업을 물리적으로 동시에 수행하는 방식입니다.
예를 들어, 쿼드코어 CPU에서는 네 개의 프로세스가 진짜 동시에 실행될 수 있습니다.
멀티프로그래밍(Multiprogramming)
메모리에 여러 개의 프로그램을 동시에 올려두고, CPU가 하나라도 쉬지 않고 작업을 번갈아 가며 실행하는 방식입니다.
즉, 하나의 CPU를 여러 프로그램이 효율적으로 나누어 사용하는 구조입니다. (CPU 중심 관점)
멀티태스킹(Multitasking)
사용자 입장에서 여러 작업이 동시에 실행되는 것처럼 보이게 하는 방식입니다.
실제로는 운영체제가 아주 빠르게 CPU를 번갈아 할당해서, 사용자가 체감하기에 여러 프로그램이 동시에 돌아가는 것처럼 느껴집니다. (사용자 중심 관점)
*요약
멀티프로세싱은 CPU 여러 개를 쓰는 것,
멀티프로그래밍은 CPU 하나가 여러 프로그램을 번갈아 실행하는 것,
멀티태스킹은 사용자 체감상 여러 작업이 동시에 되는 것입니다.
멀티프로세싱은 CPU 여러 개를 쓰는 것,
멀티프로그래밍은 CPU 하나가 여러 프로그램을 번갈아 실행하는 것,
멀티태스킹은 사용자 체감상 여러 작업이 동시에 되는 것입니다.
'Interview' 카테고리의 다른 글
개발자 기술면접 대비 - SPRING (0) | 2025.04.16 |
---|---|
개발자 기술면접 대비 - DB (0) | 2025.04.12 |
개발자 기술면접 대비 - 네트워크 (0) | 2025.04.11 |
개발자 기술면접 대비 - 보안 (0) | 2025.04.11 |
개발자 기술면접 대비 - JAVA (0) | 2025.04.10 |