1. 가상 메모리 & 페이징
- 개념
- 가상 메모리(Virtual Memory): 프로세스마다 독립된 주소 공간 제공
- 페이징(Paging): 물리 메모리를 고정 크기 페이지(frames)로, 가상 주소를 동일 크기 페이지로 쪼개 매핑
- 동작 원리
- CPU가 가상 주소 사용 → MMU가 페이지 번호와 오프셋으로 분리
- 페이지 테이블로 물리 주소 조회 → 없으면 페이지 폴트(page fault)
- OS가 디스크에서 해당 페이지 로드
- 장·단점
- 장점: 프로세스 격리, 메모리 오버커밋 가능
- 단점: 페이지 테이블 메모리 오버헤드, 페이지 폴트 시 성능 저하
- 면접 포인트
- Q1. TLB(Translation Lookaside Buffer)가 뭐고 왜 중요한가?
- TLB는 주소 변환 속도를 높이기 위한 캐시로, 최근에 사용된 가상→물리 페이지 매핑 정보를 저장합니다.
- 페이지 테이블을 매번 메모리에서 읽지 않고 TLB 히트 시 즉시 물리 주소를 얻어 성능을 크게 향상시킵니다.
- Q2. 페이지 교체 알고리즘 중 LRU와 FIFO의 차이는?
- FIFO: 가장 오래된 페이지를 교체 → 구현 간단하지만, Belady’s anomaly(교체 효율 저하)가 발생할 수 있음
- LRU: 가장 오래 사용되지 않은 페이지를 교체 → 실제 접근 패턴에 더 적합하나, 구현 오버헤드(스택/참조 비트) 있음
- Q1. TLB(Translation Lookaside Buffer)가 뭐고 왜 중요한가?
2. 동적 메모리 할당 (힙, sbrk, malloc, free)
- 개념
- 프로세스 실행 중 크기 변화가 필요한 메모리를 힙(heap)에서 요청/반환
- 기본 함수
- sbrk() / brk() : 힙 영역의 끝(brk point) 이동
- malloc(size) : 내부적으로 sbrk 혹은 mmap 호출
- free(ptr) : 메모리 블록을 가용 리스트에 반환
- 동작 흐름
- malloc → 요청 크기 정렬(alignment) → 가용 리스트 검색 → 없으면 sbrk 호출 → 블록 반환
- free → 블록 헤더/푸터에 언할로크 표시 → 인접 블록과 합치기(coalesce)
- 면접 포인트
- Q1. 왜 malloc 후에는 반드시 free 해야 하나?
- free를 하지 않으면 힙 메모리가 반환되지 않아 메모리 누수가 발생합니다.
- 메모리 누수란 :: 프로그램이 동적으로 할당한 메모리를 더 이상 사용하지 않음에도 불구하고 해제(free)를 하지 않아, 사용 가능한 힙 공간이 점점 줄어드는 현상.
- 장시간 실행되는 서버나 임베디드 환경에서는 치명적 성능 저하를 초래합니다.
- free를 하지 않으면 힙 메모리가 반환되지 않아 메모리 누수가 발생합니다.
- Q2. calloc과 realloc은 내부적으로 어떻게 동작하나?
- calloc(n, size) = malloc(n*size) + 메모리 0으로 초기화(memset).
- realloc(ptr, new_size) = 새 크기 블록 malloc, 기존 데이터 memcpy, 기존 블록 free.
- Q1. 왜 malloc 후에는 반드시 free 해야 하나?
3. 메모리 단편화
- 내부 단편화(Internal Fragmentation)
- 할당 블록이 요청보다 커서 남는 공간
- 외부 단편화(External Fragmentation)
- 충분한 총 여유 공간이 있지만, 연속된 큰 블록이 없어 요청을 못 맞춤
- 해결 기법
- 가용 리스트 병합(coalesce), 힙 compaction, 슬랩 할당(slab allocator)
- 면접 포인트
- Q1. 내부 단편화와 외부 단편화가 각각 언제 심해지는가?
- 내부: 요청 크기에 비해 고정 크기 블록(예: 페이지) 단위가 크면 남는 공간이 많아짐.
- 외부: 할당/해제가 반복되며 작은 가용 블록들이 흩어져 연속 공간 부족.
- Q2. 외부 단편화를 완화하는 기법에는 무엇이 있나?
- 합병(Coalesce): 인접 가용 블록을 결합
- 슬랩 할당(Slab allocator): 객체 풀 방식으로 내부 단편화 최소화
- 컴팩션(Heap compaction): 사용 중 블록을 이동해 연속 공간 확보
- Q1. 내부 단편화와 외부 단편화가 각각 언제 심해지는가?
4. 메모리 할당 정책 (First fit, Next fit, Best fit)
- First fit: 가용 리스트 앞에서부터 첫 번째로 맞는 블록에 할당
- Next fit: 이전 할당 위치부터 순회
- Best fit: 모든 블록을 검색해 최소 여유 공간 블록 선택
- 장단점 비교
정책 | 장점 | 단점 |
First fit | 빠름 | 외부 단편화 발생↑ |
Next fit | 균등 탐색 | 속도는 약간 느림 |
Best fit | 단편화 감소 | 탐색 비용↑ |
- 면접 포인트
- Q1. 어떤 워크로드에서 Best fit이 유리한가?
- 블록 크기 요청 패턴이 다양한 경우, 잉여 공간을 최소화해 외부 단편화를 줄일 때 유리.
- Q2. Next fit이 First fit보다 좋은 경우는?
- 연속 할당 패턴에서, 항상 리스트 앞부분만 탐색하지 않고 회전하면서 분산된 가용 블록을 균등하게 사용해 단편화를 완화.
- Q1. 어떤 워크로드에서 Best fit이 유리한가?
5. Implicit Free List vs Explicit Free List
- Implicit Free List (묵시적 리스트)
- 모든 블록을 순차 검사(헤더→푸터→다음)
- 구현 간단하지만 탐색 비용 큼(O(n))
- Explicit Free List (명시적 리스트)
- 가용 블록만 링크드 리스트로 관리
- 탐색 속도 빠름, 삽입/삭제 시 포인터 관리 필요
- 면접 포인트
- Q1. Explicit 리스트에서 블록 삽입/삭제는 어떻게 하나?
- 삽입: 새 블록의 next = free_listp, prev = NULL, 기존 첫 블록의 prev = 새 블록, free_listp = 새 블록
- 삭제: prev->next = next, next->prev = prev; 만약 prev==NULL이면 free_listp = next.
- Q2. implicit 리스트의 coalesce는 언제 수행하나?
- coalesce는 free() 직후에 호출되며, 인접 블록들의 할당 비트를 검사해 바로 합칠 수 있으면 그 자리에서 헤더와 푸터의 크기만 업데이트하고, 별도의 리스트 삽입 없이 합쳐진 블록을 남긴다.
- Q1. Explicit 리스트에서 블록 삽입/삭제는 어떻게 하나?
6. Demand-Zero Memory
- 개념
- 프로세스가 페이지에 접근하기 전까지 실제 물리 페이지를 0으로 초기화하지 않고 할당 지연 (lazy)
- 장점: 메모리 초기화 오버헤드 절감
- 면접 포인트
- Q1. Linux에서 demand-zero page는 어떻게 구현되나?
- 페이지 폴트 핸들러에서, zero-fill-on-demand 플래그에 따라 실제 물리 페이지 할당 후 memset(page, 0).
- Q2. 보안 측면에서 초기화 지연의 문제는?
- 이전 프로세스 데이터가 남아 있다가 새 프로세스가 접근 시 유출될 수 있으므로, 반드시 최초 접근 전에 0 초기화를 보장해야 함.
- Q1. Linux에서 demand-zero page는 어떻게 구현되나?
7. 시스템 콜(System Call)
- 개념: 사용자 공간 → 커널 공간 진입 인터페이스
- 흐름
- 라이브러리 함수(read, write) 호출
- CPU 특수 명령 (syscall/int 0x80) 실행
- 커널 핸들러 진입 → 서비스 수행 → 사용자로 복귀
- 면접 포인트
- Q1. gettimeofday나 clock_gettime가 왜 시스템 콜인가?
- 시간 정보는 커널이 관리하므로, 사용자 모드에서 커널 모드로 진입해 특권 레지스터 읽는 인터페이스가 필요.
- Q2. 컨텍스트 스위칭 비용은 어떤가?
- 사용자↔커널 모드 전환, 레지스터 저장/복원, TLB 저하 등으로 수백~수천 사이클 소요.
- 여러 하드웨어·소프트웨어 계층의 비용이 합쳐진 결과로, 짧은 시간 동안에도 수백~수천 사이클의 지연을 발생시킵니다. 컨텍스트 스위치가 잦으면 전체 시스템 처리량이 크게 떨어질 수 있기 때문에, 가능하면 스위치 비용을 줄이도록 스레드 풀, 비동기 I/O, 코루틴 같은 기법을 쓰는 것이 중요합니다.
- Q1. gettimeofday나 clock_gettime가 왜 시스템 콜인가?
8. DMA (Direct Memory Access)
- 개념
- CPU 개입 없이 장치가 메모리에 직접 데이터 전송
- 장점: CPU 부하 경감, 대용량 전송 효율 향상
- 면접 포인트
- Q1. DMA 설정 과정은?
- 디바이스 레지스터에 메모리 버퍼 물리 주소와 전송 크기, 방향 플래그를 쓰고 “시작” 비트 설정.
- Q2. 동기화 문제는?
- CPU 캐시와 메모리 일관성 유지 필요: 전송 전후에 cache flush/invalidate 수행.
- Q3. 커널 복사 vs. DMA 전송
- “커널을 통해 데이터를 복사한다”는 것은 CPU가 Linux 커널 함수(copy_from_user(), copy_to_user() 등)를 호출해서 메모리 내부에서 버퍼 간에 옮기는 방식이고,
- DMA는 그 반대로 커널이 설정만 해 주면 → DMA 하드웨어가 스스로 복사해 버립니다.
- Q1. DMA 설정 과정은?
9. 이더넷(Ethernet)
- 개념
- 이더넷(Ethernet)은 IEEE 802.3 표준에 따라 프레임(Frame) 단위로 데이터를 주고받는 대표적인 유선 LAN 기술입니다.사무실에서도 서버실의 라우터·스위치를 통해 각 직원 컴퓨터가 최대 수백 Mbps 이상의 안정적인 통신을 수행합니다.
- 예를 들어, 집에서 PC와 NAS를 공유기 뒤 스위치에 랜 케이블로 연결하면 이더넷으로 내부 파일 전송이나 인터넷 사용이 이뤄진다.
- 구조: MAC 주소 → 전송 매체 → CSMA/CD 충돌 회피
'개발 공부 > 컴퓨터시스템 (CSAPP)' 카테고리의 다른 글
8장 예외적인 제어흐름 (Exceptional Control Flow) (0) | 2025.04.23 |
---|---|
7장 링커 (0) | 2025.04.22 |
[운영체제 맛보기] 동시성 vs 병렬성 / 추상화 / 쓰레드 / 프로세스 / 인스트럭션 (4) | 2025.03.28 |
1. 컴퓨터 시스템으로의 여행 [1.4~1.7] (0) | 2025.03.15 |
1. 컴퓨터 시스템으로의 여행 [1.1~1.3] (0) | 2025.03.14 |