-
C언어를 위한 컴퓨터 구조C언어 2020. 2. 5. 21:25
컴퓨터 구조
C언어가 OS를 만들기 위해 탄생한 언어인 만큼 OS가 하는 일인 컴퓨터 자원 관리를 이해하기 위해서는 컴퓨터의 구조를 어느 정도 이해하고 학습을 해야 할 필요가 있다. 따라서 이번 포스트에서는 C언어를 학습하기 전 필요한 기초적인 컴퓨터의 구조에 대해서 다룰 것이다.
컴퓨터를 구성하는 코어 장치는 CPU (연산 장치) + RAM (메모리)가 있다.
추가적으로 HDD or SSD라는 보조기억장치가 있으며 해당 기기들은 주변기기이다.
C언어를 사용할 때 사용자가 직접 사용하는 것은 RAM을 많이 사용하게 된다.
+ 용어
virtual mochine = 머신은 cpu를 의미하며 보통 인텔의 '' cpu라고 하면 하드웨어인 cpu 그 자체를 의미하며 버추얼 머신이라는 것은 cpu처럼 머신 역할을 하는 소프트웨어 프로그램을 의미함
virtual memory = 저장 공간을 가상화 시스템으로 사용하는 방식으로 모든 운영체제에서 사용하며 따라서 RAM과 HDD 등으로 따로 구별하지 않는다. 하지만 나중에 C를 배울 때 변수, 동적 할당/ 해제 등의 메모리를 다룬다 라고 한다면 RAM을 다루는 것이라고 생각하면 된다. 그렇다면 보조기억장치는 어떻게 다루는 것인가? File system이라는 것이 있으며 해당 기능을 통해 파일 I/O를 통해 다루게 된다.
CPU의 사용
위에서 언급한 것처럼 컴퓨터의 코어인 CPU와 RAM이 있고 C에서는 사용자는 RAM을 자주 다룬다고 한 것 을 볼 수 있다. 그렇다면 CPU는 다루지 않는 것 인가 ? 한가지 예시를 보자
만약 사용자가 세탁기를 사용하다고 했을 때 사용자는 세탁기의 설명서만 보고 버튼을 눌러서 명령을 내리는 것 처럼 사용자가 CPU에게 연산을 시키려면 머신 코드를 사용하여 머신 ( CPU ) 에게 연산을 수행하라고 명령을 내릴 수 가 있다.
머신 즉 CPU는 매우 복잡하게 되어 있다. 따라서 사용자는 머신을 어떻게 사용하는지 명령을 사용하여 CPU를 다룬다. 이때 명령을 나타내는 것이 머신 코드라고 하는 것 이다. 또한 CPU가 제조사 별로 다 다른 것 처럼 해당 머신을 사용하기 위해 사용하는 머신 코드 또한 제조사 별로 다르다. 그렇기 때문에 C언어라는 고급 언어를 사용하여 컴파일 과정을 통해서 머신에 맞는 코드로 변환 시켜 머신을 동작시키면 된다.
C언어 -> 컴파일 -> 머신코드 -> CPU 동작
위의 자료는 머신을 동작시키는 과정을 그림으로 표현한 자료이다.
1. 사람을 위한 언어인 C , C++ 등의 프로그래밍 언어로 코드 작성
2. 번역기 역할을 하는 컴파일러 or 인터프리터를 통해서 어셈블리 코드 (목적 코드)로 변환
+ 어셈블리 코드는 머신 코드가 사람이 알아 보기에는 너무 복잡하기 때문에 사람이 조금더 알아보기 쉽게 만든 언어
3. 변환 된 어셈블리 코드를 머신 코드로 변환
4. 머신 코드를 통해 CPU가 연산 처리
Memory 계층
메모리의 계층은 다음과 같다. 가장 하위 레이어인 보조 기억 장치에서 필요한 자료를 불러와서 주기억 장치에 올리면 주기억 장치는 CPU에게 정보를 전달하고 CPU내부에 있는 캐쉬 메모리를 통해 레지스터까지 도달하게 된다. 레지스터에 도달하면 레지스터 영역에서 연산을 시행한 뒤 다시 역방향으로 정보를 전달하게 된다.
비유를 해보자면
1. 도서관 (보조 기억장치)에서 책들을 가져옴
2. 책장 (주 기억 장치) 에 읽을 도서를 쌓아둠
3. 책상 ( 캐쉬 )에 읽을 도서를 올려둠
4. 현재 읽는 책 (레지스터)
위에서 설명한 방식으로 정보가 전달 되어 연산이 실행 된다면 CPU와 RAM 사이에서는 엄청난 양의 정보 교류가 일어 날 것이다. 이때 중요 한 것이 CPU가 RAM을 관리를 하게 된다. 이 처럼 CPU가 RAM을 관리 함에 따라 어떻게 하면 효율적으로 메모리를 관리할지에 따른 방법론들이 존재한다.
프로그래머는 CPU가 RAM을 관리하는 방법에 대해서 확실히 이해하고 숙지해야 할 필요가 있으며 어떻게 관리하는지 ? 의 내용은 매우 중요하다.
'C언어' 카테고리의 다른 글
자료형이란 ? (0) 2020.02.06 Hello World 에서 벌어지는 일 (0) 2020.02.06 CPU가 메모리를 관리하는 원리 (0) 2020.02.05 비트 개념과 2진법 (0) 2020.02.05 C언어 프로그래밍을 이루는 세 가지 요소 (0) 2020.02.05