10-11주차 개념 정리
아래의 내용을 코드 블럭 우측 상단의 Copy 버튼을 눌러 복사한 뒤, 퀴즈 로봇(신명훈 학우 제작)의 프롬프트에 붙여넣기하면 핵심 개념들에 대한 퀴즈를 풀어볼 수 있습니다.
□ MLFQS
■ MLFQS 개념
사용자 프로그램의 특성을 파악하여 동적으로 우선순위를 조정하는 다단계 피드백 큐 스케줄러.
과도하게 CPU를 사용한 프로세스는 낮은 우선순위 큐로, 적게 사용한 프로세스는 높은 우선순위 큐로 이동해 공정성을 보장
■ MLFQS 동작방식
1. 새로운 프로세스는 최상위 큐에서 시작
2. 할당 시간보다 빨리 종료되면 높은 우선순위 큐 유지
3. 시간 할당을 초과하면 낮은 우선순위 큐로 이동
4. 오랫동안 CPU를 얻지 못한 프로세스는 다시 상위 큐로 이동시켜 기아 상태(Starvation)를 방지
■ MLFQS 특징
• 여러 개의 우선순위 큐
○ 각 큐는 서로 다른 우선순위와 정책을 가짐
○ 위쪽 큐일수록 높은 우선순위
○ 큐 간에 이동이 가능
• 높은 우선순위 큐일수록 할당 시간이 작음
• CPU를 오래 사용하는 프로세스는 강등, 입출력 위주 프로세스는 상위 큐를 유지 또는 승급
■ MLFQS의 장점과 단점
▶ 장점
• 다양한 프로세스 특성에 대응이 가능
• 반응성이 뛰어남
• 자동으로 CPU-bound와 I/O-bound를 판단
▶ 단점
• 구현이 복잡함
• 정책 설계 실패 시 성능이 저하될 수 있음
• 과도한 피드백은 비효율적일 수 있음
■ MLFQS 우선순위 반영 요소
• recent_cpu (최근 CPU 사용량)
○ 값이 높을수록 우선순위 하락
• load_avg (시스템 평균 부하)
○ 값이 높을수록 전체 프로세스 우선순위 하락
• nice (양보 정도)
○ 값이 높을수록 우선순위 하락
■ Round Robin와 MLFQS의 차이점
• Round-Robin은 단순하게 모든 프로세스에 동일한 시간을 할당하며, 우선순위 개념이 없음
○ 한 프로세스가 너무 오래 CPU를 연속적으로 쓰는 것을 방지
○ Ready Queue에 계속 등록되면 우선순위 제한 없이 CPU를 반복해서 획득할 수 있어, CPU 독점 완전 방지 불가
• MLFQS는 최근 CPU 사용량을 반영해 조정된 프로세스 우선순위에 따라 CPU를 할당
○ CPU 사용량에 비례한 우선순위 조정으로 프로세스 간의 공정성을 확보
○ 구현이 복잡하고 계산 오버헤드가 큼
────────────────────────────────────────────────────────────────────────────────────────────────────
□ User mode vs Kernel mode
▶ User Mode (유저 모드)
응용 프로그램이나 사용자 프로세스가 동작하는 제한된 권한의 모드
• 시스템 자원(하드웨어, 메모리 등)에 직접 접근 불가
• 시스템 자원 접근은 시스템 콜을 통해서만 가능
• 안전성과 보안을 위해 제한된 환경을 제공
▶ Kernel mode (커널 모드)
운영체제의 핵심 기능이 실행되는 특권 모드
• 시스템 자원에 직접 접근 가능
• 하드웨어 관리, 메모리 관리, 프로세스 스케줄링 등 핵심 작업 수행
• 잘못된 코드나 버그 발생 시 시스템 전체에 영향을 미칠 수 있는 위험 존재
────────────────────────────────────────────────────────────────────────────────────────────────────
□ Register vs Memory
▶ Register (레지스터)
CPU 내부에 있는 작고 빠른 저장장치. 데이터를 일시적으로 저장하고 처리하는 데 사용
• 매우 빠른 대신, 매우 작다
• 비용이 비싸다
• 직접 접근 방식 (Direct Access)
▶ Memory (메모리)
CPU 외부에 위치하며, 실행 중인 프로그램 및 데이터를 일시적으로 저장하는 장치
• 상대적으로 느린 대신, 상대적으로 더 크다
• 비용이 상대적으로 저렴하다
• 주소 기반 접근 방식 (Address-based)
────────────────────────────────────────────────────────────────────────────────────────────────────
□ User Stack (사용자 스택)
운영체제가 관리하는 메모리 영역 중 하나로, 각 프로세스마다 독립적으로 할당되는 공간.
주로 프로그램이 사용자 모드(User Mode)에서 동작할 때 사용된다.
▶ User Stack의 주요 역할
• 함수 호출 관리(복귀 주소, 매개 변수 저장 등)
• 지역 변수 관리
• 임시 데이터 저장(연산 등)
▶ User Stack의 특징
• LIFO 구조
• 크기가 제한적이며, 공간 초과 시 Stack Overflow 오류 발생
• 높은 메모리 주소에서 낮은 메모리 주소 방향으로 확장
────────────────────────────────────────────────────────────────────────────────────────────────────
□ System Call
사용자 프로세스가 파일 입출력, 프로세스 제어, 메모리 관리 등
운영체제가 제공하는 커널 수준의 서비스에 접근하기 위해 사용하는 공식적인 인터페이스
▶ Syscall의 동작 흐름
1. 사용자 모드에서 요청
2. 커널 모드 진입
3. 요청 처리
4. 처리 결과 반환 및 사용자 모드 복귀
▶ Syscall의 필요성
• 보안성: 사용자 프로세스가 임의로 하드웨어를 조작하는 것을 방지
• 안전성: 하나의 프로세스 오류가 전체 시스템에 영향을 주지 않도록 보호
• 일관성: 모든 프로세스가 동일한 인터페이스를 통해 자원을 사용하게끔 만듦
────────────────────────────────────────────────────────────────────────────────────────────────────
□ File Descriptor
운영체제가 관리하는 정수 형태의 고유 식별자로, 열린 파일이나 입출력 스트림을 식별하는데 사용된다
▶ File Descriptor의 특징
• 정수형 식별자
○ 0 이상의 정수이며, 파일이나 스트림과 연결됨
• 운영체제 관리
○ 각 프로세스는 독립적인 파일 디스크립터 테이블을 가지며, 이를 통해 자원을 관리
• 기본 디스크립터
○ 모든 프로세스는 기본적으로 표준 입력(0), 표준 출력(1), 표준 에러(2)를 가짐
────────────────────────────────────────────────────────────────────────────────────────────────────
□ Cache (캐시)
컴퓨터 시스템에서 자주 접근하는 데이터에 대해,
'빠르게 접근 가능한 임시 저장소'에 보관하여 성능을 향상시키는 메모리 기술.
▶ Cache의 필요성
메인 메모리(RAM)는 CPU에 비해 상대적으로 매우 느리기 때문에, CPU-메모리 간 속도 차이를 줄이기 위해 사용
▶ Cache의 동작 원리
• 지역성(Locality): CPU가 짧은 시간 동안 동일한 메모리 위치 집합에 반복적으로 접근하는 경향
○ 시간적 지역성: 최근 접근한 데이터를 다시 접근할 가능성이 높은 경향
○ 공간적 지역성: 접근한 데이터 근처에 있는 데이터가 연속적으로 접근될 가능성이 높은 경향
────────────────────────────────────────────────────────────────────────────────────────────────────
□ Atomic Operation (원자적 연산)
실행 도중 중단되거나 다른 작업에 의해 방해받지 않고 한 번에 완전하게 수행되는 일련의 연산.
즉, 중간에 중단되지 않고 전부 성공하거나 전혀 수행되지 않음.
▶ Atomic Operation의 필요성
• Race Condition(경쟁 상태) 방지
• 데이터 일관성 보장
────────────────────────────────────────────────────────────────────────────────────────────────────
□ rax register
x86-64에서 사용하는 주요 범용 레지스터 중 하나로, 과거부터 지금까지 연산을 담당해온 레지스터의 진화된 형태
▶ rax register의 특징
• 범용 레지스터: 다양한 연산과 데이터의 임시 저장 용도로 사용
• 함수 반환값 저장
• 곱셈/나눗셈 연산의 특수 레지스터: 중간 연산 값 또는 결과값을 저장
────────────────────────────────────────────────────────────────────────────────────────────────────
□ 32 bit OS (x86) vs 64 bit OS (x86-64)
CPU의 레지스터 크기를 기반으로 나눠지는 운영체제 종류
■ 주요 차이점
• 메모리 접근 범위
○ 32비트 OS는 RAM을 최대 4GB까지만 인식 가능
○ 64비트 OS는 대용량 메모리도 인식이 가능해 고사양 작업, 서버에 유리
• 프로세스 명령어 셋
○ 64비트 OS는 더 많은 레지스터와 향상된 연산 능력 제공
• 소프트웨어 호환성
○ 32비트 OS에서는 64비트 프로그램 실행 불가능
○ 64비트 OS에서는 대부분의 32비트 프로그램 실행 가능
• 성능
○ 일반적인 사용에는 큰 차이가 없음
○ 다만 과학 계산, 대규모 데이터 처리 등에서는 64비트가 유리
────────────────────────────────────────────────────────────────────────────────────────────────────
□ Interrupt
CPU가 프로그램을 실행하는 도중, 내부에서 발생하는 긴급한 처리 요청에 의해 현재 작업을 잠시 중단하고
우선 처리해야 하는 작업을 처리한 후 원래 작업으로 복귀하는 메커니즘
▶ Interrupt의 필요성
• I/O작업 등 대기 시간이 긴 작업에 대한 알림 역할
• CPU가 특정 작업의 완료를 기다리지 않고 다른 작업을 계속할 수 있게 만듦
○ 효율적인 CPU 자원 활용 가능
○ 시스템 반응성 향상
▶ Interrupt의 유형
• 하드웨어 인터럽트
○ 외부 장치(키보드, 마우스)에 의해 비동기적으로 발생
• 소프트웨어 인터럽트
○ 프로그램 내부에서 명시적으로 호출하여 동기적으로 발생
○ 대표적으로 System Call이 있음
• 예외(Exception)
○ 프로그램 실행 중 오류(0으로 나누기, 잘못된 메모리 접근 등)로 인해 동기적으로 발생
○ 대표적으로 Trap(예측 가능한 예외), Fault(복구 가능한 예외), Abort(복구 불가능한 예외) 등이 있음
────────────────────────────────────────────────────────────────────────────────────────────────────
□ Segmentation Fault
프로그램이 운영체제가 허용하지 않은 메모리 주소 영역에 접근하려고 시도할 때, 강제로 해당 프로그램을 종료시키는 오류.
▶ Segfault의 주요 원인
• NULL 또는 초기화되지 않은 포인터 역참조
• 허용된 범위를 벗어난 배열이나 메모리 영역 접근
• 이미 해제된 메모리 접근(dangling pointer)
• 읽기 전용 영역 변경 시도
'크래프톤 정글 > CS기초(키워드, 개념정리)' 카테고리의 다른 글
[CS기초] 가상 메모리 시스템의 기본 구조 (Virtual Memory, Page Table, TLB) (0) | 2025.06.09 |
---|---|
[중간정리] 10-11주차: 커널모드/사용자모드, 컨텍스트 스위칭, fsync, MLFQS (0) | 2025.05.28 |
[CS기초] Segmentation Fault 핵심 정리 (1) | 2025.05.18 |
[CS기초] Interrupt란 무엇인가? (0) | 2025.05.18 |
[CS기초] rax Register 핵심 개념 정리 (0) | 2025.05.18 |