목차 확인
1. 컴퓨터를 구분하는 기본
주로 CPU의 연산 속도와 저장 장치의 용량으로 컴퓨터를 선택하게 됩니다.
- 처리 속도
- 저장 용량
2. 컴퓨터 시스템 3 계층
컴퓨터 시스템은 사용자 입장에서 3 계층으로 나누어 볼 수 있습니다.
하드웨어(hardware)
하드웨어는 다양한 기계, 전자 기기, 반도체 등이 사용되는 부분으로써, 눈에 보이는 외형을 가진 전기, 기계적인 장치를 말합니다. (물리적)
- 중앙처리장치(CPU)
- 주기억장치(Main Memory)
- 입출력장치(I/O devices)
소프트웨어(software)
사용자를 위해 다양한 응용 프로그램 간의 하드웨어 사용을 제어하고 조정하는 기능을 수행합니다. (논리적)
응용 프로그램(application program)
사용자의 여러 요구사항을 해결하기 위해 제공되는 프로그램입니다. 대표적으로 워드프로세스, 스프레드시트 등이 있죠.
3. 문자의 표현
바이트(byte)는 주로 숫자나 문자를 표현하기 위해서 사용됩니다. 컴퓨터는 오직 0과 1로 이루어져있기 때문에 숫자나 문자를 나타내기 위해 규칙을 정해야 합니다.
예를 들어 '0100 0001'은 영어 대문자로 'A'로, '0101 1010'은 'Z'로 표현됩니다.
이러한 규칙을 모아둔 표를 코드 테이블(Code Table) 이라고 합니다.
비트(Bit): Binary Digit의 줄임말로 컴퓨터 내부에서의 정보 저장의 기본 단위로써, 1bit는 0과 1로만 표현이 가능합니다. 이렇게 0과 1로만 된 것을 기계어라고 합니다. 하지만 이 기계어는 사람이 이해하기 굉장히 힘들죠. 0과 1로만 된 것들을 어떻게 바로바로 해석할까요? 그래서 사람이 봐도 이해할 수 있는 언어 즉, 고급 프로그래밍 언어를 사용합니다.
우리가 작성한 고급 프로그래밍 언어를 기계어로 바꾸는 과정을 컴파일(Compile) 이라 하고, 컴파일 해주는 프로그램이 바로 컴파일러(Compiler) 입니다.
사실 고급 언어 전에 저급 언어 라는 것이 먼저 나왔습니다. 대표적으로 어셈블리어가 있으며, 기계어보다는 읽기가 쉽습니다. (기계어 -> 어셈블리어 -> 고급언어)
3-1. ASCII 코드
코드 테이블은 여러 종류가 있는데 그 중에서도 가장 일반적인 ASCII(American Standard Code for Information Interchange) 가 있습니다. 알파벳을 표현하기 좋은 코드 테이블이죠.
아스키 코드는 총 2^8(=256)개의 문자를 표현합니다.
아스키 코드 말고도 BCD 코드가 있습니다.
BCD 코드는 10진수 1자릿수 숫자를 4비트의 2진수로 표현한 것을 말합니다.
ex) 9 5 3 => 1001 0101 011
3-2. 유니코드(Unicode)
유니코드는 2바이트, 2^16 (=65,536)개의 문자를 표현할 수 있어서 전 세계의 거의 모든 문자를 표현할 수 있으며, 현재 다양한 프로그래밍 언어와 운영 체제에 의해서 지원되고 있습니다.
앞서 ASCII 코드와는 달리 국제적인 언어들의 사용에 한계점을 극복해낸 코드 테이블입니다.
4. 논리 회로 기초
컴퓨터는 전자 소자들의 집합체입니다. 0과 1을 표현하는 것이 가장 기본이죠.
전자 소자들이 0과 1을 이용하여 어떻게 연산을 수행할까요?
게이트란 컴퓨터에서 전기 신호에 따라 가장 기본적인 연산을 수행하는 소자입니다.
게이트는 하나 이상의 입력을 받아서 하나 이상의 출력 신호를 생성하는데, 게이트가 모여서 회로가 되고, 이러한 회로들이 모여서 컴퓨터가 완성되는 셈입니다.
AND, OR, NOT 이 가장 기본적인 부울 연산이면서 게이트 이름이기도 합니다.
4-1. 순차 논리 회로
조합 논리 회로
와 순차 논리 회로
가 있습니다.
조합 논리 회로의 모든 출력 결과는 '입력값에만' 의존합니다. 즉, 동일한 입력에 대해서는 언제나 동일한 출력 결과를 가지는 것이 조합 논리 회로인데, 이런 조합 논리 회로만으로는 메모리 기능을 필요로하는 회로를 만들 수 없기 때문에 순차 논리 회로란 것이 이 기능을 수행하는 것이죠.
회로의 상태를 저장하기 위해서 플립플랍(flip-flop)이라는 회로를 사용하는데, 플립플랍은 한 비트의 정보를 저장하는 이진 셀(binary cell)로써, 입력 신호가 변하기 전까지는 현재의 상태를 그대로 유지합니다. 즉, 메모리로써의 기능을 수행할 수 있는 것입니다.
플립플랍은 두 가지 상태(0과 1)를 저장할 수 있는 전자 회로로써, 현재의 상태를 0 -> 1로, 또는 1 -> 0으로 바꿀 수 있고, 또 그 상태를 계속 유지할 수 있기 때문에 한 비트의 정보를 저장할 수 있는 능력을 가지고 있습니다.
따라서 램(RAM)이나 레지스터(register) 등을 구현할 때 사용됩니다.
아래의 4 종류의 플립플랍을 많이 사용한다고 합니다.
- SR 플립플랍(또는 RS 플립플랍)
- JK 플립플랍
- D 플립플랍
- T 플립플랍
5. 하드웨어 구성
컴퓨터 하드웨어는 크게 중앙 처리 장치(CPU: Central Processing Unit), 주기억 장치(Main Memory), 입출력 장치(I/O Devices)로 나누며, 이들은 버스(Bus)로 연결되어 있습니다.
버스는 기본적으로 데이터가 이동하는 전선을 의미합니다.
이 선이 넓을수록 한번에 전송할 수 있는 데이터가 많아지기 때문에, 데이터 전송 속도와 버스의 대역폭은 상당한 관련이 있습니다.
- CPU : 컴퓨터의 머리 역할을 하며, 연산(computation)과 제어(control)를 담당합니다.
- 메인 메모리 : 입력 장치로부터 읽혀진 데이터와 프로그램 코드가 저장되는 영역입니다. 반도체 기술을 기반으로 하며, 다른 I/O 장치에 비해서 고속입니다.
- 입출력 장치 : 하드 디스크, 프린터, 키보드, 마우스, 모니터 등의 외부 장치로써, 외부에서 주기억 장치나 CPU로 데이터를 입력하거나, 컴퓨터 내부의 데이터를 외부로 출력할 때 사용되는 장치들입니다.
5-1. 중앙 처리 장치
CPU는 다른 장치들에게 '제어 명령'을 보내거나, '연산 수행'이 가장 기본적인 역할입니다.
CPU 내부는 3개의 모듈로 나뉘는데, 산출/논리 장치(ALU: Arithmetic Logic Unit), 컨트롤 장치(CU: Control Unit), 레지스터(Register)로 구성되어 있으며, 이들은 내부 버스(Internal Bus)로 연결되어 있습니다.
CPU 내부에 있기 때문에 '내부 버스'라고 하며, '외부 버스'는 처음에 설명한 CPU, 주기억 장치, 입출력 장치 등을 연결하는 버스입니다.
5-1-1. 레지스터
CPU가 연산을 수행할 때 사용되는 모든 데이터는 메인 메모리에 저장되어 있습니다. 그런데 실제 연산은 CPU 내부에서 수행되기 때문에, 연산을 위해 사용되는 데이터(피 연산자)를 CPU 내부에 저장할 공간과, 또한 CPU 내부의 상태를 저장하는 공간이 CPU 내부에 필요합니다.
이를 레지스터(register)라고 합니다.
즉, 메인 메모리에 위치한 데이터들은 연산을 위해 CPU 내부로 로드(load)되어야 하는데, 레지스터는 이들을 위한 임시 저장공간으로 사용되고, CPU 내부의 연산 중에 필요한 CPU 내부 상태를 보관하는 공간으로도 사용됩니다.
레지스터는 플립플랍 여러 개를 일렬로 배열해서 구성합니다. 플립플랍 1개가 1비트 저장 장소인데, 레지스터의 동작 방식에 따라서 직렬로 데이터를 입/출력하거나, 병렬로 데이터를 입/출력할 수 있습니다.
5-1-2. 산술/논리 연산 장치
ALU는 CPU 내부에서 실제 연산을 담당하는 부분으로써 산출 연산(+, -, x, / 등)과 논리 연산(AND, OR, NOT, XOR 등)을 수행하는 부분입니다.
산술 연산자를 사용하는 것보다 논리 연산을 사용하는 가증 큰 장점은 실행 속도 입니다.
연산은 해당하는 피연산자를 메인 메모리에서 CPU로 로드해서 연산을 수행하고, 그 결과를 다시 메인 메모리로 옮겨야 하는데, 시프트(shift) 연산을 하게 되면 레지스터 상에서 바로 이루어집니다.
5-1-3. 제어 장치
제어 장치는 처리해야 할 명령어들을 해석하고, 이 명령어 수행에 필요한 제어 신호를 생성해서 적절한 모듈에게 신호를 보냅니다. 예를 들면, ALU에게 특정 연산 수행을 명령하거나, 메인 메모리에게 Read/Write 등의 제어 명령을 내리거나, CPU 내부의 다른 모듈이나 CPU 외부의 장치의 제어를 담당하는 컴퓨터의 컨트롤 타워 역할을 수행하는 것이 바로 제어 장치입니다.
"우리가 프로그램을 실행시키면 어떤 과정을 거칠까?"
프로그램을 실행시키면, 하드 디스크에 있는 프로그램이 메인 메모리로 로딩됩니다. 이렇게 메인 메모리로 로딩된 프로그램의 명령어 하나 하나가 절차에 따라서 수행됩니다.
인스트럭션의 실행 과정을 '명령어 수행 사이클' 이라고 하는데 3 단계로 구성됩니다.
- 명령어 인출(Fetch) : PC 레지스터를 통해 메인 메모리로부터 수행할 명령어를 가져옵니다.
- 명령어 해독(Decode) : 인출된 명령어의 종류를 해독합니다.
- 명령어 실행(Execute) : 제어 장치에서 명령어 수행에 필요한 제어 신호를 제어 버스를 통해서 전송합니다.
Fetch, Decode, Execute 말고도 피 연산자를 메인 메모리로부터 가져오기 위한 간접 사이클(Indirect Cycle), 인터럽트 사이클(Interrupt Cycle) 등이 더 있습니다.
5-2. 기억(저장) 장치
기억 장치의 계층 구조란 기억 장치를 속도, 용량 등의 성능에 따라서 계층적으로 분류한 것으로써, 총괄적인 비용대비 용량과 접근 속도를 최적화하기 위함이 목적입니다.
컴퓨터는 실행할 프로그램과 데이터를 저장하기 위한 기억 장치가 필요한데, 저장 장치는 주기억 장치와 보조기억 장치로 나눌 수 있습니다.
컴퓨터는 외부로부터 데이터를 입력받아, 이를 가공/계산해서, 다시 외부로 출력하는 형식을 취합니다. CPU가 '가공/계산'하는 부분을 맡습니다. 따라서 외부에서 들여온 데이터를 보관할 공간이 필요한데 이를 주기억 장치(Main Memory)라고 합니다. 주기억 장치는 RAM과 ROM으로 나눌 수 있습니다.
5-2-1. 주기억 장치
- RAM(Random Access Memory) : 공급되던 전원이 없어지면 저장된 내용이 지워지는 휘발성 메모리이며, 대부분의 개인용 컴퓨터의 메인 메모리에 사용됩니다.
- ROM(Random Access and Read Only Memory) : 전원이 제거되어도 저장된 내용이 지워지지 않는 비휘발성 메모리입니다. 주로 바이오스, 컴퓨터를 부팅할 때 수행되어야 하는 자가 진단 프로그램(POST), 부트스트랩 로더들을 저장하고 있습니다.
아래는 주기억 장치의 특성입니다.
- 컴퓨터가 프로그램을 수행하기 위해서 프로그램은 주기억 장치에 있어야 합니다.
- 프로세서가 직접 접근할 수 있는 유일한 대량 저장 장치입니다.
- 수십만에서 수억의 크기를 가진 바이트 혹은 워드의 배열로 구성되어 있으며, 각 워드는 자신의 주소를 가지고 있습니다.
- CPU와의 상호작용은 특정 기억 장치 주소에 일련의 load(read)나 store(write) 명령을 통하여 수행됩니다.
- load : 주기억 장치로부터 중앙처리장치 내부의 레지스터로 워드를 이동시킵니다.
- store : 레지스터의 내용을 주기억 장치로 이동시킵니다.
5-2-2. 보조기억 장치
보조기억 장치는 주기억 장치보다 속도는 느리지만 전원이 차단되어도 내용이 유지되고, 단위 비용당 저장 용량이 크다는 장점이 있습니다.
- 자기 테이프 : 요즘은 많이 사용하지 않지만 데이터 백업용으로 많이 사용된 장치입니다. 대용량 데이터를 순차적으로 처리해야하는 작업에는 적합하지만, 원하는 정보를 다이렉트로 접근하려는 업무에는 적합하지 않죠.
- 자기 디스크 : 주기억 장치의 확장용으로 매우 큰 프로그램과 자료를 장기간 저장하는 용도로 사용되는 장치가 자기 디스크입니다.
- SSD(Solid State Disk) : 플래쉬 메모리는 반도체로 구성되었으며, 디스크와 같은 비휘발성의 장점이 있습니다. 속도는 자기 디스크보다 빠르며, 크기도 작고, 전력 소비가 적고, 충격에 강한 장점이 있어 요즘날에도 굉장히 많이 쓰이죠. 장점이 있으면 단점도 있죠. 재생 속도에 비해 기록 속도가 상대적으로 느리고, 기록과 삭제 횟수가 한정되어 있기 때문에 기대 사용 수명이 미리 정해진다는 것이 단점입니다.
그럼에도 장점이 막강하기 때문에 수요가 많습니다. - RAID(Redundant Array of Inexpensive Disks) : RAID는 중요한 데이터를 가지고 있는 서버에 주로 사용되며, 여러 대의 하드 디스크가 있을 때 동일한 데이터를 다른 위치에 중복해서 저장하는 방법입니다. 이렇게 중복해서 저장을 하게 되면 고장에 대비할 수 있습니다.
- 데이터 분산 저장에 의한 동시 액세스 가능
- 병렬 데이터 채널에 의한 데이터 전송 속도 향상
5-2-3. 캐시 메모리(Cache Memory)
캐시 메모리란 빠른 CPU와 상대적으로 느린 메인 메모리 사이에 위치하여, 이와 같이 서로 속도 차이가 있는 메모리 사이의 데이터 접근 효율성을 향상시키기 위한 메모리입니다.
또한 CPU와 메인 메모리간의 속도차이를 줄이기 위한 메모리입니다.
메인 메모리로부터 CPU로 로드되어 사용된 데이터를 캐시 메모리에 보관함으로써, 이후의 사용시 캐시 메모리 내의 데이터를 먼저 사용함으로써, 메인 메모리로의 접근 횟수를 줄임으로써 속도를 향상시킬 수 있는 것이죠.
캐시 메모리 작동 방식은 아래와 같습니다.
- 데이터를 주기억 장치로부터 캐시로 복사합니다.
- 캐시에서 데이터를 꺼내어 처리합니다.
- 다음 번 데이터 요구시 캐시를 검사하여 원하는 데이터가 있으면 꺼내옵니다.
- 만일 캐시에 원하는 데이터가 없으면 메인 메모리에서 꺼내옵니다.
- 다시 사용하는 메모리 부분을 캐시에 복사합니다.
캐시 메모리를 연관 사상 메모리(associative memory)라고도 합니다.
캐시 메모리는 메인 메모리와 달리 주소로 접근하는 것이 아니라 메모리 내부의 데이터를 통해 검색하기 때문에 일종의 내용 기반 검색이라는 의미입니다.
말고도 '웹 캐시' 라는 것이 있습니다.
웹 캐시란 웹 상에서 클라이언트가 요청하는 html, css, image, javascript 파일 등에 대하여, 첫 요청시 파일을 다운로드해서 특정 위치에 복사본을 저장하고, 이후 동일한 요청은 내부의 저장된 파일을 이용하여 속도를 향상시키는 기법이죠.
이렇게 웹 상에서도 중복된 요청에 대하여 캐시를 이용하면 속도를 향상시킬 수 있는 것이죠.
5-3. 입출력 장치(I/O devices)
- 입력 장치 : 외부의 데이터를 컴퓨터의 CPU나 주기억 장치로 입력할 때 사용하는 장비
- 키보드
- CD/DVD 등
- 하드디스크
- 마우스
- USB
- 출력 장치 : CPU나 주기억 장치의 데이터를 외부로 옮길 때 사용하는 장비
- 모니터
- 프린터
- 하드 디스크
- USB
속도가 빠른 CPU입장에서는 상대적으로 느린 입출력 장치를 기다리는 것은 비효율적입니다. 또한 다양한 입출력 장치들의 상황이나 조건을 고려해서 사용하기 위해서는 CPU가 해야 할 일이 너무 많을 것입니다.
이러한 이유로 '입출력 제어기'를 통해 '입출력 장치'를 제어합니다.
각각의 입출력 장치에 있는 제어기들은 인터페이스 역할을 담당하여 CPU에게서 명령을 받아 자신이 관리하는 입출력 장치를 조절하거나 데이터 버퍼링, 오류 검출 기능 등을 담당합니다.
- CPU에 의한 입출력 제어
- 프로그램에 의한 방법(Programmed I/O)
- 인터럽트에 의한 방법(Interrupt-driven I/O)
- DMA(Direct Memory Access) 방식
- 채널(channel)에 의한 I/O
- 기억 장치-사상 입출력(Memory-mapped I/O)
6. 클라우드 컴퓨팅
마지막 클라우드 컴퓨팅에 대한 간략한 개념 설명 후 이 파트를 마치겠습니다.
컴퓨가 보급이 어려웠던 옛날에 비해 요즘 시대는 개인용 컴퓨터가 없으면 이상할 정도로 굉장히 컴퓨터 보급이 많아졌죠.
그러면서 유명한 기업(microsoft, google, amazon)들이 클라우드 컴퓨팅 사업에 뛰어들었습니다.
각종 소프트웨어와 데이터를 모두 메인서버(클라우드) 시스템에 저장해 놓고 필요할 때마다 가져다 쓰는 방식입니다.
소프트웨어 업그레이드, 시스템 업데이트, 백신 관리 등 모든 소프트웨어 관리를 클라우드가 대신 해줌으로써 사용자의 부담을 확 줄여주는 이점이 있습니다.
즉, 일정 비용만 지불하면 훨씬 편하게 인프라를 만들 수 있는 것이죠.
마지막으로 클라우드 컴퓨팅 주요 기술에 대해 알아보고 마치겠습니다.
- IaaS(Infrastructure as a Service) : CPU나 네트워크 회선, 저장 공간 등의 컴퓨팅의 자원을 사용자가 별도의 설치나 관리, 조정 없이 OS 및 특정 애플리케이션 등을 실행시킬 수 있는 서비스입니다.
- 아마존의 Cloudfront와 SimpleDB
- 마이크로소프트의 LiveMesh 등
- PaaS(Platform as a Service) : 사용자가 프로그래밍을 할 때 수많은 애플리케이션을 설치하고 환경을 구성해야하는데 해당 부분에 대한 서비스를 제공하여 사용자가 쉽게 프로그래밍 언어 및 도구를 이용하여 애플리케이션을 개발하고 배포할 수 있도록 도와주는 서비스입니다.
보통 이 플랫폼을 많이 이용하죠. 개인 사이드 프로젝트나 팀 프로젝트를 통해 웹/앱을 만들고 많은 사람들에게 결과를 보여주기 위해서는 만든 웹/앱을 배포해야 합니다. 이를 위한 플랫폼이네요.- 마이크로소프트의 Azure
- 아마존의 AWS
- 구글의 Google Cloud ploatform
- Cloud9의 개발 플랫폼 등
- SaaS(Software as a Service) : 가장 많이 이용되고 있는 서비스로 사용자의 별도의 관리나 조정 없이, 애플리케이션을 제공받는 서비스로 PC 뿐만 아니라 네트워크 컴퓨터, 모바일 등 다양한 환경에서 네트워크를 통해 접속 가능하게 하는 응용 소프트웨어 서비스 환경입니다.
예시를 보시면 어떤 의미인지 아시게 될겁니다.- Google Drive
- 마이크로소프트의 office Live
- IBM의 Lotus
- 우리가 일반적으로 사용하는 이메일 서비스나 카페, 블로그 등
여기까지 컴퓨터구조 기초를 마치겠습니다.
이 모든 내용은 정기철 저자
의 프로그래밍 관점에서 바라보는 컴퓨터 구조
라는 책을 바탕으로 정리하였습니다.
읽어주셔서 감사합니다.
'공부 기록' 카테고리의 다른 글
VS Code 사용중에 "Cannot validate the php" 에러가 뜬다면 (0) | 2020.10.04 |
---|---|
왜 intellij를 사용하는가 (0) | 2020.09.09 |
라이브러리 (0) | 2020.09.09 |
EC2 배포중에 나는 에러 (0) | 2020.08.30 |
운영체제 기초 (0) | 2020.07.17 |
댓글