컴퓨터 저장장치의 종류
컴퓨터 저장장치는 어떤 것이 있을까요? 우선 저장장치의 계층을 살펴보겠습니다.
보조기억장치는 프로그램이나 데이터 등을 비교적 장기간 저장하기 위한 저장장치입니다. 용량이 크고 가격이 저렴하지만, 속도가 느리다는 단점이 있습니다. 하드디스크(HDD)와 솔리드 스테이트 디스크(SSD)가 있습니다. 주기억장치는 CPU가 연산을 수행하기 위해 필요한 명령어나 데이터를 임시로 저장하기 위한 기억장치입니다. 보조기억장치보다 속도가 빠르지만, 가격 대비 용량이 적습니다. 캐시메모리는 전원이 켜져있으면 데이터가 계속 유지됩니다. CPU와 직접 통신하는 메모리의 한 종류로 속도가 매우 빠르다는 장점이 있습니다. 레지스터는 CPU가 연산에 필요한 자료를 임시로 저장하는 역할을 합니다.
컴퓨터 동작 원리
다음은 컴퓨터 프로그램을 실행하면 어떻게 동작하는지 알아보겠습니다.
먼저 사용자가 운영체제에 명령을 전달합니다. 운영체제는 보조기억장치(여기서는 HDD)에서 관련 자료을 읽어 메모리(Memory)에 전달합니다. 그 다음 연산이 필요한 부분을 CPU에 전달하고 메모리가 결과를 받아올 수 있습니다. 메모리 구조를 더 자세히 살펴보겠습니다.
메모리 구조 및 세그먼트
메모리는 크게 코드(Code)영역, 데이터(Data)영역, BSS 영역, 힙(Heap) 영역, 스택(Stack) 영역으로 구분됩니다. 이 영역이 어떤 것을 의미하는지 알아보겠습니다.
코드 세그먼트
- 실행 가능한 기계 코드가 위치하는 영역
- 텍스트 세그먼트(Text Segment)라고도 함
- 동작하려면 코드를 실행할 수 있어야 하므로 읽기 권한과 실행 권한 부여
세그먼트 | 권한 | 여부 | 사용 예 |
코드 세그먼트 | 읽기 | O | main() 등의 함수 코드 |
쓰기 | X | ||
실행 | O |
데이터 세그먼트
- 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치
- CPU가 이 세그먼트의 데이터를 읽을 수 있어야 하므로 읽기 권한 부여
- 데이터 세그먼트는 다시 쓰기 불가능 세그먼트와 쓰기 가능 세그먼트로 분류됨
- 쓰기 가능 세그먼트: 전역 변수와 같이 프로그램이 실행되면서 값이 변할 수 있는 데이터들이 위치
- 쓰기 불가능 세그먼트: 실행하면서 값이 변하면 안되는 데이터들이 위치
- 전역적으로 선언된 상수
- 이런 세그먼트를 rodata(read-only data) 세그먼트라 부름
BBS 세그먼트 (Block Started By Symbol Segment)
- 컴파일 시점에 값이 정해지지 않은 전역 변수가 위치하는 메모리 영역
- 개발자가 선언만 하고 초기화하지 않은 전역변수 등이 포함됨
- 메모리 영역은 프로그램이 시작될 때 모두 0으로 값이 초기화됨
- 이런 특성 때문에 C를 작성할 때, 초기화 안된 전역 변수의 값은 0임
- 읽기 권한 및 쓰기 권한 부여
세그먼트 | 권한 | 여부 | 사용 예 |
쓰기 가능 데이터 세그먼트 | 읽기 | O | 전역 변수 |
쓰기 | O | ||
실행 | X | ||
쓰기 불가능 데이터 세그먼트 rodata(read-only data) |
읽기 | O | 전역으로 선언된 상수 |
쓰기 | X | ||
실행 | X |
스택 세그먼트(Stack Segment)
- 프로세스의 스택이 위치하는 영역
- 함수의 인자나 지역 변수 같은 임시 변수들이 저장
- 스택 세그먼트는 스택 프레임(Stack Frame)이라는 단위로 사용
- 스택 프레임은 함수 호출 시 생성, 반환 시 해제
- 프로그램의 전체 실행 흐름은 여러 요인의 영향을 받음
- // 자료구조의 스택(Stack)과 유사, Last In First Out 구조
세그먼트 | 권한 | 여부 | 사용 예 |
스택 세그먼트 | 읽기 | O | 지역 변수 |
쓰기 | O | ||
실행 | X |
힙 세그먼트 (Heap Segment)
- 힙 데이터가 위치하는 세그먼트
- 스택과 마찬가지로 동적 할당
- 리눅스에서 스택 세그먼트와 반대 방향으로 자람
- C에서 molloc(), calloc() 등을 호출해서 할당받는 메모리가 이 세그먼트에 위치
- 일반적으로 읽기와 쓰기 권한 부여
- // 자료구조의 힙(Heap)과 와 유사
세그먼트 | 권한 | 여부 | 사용 예 |
힙 세그먼트 | 읽기 | O | C언어에서 malloc(), calloc() 등 동적 할당 메모리 영역 |
쓰기 | O | ||
실행 | X |
전체적인 그림을 보겠습니다.
지금까지 저장장치의 계층과 프로그램 동작 원리, 메모리 구조를 살펴봤습니다. 메모리가 어떻게 작동하는지를 알면 어셈블리어를 하는데 도움이 됩니다, 또한, C언어, JAVA와 같은 고급 언어에서도 이를 알면 프로그램을 작성하는데 큰 도움이 될 것입니다.
출처
- "System Hacking", Dreamhack(드림핵), 2023.03.13 접속, https://dreamhack.io/lecture/roadmaps/2.
- “[컴퓨터 기초] 메모리구조(Memory Structure)”, 티스토리 『jinShine 블로그』, 2018.05.17, https://jinshine.github.io/2018/05/17/%EC%BB%B4%ED%93%A8%ED%84%B0%20%EA%B8%B0%EC%B4%88/%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0/.