1. 컴퓨터 시스템과 하드웨어
컴퓨터 시스템의 범위
컴퓨터 시스템의 계층
- 응용프로그램 층
- 운영체제 층
- 컴퓨터 하드웨어 층
컴퓨터 시스템 계층 구조의 특징
- 사용자는 응용프로그램과 GUI/도구프로그램(툴/유틸리티)을 통해 컴퓨터 활용
- 사용자나 응용프로그램의 하드웨어에 대한 직접 접근 불허 (반드시 운영체제를 통해서만 접근 가능)
- 하드웨어는 모두 운영체제의 배타적 & 독점적 지배 받음
계층 구조로 보는 운영체제의 기능
- 사용자가 하드웨어에 대해 몰라도 컴퓨터를 사용할 수 있도록 함
- 응용프로그램과 하드웨어 사이의 중계
컴퓨터 하드웨어 설명
CPU
- 프로그램 코드(기계 명령)를 해석하여 실행하는 중앙처리장치
- 컴퓨터의 가장 핵심 장치
- 전원이 공급될 때 작동 시작
RAM
- CPU에 의해 실행되는 프로그램 코드와 데이터가 적재되는 공간
- 프로그램은 실행되기 위해 반드시 메모리에 적재되어야 함
캐시 메모리
- 배경
- CPU의 처리 속도가 메모리 속도에 비해 빠르게 향상 → 느린 메모리 때문에 CPU의 대기 시간이 늘게 됨
- CPU의 프로그램 실행 속도를 높이기 위해, CPU와 메모리 사이에 소량의 빠른 메모리를 설치
- 온칩 캐시 - CPU 내부에 설치되는 캐시
- 옵칩 캐시 - CPU 외부에 설치되는 캐시
- 캐시 메모리가 있는 경우 CPU는 캐시 메모리에서만 프로그램 실행(캐시메모리 우선)
- 실행하고자 하는 프로그램과 데이터는 메모리에 먼저 적재되고 다시 캐시로 옮겨져야 함
- 캐시는 용량이 작기 때문에 현재 실행할 코드와 데이터의 극히 일부만 저장
- 주 메모리(RAM)를 배제하는 것이 아님 (주 메모리와 캐시 메모리를 함께 사용하되, 우선순위를 캐시메모리를 더 높게 생각하는 것)
Cache hit vs Cache miss
캐시 히트: CPU가 요청한 데이터가 캐시 메모리에 이미 저장된 상태일 때
캐시 미스: CPU가 요청한 데이터가 캐시 메모리에 없을 때 (이때, 메인 메모리에 접근해야 함)
캐시 미스가 많을 수록 CPU 성능 저하
캐시 사용의 효율성, 비효율성이 알고리즘의 성능에 영향을 미침
- 비연속적인 메모리 접근 → 캐시 미스 발생
- 연속적인 메모리 접근 → 캐시 히트 발생
장치
- 키보드, 프린터, 스캐너 등
버스
- 0과 1의 디지털 신호가 지나가는 여러 가닥의 선을 다발로 묶어 부르는 용어
- 비유
- 컴퓨터의 버스: 도로
- 컴퓨터의 데이터: 도로에 다니는 자동차
- 버스의 종류 (지나다니는 정보에 따라)
- 주소 버스 - 주소 신호가 지나다니는 버스
- 주소
- 메모리, 입출력 장치나 저장 장치 내에 있는 저장소에 대한 번지
- 0번지에서 시작하는 양수
- 주소 버스는 주소 값이 전달되는 여러 선의 다발
- CPU는 메모리나 입출력 장치에 값을 쓰거나 읽을 때 반드시 주소를 발생시킴
- 주소
- 데이터 버스 - 데이터 신호가 지나다니는 버스
- 제어 버스 - 제어 신호가 지나다니는 버스
- 주소 버스 - 주소 신호가 지나다니는 버스
목적에 따라 버스 구분
- 시스템 버스
- CPU, 캐시 메모리, 메모리 등 빠른 하드웨어들 사이에 데이터 전송
- 고속도로에 비유
- 입출력 버스(I/O bus)
- 상대적으로 느린 입출력 장치들로부터 입출력 데이터 전송
- 일반 도로에 비유
- 시스템/입출력 버스 모두 주소, 데이터, 제어 버스로 구성
I/O controllers & control circuit (입출력 제어 장치 및 시스템 제어 회로)
- 입출력 장치들을 제어하기 위한 여러 하드웨어
- 입출력 장치에게 명령 하달
- 메모리와 입출력 장치 사이에 또는 CPU와 입출력 장치 사이에 데이터 전달 중계
- Ex)
- DMAC: CPU 개입없이 입출력 장치와 메모리 사이의 데이터 전송
- 인터럽트 제어장치: 장치들이 입출력을 완료하였을 때 발생시키는 인터럽트 신호를 받아 CPU에 전달
CPU는 메인 메모리와 로컬 버퍼 사이에 데이터를 운반
인터럽트 신호가 발생함으로써 데이터 운반이 종료됐음을 알림
Direct Memory Access (DMA)
- CPU에 가해지는 인터럽트 수를 줄이기 위해 로컬 버퍼와 메모리 사이에 운반되는 데이터 단위를 블럭 단위로 함
- 블럭의 크기는 달라질 수 있음
- 인터럽트 수가 줄어들면 병렬적으로 수행할 수 있어서 (CPU, I/O 장치 등) 시스템 전반적으로 효율성 증가
32비트 컴퓨터: 32비트 CPU를 가진 컴퓨터
32비트 운영체제: 32비트 주소 체계로 관리되는 운영체제
CPU와 메모리의 관계
32비트 CPU, 32비트 운영체제, 32비트 컴퓨터란?
- CPU에 32개의 주소선이 있음
- CPU의 액세스 범위: 2^32 개의 서로 다른 주소 (0 ~ 2^32 - 1 번지)
- CPU가 최대 액세스할 수 있는 메모리의 크기 : 4GB
- 32비트 CPU를 가진 컴퓨터에 4GB 이상 메모리를 설치할 경우
- 4GB를 넘어선 영역은 사용할 수 없음
- CPU에 입출력되는 32개의 데이터선이 있음
- 한번에 32비트 읽고 쓰기 가능
cf. 64비트의 경우 2^34GB(약 16TB) 액세스 가능
CPU 레지스터와 명령어 사이클
주요 레지스터
- PC(Program Counter) - 다음에 실행할 명령의 메모리 주소 저장 (IP: Instruction Pointer 라고도 함)
- IR(Instruction Register) - 현재 실행하기 위해 메모리로부터 읽어 온 명령 저장
- SP(Stack Pointer) - 스택의 톱 메모리 주소 저장 (스택의 현재 위치 추적)
- 상태 레지스터 - CPU의 상태 정보나 인터럽트 금지 등의 제어 정보 저장
- 기타
명령어 사이클
- CPU가 하나의 명령을 실행하는 과정
- CPU는 전원이 켜진 후 단순하게 명령 사이클 반복
명령어 사이클
1. IF (명령어 가져오기)
- PC는 실행할 명령어의 메모리 주소 가리킴
- CPU는 해당 메모리 위치에서 명령어 얻음
2. Advance IP (PC 업데이트)
- 명령어를 가져온 뒤 PC를 다음 명령어의 주소로 증가시킴 (PC 또는 IP가 일정 단위로 증가)
3. ID (IR에 저장된 명령어 해독하기)
- 명령어의 각 비트를 분석하여 어떤 작업을 해야 하고 어떤 자원을 사용해야 하는지 결정
4. OF (피연산자 가져오기)
- 처리해야 할 데이터를 가져와야 함 (메모리와 레지스터에서 읽어 옴)
5. IE (명령어 실행하기)
- 명령어가 요구하는 연산 수행
- ALU에서 사용되며 논리, 산술 연산 수행 (데이터 이동, 곱하기 등)
6. OS (결과 저장하기)
- 결과를 레지스터나 메모리에 저장
- 다음 명령어 사이클로 넘어갈 준비
ex)
mov eax, [300]; << 메모리 300번지의 값을 읽어 eax 레지스터에 저장
eax: 32비트 크기를 가진 범용 레지스터
스택은 어디에 있는가?
프로그램이 실행되기 위해 운영체제에 의해 할당되는 공간
- 코드 공간: 프로그램 코드 적재
- 데이터 공간: Global/static/(초기화되지 않은 전역) 변수들이 적재되는 공간
- 힙 공간: 프로그램에서 동적 할당받는 공간 ( ex. malloc)
- 스택 공간: 함수가 호출될 때 매개변수, 지역변수, 복귀 주소 등 저장
cf. 복귀 주소: 함수가 끝난 뒤 되돌아갈 주소
메모리 레이아웃 (리눅스 프로세스)
(높은 논리 주소~낮은 논리 주소 순서)
stack
- 상위 논리 주소로부터 하위 주소로 확장
- 지역 변수, 매개변수, 함수의 복귀 주소
heap
- bss 상단으로부터 상위 주소로 확장
- 동적으로 할당한 메모리 영역
bss
- 초기화되지 않은 전역&정적 변수
data
- 초기화된 전역&정적 변수
rodata
- read-only, const type variables(초기화된 이후로 값을 수정할 수 X), strings(문자열)
text
- 명령어들
x86_64 General Purpose Register
| Register | Accumulator | Counter | Data | Base | Stack Pointer | Base Pointer | Source | Destination |
| 64bit | RAX | RCX | RDX | RBX | RSP | RBP | RSI | RDI |
| 32bit | EAX | ECX | EDX | EBX | ESP | EBP | ESI | EDI |
x86_64 Calling Convention
Calling convention
- 정의: 함수를 호출하는 방식에 대한 표준화 된 규칙, 함수가 호출될 때 어떤 방식으로 매개변수와 반환값이 전달되는지 정의
- 목적: 서로 다른 컴파일러, 서로 다른 언어로 구현된 코드가 상호작용할 수 있게 됨
x86-64 system V style calling convention
- 함수의 첫 6개 인자는 기본적으로 부동소수점 숫자가 아닌 경우 다음의 범용 레지스터를 통해 순서대로 전달 : RDI, RSI, RDX, RCX, R8, R9
- 6번째를 초과하는 인자들은 스택에 삽입 (Right-to-Left 순서) (LIFO 후입선출)
컨텍스트(Context)
프로그램이 실행 중인 일체의 상황 혹은 상태 정보
- 메모리
- 프로그램 코드와 데이터, 스택, 동적 할당 받아 저장한 값
- CPU 레지스터들의 값
- PC에는 코드의 주소
- SP에는 스택의 톱 주소
- 다른 레지스터는 이전의 실행 결과나 현재 실행에 사용되는 데이터들
좁은 의미에서의 컨텍스트
- 메모리에 저장된 상황 정보는 그대로 남아 있음
- 따라서 현재 CPU에 들어 있는 레지스터의 값들을 컨텍스트라고 할 수 있음
컨텍스트 스위칭
- 정의
- 현재 실행중인 프로그램의 컨텍스트(CPU 레지스터들의 값)를 메모리에 저장
- 새로 실행시킬 프로그램의 저장된 컨텍스트를 CPU에 복귀
- 발생
- CPU가 현재 프로그램 실행을 중지하고 다른 프로그램을 실행할 때
멀티 코어 CPU
2001년 IBM에 의해 PowerPC 라는 멀티코어 CPU 개발
- CPU 내부에 2개의 프로세서 포함
- 2개의 프로그램을 동시에 실행
- 코어는 완벽한 처리기(과거 개념의 CPU)
캐시 종류
- L1 캐시
- 가장 빠르고 CPU에 가까운 캐시
- 코어마다 프라이빗하게 독립적으로 존재
- I-캐시: 명령어, D-캐시: 데이터
- 파이프라인에서 structural hazard 방지 효과 제공
- L2 캐시
- L1 캐시보다 저장공간이 크고 약간 느림
- 각 코어에 독립적으로 존재
- L1 캐시에 없는 데이터를 L2 캐시에서 찾게 됨
- L3 캐시
- 여러 코어가 공유함
- L1, L2 캐시보다 용량이 크고 여러 코어가 동시에 접근 가능
- L1, L2 캐시보다 속도 느림
- L2 캐시에서 찾지 못한 데이터를 L3 캐시에서 찾음
L1, L2, L3의 계층 구조: CPU가 자주 사용하는 데이터를 더 빠르게 처리 → 성능 극대화
'공부 기록 > 운영체제' 카테고리의 다른 글
| 컴퓨터 시스템과 운영체제 (3) (0) | 2025.11.09 |
|---|---|
| 컴퓨터 시스템과 운영체제 (2) (0) | 2025.11.09 |