안경잡이개발자

728x90
반응형

● 프로그램

 

  컴퓨터를 움직이게 하려면 명령을 내려야 합니다. 프로그래밍 언어는 인간이 컴퓨터와 의사소통할 수 있도록 컴퓨터에 내리는 명령으로서 프로그램을 처리하도록 기술한 언어를 말합니다. 프로그램을 짜는 이유는 다음과 같습니다. 프로그램을 작성함으로써 '주어진 문제를 보다 쉽고, 빠르게 해결하기 위해서 처리하는 명령어의 묶음을 컴퓨터에게 제시할 수 있습니다.' 프로그램은 인스트럭션(Instruction)이라는 흔히 말하는 명령어로 쓰여져 있으며, 컴퓨터는 이러한 명령어를 논리적 순서에 따라 수행합니다. 이러한 명령어는 2진수 형태의 기계어로 쓰여있기 때문에 인간이 이해하기 힘듭니다. 이 문제를 해결하기 위해서 인간도 쓰기 쉽고 컴퓨터도 기계어로 해석할 수 있는 프로그래밍 언어(Programming Language)를 개발하여 사용하게 된 것입니다.​

  저급 언어

  저급 언어란 컴퓨터 내부 표현에 가까운 언어로 기계어와 어셈블리어로 나눌 수 있습니다. 기계어는 0과 1로 작성하는 언어이고, 어셈블리어는 기계어를 인간이 이해하기 쉽도록 기호로 표현하여 작성한 언어를 말합니다.​ 먼저 기계어는 0과 1로 된 2진수 형태의 언어로서 컴퓨터끼리도 잘 호환되지 않아 실제로는 별로 사용되지 않는 언어입니다. 그리고 어셈블리어는 기계어 명령을 알기 쉬운 기호로 표시하기 때문에 기계어는 물론 사용하고자 하는 컴퓨터 내부 구성과도 관계가 깊습니다. 예를 들어 ADD A라는 어셈블리어 코드는 메모리 A번지에 있는 내용을 누산기(AC)와 더해 다시 누산기(AC)에 저장하라는 의미로서 기계어로 표현하면 약 16bit의 명령어로 표현이 가능합니다.

 ▶ 고급 언어

  사용자의 요구 수준이 높아지고 컴퓨터 기술이 발달하면서 새롭게 다양한 고급 언어가 개발되었습니다.​ 고급 언어는 하드웨어의 기술적 요구를 구체적으로 몰라도 쉽게 작성하고 수정할 수 있는 언어를 의미합니다. 고급 언어는 일상 언어에서 사용하는 표현을 그대로 사용할 수 있게 해줍니다. 예를 들어 +는 덧셈, -는 뺄셈으로 사용하는 등 일반적으로 사용하는 단어나 표현을 그대로 사용합니다. 기계어나 어셈블리어를 쓰려면 기억장치에서 데이터를 읽거나 쓸 때 기억 장소의 주소를 정확히 알아야 합니다. 이에 비해서 고급 언어는 번지 대신 변수 이름으로 기억 장소에 접근하므로 사용자가 기억 장소의 주소를 일일히 기억할 필요도 없습니다. 또한 명령어 하나로 다수의 동작을 지시합니다. 예를 들어 A = B + C X D는 C와 D를 먼저 곱하고 그 결과를 B와 더해 X에 대입하라는 뜻을 가지고 있습니다. 이처럼 하나의 명령어를 이용해 다수의 연산을 실행하도록 해줍니다.

  다음 그림은 고급 언어로 작성한 프로그램을 실행하는 과정입니다. 프로그래머는 먼저 고급 언어와 같은 프로그래밍 언어를 이용해 원시 코드를 작성합니다. ​그 다음으로는 번역기(컴파일러)가 원시 코드를 목적 코드로 변환합니다. 여기서 목적 코드는 기계어로 된 프로그램으로 컴퓨터가 바로 실행할 수 있는 상태의 프로그램 코드를 의미합니다. 목적 코드는 메모리로 옮겨져 실행되고 결과물을 계산해 냅니다.



 ▶ 컴파일

​  프로그래밍 언어로 프로그램을 작성하는 것코딩(Coding)이라고 말합니다. 코딩을 할 때는 개발할 프로그램의 특성에 맞는 프로그래밍 언어를 선택하여 작성해야 합니다. 코딩이 끝나면 고급 언어로 작성된 명령문을 기계어로 바꾸는 컴파일 단계에 들어갑니다. 컴파일은 프로그래밍 언어의 성격에 따라 컴파일러를 이용한 방식과 인터프리터를 이용한 방식으로 나누어집니다. 두 방식을 혼합한 하이브리드 방식 또한 존재합니다.

 - 컴파일러를 이용한 방식

  프로그램 전체를 한 번에 기계어로 번역하는 방식으로 C언어를 비롯한 다양한 언어에서 사용되고 있습니다. 다음 그림은 컴파일러를 이용한 방식으로 프로그램을 실행하는 과정입니다. 컴파일러는 고급 언어로 작성한 원시 코드를 기계어인 목적 코드로 번역합니다. 목적 코드는 로더에 의해 메모리로 옮겨져 실행되어 결과 값을 출력합니다. 컴파일러는 한 번 목적 코드로 번역하고 나면 실행할 때마다 번역할 필요가 없으므로 프로그램 전체의 실행 시간을 줄일 수 있습니다. 하지만 원시 코드의 일부만 수정되어도 프로그램 전체를 다시 번역해야 하므로 번거로울 수 있습니다.​


- 인터프리터를 이용한 방식

​  프로그램을 한 행씩 읽어 번역과 실행을 동시에 하는 방식으로 HTML 등에서 활용됩니다. 원시 코드가 수정될 때마다 프로그램 전체를 번역할 필요가 없으므로 간단한 구조의 프로그램은 편리하나 반복문이나 계속 호출되는 서브 프로그램처럼 많은 횟수로 처리되는 프로그램은 실행 시간이 길어져 비효율적입니다. 다음 그림은 인터프리터를 이용한 방식으로 프로그램을 실행하는 과정을 보여주고 있습니다.



728x90
반응형

728x90
반응형

● 기억장치

 

  중앙처리장치가 어떤 작업을 처리하려면 데이터와 데이터를 처리할 프로그램이 필요합니다. 기억장치는 데이터, 프로그램, 연산의 중간 결과 등을 일시적 또는 영구적으로 저장하는 장치입니다. 기억장치는 접근 속도, 기억 용량, 용도 등에 따라 레지스터, 캐시 메모리, 주기억장치, 보조기억장치로 나누어집니다. 그 종류는 레지스터, 캐시 메모리, 주기억장치, 보조기억장치로 분류할 수 있습니다.

  - 레지스터 : 중앙처리장치 내부에 존재하는 기억장치입니다.​ 접근 시간이 중앙처리장치의 처리 속도와 비슷합니다.

  - 캐시 메모리 : 중앙처리장치가 주기억장치에 접근할 때 속도 차이를 줄이기 위해 사용됩니다. 실행 중인 프로그램의 명령어와 데이터를 저장합니다.

                            기억 용량은 작지만 접근 시간이 주기억장치보다 5 ~ 10배 정도 빠릅니다.

  - 주기억장치 : 중앙처리장치가 직접 데이터를 읽고 쓸 수 있는 장치입니다. 레지스터나 캐시 메모리보다 기억 용량이 큽니다.

  - 보조기억장치 : 주기억장치에 비해 접근 시간은 느리지만 기억 용량이 큽니다. 접근 시간은 주기억장치보다 약 1,000배 정도 느립니다.

​  당연히 이러한 기억장치들은 읽고 쓰는 속도에 비례하여 가격이 올라갑니다. 이러한 이유로 중앙처리장치에 직접 연결된 기억장치에는 기억 용량이 작고 속도가 빠른 장치를 사용하고, 보조기억장치에는 속도는 느리지만 가격이 저려하고 기억 용량이 큰 것을 사용합니다. 다음은 기억장치의 계층 구조를 나타낸 것입니다.

 4 계층 : 레지스터​ 

 3 계층 : 캐시 메모리​

 2 계층 : 주기억장치​

 1 계층 :​ 보조기억장치

  계층이 올라갈수록 접근 속도가 증가하고 저장 비용이 상승합니다. 반면에 기억 용량은 감소하게 됩니다. 따라서 기억장치의 구성 비용과 성능을 고려해서 중앙처리장치가 자주 사용하는 데이터를 상위 계층에 저장하는 편이 훨씬 효율적입니다. 다음 그림은 기억장치에서 데이터의 흐름을 나타낸 것입니다. 중앙처리장치는 보조기억장치에 직접 접근할 수 없기 때문에 보조기억장치에 저장된 프로그램을 실행하기 위해서는 프로그램과 데이터를 주기억장치로 옮겨야 합니다. 중앙처리장치가 주기억장치에서 프로그램과 데이터를 처음 가져올 때는 캐시 메로리로 가져옵니다. 그 이유는 중앙처리장치가 필요로 하는 프로그램과 데이터가 캐시 메모리에서 발견되면 즉시 가져올 수 있기 때문에 접근 시간을 단축할 수 있어서 입니다.

 

 

 리포트를 작성하기 위해 한글을 실행시키면 주기억장치는 보조기억장치에 저장된 워드프로세서 프로그램을 읽어 들입니다. 사용자가 문서 작업을 실행하면 중앙처리장치는 필요한 프로그램과 데이터를 주기억장치에서 가져와 작업을 합니다. 이 때 자주 사용하는 프로그램과 데이터는 속도가 빠른 캐시 메로리로 가져옵니다. 그래야 다음에 접근할 때 속도를 단축시킬 수 있기 때문입니다.​

  주기억장치는 컴퓨터가 동작하는 동안 프로그램, 데이터, 연산의 중간 결과 등을 저장합니다. 중앙처리장치와 직접 데이터를 교환할 수 있도록 내부 버스로 연결되어 있습니다. 일반적으로 말하는 기억장치는 주기억장치를 말합니다.​ 램(RAM)전원 공급이 중단되면 저장된 정보가 모두 지워지는 휘발성 메모리로 정보를 기록하고 해독하는 장치입니다. 정보의 저장 위치에 관계없이 일정한 시간 내에 읽거나 쓸 수 있는 임의 접근 기억장치입니다. 램은 제조 기술에 따라 DRAM과 SRAM으로 구분됩니다.

 - DRAM : DRAM은 트랜지스터 내의 축전지에 충전된 전하를 이용하여 정보를 저장합니다. 축전지에 충전된 전하의 존재 유무를 0과 1로 구분하는데, 축전지의 전하는 시간이 지나면​ 방전되므로 주기적으로 충전 해야 합니다. DRAM은 가격이 저렴하고 전력 소모가 적으며 동작 속도가 빠르고 직접도가 높습니다. 따라서 대용량 메모리로 쓰기에 적합하여 주기억장치로 사용됩니다.

 - SRAM : SRAM은 플립플롭 기억소자로 구성되며 전원이 공급되는 동안 정보가 계속 유지되기 때문에 DRAM처럼 주기적으로 충전하지 않아도 됩니다. SRAM은 DRAM에 비해 회로가 복잡하고 전력 소모가 많으며 가격 또한 비싸지만 동작 속도가 빨라 캐시 메모리에 주로 사용됩니다.

​  캐시메모리중앙처리장치와 주기억장치의 속도 차이로 발생하는 병목현상을 완화하기 위해서 필요합니다. 즉, CPU가 주변장치에 비해서 상대적으로 빠르기 때문이라는 것입니다. 캐시 메모리는 주변 장치와 CPU 사이에 존재하면서 이러한 성능 저하를 막아줍니다. 캐시 메모리를 상대적으로 용량이 적어 주기억장치의 내용 전체가 아니라 일부만 저장합니다. 중앙처리장치는 주기억장치로부터 프로그램이나 데이터를 가져올 때 우선적으로 원하는 정보가 캐시 메모리에 존재하는지 검사합니다. 원하는 정보가 캐시 메모리에 존재하면 바로 읽어오고, 존재하지 않으면 주기억장치에서 캐시 메모리로 저장한 후 읽어옵니다.

  중앙처리장치가 필요로 하는 정보가 캐시 메모리에 존재하는 상황을 캐시 적중이라고 하며 존재하지 않는 상황을 캐시 미스라고 말합니다. 원하는 정보가 캐시 메모리에 존재할 확률을 나타내는 캐시 적중률(Hit Ratio)는 다음과 같이 정의합니다. 캐시 적중률이 높을수록 컴퓨터의 성능이 우수해집니다.​

  캐시 적중률(H) = 캐시 적중 횟수 / 전체 기억장치 참조 횟수

  캐시 메모리를 사용하면 기억장치의 평균 접근 시간이 상당히 많이 개선됩니다. 캐시 메모리를 사용할 때 기억 장치의 유효 접근 시간은 다음과 같습니다.

 

  유효 접근 시간 = ​(H X 캐시 적중 시 기억장치 접근 시간) + ((1 - H) + 캐시 미스 시 기억장치 접근 시간)

​  예시 ) 캐시 메모리 접근 시간이 20ns, 주기억장치 접근 시간이 100ns, 캐시 적중률이 95%일 때 기억 장치의 유효 접근 시간은 ?

  ( 0.95 X 20ns ) + ( 0.05 X 120ns ) = ​25ns

​  여기서 중요한 점은 캐시 미스일 때는 캐시 접근 시간 + 주기억장치 접근 시간을 모두 더한 120ns로 계산한다는 점입니다.

728x90
반응형

728x90
반응형

● 중앙처리장치

 

  중앙처리장치는 대부분이 이미 알고 있듯이 컴퓨터에서 가장 핵심적인 역할을 수행하는 부분으로서 '인간의 두뇌'에 해당합니다. 중앙처리장치는 다음과 같이 연산장치, 제어장치, 레지스터 3가지로 나누어 설명하는 경우가 많습니다.

 - 연산 장치 : 덧셈, 뺄셈, 곱셈, 나눗셈 등의 산술연산과 논리곱, 논리합, 부정 등의 논리연산을 수행합니다. 두 가지 연산을 모두 수행하기 때문에 산술논리연산장치라고도 말합니다. 연산장치는 연산에 필요한 데이터를 레지스터에서 가져오고, 연산 결과를 다시 레지스터로 보내 저장합니다.

 - 제어 장치 : 명령어를 순서대로 실행할 수 있도록 제어하는 장치입니다. 주기억장치에서 프로그램 명령어를 꺼내 해독한 다음, 해독한 결과에 따라 명령어 실행에 필요한 제어 신호를 기억장치, 연산장치, 입출력장치로 보냅니다. 또한 이들 장치가 보낸 신호를 받아 다음에 수행할 동작을 결정합니다.

​ - 레지스터 : 중앙처리장치의 속도와 비슷한 고속의 기억장치입니다. 명령어 주소, 명령어 코드, 연산에 필요한 데이터, 연산 결과 등을 임시로 저장합니다. 용도에 따라 범용 레지스터와 특수 목적 레지스터로 구분됩니다. 중앙처리장치의 종류에 따라 사용할 수 있는 레지스터의 개수와 크기가 다른 것도 기억해두면 좋습니다. 범용 레지스터란 '연산에 필요한 데이터나 연산 결과를 임시로 저장'하는 레지스터입니다. 반면에 특수 목적 레지스터란 '특별한 용도로 사용하는 레지스터로, 용도와 기능에 따라 구분'되는 레지스터입니다.

​  특수 목적 레지스터 중에서 기억해놓으면 좋은 것들이 아래의 레지스터들입니다.

 1. 메모리 주소 레지스터(MAR) : 읽기와 쓰기 연산을 수행할 주기억장치의 주소를 저장합니다.

 2. 프로그램 카운터(PC) : 다음에 수행할 명령어의 주소를 저장합니다.

 3. 명령어 레지스터(IR) : 현재 실행 중인 명령어를 저장합니다.

 4. 메모리 버퍼 레지스터(MBR) : 주기억자치에서 읽어온 데이터나 주기억장치에 저장할 데이터를 임시로 저장합니다.

 5. 누산기(AC) : 연산 결과를 임시로 저장합니다.

​  중앙처리장치의 동작 과정은 아래와 같습니다.

 1. 주기억장치는 입력장치에서 입력받은 데이터 또는 보조기억장치에 저장된 프로그램을 읽어옵니다.

 2. 중앙처리장치는 프로그램을 실행하기 위해 주기억장치에 저장된 프로그램 명령어와 데이터를 읽어와 처리하고

     결과를 다시 주기억장치에 저장합니다.

 3. ​주기억장치는 처리 결과를 보조기억장치에 저장하거나 출력장치로 내보냅니다.

 4. 제어장치는 1 ~ 3 과정에서 명령어가 순서대로 실행될 수 있도록 각 장치를 제어합니다.

​  명령어 세트란 중앙처리장치가 실행할 명령어의 집합으로서 중앙처리장치에 따라 형식과 종류가 서로 다릅니다. 명령어는 실행할 연산을 나타내는 연산 코드(Operation Code)와 연산에 필요한 데이터나 데이터의 저장 위치를 나타내는 피연산자(Operand)로 구성됩니다.​

 

연산 코드(OP Code)

피연산자(Operand)

​  연산 코드는 실행하는 연산의 종류에 따라 다음과 같이 네 가지 기능으로 나뉩니다.

 - 연산 기능 : 사칙연산, 시프트, 보수 등의 산술연산과 논리곱, 논리합, 부정 등의 논리연산을 수행합니다.

 - 제어 기능 : 조건 분기와 무조건 분기 등을 사용하여 명령어의 실행 순서를 제어합니다.

 - 데이터 전달 기능 : 레지스터와 레지스터 사이, 레지스터와 주기억장치 사이에서 데이터를 전달합니다.

 - 입출력 기능 : ​프로그램과 데이터를 주기억장치에 전달하고, 연산 결과는 출력장치로 전달합니다.

  연산 코드는 길이가 n비트일 때 최대 2^n개의 연산을 정의할 수 있습니다. 예를 들어 연산 코드의 길이가 4비트이면 최대 16가지 연산을 정의할 수 있게 되는 것입니다.

  피연산자는 주소, 숫자, 문자, 논리 데이터 등을 저장할 수 있습니다.

 - 주소 : 기억장치 혹은 레지스터의 주소가 저장됩니다.

 - 숫자/문자 : 숫자는 정수, 고정 소수점 수, 부동 ​소수점 수 및 각각의 코드로 저장되고 문자는 아스키 코드로 저장됩니다.

 - 논리 데이터 : 참 또는 거짓을 표현할 때 사용하며 비트나 플래그 등으로 저장됩니다.​

​  중앙처리장치는 프로그램을 실행하기 위해 주기억장치에서 명령어를 순차적으로 인출하여 해독하고 실행하는 과정을 반복합니다. 중앙처리장치가 주기억장치에서 한 번에 하나의 명령어를 인출하여 실행하는 데 필요한 일련의 활동을 '명령어 사이클(Instruction Cycle)'이라고 말합니다. 명령어 사이클은 인출 사이클과 실행 사이클로 나뉩니다. 주기억장치의 지정된 주소에서 하나의 명령어를 가져오고, 실행 사이클에서는 명령어를 실행합니다. 하나의 명령어 실행이 완료되면 그 다음 명령어에 대한 인출 사이클이 시작됩니다.

 

 

  명령어 사이클을 세분화하면 구체적으로 인출 사이클, 실행 사이클, 간접 사이클, 인터럽트 사이클로 나눌 수 있습니다. 이 때 인출 사이클과 실행 사이클은 항상 수행되지만 간접 사이클과 인터럽트 사이클은 주소 지정 방식이 필요할 때나 인터럽트 요구가 있을 때만 수행됩니다.

  구체적으로 인출 사이클과 실행 사이클에 의한 명령어 처리 과정을 이해하기 위해서는 조금 더 복잡한 지식이 수반됩니다. 인출 사이클에서 가장 중요한 부분은 바로 프로그램 카운터(PC) 값의 증가입니다. 프로그램 카운터는 다음에 수행할 명령어의 주소를 포함하고 있습니다. 다음 묘사는 인출 사이클에 사요되는 특수 목적 레지스터의 종류와 인출 사이클의 동작 과정을 보여줍니다.

 

 

  위에서 보시면 먼저 PC에 저장된 주소를 MAR로 전달하는 것을 볼 수 있습니다. 그 이후에 MAR에 저장된 내용을 토대로 주기억장치의 해당 주소에서 명령어를 인출합니다. 그 뒤에는 인출한 명령어를 MBR에 저장합니다. 여기서 중요한 포인트가 다음 명령어를 인출하기 위해 프로그램 카운터(PC)의 값을 증가시킨다는 것입니다. 마지막으로 메모리 버퍼 레지스터(MBR)에 저장된 내용을 명령어 레지스터(IR)에 전달합니다.

​ ● 인출 사이클의 마이크로 연산

   T0 : MAR <- PC

   T1 : MBR <- M[MAR], PC <- PC + 1

   T2 : IR <- MBR

​  이렇게 위처럼 프로그래밍 언어처럼 사용할 수 있습니다. 다만 이것은 인출하기까지의 과정이므로 인출한 이후에 명령어를 실행하는 것은 이것과 조금 유사하면서도 다릅니다. 그것을 이해하고 있으면 문제 푸는 것이 전혀 어렵지 않을 것입니다. 그렇다면 실행 사이클은 어떤지 한 번 확인해보도록 하겠습니다. 가장 만만한 것이 더하기(ADD) 연산이므로 이것부터 확인하겠습니다.

 

 ● ADD addr 명령어 연산

​  T0 : MAR <- IR(Addr)

  T1 : MBR <- M[MAR]

  T2 : AC <- AC + MBR

  위처럼 정리할 수 있습니다. 여기서 주의 집중하여 볼 부분은 T1입니다. 메모리에 저장된 데이터 값을 MBR에 저장합니다. 인출 사이클과는 다르게 PC <- PC + 1 이라는 명령어가 존재하지 않는데 이는 이미 인출이 진행이 되고 명령어 실행만 하면 되는 상황이기 때문에 그렇습니다.​ 즉, 이미 인출이 되어 IR에 MBR의 값이 저장된 상태라는 의미입니다. 또한 여기서는 이미 어큐뮬레이터(AC)에 저장된 값에 ADD를 한다는 것이 중요합니다.

728x90
반응형

728x90
반응형

● 컴퓨터의 구성

 

  이번 시간에는 컴퓨터의 구성에 대해서 이야기하는 시간을 가지도록 하겠습니다. 컴퓨터를 보면 참 이상한 회로가 많고 무척이나 어려워 보입니다. 하지만 그 기본적인 구성을 다이어그램(그림)의 형태로 쉽게 이해하고자 한다면 그다지 어렵지 않을 수 있습니다. 컴퓨터 시스템은 기본적으로 하드웨어(Hardware)와 소프트웨어(Software)로 구성됩니다. 하드웨어는 컴퓨터를 구성하는 기계적 장치이고, 소프트웨어는 하드웨어의 동작을 지시하고 제어하는 명령어의 집합입니다. 컴퓨터 구조란 하드웨어를 구성하는 각 장치의 특성과 동작 원리를 다루는 학문입니다. 여기서는 하드웨어의 각 장치에 해당하는 중앙처리장치(CPU), 기억장치, 입출력장치에 대해 하나씩 살펴보도록 하겠습니다.

 

 

  먼저 하드웨어의 구성에 대해서 이야기하는 시간을 가지도록 하겠습니다. 하드웨어는 중앙처리장치, 기억장치, 입출력장치로 구성되며 각 장치는 시스템 버스로 연결되어 있습니다. 시스템 버스는 데이터와 명령 제어 신호를 각 장치로 실어 나르는 역할을 합니다. 다음 그림은 각 장치 사이의 데이터 흐름을 나타낸 것입니다.

 

  위 사진에서 각 화살표들을 바로 '시스템 버스'라고 부르는 것입니다. 이 시스템 버스에 관해서도 나중에 자세하게 다루도록 하겠습니다. 또한 위의 주기억장치와 보조기억장치를 합쳐서 총 '기억장치'라고 부르며 프로그램을 올려놓는 기억 공간이라고 생각하시면 정말 간단합니다. 실제로 컴퓨터에서 하는 모든 처리는 중앙처리장치에서 하는 것이죠. 결과적으로 중앙처리장치가 바로 컴퓨터의 두뇌같은 것이라고 보시면 됩니다.

  중앙처리장치는 인간으로 따지면 두뇌에 해당하는 것으로 CPU라고 부릅니다. 주기억장치에서 프로그램 명령어와 데이터를 읽어와 처리하고 명령어의 수행 순서를 제어합니다. 중앙처리장치는 비교와 연산을 담당하는 산술논리연산장치(ALU)와 명령어의 해석과 실행을 담당하는 제어장치, 그리고 속도가 빠른 데이터 기억장소인 레지스터로 구성됩니다. 개인용 컴퓨터와 같은 소형 컴퓨터에서는 중앙처리장치를 마이크로프로세서라고도 합니다.

  기억장치는 프로그램, 데이터, 연산의 중간 결과 등을 저장하는 장치입니다. 주기억장치와 보조기억장치로 나누어지며 흔히 RAM과 ROM도 여기서 나옵니다. 실행중인 프로그램과 같은 프로그램에 필요한 데이터를 일시적으로 저장합니다. 보조기억장치는 흔히 하드디스크 등을 말하며 주기억장치에 비해 속도는 느리지만 많은 자료를 영구적으로 보관할 수 있다는 장점이 있습니다.

  입출력장치는 입력장치와 출력장치로 나누어지는데 입력장치는 컴퓨터 내부로 자료를 입력하는 장치로서 키보드, 마우스, 조이스틱 등이 있고 출력장치는 프린터, 모니터, 스피커 등의 인간이 인지할 수 있는 여러 가지 형태로 변환하여 컴퓨터에서 외부로 표현하는 장치입니다.​

  시스템 버스란 '하드웨어 구성 요소를​ 물리적으로 연결하는 선'을 의미합니다. 각 구성 요소가 다른 구성 요소로 데이터를 보낼 수 있도록 통로가 되어줍니다. 용도에 따라 데이터 버스, 주소 버스, 제어 버스로 나누어집니다.

​ - 데이터 버스 : 중앙처리장치와 기타 장치 사이에서 데이터를 전달하는 통로입니다. 기억장치와 입출력장치의 명령어와 데이터를 중앙처리장치로 보내거나, 중앙처리장치의 연산 결과를 기억장치와 입출력장치로 보내므로 양방향 버스입니다.

 - 주소 버스 : 데이터를 정확히 실어 나르기 위해서는 기억장치 '주소'를 정해주어야 합니다. 주소 버스는 중앙처리장치가 주기억장치나 입출력장치로 기억장치 주소를 전달하는 통로이기 때문에 단방향 버스입니다. 주소 선의 수는 시스템의 기억장치 용량을 결정합니다. 수가 많을수록 당연히 접근할 수 있는 기억 용량이 커집니다. 예를 들어 주소 선의 수가 8비트이면 주소를 256개 지정할 수 있으며 16비트이면 65,536개를 지정할 수 있습니다.

 - 제어 버스 : 주서 버스와 데이터 버스는 모든 장치에 공유되기 때문에 이를 제어할 수단이 필요합니다. 제어 버스는 중앙처리장치가 기억장치나 입출력장치에 제어 신호를 전달하는 통로입니다. 제어 신호에는 기억장치 읽기 및 쓰기, 버스 요청 및 승인, 인터럽트 요청 및 승인, 클락, 리셋 등이 있습니다. 제어 버스는 읽기 동작과 쓰기 동작을 모두 수행하기 때문에 양방향 버스입니다.

 

 

  위 사진은 램을 도식화한 것입니다. 컴퓨터는 기본적으로 읽고(READ), 처리(PROCESS)한 뒤에 저장(Write)합니다. 이러한 과정에서 주기억장치(RAM)과 끊임없이 소통하는 것입니다. 이 때 데이터를 읽어오는 양을 상정할 수 있습니다. 흔히 운영체제는 32-bit 혹은 64-bit를 사용하게 되는데 64-bit인 경우 중앙처리장치(CPU)는 RAM으로부터 데이터를 한 번에 64비트씩 읽어올 수 있게 되는 것입니다. 64비트면 기본적으로 연결하는 선이 64개는 있어야 하며 다른 말로 해서 워드(Word)가 64비트라고 이야기할 수 있습니다.

728x90
반응형

728x90
반응형

● 컴퓨터의 실수 표현

 

  지난 시간에는 컴퓨터의 정수 표현에 대해서 공부하는 시간을 가졌습니다. 컴퓨터에서 소수점을 표현하는 방식에는 고정 소수점 방식과 부동 소수점 방식이 있습니다. 고정 소수점 방식은 소수점이 항상 고정된 위치에 있다는 의미로 정수를 표현할 때 주로 사용되어집니다. 부동 소수점 방식소수점의 위치가 바뀌기 때문에 실수를 표현할 때 주로 사용하며 고정 소수점 방식보다 넓은 범위의 수를 표현할 수 있습니다.

 

  부동 소수점 방식으로 저장된 실수는 인간에게 다음으로 해석됩니다.

 

  m X r^e ( m : 가수 r : 밑수 e : 지수 )

 

  예를 들어 57.23 X 10^1에서 가수는 57.23, 밑수는 10, 지수는 1이 됩니다. 572.3 X 10^2에서는 가수가 572.3, 밑수는 10, 지수는 2가 됩니다.

 

  컴퓨에서 실수를 부동 소수점 방식으로 저장하면 부호 비트와 지수 부분과 가수 부분 이렇게 세 영역으로 저장이 됩니다. 부호 비트는 양의 실수인지 음의 실수인지 나타내는 부분이고, 지수 부분은 소수점 위치를 나타내며, 가수 부분은 유효 자릿수를 나타냅니다. 부동 소수점 방식은 표현 범위에 따라 4바이트의 단일 정밀도 형식과 8바이트의 이중 정밀도 형식으로 나눌 수 있습니다.

 

  32비트 체제(단일 정밀도 형식)에서는 부호 부분 1, 지수 부분 8, 가수 부분 23개로 비트를 할당합니다.

  64비트 체제(이중 정밀도 형식)에서는 부호 부분 1, 지수 부분 11, 가수 부분 52개로 비트를 할당합니다.

 

  실수를 부동 소수점 방식으로 저장할 때는 정규화 과정을 거칩니다. 예를 들어 2진 소수 101.01 X 2^1은 10.101 X 2^2 등으로 표현해도 그 값이 달라지지 않습니다. 이 때 정규화된 표현은 1.0101 X 2^3입니다. 이와 같이 2진 소수를 정규화시키면 1.XXX로 표현할 수 있습니다. 정규화된 2진 소수 1.0101 X 2^3의 부호는 양수, 가수는 1.0101, 밑수는 2, 지수는 3입니다. 정보를 저장할 때 양의 지수와 음의 지수가 구분되도록 단일 정밀도일 때는 지수에 127을 더하고 이중 정밀도일 때는 1023을 더합니다. 그리고 가수에는 정수 값 1을 생략하고 저장합니다.

 

  위 정규화 과정과 비트 정리 과정을 거치게 되면 '부동 소수점 표현'이 가능해지는 것입니다.

 

  예시 ) 2진수 10110.11011을 단일 정밀도 형식의 부동 소수점으로 나타내봅시다.

 

  2진수 10110.11011을 단일 정밀도 형식의 부동 소수점으로 나타낼 때 먼저 정규화를 해야 하겠습니다.

  정규화를 하게 되면 1.011011011 X 2^4이 됩니다. 부호 비트는 양수이므로 0, 지수는 4이므로 바이어스에 적용하면

  127 + 4 = 131이 됩니다. 결과적으로 10000011(2) = 131(10)이 됩니다.

  수는 정수 값 1을 제외한 011011011을 저장하고 나머지를 0으로 채우므로 변환된 부동 소수점 표현은 아래와 같습니다.

 

  ( 부동 소수점 ) 0 10000011 00000000000000011011011

 

  실제로 이러한 부동 소수점 표현 방식은 IEEE 방식과 IBM 방식으로 나누어지기 때문에 이와 관련한 문제가 출제될 때는 표현 방식에 대해서 구체적으로 명시할 필요가 있습니다. 물론 요즘 주로 쓰이는 방식은 IEEE 방식입니다. 정규화 과정 자체도 시험문제로 많이 출제되는 부분이므로 컴퓨터 개론학에서 반드시 기억하는 것이 좋은 부분입니다.

● 요약

  지금까지 컴퓨터의 수 체계에 대해서 계속 학습해오는 시간을 가졌습니다. 간단하게 배운 내용을 정리하도록 하겠습니다.

  컴퓨터는 0과 1의 2진 체계를 사용하여 데이터를 표현합니다. 또한 진법을 나타낼 때는 수의 오른쪽 아래 첨자로 진법을 나타내는 숫자를 붙입니다. 자릿값이란 해당 진수에 숫자의 위치를 나타내는 제곱수를 적용하는데, 10진수의 자릿값은 10^0(1), 10^1(10), 10^2(100), ... 과 같습니다. 또한 다른 진수를 10진수로 변환할 때는 각 자리의 숫자에 자릿값을 곱한 후 모두 더하면 됩니다. 반대로 10진수를 다른 진수로 변환할 떄는 정수 부분과 소수 부분을 모두 구분하여 변환한 후 그 결과를 조합한다고 하였습니다. 정수 부분은 변환하려는 진수로 나누어 ​떨어지지 않을 때까지 반복하고, 마지막으로 각 단계의 나머지를 역순으로 나열합니다. 소수 부분은 변환하려는 진수를 곱합니다. 곱셈 소수 부분이 0이 될 때까지 반복하며, 마지막으로 각 단계에서 발생하는 정수 부분을 순서대로 나열합니다.

  정보의 표현은 다음과 같습니다. 정보를 표현하는 최소 단위를 바로 비트(Bit)라고 하며 N개의 비트로 표현할 수 있는 정보의 수는 2^N개 입니다. 문자를 표현하는 최소 단위는 바이트(Byte)라고 하며, 8개의 비트로 구성됩니다. 1바이트는 256(2^8)개의 서로 다른 데이터를 표현할 수 있습니다. 워드(Word)란 명령어나 연산을 처리하는 기본 단위로서, 기억장치에 한 번 접근하여 얻을 수 있는 데이터의 양입니다. 코드란 한글, 영문자, 숫자, 특수문자 등 다양한 문자를 구분하기 위해서 각 문자마다 유일한 값으로 표현한 기호 체계입니다.​ 코드의 종류는 아스키 코드, 2진화 10진 코드, 확장 2진화 10진 코드, 유니코드 등이 있습니다.​

  보수란 '두 수의 합이 진법의 밑수가 되게 하는 수를 의미'하며, 음의 정수를 표현하기 위해 고안된 개념입니다. 2진법에는 1의 보수와 2의 보수가 있습니다. 고정 소수점 방식은 '소수점이 고정되어 있다'라는 뜻이지만 실제로 소수점은 존재하지 않습니다. 소수점이 수의 왼쪽에 있다고 가정하면 소수를 나타내고, 오른쪽에 있다고 가정하면 정수를 나타냅니다. 고정 소수점 방식은 주로 정수를 표현하는 데 사용합니다. 고정 소수점 방식에서의 음의 정수 표현은 다음과 같습니다.

 - 부호화 절댓값 방식 : 부호 비트 1과 2진수의 절댓값으로 나타냅니다.

 - 1의 보수 방식 : 부호 비트 1과 2진수의 절댓값에 대한 1의 보수로 나타냅니다.

 - 2의 보수 방식 : 부호 비트 1과 2진수의 절댓값에 대한 2의 보수로 나타냅니다.

  부동소수점 방식이란 '소수점이 포함된 실수를 표현하기 위해 사용되며 부호 비트, 지수 부분, 가수 부분으로 구성되는 방식'입니다. 지수 부분은 소수점의 위치를 나타내고 가수 부분은 유효 자릿수를 나타냅니다.

728x90
반응형

728x90
반응형

● 정수 표현

 

  컴퓨터는 N개의 비트를 이용해 2^N개의 정수만 표현할 수 있습니다. 이러한 방식을 이용해서 수를 표현해야 하기 때문에 쉽지 않습니다. 또한 정수는 음의 정수와 양의 정수로 나누어지기 때문에 +, - 기호 또한 전부 비트로 표현을 해주어야 합니다. 하지만 정확히 어떠한 방식으로 이러한 정수를 표현할 수 있을까요? 그것을 알기 위해서는 보수의 개념을 이해하면 됩니다.

  보수란, '두 수의 합이 진법의 밑수(N)가 되게 하는 수'를 말합니다. 예를 들어 10진수 4의 10의 보수는 6이고, 10진수 2의 10의 보수는 8입니다. 보수는 컴퓨터에서 음의 정수를 표현하기 위해서 고안되었습니다. 컴퓨터 내부에서는 사칙연산을 할 때 덧셈을 담당하는 가산기(Adder)만 이용하기 때문에 뺄셈은 덧셈으로 형식을 변환하여 계산해야 합니다. 즉 컴퓨터 내부에서는 A - B를 계산할 때 B의 보수(-B)를 구한 다음 A + (-B)로 계산하는 것입니다.

 

1의 보수 : 각 자릿수의 값이 모두 1인 수에서 주어진 2진수를 빼면 1의 보수를 얻을 수 있습니다.

  예시 ) 2진수 1010의 1의 보수는 0101입니다.

2의 보수 : 1의 보수에 1을 더한 값과 같습니다.​

  예시 ) 2진수 1010에 대한 2의 보수를 구하려면 2진수 1010에 대한 1의 보수 0101을 구한 다음 1을 더해 0110을 얻습니다.

▶ 덧셈 : 기본적으로 2진수의 덧셈은 10진수의 덧셈과 계산하는 방식이 같습니다.

▶ 뺄셈 : 컴퓨터 내부에서는 덧셈만 가능하기 때문에 뺄셈은 보수를 이용해 덧셈으로 바꿉니다. 

  예시 ) 뺄셈 A - B는 B의 보수를 구한 다음 덧셈 A + (B의 보수)로 바꾸어 계산합니다.

 - 1의 보수 뺄셈 : 1의 보수를 이용한 뺄셈은 빼는 수의 1의 보수를 구한 다음 더합니다. 덧셈한 결과가 최상위 비트에서 자리올림이 생겼다면 최하위 비트에 1을 더하고, 자리올림이 생기지 않았다면 연산 결과에 대해 1의 보수를 구한 후 - 부호를 붙입니다.

  예시 ) ​111(2) - 110(2) = 111(2) + 001(2) = 1000(2)에서 최상위 비트를 지우고 1을 더하므로 답은 1(2)입니다.

  예시 ) 100(2) - 110(2) = ​100(2) + 001(2) = 101(2)에서 다시 1의 보수를 취하므로 답은 10(2)입니다.

​ - 2의 보수 뺼셈 : 2의 보수를 이용한 뺄셈은 빼는 수의 2의 보수를 구한 다음 더합니다. 덧셈한 결과가 최상위 비트에서 자리 올림이 생겼다면 자리올림을 제외한 나머지 부분이 연산 결과이고, 자리 올림이 생기지 않았다면 연산 결과의 2의 보수를 구한 후 - 부호를 붙입니다.

  예시 ) 111(2) - 110(2) = 111(2) + 010(2) = 1001(2)에서 최상위 비트를 지우므로 답은 1(2)입니다.

  예시 ) 1​00(2) - 110(2) = 100(2) + 010(2) = 110(2)에서 답은 010(2)입니다.

▶ 곱셈 : 2진수의 곱셈을 하려면 부분 곱(Partial Product)을 이용합니다.

  예시 ) 110011(2) X 110(2)은 다음과 같이 계산됩니다.

            110011

    X           110

        -----------

​           000000

          110011

        110011

        -----------

      100110010

  결과적으로 답은 100110010(2)입니다.

▶ 나눗셈 : 2진수의 나눗셈을 뺄셈으로 구현합니다.

  예시 ) 100110(2) / 110(2)은 다음과 같이 계산됩니다.

​                   110

​     110  ) 100110

              -110

               --------

                 111

                -110

               --------

                     10​

  결과적으로 몫은 110(2)이고 나머지는 10(2)입니다.

▶ 고정 소수점 표현 : 고정 소수점은 소수점이 고정된 위치에 있다는 의미입니다.​ 소수점이 왼쪽에 있다고 가정하면 소수를 나타내고 오른쪽에 있다고 가정하면 정수를 나타냅니다. 고정 소수점 방식은 용량이 제한적인 컴퓨터에서 매우 큰 수나 작은 수를 표현하기에는 한계가 있어서 정수를 표현할 때 주로 사용되고 있습니다.

  부호(S)에 양의 정수는 0을 저장하고 음의 정수는 1을 저장합니다. 크기에는 정수 값을 2진수로 저장하면 됩니다.

​  고정 소수점 표현에는 음의 정수를 부호화 절댓값 방식, 1의 보수 방식, 2의 보수 방식을 사용하여 나타냅니다.

 - 부호화 절댓값 방식 : 부호 비트 1과 2진수의 절댓값으로 나타냅니다.

 - 1의 보수 방식 : 부호 비트 1과 2진수의 절댓값에 대한 1의 보수로 나타냅니다.

 - 2의 보수 방식 : 부호 비트 1과 2진수의 절댓값에 대한 2의 보수로 나타냅니다.

  양의 정수를 표현할 때는 3가지 방식 모두가 부호 비트에 0을 넣는 방식을 채택하지만, 음의 정수를 표현할 때는 제각각인 것입니다.

  예시) 8비트로 양의 정수 +13과 음의 정수 -13을 나타내면 아래와 같습니다.

표현 방식

+13

-13

부호화 절댓값

0 0001101

1 0001101

1의 보수

0 0001101

1 1110010

2의 보수

0 0001101

1 1110011

  또한 부호화 절댓값 방식과 절댓값 방식이 N비트로 표현할 수 있는 수의 범위는 -(2^N-1 - 1) ~ (2^N-1 - 1)입니다. 반면에 2의 보수 방식은 +0과 -0이 존재하는 부호화 절댓값 방식이나 1의 보수 방식과 달리 -0이 존재하지 않습니다. 즉 음의 정수를 하나 더 표현할 수 있어서 더욱 효율적이라고 할 수 있습니다. 따라서 2의 보수 방식으로 표현할 수 있는 수의 범위는 -2^N-1 ~ (2^N-1 - 1)입니다. 대부분의 컴퓨터에서는 2의 보수 방식을 사용합니다.

10진수

부호화 절댓값

1의 보수

2의 보수

-4

-

-

100

-3

111

100

101

-2

110

101

110

-1

101

110

111

-0

100

111

-

+0

000

000

000

+1

001

001

001

+2

010

010

010

+3

011

011

011

728x90
반응형

728x90
반응형

● 문자 표현

 

 우리는 컴퓨터를 사용할 때 한글, 영문자, 숫자, 특수문자 등 다양한 문자를 사용해야만 합니다. 하지만 이렇게 다양하고 많은 문자들을 도대체 어떻게 컴퓨터로 나타내는 것일까요? 그것은 다양한 문자를 구별하기 위한 특정한 코드 체계가 있기에 가능한 것입니다. 저번 강좌에서 말했듯이 A는 65(10)으로 나타내고, 10은 그대로 10(10)으로 나타내는 식의 코드 체계가 있다면 손쉽게 구현이 가능하겠죠. 우리가 가장 많이 알고 있는 것은 아스키 코드(ASCII​ Code), 유니코드(Unicode) 등이 있겠습니다. 사실 이 두 가지 정도만 알아도 문자 표현에 대해서 전반적으로 알고 있는 것이죠.

 

 1. 아스키 코드

 미국표준협회(ANSI)에서 정의한 것으로 표준 코드입니다. 각 문자를 나타내는 7비트(128개의 문자가 저장 가능)와 오류 검사 비트 1개를 붙여서 총 8비트로 구성합니다. 오류 검사 코드는 패리티 비트라고 합니다. 아스키 코드 중 앞 3비트는 존 비트, 뒤 4비트는​ 디지트 비트라고 하는데 여기까지는 몰라도 됩니다. 아스키 코드에서 0~31번과 127번은 제어 문자, 32~64번은 특수 문자와 숫자, 65~96번은 알파벳 대문자와 특수문자, 97~126번은 알파벳 소문자와 특수문자를 나타내고 있습니다.

 이 외에도 2진화 10진 코드(BCD부터 확장 2진화 10진 코드까지 다양한 코드가 존재합니다. 하지만 사실상 아스키 코드만 알면 더이상 알지 않아도 코드 체계는 다 안다고 봐도 됩니다.

2. 유니코드

 

 유니코드는 전 세계의 모든 언어를 일관성 있게 표현할 수 있도록 만든 국제적 단위의 문자 코드 체계가 되겠습니다. 컴퓨터 간 데이터 교환이 원활할 수 있도록 각각의 문자마다 16비트를 부여합니다. 물론 16비트 이상으로 정의한 것 도 있지만 기본적으로 16비트라고 생각하시면 됩니다. 문자를 최대 65,536(2^16)개 까지 표현할 수 있기 때문에 사실상 모든 문자를 표현할 수 있게 된 것이죠. 최근에는 2015년 6월에 나온 유니코드 8.0부터 시작해 나나일 더욱 향상된 버전을 보여주고 있습니다.

 

 한글 유니코드는 http://www.unicode.org/charts/PDF/UAC00.pdf에서 확인할 수 있습니다. 우리나라 한글 '가'가 유니코드로 AC00로 시작한다는 것 정도는 상식으로 알아두세요.

 

 

728x90
반응형

728x90
반응형

● 정보의 표현

 

 기원 전 2000년경에 수메르인들은 60을 밑수로 하는 60진법을, 고대 로마인은 12을 밑수로하는 12진법을 사용했다고 합니다. 현재는 숫자 10개를 사용하는 10진법을 이용하고 있죠. 하지만 컴퓨터에서는 2진법, 8진법, 16진법이 가장 많이 사용 됩니다. 사실 어떠한 수가 있으면 그 수를 10진법으로 표현하면 10진수, 2진법으로 표현하면 2진수가 되는 것이죠.

​ 예를 들어 8이라는 10진수를 2진수로 바꾸면 1000(2)가 되겠고 8진수로 바꾸면 10(2)가 되고 16진수로 바꾸면 그대로 8이 되겠습니다. 여기까지는 하나씩 차근차근 생각해보면 쉽게 찾아낼 수 있으므로 대략적으로 이해하기만 해도 충분합니다. 자릿값은 수 체계에서 아주 중요한 개념으로서 진법에 따라 각 숫자는 별도의 자릿값을 가지게 됩니다. 모든 진수들은 정수 부분과 소수 부분을 가지게 됩니다. 123.456 이라는 10진수가 있으면​ 123은 정수 부분이고 456은 소수 부분이 되는데 이를 바꿔서 표현하면 이렇게 됩니다.

 1 x 10^2

 2 x 10^1

 3 x 10^0

 

 4 x 10^-1

 5 x 10^-2

 6 x 10^-3

 정말 간단합니다.

 다만 2진수와 8진수 그리고 16진수의 변환은 주의할 점이 있습니다. 예를 들어 2진수로 100101(2)이라는 수가 있다면 이것을 3개씩 묶으면 바로 8진수로 변환이 가능하다는 점입니다. 100101(2) = 45(8)인 것이죠. 이게 바로 8진수와 16진수를 이용하는 가장 큰 이유 중에 하나입니다. 2진법을 채택하는 컴퓨터의 구조 원리에 입각했을 때 아주 효율적입니다. 또한 문자나 숫자 등의 정보를 0과 1의 2진 체계로 처리하는 컴퓨터는 각각의 단어나 ​숫자라는 하나의 정보를 부호화하죠. 예를 들어 A는 65(10) = 01000001(2)로, 10은 10(10) = 00001010(2) 등으로 컴퓨터에서는 저장을 하고 있습니다.

 기본적으로 하나의 정보를 컴퓨터는 8비트 형태로 저장하니다. 8비트는 우리는 1바이트라고 부릅니다. 다만 한글은 알파벳에 비해서 더 많은 비트가 필요해서 한 글자당 2바이트가 필요합니다. 알파벳 및 숫자는 1바이트로 모두 표현이 가능합니다. 또한 워드(Word)라는 단어가 컴퓨터에서 많이 사용되는데 우리가 운영체제를 구입할 때 32비트, 64비트 운영체제를 구입하는 것을 생각하면 됩니다. 워드라는 것이 기억장치에 한 번 접근해서 얻을 수 있는 데이터의 양을 의미하는데 64비트 운영체제를 이용하는 사람은 CPU가 RAM(주기억장치, 램)에서 한 번 데이터를 뽑아올 때 마다 8바이트(64비트)씩 뽑아오니까 아주 좋은 성능을 갖추고 있다고 할 수 있는 것입니다. 요즘엔 거의 모든 사람들이 32비트 혹은 64비트 운영체제를 이용하고 있죠.​

​● 진법 변환

 진법 변환은 그다지 어렵지 않기 때문에 빠르게 이해하고 넘어가겠습니다. 우리는 12진법과 60진법 등등 실제로 다양한 진법을 활용하고 있습니다. 1분은 60초인데 이것만 봐도 60진법을 실제로 우리가 사용한다는 것을 이해할 수 있는 것이죠. 그리고 2진수, 8진수, 16진수를 10진수로 바꾸는 법은 정말 간단합니다.

 1011(2)를 10진수로 바꾸면 1 x 2^3 + 0 x 2^2 + 1 x 2^1 + 1 x 2^0 = 11(10)이겠죠. 20C(16)은 2 x 16^2 + 0 x 16^1 + 12(C) x 16^0 = 524(10)이 되겠습니다. 다만 10진수를 2진수, 8진수, 16진수로 변환할 때는 유의할 점이 있습니다. 10진수의 정수 부분을 2진수의 밑수인 2로 나누어 몫과 나머지를 계산하는 것이죠. 그리고 더이상 나누어지지 않을 때 까지 나누다가 역순으로 나열하면 됩니다.

 19(10)을 2진법으로 바꾸려면

 19 / 2 = 9 ... 1

 9 / 2 = 4 ... 1

 4 / 2 = 2 ... 0

 2 / 2 = 1 ... 0

 1 / 2 = 0 ... 1

 이렇게 2를 계속 나눠주는 것이죠. 나머지가 차례대로 1, 1, 0, 0, 1 이렇게 나왔는데

이것을 뒤집어서 10011(2)가 되겠습니다.

​52(10)을 16진법으로 바꿀 때도 같습니다.

 52 / 16 = 3 ... 4

 3 / 16 = 0 ... 3

 

 이렇게 되므로 34(16)가 되겠습니다. 정말 쉽고 간단하죠!

​ 소수 부분을 변환하는 것도 정말 간단합니다. 10진수의 소수 부분에 2진수의 밑수 2를 곱하고 소수 부분이 0이 될 때까지 밑수 2를 계속해서 곱하면 됩니다. 마지막에는 각 단계에서 발생하는 정수 부분을 순서대로 나열합니다.

 0.125(10)을 2진수로 바꾸겠습니다.

 0.125 x 2 = 0.250 ... 0

 0.25 x 2 = 0.500 ... 0

 0.5 x 2 = 1.000​ ... 1

 소수가 0이 될 때 까지 진행했으므로 이제 이것을 그대로 나열해줍니다.

따라서 정답은 0.001(2)​이 되겠습니다.

 이제 마지막으로 55.5(1)을 8진수로 변환해보겠습니다.

 55 / 8 = 6 ... 7

 6 / 8 = 0 .. 6

 즉, 정수 부분은 67(8)이 되겠고

 0.5 x 8 = 4.000 ... 0​

 이렇게 되므로 소수 부분은 0.4(8)이 되겠습니다.

즉, 정답은 67.4(8)으로서 깔끔하게 답이 나온 것이죠.​

728x90
반응형

728x90
반응형

● 컴퓨터의 역사

 

 컴퓨터의 시작은 정말 애매한 부분입니다. 어떤 사람은 고대 시대에 계산을 위해서 만들어진 석판이 컴퓨터의 시초라고 말하고 어떤 사람은 앨런의 튜링기계가 컴퓨터의 시초라고 말합니다. 사실 컴퓨터는 지금까지 수많은 시행착오를 거쳐서 발전해왔다고 할 수 있고 아주 다양한 형태로서 현재 우리에게 자리잡았다고 생각합니다.

 

 대략적으로 흔히 말하는 컴퓨터의 발전 양상은 아래와 같습니다. 솔직히 말해서 요즘 컴퓨터 공부하는데 그다지 쓸모없는 내용입니다. 이러한 내용을 미리 보고 프로그래밍이나 알고리즘을 공부한다고 해서 더욱 효율적인 것도 아니며 단지 적어도 궁금한 부분을 채워줄 수 있다는 측면에서는 의미가 있다고 생각합니다. 적당히 눈으로 훑으면서 상식 선에서 재미있게 보시면 됩니다.​

 

1. 주판(기원 전 26세기경 중국에서 시작됨)

 

 

2. 파스칼의 계산기(1642년 톱니바퀴를 사용해 덧셈과 뺄셈이 가능한 최초의 기계식 계산기)

 

 

3. 라이프니츠의 계산기(1671년 파스칼의 계산기를 계량해 곱셈과 나눗셈도 가능하게 만듦)

 

 

4. 배비지의 차분기관과 해석기관(1820 ~ 1830년대에 걸쳐 제어, 연산, 기억 입출력 등이 가능한 컴퓨터를 설계)

 

 

 

5. 천공카드 컴퓨터(1889년 종이 카드에 구멍을 뚫어 자료를 처리하는 천동카드 시스템을 개발, 인구조사 통계에 활용)

 

 

6. 튜링기계(1936년 전쟁을 위해 고안, 테이프에 부호를 기록해 프로그램처럼 사용하는 컴퓨터)

 

 

7. 에니악(1946년 전쟁을 위해 고안, 진공관을 사용하고 무식하게 거대함)

8. 에드삭(1949년 프로그램 내장 방식 이론을 도입한 컴퓨터)

 

 

9. 에드박(1945년에 개발되어 1951년 세계 최초의 상업용 컴퓨터인 유니박원으로 이어짐)

 

● 오늘날의 컴퓨터

1. 제1세대 컴퓨터(1951~1958)

 제1세대 컴퓨터는 ​ 진공관을 사용합니다. 이러한 프로그래밍은 당연히 저급 언어(기계어)를 이용하기 때문에 프로그램을 작성하는 시간이 아주 오래 걸리고 공학을 전공하는 수재들이 아니면 이해하기도 어려웠습니다. 여기서 말하는 저급 언어란 급이 낮다는 뜻이 아니라 사람이 이해하기보다 기계가 이해하기 쉬운 언어라는 뜻을 가지고 있습니다. 즉, 지금의 C언어와 같이 printf() 등과 같은 언어(print라는 말에서 출력이라는 뜻을 프로그래머가 예상할 수 있음)를 사용하지 않고 모두 0과 1을 이용해서 이해하기 어려운 것이 기계어입니다.

2. 제2세대 컴퓨터(1959~1963)

 제2세대 컴퓨터는 기억소자로​ 트랜지스터를 처음으로 도입했습니다. 트랜지스터는 진공관과 기능이 유사하지만 크기가 훨씬 작고 발열 및 전력 소모에서 효율적입니다. 여기서 COBOL, FORTRAN 등의 언어가 나왔습니다. 다만 이 때까지만 하더라도 일반인이 컴퓨터를 공부하거나 프로그래밍을 배우는 일은 없었죠.

3. 제3세대 컴퓨터(1964~1970)

 제3세대 컴퓨터는 기억소자로서 직접회로를 사용합니다. 직접회로는 수백 개의 트랜지스터와 부품들을 칩으로서 통합한 전자회로를 의미합니다. 다중 프로그래밍의 개념이 처음으로 등장하였고 고속 처리가 가능해졌습니다.

4. 제4세대 컴퓨터(1971~현재)

 제4세대 컴퓨터는 고밀도직접회로를 사용합니다. 또한 초고밀도직접회로로 고성능 컴퓨터도 구비할 수 있습니다. 1970년대 초에 단일 칩 마이크로프로세서에서부터 Intel 운영체제를 가미한 상업용 개인용 컴퓨터도 출현했습니다. 1990년대에 들어서 우리가 알고 있는 윈도우가 등장했고 고밀도직접회로의 상용화 덕에 많은 사람들이 PC를 가질 수 있게 되었습니다.

 

5. 제5세대 컴퓨터

 솔직히 제5세대 컴퓨터라고 굳이 분류하는 이유는 모르겠지만 인공지능을 갖춘 개인용 컴퓨터의 도래를 일컫는다고 합니다. 컴퓨터 스스로 논리적인 추론이 가능하게 되고 내부 및 외부의 데이터를 상호 조합할 수 있게 된다고 합니다.

● 참고

​ 위에서 언급한 내용은 모두 교과서에나 볼 법한 내용이고 제가 생각할 때 컴퓨터의 역사에서 중대한 의미를 가지는 부분은 폰 노이만의 '프로그램 내장 방식'이라고 생각합니다. 폰 노이만은 미국의 수학자이면서도 경제학부터 시작해 다양한 학문에서 엄청난 업적을 남겼던 천재인데요. 이 폰 노이만은 컴퓨터에 있어서도 정말 중요한 역할을 했습니다.

 제 개인적인 생각이지만 폰 노이만의 업적은 컴퓨터와 관련한 측면에서는 아인슈타인도 비교할 수 없다고 생각합니다. 궁금하신 분들은 폰 노이만에 대해서 자세하게 찾아보세요. (주변 박사 및 연구원들 사이에서 악마라고 불릴 정도의 천재적인 두뇌와 기막힌 발상으로 유명했죠.)​ 아무튼 이 '프로그램 내장 방식'이 왜 대단한 것이냐면 폰 노이만의 이전에 컴퓨터는 어떤 작업을 할 때마다 설치된​ 스위치를 다시 세텅해야만 해서 정말 번거로웠습니다.

 

 프로그램 내장 방식은 이러한 문제를 해결하기 위해서 고안된 방식으로, 데이터를 외부에서 받지 않고 내부의 기억장치에 저장한 후 프로그램의 명령을 순서대로 꺼내 해독하고 실행하는 개념입니다. 이 방식은 위에서 말했듯이 1949년에 에드삭을​ 개발할 때 적용되었습니다. ​또한 가장 중요한 점이 현대에 있는 모든 컴퓨터를 설계하는데 기본이 되고 있는 설계도라는 것입니다. 또한 폰 노이만은 자신의 논문에서 '캐시 메모리'가 출현할 것을 미리 예측했습니다. 근데 그것이 한 100년 전입니다. 즉, 근 100년 전에 이현대의 컴퓨터의 모습을 예상하고 있었던 것입니다.​

​ 쉽게 설명하자면 지금의 컴퓨터는 프로그램을 실행시키면 그 프로그램이 주기억장치(RAM)에 올라가서 데이터를 워드 단위로 읽어서 CPU에서 처리하고 있습니다. 데이터는 입출력 장치를 이용해 사용자로부터 받습니다. 즉, 주기억장치와 CPU 그리고 입출력장치 이렇게 3단계 구조를 이용하고 있는 것입니다. 따라서 하나의 프로그램을 사용하다가 다른 프로그램을 사용하고 싶으면 단순히 SW만 교체하면 되기 때문에(다른 프로그램을 RAM에 올려서 다시 사용)​ 정말 간편하죠.

 

​ 이전에는 원하는 연산을 하고 싶을 때마다 여러 명이 진공관 회로 스위치를 변경해야만 했는데 지금은 그냥 프로그램 하나만 마우스로 클릭해 실행시키고 데이터를 입력만 하면 알아서 처리를 해주는 것이죠. 프로그램을 주기억장치에 내장시킴으로써 이러한 작업이 가능하게 된 것입니다.​ 즉, 우리가 컴퓨터를 켜서 주기억장치(하드디스크)에 저장된 한글 2008을 실행시키면 RAM에 한글 2008 프로세스가 올라가게 되어 바로 실행이 가능한 것을 생각하면 됩니다.

 

 폰 노이만의 구조를 채택하지 않는다면 한글 2008이 컴퓨터에 '내장'되어있지 않기 때문에 한글 2008을 실행시킬 때 마다 다시 만들어줘야 하는 것이죠. 한마디로 지금과 같은 컴퓨터의 활용은 폰 노이만의 구조를 채택하지 않았다면 절대로 불가능한 것입니다.​ 물론 최근에 와서도 폰 노이만 구조의 문제점(폰 노이만 병목) 등을 발견하고 보완하고 있기 때문에 지속적인 컴퓨터 성능 향상이 루어지고 있습니다.​

 

728x90
반응형