운영체제(OS) 정리 🖥️
운영체제는 사용자가 편리하게 컴퓨터를 사용할 수 있도록 소프트웨어를 관리하고, 하드웨어 자원을 효율적으로 배분·제어해 주는 핵심 소프트웨어입니다.
📦 펌웨어(Firmware)
- 하드웨어와 소프트웨어의 중간에 위치한 저수준 소프트웨어
- ROM/EEPROM/Flash 등에 저장되어 전원이 꺼져도 유지
- 일반적으로 추가 애플리케이션 설치 불가
- 예시:
- PC의 BIOS/UEFI
- 라우터·프린터 펌웨어
- IoT 기기 센서 제어 로직
🎯 운영체제의 주요 역할
- CPU 스케줄링 & 프로세스 관리
- CPU 소유권 분배, 프로세스 생애주기(생성 ▶ 실행 ▶ 대기 ▶ 종료)
- 메모리 관리
- 디스크·파일 시스템 관리
- I/O 디바이스 관리
- 마우스·키보드·프린터 등 장치 제어, 드라이버 인터페이스 제공
🏗️ 운영체제 구조
사용자 프로그램
├── GUI / CLI
├── 시스템 콜 인터페이스 (Trap)
└── 커널
├── 프로세스 스케줄러
├── 메모리 매니저
├── 파일 시스템
├── 네트워크 스택
└── 디바이스 드라이버
├── 디스크 드라이버
├── 네트워크 카드 드라이버
└── 기타 I/O 컨트롤러
하드웨어
- 시스템 콜: 유저 모드 ↔ 커널 모드 전환을 통해 OS 서비스 요청
- 드라이버: 하드웨어 제어용 소프트웨어 (예: 디스크 드라이버는 블록 입출력을, 네트워크 드라이버는 패킷 송수신을 담당)
🔄 시스템 콜 원리
- 유저 모드에서 I/O 요청 (e.g.
read()
, write()
)
- 트랩(trap) 발생 → 커널 모드 전환
- 시스템 콜 번호/인자 검증 & 핸들러 호출
- 커널 내부에서 실제 작업 수행 (파일 읽기, 메모리 할당 등)
- 커널 모드 → 유저 모드 복귀
- 결과 반환 후 프로그램 로직 계속 실행
포인트: 시스템 콜은 모드 전환(mode switch) 이며, 프로세스 간 컨텍스트 스위칭과는 다릅니다.
💻 컴퓨터의 구성 요소
- CPU
- 제어장치(CU), 산술논리연산장치(ALU), 레지스터
- 명령어 실행의 중심
- DMA 컨트롤러
- I/O 장치가 메모리에 직접 접근하도록 지원
- CPU 부담 경감, 대용량 데이터 전송 최적화
- 타이머
- 타임 슬라이스 제어, 프로세스 선점(preemption) 트리거
- 디바이스 컨트롤러
- 메모리 & 저장장치
⚙️ CPU 연산 처리 과정 (간단 요약)
- Fetch: 메모리에서 명령어 & 데이터 로드
- Execute: 레지스터의 피연산자를 ALU가 연산
- Write Back: 연산 결과를 레지스터(혹은 메모리)에 저장
연산 결과를 레지스터에 저장하면 다음 연산을 빠르게 수행할 수 있고, 메모리에 저장하면 프로그램 상태를 유지합니다.
🛎️ 인터럽트 & 장치 제어
- 인터럽트(Interrupt): 외부 이벤트(키보드, 타이머 등) 발생 시 CPU에 알림
- 하드웨어 인터럽트: I/O 장치 신호
- 소프트웨어 인터럽트(Trap): 시스템 콜, 예외 상황
- DMA: CPU 개입 없이 메모리 ↔ I/O 전송
- 타이머: 프로세스 실행 시간 제한, 선점형 스케줄링 지원
- 디바이스 컨트롤러: 각 장치별 명령 해석·제어·인터럽트 발생
🧠 메모리 구조 및 관리
메모리 계층
레지스터 (가장 빠름, 작음)
↓
캐시 L1 → L2 → L3
↓
메인 메모리 (RAM)
- DRAM은 옛날 방식, 요즘은 발전된 DDR4SDRAM 사용
↓
보조 기억장치 (SSD/HDD, 비휘발성)
캐시(Cache)
- 임시 저장소로 메모리 병목 해소
- 지역성(Locality) 활용
- ⏱️ 시간 지역성: 최근에 사용한 데이터를 곧 재사용
- 📍 공간 지역성: 인접 데이터 접근
- 히트/미스
- 히트: 캐시에서 즉시 반환
- 미스: 다음 레벨(다음 캐시 ▶ 메모리) 접근
캐시 매핑 방식
방식 | 특징 | 장점 | 단점 |
---|
직접 매핑 | 블록 → 특정 라인 | 구현 단순·속도 빠름 | 충돌↑ |
전 연관 매핑 | 블록 → 아무 라인 | 충돌 거의 없음 | 비용(비교 회로)↑ |
집합 연관 매핑 | 세트 내 k‑way | 절충안 | k 설정 민감 |
가상 메모리(Virtual Memory)
- 한정된 물리 메모리를 추상화해 “매우 큰” 메모리처럼 사용
- 가상 주소(VA) → 물리 주소(PA) 변환: MMU + 페이지 테이블
- TLB: VA→PA 매핑 캐시
메모리 접근 순서
- VA 생성 → TLB 조회 (히트/미스)
- PA 획득 → 캐시 조회 (L1→L2→L3)
- 캐시 미스 → 메인 메모리(DRAM) 접근
- (페이지 폴트 시) 디스크 스왑인 → 테이블/TLB 갱신 → 재실행
- 데이터 반환
스레싱(Thrashing)
- 페이지 폴트 과다 → 스왑 반복 → CPU 유휴↑ → 더 많은 프로세스 할당 → 악순환
- 해결책
- 💾 물리 메모리 확장 / SSD 사용
- 🔄 Working Set: 지역성 기반으로 “필요 페이지 집합” 유지
- 📈 PFF(Page Fault Frequency): 페이지 폴트 상·하한 기준으로 프레임 동적 조정
📂 메모리 할당
연속 할당 (Contiguous)
- 고정 분할(Fixed Partitioning)
- 미리 정해진 크기 파티션에 프로세스 통째로 할당
- 내부 단편화 발생
- 가변 분할(Dynamic Partitioning)
- 빈 영역(hole)에 프로세스 크기만큼 동적 할당
- 외부 단편화 발생
- 할당 전략: First‑Fit, Best‑Fit, Worst‑Fit
불연속 할당 (Non‑Contiguous)
- 페이징(Paging)
- 프로세스 → 페이지, 메모리 → 프레임 (고정 크기)
- 내부 단편화 발생
- 세그멘테이션(Segmentation)
- 논리 단위(코드·데이터·스택)로 분할 (가변 크기)
- 외부 단편화 발생
- 세그먼테이션+페이징: 두 방식 결합
🔄 페이지 교체 알고리즘
- FIFO: 가장 먼저 들어온 페이지 교체
- LRU (Least Recently Used): 가장 오랫동안 사용되지 않은 페이지 교체
- LFU (Least Frequently Used): 사용 빈도 최소 페이지 교체
- NUR (Not Used Recently): 최근 사용 여부 비트 활용