개발이야기/CSAPP
[CSAPP]컴파일러와 시스템의 이해
Study & Stack
2025. 5. 29. 22:51
728x90
1. 코드가 실행되기 전 과정
소스 코드 작성
사람이 읽기 쉬운 프로그래밍 언어로 코드를 작성합니다.
전처리 (Preprocessing)
매크로 치환, 포함된 파일 삽입 등 코드를 정리합니다.
컴파일 (Compilation)
소스 코드를 어셈블리어 또는 중간 코드로 변환하며 문법, 타입 검사를 수행합니다.
어셈블 (Assembly)
어셈블리어를 CPU가 이해할 수 있는 기계어(바이너리)로 변환합니다.
링킹 (Linking)
여러 오브젝트 파일과 라이브러리를 합쳐 실행 파일을 만듭니다.
로딩 (Loading)
운영체제가 실행 파일을 메모리에 올리고 CPU에 실행 준비를 지시합니다.
2. 컴파일러 내부 최적화 과정
컴파일러는 실행 속도와 효율을 높이기 위해 다양한 최적화를 합니다.
- 상수 접기(Constant Folding): 컴파일 시 계산 가능한 값을 미리 계산
- 불필요한 코드 제거(Dead Code Elimination): 쓰이지 않는 코드 삭제
- 루프 최적화(Loop Optimization): 반복문 성능 개선
- 인라인 확장(Inline Expansion): 함수 호출 대신 코드 직접 삽입
- 레지스터 할당(Register Allocation): 변수들을 CPU 레지스터에 배치하여 접근 속도 향상
3. CPU의 명령어 처리 과정
CPU는 명령어를 다음 5단계 파이프라인으로 처리합니다.
단계 | 설명 |
---|---|
명령어 인출 (IF) | 메모리에서 명령어를 읽어옴 |
명령어 해독 (ID) | 명령어 종류 해석 및 필요한 데이터 준비 |
실행 (EX) | 산술/논리 연산, 주소 계산 수행 |
메모리 접근 (MEM) | 필요한 경우 메모리에서 데이터 읽기/쓰기 |
쓰기 단계 (WB) | 결과를 레지스터나 메모리에 저장 |
4. CPU 구조 간단 설명
CPU는 크게 세 부분으로 나뉩니다.
1) 연산 장치 (ALU)
산술 및 논리 연산을 수행하는 ‘계산기’ 역할
2) 제어 장치 (Control Unit)
명령어 해독과 실행 순서 제어
3) 레지스터 (Registers)
초고속 임시 저장 공간으로 연산 및 데이터 저장에 사용
추가 구성 요소
- 캐시 메모리: CPU와 메인 메모리 사이에 위치해 데이터 접근 속도를 높임
- 버스: CPU, 메모리, 주변장치 간 데이터 전달 통로
5. CPU 내부 동작 상세
CPU는 클럭 신호에 맞춰 동작합니다. 클럭이 빠를수록 명령어 처리 속도가 빨라집니다.
- 명령어 인출(IF): PC(Program Counter)가 가리키는 메모리 주소에서 명령어를 읽어옵니다.
- 명령어 해독(ID): 제어 장치가 명령어를 분석하고, 필요한 레지스터에서 데이터를 준비합니다.
- 실행(EX): ALU가 연산을 수행하거나 주소를 계산합니다.
- 메모리 접근(MEM): 필요 시 데이터를 메모리에서 읽거나 씁니다.
- 쓰기 단계(WB): 연산 결과를 레지스터에 저장합니다.
이 동작은 파이프라인으로 겹쳐 수행되며, 여러 명령어가 동시에 처리됩니다.
6. 캐시 메모리 작동 방식
캐시는 CPU 내부 또는 가까이에 위치한 초고속 메모리로, 자주 쓰는 데이터를 임시 저장해 메인 메모리 접근 지연을 줄입니다.
캐시 계층 구조
- L1 캐시: CPU 코어별 초고속 캐시, 크기는 작지만 가장 빠름
- L2 캐시: L1보다 크고 느리지만 여전히 빠름
- L3 캐시: 여러 코어가 공유하는 큰 캐시, 속도는 가장 느림
작동 원리
- CPU가 데이터를 요청하면 먼저 캐시에서 찾습니다 (캐시 히트).
- 데이터가 없으면 메인 메모리에서 가져와 캐시에 저장합니다 (캐시 미스).
- 캐시는 최근에 사용하거나 자주 사용하는 데이터를 저장해 반복 접근 속도를 높입니다.
캐시의 중요성
- 메모리 접근 시간은 CPU 처리 시간에 비해 매우 느리므로 캐시는 병목 완화에 필수적입니다.
- 효율적 캐시 설계가 CPU 성능 향상에 큰 영향을 미칩니다.
7. 정리
구분 | 설명 |
---|---|
컴파일러 | 소스 코드를 기계어로 변환하고 최적화 수행 |
링커 | 여러 코드 조각과 라이브러리를 합쳐 실행 파일 생성 |
운영체제 | 실행 파일을 메모리에 올리고 CPU에 실행 지시 |
CPU | 명령어를 파이프라인으로 처리하며 연산과 제어 수행 |
캐시 | 자주 사용하는 데이터를 빠르게 접근할 수 있도록 임시 저장 |
컴파일러와 CPU, 캐시, 운영체제가 유기적으로 협력해 우리가 작성한 프로그램을 빠르고 효율적으로 실행합니다.
이해하면 더 나은 코딩과 성능 최적화에 큰 도움이 됩니다!
728x90