본문 바로가기

TIL

컴퓨터의 구조-폰노이만 ~ 현대 컴퓨터 (22.07.05TIL)

아샬님의 유튜브영상에서 하신 말중에 가장 기억에 남는 부분이 있다. 컴퓨터로 웹개발을 하려면 컴퓨터를 굉장히 잘 알아야 한다는 부분이다. 그래서 이번 포스팅에서는 폰노이만~ 현대 까지의 컴퓨터 구조를 살펴볼 것이다. 과제를 진행하기 전에 내가 컴퓨터에 대해 알고있는 지식이 어떤게 있었나 곰곰히 생각해 보았다. 대학교 신입생때 부모님한테는 CAD때문에 게이밍 노트북을 사달라고 졸랐던 기억이 떠올랐다. 그때는 아무 생각없이 테크 유튜버가 한말을 듣고 16gb ram을 장착한 노트북을 구매했는데 굉장히 단순한 이유였다. "램이 높으면 빨라요!" 이번 포스팅을 진행하면서 컴퓨터 구조를 이해하고 그때 그 유튜버가 왜 그런말을 했는지 이해해보는게 목표이다.

 

 

1. 폰노이만 프로그램 내장방식

폰노이만 구조도

제 1세대 컴퓨터에서 프로그램을 변경할 때마다 외부장치의 조작이 필요했다. 폰노이만은 이러한 비효율적인 방법을 대체하기 위해 새로운 프로그램 구조를 도입했다.폰노이만 방식은 데이터를 외부에서 받지 않고 내부의 기억장치에 저장한 다음 프로그램(소프트웨어)의 명령을 순서대로 꺼내 해독하고 실행하는 개념이다. 폰 노이만 방식은 아래 4단계의 과정이 순차적으로 진행된다.

 

- fetch : cpu가 메모리로부터 명령어를 가져오는 것
- decode : 가져온 명령어의 의미를 해석하는것
- execute : 해석한 명령어를 실행하는 것.
- store : 결과를 저장하는 것

이 방식을 채택해 현재의 컴퓨터 데이터 처리방식은 다음과 같다.

- 프로그램 실행
- 주기억장치(RAM)에 올라가서 데이터를 워드단위로 읽는다.(fetch)
- 읽은 데이터를 CPU에서 처리한다.(decode, execute, store)
- 입출력장치를 이용해 데이터를 받거나 내보낸다.
- 주 기억장치와 CPU 입출력장치로 구성된다.

폰 노이만 방식 덕분에 우리는 별다른 불편함 없이 프로그램 사이를 이리저리 왔다갔다 할 수 있다.(유튜브 보다가 카톡하기) 

하지만 폰 노이만 구조도 단점이 존재한다. ( 폰노이만 병목 )

 

폰 노이만 병목

위의 폰노이만 구조도를 보면 프로그램 메모리와 데이터 메모리가 물리적 구분 없이 하나의 버스를 통해 cpu와 교류하기 때문에 발생한다. 버스에서는 나열된 명령을 한 번에 하나씩(직렬)만 쓸 수 있기 때문에 cpu의 처리속도가 아무리 빨라도 기억장치에서 속도저하가 발생해 전체 시스템의 속도가 느려진다는 단점이 있다. 현실에서 예를 들자면 빨래 해놓고 분류없이 옷을 한군데 개어 놓았다가 나중에 필요한 옷 찾으려고 하나하나 들춰봐야하는 상황과 비슷하다. 이러한 부분을 해결하기 위해 하버드 구조가 출현하였다.

2. 하버드 구조

하버드 구조도

하버드 구조에서는 기존 폰노이만 구조의 단점을 해결하기 위해 CPU가 명령어와 데이터를 동시에 사용할 수 있도록 각각의 버스를 물리적으로 분리하였다. 현재 명령이 끝남과 동시에 다음 명령을 읽어들일 수 있으므로 폰노이만 보다 더 빠르다. 폰노이만 구조와 하버드 구조를 잘 섞어서 현대컴퓨터의 구조가 탄생하였다.

3. 현대 컴퓨터의 구조

현대 컴퓨터의 구조도를 보기 앞서 우리가 컴퓨터를 전원을 키면 어떤일이 발생할까?에 대해서 먼저 알아보자. 다음과 같은 순서로 작동한다.

1. cpu로 전기가 흘러들어감.
2. PC레지스터를 ROMBIOS의 부트 프로그램 주솟값으로 초기화함.
3. 부트 프로그램이 CPU이상 테스트.
4. 이상이 없다면 POST작업 실행
POST : CPU, 메모리, 그래픽 카드등 전체 하드웨어를 검사하는 테스트(Power On Self Test)
5. POST를 마친 후 하드디스크로 넘어가서 OS를 검사한다.
6. 문제가 없으면 부팅권한을 가진 다음, 하드디스크 내의 MBR영역을 확인한다.
MBR(Master Boot Record) : 하드디스크의 맨 앞 부분에 기록되어 있는 영역으로 여기서 확인된 운영체제에 의해 화면이 나타난다.
7. MBR을 체크하고 부트로더를 찾아서 확인이 되면 윈도우 부팅을 진행할 부팅파티션을 찾는다. 이 때 부팅 파티션을 C드라이브라고 한다.
8. 부팅 파티션까지 검사를 하면 운영체제를 구동한다.

컴퓨터 구조

현대 컴퓨터 구조도

먼저 컴퓨터를 세 부분으로 나눈다면 하드웨어, 소프트웨어, 펌웨어로 구성되어 있다. 하드웨어는 앞서 폰노이만 구조에서도 자주 보았던 CPU, main memory, 입출력 장치로 구성되어 있다. 다들 알겠지만 물리적인 장치를 의미한다.

 

소프트웨어는 응용프로그램과 시스템 소프트웨어로 구성된다. 우리가 사용하는 프로그램은 대부분 소프트웨어라고 생각하면 편하다. 응용소프트웨어와 시스템 소프트웨어를 가르는 명확한 기준은 없지만 시스템 내부와 관련이 더 많은 것을 시스템 소프트웨어라고 부른다.(운영체제, 컴파일러)

 

펌웨어는 하드웨어와 소프트웨어 중간에 위치하는 소규모 프로그램이다. 하드웨어에 접근하여 기능을 추가하거나 업그레이드를 도운다.

컴퓨터 내부의 데이터 표현

디지털 세계라는 말 답게 컴퓨터는 2진수를 사용해 데이터를 주고받는다. 2진수에서의 정보 표현 단위는 다음과 같다.

- 비트(bit) : 컴퓨터 내부 정보 저장(표현)의 기본 단위이다. 1비트는 2가지 상태(0/1)만 표현 가능하다.
- 바이트(byte) : 1byte = 8bit
- 워드(word) : 여러 개의 바이트를 뭉친 단위다. 컴퓨터에서는 워드 단위로 주소를 지정한다.(CPU → 메인 메모리로 보내는 주소 : 워드 단위로 지정)
- 반워드 : 2byte
- 전워드 : 4byte
- 더블워드 : 8byte

논리회로 기초

컴퓨터가 2진수(기계어)로 하드웨어간에 어떻게 소통하는지 알아보기 위해 논리회로를 공부해보자.

 

논리 회로 하나하나는 연산들을 실제로 수행하는 하드웨어 소자이다. 회로라고 부르면 circuit을 생각하기 쉽지만 여기서는 gate를 의미한다. gate가 모이면 -> circuit가 모이면 -> computer가 된다.

 

기본 게이트는 입력을 받고 정해진 연산을 거쳐 결과를 출력한다. 다음과 같은 기본게이트 들이 존재한다.

- and
- or
- not
- xor
- nand
- nor

논리 회로 표현 방식을 살펴보자면 회로 내부 동작 방식은 숨기고, 입출력의 개수와 이름만 표시한다. 진리표 또는 논리식, 논리도, 회로도로 표현한다.

- 논리식 : 논리 연산자로 구성된 식별자들의 나열로 표현하는 식
- 논리도 : 논리 게이트들로 표현한 그림
- 진리표 : 논리 회로에 입력 가능한 모든 경우에 대해 출력값을 나타낸 표

그리고 논리 회로의 2가지 종류가 있다. 입력값 만으로 출력값이 결정되는 회로인 조합 논리 회로, 입력값 + 회로내부의 상태가 출력값에 영향을 미치는 순서논리회로로 구성된다. 이 둘의 차이는 고등학생때 배웠던 순열과 조합의 차이라고 보면 좋을 것 같다.

조합 논리 회로

카르노 맵

논리회로는 모두 불 대수 법칙을 따른다. 불 대수 법칙이란 중고등학생때 배웠던 집합 개념을 수식으로 그대로 옮긴 정리라고 생각하면 된다.

조합논리회로에서는 And-or(SOP : 곱의 합) 또는 or-and회로(POS : 합의 곱)으로 회로를 간소화시킨다. 가장 많이 쓰이는 간소화 모델은 카르노 맵인데 이를 이용해 식을 간소화 하면 회로구현이 굉장히 간단해 진다. 카르노 맵에 대해 자세한 내용은 다음 포스팅에서 다뤄보도록 하겠다.

순차 논리 회로

순차 논리회로는 회로의 상태도 출력값에 영향을 미치기 때문에 플립플랍이라는 셀을 이용해 회로의 상태를 저장한다.

먼저 플립플랍을 살펴보자.

플립플랍?
- 외부 신호가 들어오기전까지 현재 상태를 유지하는 이진 셀 (상태가 바뀐다 -> 플립플랍)
- 0, 1 두가지 상태가 존재
- 보통 클럭에 맞추어 변화가 발생한다.

플립플랍에는 동기, 비동기 플립플랍 두 가지 종류가 있다.

동기 플립플랍은 클럭펄스에 맞추어 플립 플랍이 발생하고, 비동기식 플립플랍은 클럭과 상관 없이 앞단의 플립플랍의 출력 결과에 따라 차례로 동작한다.

컴퓨터 하드웨어

이제 우리에게 그나마 친숙한 하드웨어 구성요소를 한번 살펴보자! 하드웨어는 cpu, memory, 입출력 장치, 버스 4가지 요소로 구성되어 있고 다음과 같은 역할을 한다. 각각의 요소를 자세히 알아보자.

- CPU : 컴퓨터의 머리역할, 연산, 제어 담당
- Main Memory : 읽어온 데이터와 프로그램 코드를 저장
- 입출력 장치외부 → memory, cpu 정보 입력반대로 출력
- 버스 : 요소들 간의 데이터를 주고받는 통로

 

* CPU

cpu는 레지스터, ALU, CU 세가지 요소로 이루어져 있다. 각각의 부품을 살펴보면 다음과 같다.

- 레지스터 : 메모리에서 받아온 데이터를 임시보관하고 cpu에서 연산에 필요한 도구들을 보관
- ALU(산술논리연산장치) : 산술연산 (+-*%)과 논리 연산(and or)을 수행
- CU(제어장치) : 처리할 명령어 해석, 명령 수행에 필요한 제어신호 생성. 하드와이어 제어방식과 마이크로 프로그램 기반 제어방식 존재

 

* 버스

하드웨어 3요소간의 데이터를 전송하는 통로이다. cpu안팎을 기준으로 내부버스, 외부버스로 나눈다. 사용하는 목적에 따라 데이터 버스, 주소버스, 제어버스로도 분류한다. cpu와 메모리간의 읽고쓰는 버스 메커니즘은 다음과 같다.

cpu와 주 기억장치의 읽기/쓰기 과정
- CPU가 버스에 데이터를 싣는다.
- 주 기억장치는 제어 버스에 실린 제어 신호를 확인한다.
- 읽기 작업인 경우, CPU는 데이터 버스에 실린 값을 CPU로 가져온다.

 

* 기억 장치

- 주 기억 장치

주 기억장치는 CPU가 직접 접근할 수 있는 유일한 대용량 저장장치이고, CPU가 실행할 프로그램과 데이터가 저장되는 곳이다.

ram과 rom으로 나뉜다.

  • RAM : 전원을 차단하면 저장된 내용이 없어지는 휘발성 메모리. 대부분의 개인용 컴퓨터 메인메모리다.
  • ROM : 전원을 차단해도 저장된 내용이 지워지지 않는 비휘발성 메모리. (ssd, hdd...)

- 캐시 메모리

주 메모리와 cpu간의 속도 차이를 줄이기 위한 메모리이다.주 메모리에서 최근 사용한 데이터를 보관한다. CPU는 작업을 진행할 때 캐시 메모리에 필요한 데이터가 있는지부터 살펴보고  없으면 주 메모리에 접근한다.

 

* 입출력 장치

- 입출력 장치

입출력 장치는 입력장치, 출력장치, 포트로 구성되어 있다. 입력장치는 외부 데이터를 cpu, memory로 받을 때 쓰는 장치를 의미하고 출력장치는 cpu, memory에서 데이터를 내보내는 장치를 의미한다. 포트는 이러한 입출력 장치와 컴퓨터를 연결하는 통로이다.

  • 예시
    • 입력장치 : 키보드, 마우스, 마이크
    • 출력장치 : 모니터, 스피커
    • 포트 : usb

- 인터럽트

인터럽트는 CPU가 특정 기능을 수행하는 도중 급하게 다른 일을 처리하고자 할 때 사용할 수 있는 기능이다. 하드웨어에 의해 발생한 인터럽트를 외부 인터럽트, 데이터처리(소프트웨어)에서 발생한 인터럽트를 내부 인터럽트라고 한다. 응급한 문제를 먼저해결할 수 있는 갓길정도로 생각하면 편할 것 같다.

 

마치며

이번 포스팅 서두에 적었듯이, 내가 가장 궁금했던 부분은 RAM이 무엇인가? 하는 부분이었다. RAM이 기억장치라는 것도 오늘 처음알았고(ssd, hdd만 기억장치 인줄 알았다...) 폰노이만 구조에서 cpu성능이 아무리 좋아도 메모리(주 기억장치)가 시원찮으면 전체 성능이 나아질 수 없다는 점을 깨닫고 내가 궁금했던 의문이 풀렸다. 다음 포스팅에서는 컴퓨터의 각 부품에 대해 세세하게 알아보고 내가 원하는 목적에 맞는 PC를 직접 견적맞춰볼 것이다.