
2025.04.30
오늘한 내용 : 7주차 키워드 정리
WEEK07: 시스템 콜, 데이터 세그먼트, 메모리 단편화, sbrk/mmap
가상 주소 공간을 고정 크기 단위인 페이지(Page)로 나누고,
물리 메모리도 같은 크기의 프레임(Frame)으로 나눔
페이지 단위로 가상 주소 → 물리 주소 변환
| 용어 | 설명 |
|---|---|
| 페이지(Page) | 가상 메모리의 고정 단위 (보통 4KB) |
| 프레임(Frame) | 물리 메모리의 고정 단위 (페이지와 동일 크기) |
| 페이지 테이블 | 각 가상 페이지가 어떤 물리 프레임에 매핑되는지 저장 (프로세스별로 존재) |
| TLB | 자주 접근하는 주소 변환 캐시 → 빠른 변환 |
[가상 주소]: 0x0012_34AB
→ 페이지 번호: 0x0012
→ 오프셋: 0x34AB
페이지 테이블에서 0x0012 → 물리 프레임 0x9F
→ 물리 주소 = 0x9F_34AB
| 장점 | 설명 |
|---|---|
| 보호 | 프로세스 간 메모리 침범 방지 |
| 효율적 사용 | 필요할 때만 메모리 사용 가능 (지연 로딩) |
| 프로세스 독립성 | 각 프로세스는 자신만의 메모리 공간 가짐 |
| 스왑 가능 | 페이지 단위로 디스크와 교체 가능 → 실제 메모리보다 큰 프로그램 실행 가능 |
| 함수 | 설명 |
|---|---|
malloc(size) | size만큼의 메모리를 할당하고, 시작 주소를 리턴 |
free(ptr) | malloc으로 할당된 메모리를 해제 |
calloc(n, sz) | n개 × sz 크기의 메모리를 할당하고, 0으로 초기화 |
realloc(ptr, sz) | 기존 메모리 크기를 sz로 재조정 |
sbrk() 시스템 콜malloc()은 내부적으로 sbrk() 또는 mmap()을 호출해 힙 확장| 유형 | 설명 | 예시 |
|---|---|---|
| 외부 단편화 (External) | 사용 가능한 메모리 공간이 조각나 있어서 원하는 크기만큼 연속된 공간을 할당할 수 없는 경우 | 총 1000바이트가 남아도 3칸으로 나뉘면 500바이트 연속 할당이 안 됨 |
| 내부 단편화 (Internal) | 할당된 블록 내에서 실제로는 사용되지 않는 낭비된 공간 | 100바이트만 필요하지만 128바이트 블록이 할당된 경우 |
| 구분 | 해결 방법 | 설명 |
|---|---|---|
| 외부 단편화 | 블록 병합(Coalescing) | 인접한 가용 블록을 합쳐서 단편화 감소 |
| 페이징 | 고정 크기 페이지로 관리하면 외부 단편화 방지 가능 | |
| 가비지 컬렉션 | (C/C++은 수동) 안 쓰는 메모리 회수로 단편화 간접 완화 | |
| 내부 단편화 | 블록 분할(Splitting) | 큰 블록을 요청 크기에 맞게 쪼개어 내부 단편화 최소화 |
| 정책 | 설명 |
|---|---|
| First Fit | 가용 리스트에서 처음으로 맞는 블록을 찾으면 즉시 할당 |
| Next Fit | 이전 탐색 위치부터 시작해서, 맞는 블록을 찾으면 할당 |
| Best Fit | 가장 딱 맞는(가장 작은 적합한) 블록을 찾아서 할당 |
| Worst Fit | 가장 큰 블록을 찾아서 할당 (→ 자투리 많이 남기려는 전략) |
| Segregated Fit | 크기별로 여러 개의 free list를 운영하여 해당 크기 리스트에서 할당 |
| 정책 | 장점 | 단점 |
|---|---|---|
| First Fit | 빠름, 구현 쉬움 | 단편화 발생 가능 (앞부분 집중) |
| Next Fit | 앞부분 재사용 방지 가능 | 성능 불안정 (최악 시 전부 탐색) |
| Best Fit | 내부 단편화 최소화 가능 | 외부 단편화 심화, 탐색 느림 |
| Worst Fit | 큰 블록 보존 전략 | 내부 단편화 심화 가능 |
| Segregated Fit | 탐색 빠르고 정밀할당 가능 | 리스트 많고 구현 복잡 |
first-fit, next-fit, best-fit 등으로 가능| 항목 | Implicit Free List | Explicit Free List |
|---|---|---|
| 탐색 대상 | 모든 블록 (할당 + 가용) | 가용 블록만 |
| 탐색 속도 | 느림 | 빠름 |
| 구현 난이도 | 쉬움 | 어려움 |
| 오버헤드 | 적음 | prev/next 포인터 공간 필요 |
| 블록 정보 | header/footer | header + 포인터 필드 |
예시 :
class[0] (1~16B) → [Block][Block]
class[1] (17~32B) → [Block]
class[2] (33~64B) → NULL
메모리 블록을 요청했을 때 즉시 물리 메모리를 할당하지 않고,
해당 페이지에 처음 접근할 때 OS가 실제로 물리 메모리를 할당하고 0으로 초기화하는 방식
- 핵심 특징
| 항목 | 설명 |
|---|---|
| "요청 즉시 할당 안 함" | malloc()이나 brk()로 공간을 요청해도 물리 메모리는 실제 접근 시까지 비할당 |
| "처음 접근 시 0으로 초기화" | 해당 페이지에 쓰기 작업이 발생할 때 → OS가 실제 페이지를 할당하고 0으로 초기화 |
| 효율적 메모리 사용 | 실제로 사용하지 않은 메모리는 할당조차 되지 않음 (낭비 방지)작동 과정 (간단히) |
작동 예시
1. malloc(4096) 호출
→ 커널은 가상 주소 공간만 확보 (물리 메모리 미할당)
2. 사용자가 arr[0] = 1 실행
→ 해당 주소에 접근 시 Page Fault 발생
3. OS가 빈 페이지를 물리 메모리에 할당 + 0으로 초기화
→ 다시 접근 재시도 → 정상 작동
| 기술 | 설명 |
|---|---|
| Demand Paging | 접근할 때까지 메모리 페이지를 할당하지 않는 전략 전체 (zero 초기화 포함 or 미포함) |
| Copy-on-Write (COW) | 프로세스 복사 시 페이지 공유하다가 쓰기 발생 시에만 복사 (fork와 밀접) |
| mmap + MAP_ANONYMOUS | 파일 기반이 아닌, 익명 메모리 매핑 (보통 demand-zero로 동작) |
사용자 프로그램이 운영체제 커널의 기능을 요청할 때 사용하는 인터페이스
일반 프로그램은 커널 자원(파일, 메모리, 장치 등)에 직접 접근 불가
→ 시스템 콜을 통해 간접적으로 요청
- OS는 메모리 보호, 자원 보호를 위해 사용자 코드가 커널에 직접 접근하지 못하게 함. 대신, 시스템 콜이라는 공식 통로를 통해서만 커널 기능 사용 가능
| 구분 | 설명 |
|---|---|
| 라이브러리 함수 | 단순히 사용자 공간에서 동작 (printf, strlen) |
| 시스템 콜 | 커널 기능 호출 → 사용자 모드에서 커널 모드로 전환 발생 |
캐시 플러시(Cache Flush) : 사용자 모드→ 커널 모드 시 보안 문제로 인해 캐시(L1~L3등) 비워줌
권한 설정(Privileage Switching) : CPU가 접근 권한 수준을 나눔
- 스택 변경 (커널 전용 스택으로 전환)
- 레지스터 백업
- 보안 확인
- 인터럽트 마스크 설정 등이 포함됨
| 항목 | 설명 |
|---|---|
| 캐시 플러시 | TLB나 CPU 캐시 무효화 → 캐시 혜택 상실 → 성능 저하 |
| 권한 전환 | 사용자 모드 → 커널 모드 전환 시 스택/레지스터/보호 모드 전환 등 처리 필요 |
CPU 개입 없이, I/O 장치가 직접 메모리와 데이터를 주고받는 기술
→ CPU는 단순 데이터 전송에 낭비되지 않고, 다른 연산을 수행할 수 있음
기존 방식:
[디스크] → CPU → [메모리]
DMA 방식:
[디스크] → [메모리] (CPU 없이 직접 전송)
| 사용 사례 | 왜 DMA로 처리하는가? |
|---|---|
| 디스크에서 파일을 메모리로 읽을 때 | 디스크는 MB~GB 단위 대용량 데이터를 처리함 → CPU가 직접 복사하면 시간 낭비 + 부하 증가. DMA가 대신 처리하면 CPU는 다른 작업에 집중 가능 |
| 네트워크 카드(NIC)가 패킷 수신 | 고속 네트워크 환경(예: 1Gbps 이상)에서는 수백~수천 개 패킷/초가 들어옴 → CPU가 직접 수신 처리하면 병목 발생. NIC가 패킷을 메모리로 직접 복사하고, 완료 후 인터럽트로 알리는 구조가 훨씬 효율적 |
| GPU → 프레임 버퍼 전송 | GPU는 매 프레임마다 수천~수만 픽셀 데이터를 화면으로 보내야 함. CPU가 개입하면 그래픽 처리 속도 저하. DMA가 화면 메모리에 직접 전송하면 실시간 렌더링이 가능해짐 (ex. 게임, 영상 스트리밍 등) |
| 장점 | 설명 |
|---|---|
| CPU 부하 감소 | 단순 데이터 이동 대신 계산/처리 집중 가능 |
| 전송 속도 향상 | 버스 대역폭을 직접 사용, 빠름 |
| 효율적 멀티태스킹 | DMA 수행 중에도 CPU는 다른 작업 가능 |
| 단점 | 설명 |
| 메모리 보호 어려움 | DMA는 메모리에 직접 접근하므로 부적절한 접근 위험 존재 (보안 이슈) |
| 동기화 필요 | DMA 중에 해당 메모리 영역을 CPU가 접근하면 경쟁 상태(race condition) 발생 가능 |
| 버스 경합 | DMA도 시스템 버스를 사용하기 때문에, CPU와 충돌 가능성 있음 |
컴퓨터 간의 데이터를 유선(LAN)을 통해 전송하는 대표적인 네트워크 기술
→ 프레임(Frame) 기반으로 동작하며, MAC 주소로 통신 대상을 식별
- 우리가 흔히 말하는 유선 인터넷
- 학교, 회사, 가정 등에서 사용하는 LAN(Local Area Network) 기반 기술
- 대부분의 컴퓨터/라우터/스위치는 이더넷을 기본으로 지원
┌───────────┬─────────┬────────┬─────────────────┬────────┐
│ Dest MAC │Src MAC │ Type │ Payload(Data) │ CRC │
└───────────┴─────────┴────────┴─────────────────┴────────┘
| 필드 | 설명 |
|---|---|
| Destination MAC | 수신자 하드웨어 주소 (6바이트) |
| Source MAC | 송신자 하드웨어 주소 (6바이트) |
| Type | 상위 프로토콜 정보 (예: IPv4, ARP 등) |
| Payload | 전송할 실제 데이터 (46~1500바이트) |
| CRC | 오류 검출용 체크섬 |
| 항목 | 설명 |
|---|---|
| 유선 기반 | 전기 신호로 데이터를 주고받음 (UTP 케이블 등) |
| 프레임 단위 전송 | 고정 구조로 신뢰성 있게 데이터 전송 |
| 비연결형 프로토콜 | 연결 설정 없이 바로 데이터 전송 (→ 상위 계층 TCP가 신뢰성 담당) |
| 브로드캐스트 지원 | 같은 네트워크 상 모든 장치에 전송 가능 (ARP 등에서 사용됨) |
※ 현재는 대부분 스위치 기반 전이중 통신(full-duplex)으로 충돌 없음Carrier Sense Multiple Access / Collision Detection
- 듣고 있다가 (Carrier Sense)
- 채널이 비면 전송 (Multiple Access)
- 충돌이 나면 중단 후 재시도 (Collision Detection)