티스토리 뷰

CPU

- CPU는 기계어로 된 코드를 읽어 연산을 할 수 있다.

- 컴퓨터에서 가장 중요한 CPU는 다양한 종류가 있다. 보통 이 종류를 Architecture라고 부른다. 우리가 흔히 사용하는 CPU는 Microcomputer CPU이다. 인텔의 IA-32AMD의 AMD64와 같은 CPU를 Microcomputer CPU라고 한다. 모바일 기기나 작은 장치에 사용되는 Embedded CPU의 예로는 ARM이 있다. 또 Server나 Mainframe CPU는 MIPS, IBM의 SSystem/360등이 있다.

이렇게 용도에 따라 사용되는 Architecture가 다르고, 각각의 기계어들도 다 다르다. 이 글에서는 가장 흔하고 많이 사용되는 x86 프로세서 계열에 대해 다룰 것이다. 가정이나 개인 용도로 흔히 사용하는 인텔과 AMD의 CPU들이 대부분 x86 계열이다.

CPU의 구성

CPU는 스터 / 클럭 / 제어 장치 / 산술 논리 연산 장치로 구성되어 있다.

레지스터는 연산에 필요한 데이터를 저장한다.

클럭은 다른 시스템 구성요소를 CPU의 내부와 동기 시킨다.

제어 장치(Control Unit)는 기계 명령어를 실행하는 순서를 제어한다.

산술 논리 연산 장치(Arithmetic Logic Unit)는 덧셈, 뺄셈과 OR, AND NOT과 같은 논리 연산을 수행한다.

CPU는 메인보드에 있는 CPU 소켓에 부착된 핀을 통해 다른 부품들과 통신한다. 핀은 데이터 버스, 제어 버스, 주소 버스에 연결된다.

메모리는 프로그램이 실행되는 동안 명령어와 데이터를 저장한다. 버스는 데이터를 컴퓨터의 한 부분에서 다른 부분으로 전송한다. 데이터 버스, 입출력(I/O) 버스, 제어 버스, 주소 버스로 구성된다. 데이터 버스는 CPU와 메모리 간에 명령어와 데이터를 전송한다. 입출력 버스는 CPU와 입출력 장치간의 데이터를 전송한다. 제어 버스는 버스에 연결된 모든 장치의 동작을 동기화하기 위해 2진 신호를 사용한다. 주소 버스는 현재 실행중인 명령어가 CPU와 메모리 간에 데이터를 전송할 때에 명령어와 데이터의 주소를 가지고 있다.

명령어 실행 사이클

- 하나의 기계어 명령어 실행은 명령어 실행 사이클이라는 연속적인 개별 동작으로 나누어진다. 프로그램은 실행되기 전에 메모리에 적재된다. 명령어 포인터(IP)는 다음 명령어의 주소를 가리킨다. 명령어 큐는 실행되려고 하는 명령어들을 저장한다.

- 기계어 명령어를 실행하려면 인출(fetch), 해독(decode), 실행(execute)의 3가지 기본 단계가 필요하다. 명령어가 메모리 피연산자를 사용할 때에는 피연산자 인출(fetch operand)과 출력 피연산자 저장(store output operand)의 두 단계가 더 필요하다.

- 인출​은 제어 장치가 명령어 큐에서 다음 명령어를 인출하고 명령어 포인터를 증가시키는 것을 말한다.

해독은 제어 장치가 명령어가 무엇을 할 지 결정하기 위해 명령어의 기능을 해독한다.

명령어의 입력 피연산자를 산술 논리 연산 장치로 전달하고 수행될 연산을 알려주는 신호를 산술 논리 연산장치로 보낸다. 피연산자 인출은 명령어가 메모리에 있는 입력 피연산자를 사용하면 제어 장치는 피연산자를 읽어서 내부 레지스터로 복사하기 위하여 읽기 동작을 한다.

실행은 산술 논리 연산 장치가 명명된 레지스터와 내부 레지스터를 피연산자로 사용하여 명령어를 실행하고 결과를 레지스터나 메모리로 보낸다.

출력 피연산자 저장은 출력 피연산자가 메모리에 있다면 제어 장치는 데이터를 저장하기 위해서 쓰기 동작을 한다.

간단히 인출 - 해독 - 실행의 순서를 반복한다고 생각하면 된다.

레지스터

레지스터는 CPU안에 있는 고속 저장 장소이며 일반 메모리보다 훨씬 빠른 속도로 접근되도록 설계되었다.

캐시메모리

- 캐시메모리는 주 기억장치와 CPU사이에 위치하며, 자주 사용하는 프로그램과 데이터를 기억한다.

- 캐시 메모리는 메모리 계층 구조에서 가장 빠른 소자이며, 처리 속도가 거의 CPU의 속도와 비슷할 정도의 속도를 가지고 있다.

- 캐시 메모리를 사용하면 주 기억장치를 접근하는 횟수가 줄어들어 컴퓨터의 처리 속도가 향상된다.

- 캐시 주소표는 검색 시간을 단축시키기 위해 주로 연관기억장치를 사용한다.

- 캐시의 크기는 보통 수십 KByte ~ 수백 KByte이다.

Memory

- CPU가 작업을 위해 프로그램이나 데이터를 불러와서 작업 공간으로 사용하는 기억장치이다.

- 일반적으로 컴퓨터에서 메모리라고 하면 상황에 따라 여러가지를 의미하지만, 가장 좁은 의미로는 RAM, 즉 '메인 메모리(=주 기억장치)'를 의미한다. RAM은 기억할 내용이 전기적인 신호로 저장되기 때문에 하드디스크를 이용하는 것보다 속도가 매우 빠르게 반응한다. 물론 빠른 속도 때문에 컴퓨터의 주 기억장치로 사용되는 것이다.

- 'Random Access Memory'는 어떤 위치에라도 곧바로 접근할 수 있다는 의미이다. 즉 어떤 데이터를 찾기 위해 처음부터 하나씩 찾아가는 방식이 아닌 특정 위치에 직접 저장하거나 검색할 수 있는 방식으로 편성되고 통제된다는 의미이다. 물론 빠른 속도를 위해서이다.

- 보조 기억 장치에 있는 프로그램들이 실행될때 주 기억장치인 메모리에 적재되어 프로세스라는 이름으로 실행된다. 메모리는 보조 기억장치보다 속도가 빠른 대신에 가격이 비싸다. 그래서 메모리를 어떻게 효율적으로 사용할 수 있을 것인가에 대해서 나온 여러가지 메모리 관리 기법이 있다. 그런 관리 기법의 큰 범주인 가상 메모리(Vritual Memory)를 살펴보자.

가상 메모리(Virtual Memory)

- 가상 메모리란 메모리를 관리하는 기법 중 하나로, 실제 메모리 주소가 아닌 가상 메모리 주소를 사용하는 방법을 말한다. 덕분에 메모리의 용량이 한정되어 있어도 더 많은 용량의 메모리를 사용할 수 있게 된다. 예를 들어 메모리가 4GB가 있다. 이때 물리 메모리는 4GB이지만 가상 메모리 기법을 사용하면, 프로세스마다 각각 4GB를 사용할 수 있다. 어떻게 이런 게 가능할 수 있을까 알아보도록 하겠다.

- 가상 메모리에는 다시 세그먼트 기법과 페이징 기법이라는 2종류로 나뉜다.

 

세그먼트(Segment) 기법

- 세그먼트 기법이란 가상 메모리를 서로 크기가 다른 논리적 단위인 세그먼트(Segment)로 나누는 것을 말한다. 이게 무슨 말인가 하면, 메모리를 용도에 따라 영역을 나누는 것이다 라고 쉽게 설명할 수 있다.

위의 그림이 가상 메모리가 세그먼트로 나뉘어 있는 모습이다.

- 32-bit 시스템 기준으로 4GB의 가상 메모리 중 가장 낮은 주소부터 1GB는 커널(Kernel)영역이다. 이 영역은 사용자(프로그래머)가 접근할 수 없으며 접근 시 Segment Fault가 일어나게 된다.

그 위로 3GB는 사용자(User) 영역이다. 사용자가 작성한 코드나 변수 등이 이곳에 위치한다.

- Stack Segment는 함수의 매개변수나 지역 변수가 함수가 실행되는 동안에 저장되는 영역이다. Stack Segment의 특이한 점은 주소값이 밑으로 자란다는 점이다. 예를 들어 0xBFFF1000보다 0xBFFF2000이 더 낮은 주소인 것이다. 함수가 호출되면 Stack Frame을 형성하고 Stack Pointer를 그 함수의 지역 변수의 크기만큼 빼준다. 그리고 함수가 반환된 후에 빼준 만큼 다시 더해준다. Stack Frame이라는 것은 그 함수의 기준점이라고 생각하면 된다. 이 Stack Frame을 기준으로 변수나 매개변수의 주소를 계산한다.

- Memory Mapping Segment는 공유 라이브러리가 저장되어 있는 영역이다. 소스 코드를 컴파일 할 때 정적 라이브러리가 아닌 공유 라이브러리를 사용한다면, 공유 라이브러리는 이곳에 저장된다. 이 영역도 Stack Segment와 마찬가지로 주소값이 밑으로 자란다.

- Heap Segment는 사용자(프로그래머)가 동적 할당한 변수가 저장되는 영역이다. C언어의 malloc과 같은 함수로 할당한 변수를 말한다.

- BSS Segment는 초기화되지 않은 전역 변수가 저장되는 영역이다.

- Data Segment는 초기화된 전역 변수가 저장되는 영역이다.

- Text Segment는 Code Segment라고도 불리며, 프로그램의 실행 코드가 저장되는 영역이다.

페이징(Paging)기법

페이징 기법이란 가상 메모리를 서로 같은 크기의 블록으로 나누는 것을 말한다. 이때 블록을 페이지(page)라고 한다. 안 쓰는 페이지는 보조 저장 장치에 Page file로 저장시켜놓고 그 페이지가 필요할 때마다 스와핑(Swapping)을 하여 페이지를 교체해 준다.

롬(ROM, Read Only Memory)

- 보통 메모리를 생각할 때, 필요한 정보를 기억시키기도 하고, 또 기억된 내용을 꺼내 쓰기도 하는, 즉 읽고 쓰기가 모두 가능한 경우가 대부분일 것이다. 하지만 ROM은 저장된 정보를 읽을수만 있고, 새로운 정보는 기억시킬 수 없는 메모리를 말한다.

- ROM은 '읽기 전용 메모리'라는 뜻을 가지고 있다. 대게 ROM에는 윈도우 같은 운영체제를 가동하기 전에, 컴퓨터의 각 구성요소를 점검하기 위한 기본 정보들이 들어 있고, 모니터, 키보드, 디스크 드라이브 등이 서로 어떻게 정보를 전달하고, 이용할 것인지를 제어하는 기본 입출력시스템, 즉 바이오스 정보가 들어있다. 이런 것들은 아예 컴퓨터가 만들어질 때 제조회사에서 미리 결정하여 입력하는 정보이므로, 사용자가 임의로 바꾸거나 할 일은 없는 셈이다.

REFERENCE

https://d4m0n.tistory.com/12 ★나중에 다시 정독 (페이징 기법에 대한 자세한 설명)

http://www.clickhd.co.kr/xe/clickhd_qna/1607

https://m.blog.naver.com/PostView.nhn?blogId=oasisloan&logNo=220387105293&proxyReferer=https%3A%2F%2Fwww.google.com%2F

https://coding-factory.tistory.com/357

댓글