본문 바로가기

개발 공부/컴퓨터시스템 (CSAPP)

7주차_키워드 정리 (가상메모리, 페이징, 단편화, DMA, malloc)

 

1. 가상 메모리 & 페이징

  • 개념
    • 가상 메모리(Virtual Memory): 프로세스마다 독립된 주소 공간 제공
    • 페이징(Paging): 물리 메모리를 고정 크기 페이지(frames)로, 가상 주소를 동일 크기 페이지로 쪼개 매핑
  • 동작 원리
    1. CPU가 가상 주소 사용 → MMU가 페이지 번호와 오프셋으로 분리
    2. 페이지 테이블로 물리 주소 조회 → 없으면 페이지 폴트(page fault)
    3. OS가 디스크에서 해당 페이지 로드
  • 장·단점
    • 장점: 프로세스 격리, 메모리 오버커밋 가능
    • 단점: 페이지 테이블 메모리 오버헤드, 페이지 폴트 시 성능 저하
  • 면접 포인트
    • Q1. TLB(Translation Lookaside Buffer)가 뭐고 왜 중요한가?
      • TLB는 주소 변환 속도를 높이기 위한 캐시로, 최근에 사용된 가상→물리 페이지 매핑 정보를 저장합니다.
      • 페이지 테이블을 매번 메모리에서 읽지 않고 TLB 히트 시 즉시 물리 주소를 얻어 성능을 크게 향상시킵니다.
    • Q2. 페이지 교체 알고리즘 중 LRU와 FIFO의 차이는?
      • FIFO: 가장 오래된 페이지를 교체 → 구현 간단하지만, Belady’s anomaly(교체 효율 저하)가 발생할 수 있음
      • LRU: 가장 오래 사용되지 않은 페이지를 교체 → 실제 접근 패턴에 더 적합하나, 구현 오버헤드(스택/참조 비트) 있음

 


 

2. 동적 메모리 할당 (힙, sbrk, malloc, free)

 

  • 개념
    • 프로세스 실행 중 크기 변화가 필요한 메모리를 힙(heap)에서 요청/반환
  • 기본 함수
    • sbrk() / brk() : 힙 영역의 끝(brk point) 이동
    • malloc(size) : 내부적으로 sbrk 혹은 mmap 호출
    • free(ptr) : 메모리 블록을 가용 리스트에 반환
  • 동작 흐름
    1. malloc → 요청 크기 정렬(alignment) → 가용 리스트 검색 → 없으면 sbrk 호출 → 블록 반환
    2. free → 블록 헤더/푸터에 언할로크 표시 → 인접 블록과 합치기(coalesce)
  •  
  • 면접 포인트
    • Q1. 왜 malloc 후에는 반드시 free 해야 하나?
      • free를 하지 않으면 힙 메모리가 반환되지 않아 메모리 누수가 발생합니다.
        • 메모리 누수란 :: 프로그램이 동적으로 할당한 메모리를 더 이상 사용하지 않음에도 불구하고 해제(free)를 하지 않아, 사용 가능한 힙 공간이 점점 줄어드는 현상.
      • 장시간 실행되는 서버나 임베디드 환경에서는 치명적 성능 저하를 초래합니다.
    • Q2. calloc과 realloc은 내부적으로 어떻게 동작하나?
      • calloc(n, size) = malloc(n*size) + 메모리 0으로 초기화(memset).
      • realloc(ptr, new_size) = 새 크기 블록 malloc, 기존 데이터 memcpy, 기존 블록 free.

 


 

3. 메모리 단편화

 

  • 내부 단편화(Internal Fragmentation)
    • 할당 블록이 요청보다 커서 남는 공간
  • 외부 단편화(External Fragmentation)
    • 충분한 총 여유 공간이 있지만, 연속된 큰 블록이 없어 요청을 못 맞춤
  • 해결 기법
    • 가용 리스트 병합(coalesce), 힙 compaction, 슬랩 할당(slab allocator)
  • 면접 포인트
    • Q1. 내부 단편화와 외부 단편화가 각각 언제 심해지는가?
      • 내부: 요청 크기에 비해 고정 크기 블록(예: 페이지) 단위가 크면 남는 공간이 많아짐.
      • 외부: 할당/해제가 반복되며 작은 가용 블록들이 흩어져 연속 공간 부족.
    • Q2. 외부 단편화를 완화하는 기법에는 무엇이 있나?
      • 합병(Coalesce): 인접 가용 블록을 결합
      • 슬랩 할당(Slab allocator): 객체 풀 방식으로 내부 단편화 최소화
      • 컴팩션(Heap compaction): 사용 중 블록을 이동해 연속 공간 확보

 


 

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보다 좋은 경우는?
      • 연속 할당 패턴에서, 항상 리스트 앞부분만 탐색하지 않고 회전하면서 분산된 가용 블록을 균등하게 사용해 단편화를 완화.

 


 

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() 직후에 호출되며, 인접 블록들의 할당 비트를 검사해 바로 합칠 수 있으면 그 자리에서 헤더와 푸터의 크기만 업데이트하고, 별도의 리스트 삽입 없이 합쳐진 블록을 남긴다.

 


 

6. Demand-Zero Memory

 

  • 개념
    • 프로세스가 페이지에 접근하기 전까지 실제 물리 페이지를 0으로 초기화하지 않고 할당 지연 (lazy)
  • 장점: 메모리 초기화 오버헤드 절감
  • 면접 포인트
    • Q1. Linux에서 demand-zero page는 어떻게 구현되나?
      • 페이지 폴트 핸들러에서, zero-fill-on-demand 플래그에 따라 실제 물리 페이지 할당 후 memset(page, 0).
    • Q2. 보안 측면에서 초기화 지연의 문제는?
      • 이전 프로세스 데이터가 남아 있다가 새 프로세스가 접근 시 유출될 수 있으므로, 반드시 최초 접근 전에 0 초기화를 보장해야 함.

 


 

7. 시스템 콜(System Call)

 

  • 개념: 사용자 공간 → 커널 공간 진입 인터페이스
  • 흐름
    1. 라이브러리 함수(read, write) 호출
    2. CPU 특수 명령 (syscall/int 0x80) 실행
    3. 커널 핸들러 진입 → 서비스 수행 → 사용자로 복귀
  • 면접 포인트
    • Q1. gettimeofday나 clock_gettime가 왜 시스템 콜인가?
      • 시간 정보는 커널이 관리하므로, 사용자 모드에서 커널 모드로 진입해 특권 레지스터 읽는 인터페이스가 필요.
    • Q2. 컨텍스트 스위칭 비용은 어떤가?
      • 사용자↔커널 모드 전환, 레지스터 저장/복원, TLB 저하 등으로 수백~수천 사이클 소요.
      • 여러 하드웨어·소프트웨어 계층의 비용이 합쳐진 결과로, 짧은 시간 동안에도 수백~수천 사이클의 지연을 발생시킵니다. 컨텍스트 스위치가 잦으면 전체 시스템 처리량이 크게 떨어질 수 있기 때문에, 가능하면 스위치 비용을 줄이도록 스레드 풀, 비동기 I/O, 코루틴 같은 기법을 쓰는 것이 중요합니다.

 


 

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 하드웨어가 스스로 복사해 버립니다.

 


 

9. 이더넷(Ethernet)

 

  • 개념
    • 이더넷(Ethernet)은 IEEE 802.3 표준에 따라 프레임(Frame) 단위로 데이터를 주고받는 대표적인 유선 LAN 기술입니다.사무실에서도 서버실의 라우터·스위치를 통해 각 직원 컴퓨터가 최대 수백 Mbps 이상의 안정적인 통신을 수행합니다.
    • 예를 들어, 집에서 PC와 NAS를 공유기 뒤 스위치에 랜 케이블로 연결하면 이더넷으로 내부 파일 전송이나 인터넷 사용이 이뤄진다.
  • 구조: MAC 주소 → 전송 매체 → CSMA/CD 충돌 회피