전공과목 정리/컴퓨터과학의이해

[컴퓨터과학의이해🧮] 데이터 조작 (2장)

최연재 2022. 8. 25. 17:28

교재 : 컴퓨터 과학 총론 (13th Edition)

(배운 내용을 책으로 복습하며 작성한 글입니다. )

1. 컴퓨터 구조

- 중앙처리장치 (central processing unit ; CPU) : 데이터 조작을 제어하는 컴퓨터 안의 회로, 프로세서라 불리기도 한다. 

- 마이크로프로세서(microprocessor)  : 크기가 매우 작은 프로세서

 

1) CPU 기초

- 구성 :  연산장치, 제어장치, 레지스터 장치

  • 연산장치 (arithmeitc/logic unit) : 데이터에 대한 덧셈이나 뺄셈 연산을 수행하는 회로를 포함한다. 
  • 제어장치 (control unit)  :컴퓨터의 동작을 조정하는 회로
  • 레지스터 장치 (register unit) : *레지스터(register)라 불리는 데이터 저장용 셀들을 갖고 있다.

* CPU 내에서 정보를 임시로 저장하기 위해 사용되며, 개념상 주기억장치 셀과 비슷하다. 레지스터 장치 내의 일부 레지스터는 **범용 레지스터로 간주되며, 나머지 레지스터는 용도 지정 레지스터로 간주된다. 

** 범용 레지스터는 CPU에서 조작되는 데이터를 위한 임시 저장 공간으로 사용된다. 범용 레지스터들은 연산장치 회로의 입력들을 저장하고 있거나 연산장치에서 계산된 겨로가를 저장하기 위한 공간으로 이용된다. 

 

- 버스(bus) : 비트 패턴들을 전송하기 위해 CPU와 주기억장치를 연결하는 전선 묶음

; 버스를 통해 CPU는 주기억장치 회로에 해당 메모리 셀의 주소와 읽기 신호를 보냄으로써 주기억장치로부터 데이터를 읽어온다. 또한 CPU가 주기억장치에 데이터를 저장할 때에도 목적지 셀의 주소, 저장될 데이터, 적절한 전자 신호 등으로 주기억장치 회로에 보낸다. 

 

2) 프로그램 내장 개념

- 초창기 컴퓨터들에서는 수행할 프로그램을 제어장치 안에 실현시켰으므로 프로그램이 고정되어 여러 가지 기능을 수행할 수 있는 유연성이 없었다. 

- 유연성에 대한 획기적 발전은 프로그램도 주기억장치 안에 인코딩하여 저장할 수 있는 기술의 실현으로 마련되었다. 

- 컴퓨터 프로그램을 주기억장치 안에 저장하자는 생각은 프로그램 내장 방식 (program concept) 으로 불린다. 

 

2. 기계어

- 프로그램 내장 개념을 적용하기 위해 CPU는 비트 패턴으로 인코딩된 명령들을 해석할 수 있도록 설계되어 있다.

- 기계어 (machine language) : 인코딩 체계와 명령 집합

- 기계 명령(machine instruction) == 기계 수준 명령 : 기계어에서 표현되는 명령

 

1) 명령의 종류

(1) CPU 구조에 대한 2가지 철학

  • RISC (Reduced Instruction Set Computer) : CPU가 최소의 기계 명령 집합을 실행하도록 설계되어야 한다. 
  • CISC (Complex Instruction Set Computer) : 많은 수의 복잡한 명령들을 실행할 수 있는 CPU를 선호한다. (다수의 명령이 기능적으로 중복되어도 무방)
  • 둘 다 기계 명령들을 데이터 전송 그룹, 연산 그룹, 제어 그룹 등의 세 그룹으로 분류 가능

(2) 2가지 철학의 장점

  • RISC : 효율적이고, 빠르면서, 제작비용이 적은 컴퓨터를 만들 수 있다. 
  • CISC : CPU가 복잡할수록 오늘날 점차 더욱 복잡해지는 소프트웨어에 더 잘 대처할 수 있다. (RISC에서 여러 개의 명령으로 실행될 일을 하나의 명령으로 처리 가능)

(3) 예시

RISC :  애플, IBM, 모토롤라 연합에 의해 개발된 PowerPC  프로세서(애플 매킨토시에 사용됨), 

CISC : PC에서 사용되는 인텔 프로세서

 

(4) 결과

- 시간이 지나면서 CISC의 제조 비용이 크게 낮아지며, CISC가 데스크톱 컴퓨터 시장을 차지함. 

- CISC가 전력을 많이 사용한다는 단점이 있기 때문에, ARM (Advanced RISC Machine) 회사에서는 저전력 용도에 적합한 구조를 설계하였다. 

 

(5) 기계 명령들의 분류

- 데이터 전송(data transfer) 

: 데이터 전송 그룹은 데이터를 한 장소에서 다른 장소로 옮길 것으로 요청하는 명령들로 구성된다. 

(I/O 명령 : 프린터, 키보드, 디스플레이 화면, 디스크 장치 등 장치와의 통신을 위한 명령, 컴퓨터의 입출력 작업을 다룸)

ex) 

  • LOAD ; 메모리 셀에 들어 있던 내용을 범용 레지스터에 옮기라는 요청
  • STORE ; 레지스터에 들어 있던 내용을 메모리 셀에 옮기라는 요청을 가리키는 명령

- 연산 (arithmetic/logic)

: 연산 그룹은 제어장치가 연산장치에 어떤 작업을 하도록 요청하는 명령들로 구성된다. 

기본 산술 연산 외에 다른 연산들(부울 연산, 레지스터의 내용 이동)도 수행 가능하다. 

 

- 제어 (control) 

: 제어 그룹은 데이터를 조작하는 대신 프로그램의 실행을 조종하는 명령들로 구성된다. 

ex) JUMP 명령 ;  무조건(uncoditional) 점프, 조건부(conditional) 점프

 

2) Vole : 가상적인 기계어

- 인코딩된 기계 명령은 명령 코드(operation code, op-code) 필드와 피연산자(operand) 필드의 두 부분으로 구성된다. 

-명령 코드 필드에 나타나는 비트 패턴은 STORE, SHIFT, XOR, JUMP 등등 중에서 어느 기본 명령인지를 나타낸다. 

- 피연산자 필드에 나타나는 비트 패턴은 명령 코드가 사용할 정보를 제공한다. 

- Vole의 각 명령에서 피연산자 필드는 3개의 16진 숫자, 즉 12비트로 이루어진다. 

- 추가 정보가 필요없는 HALT 명령을 제외하고는 명령코드가 지시하는 명령의 내용을 더욱 구체화한다. 

B0XY 형식의 명령은 0번 레지스터의 내용에 상관없이 메모리 주소 XY로 점프가 일어나게 만든다. 

3. 프로그램의 실행

1) 프로그램 실행

- 명령 레지스터 (instruction register) : 실행될 명령을 보관하리 위해 사용된다. 

- 프로그램 카운터 (program counter) : 다음에 실행될 명령의 주소를 갖고 있으며, 컴퓨터가 현재 프로그램의 어느 부분에 와 있는지 추적하는 수단으로 사용된다. 

 

- 기계 주기 (machine cycle)  : 인출(fetch), 해석(decode), 실행(execute)

① 인출 

  • CPU는 프로그램 카운터가 가리키는 주소에 저장된 명령을 달라고 주기억장치에 요청한다. 
  • Vole에서 각 명령의 길이는 2 바이트이므로 인출 과정은 주기억장치에서 두 개의 메모리 셀의 내용을 읽어오는 작업을 포함한다. 
  • CPU는 메모리에서 받아온 명령을 멸영 레지스터 안에 넣은 다음 프로그램 카운터를 2만큼 증가시켜 메모리에 저장된 다음 명령의 주소를 갖게 만든다. -> 프로그램 카운터는 다음 인출을 위한 준비를 마침

② 해석

  • 명령이 레지스터 안에 있는 상태에서 CPU가 명령을 해석한다. 
  • 명령을 해석하는 작업에는 명령 코드에 기초하여 피연산자 필드를 적절한 요소들로 나누는 작업이 있다. 

③ 실행

  • CPU는 명령이 요청한 작업을 수행하기 위해 적절한 회로를 가동시킴으로써 명령을 실행한다. 
  • 명령 레지스터 내의 명령이 실행되면, CPU는 다시 인출 단계에서 기계주기를 실행한다. 

 

2) 프로그램과 데이터 

- 컴퓨터 주기억장치 안에 여러 개의 프로그램이 서로 다른 위치를 차지하면서 동시에 저장될 수 있다. 

- 데이터 또한 주기억장치 안에 저장되며 0과 1을 사용하며 인코딩되므로, 컴퓨터 자체는 어느 것이 데이터이고 어느 것이 프로그램인지 판단할 수 없다. 

- 한 프로그램이 다른 프로그램을 데이터처럼 다룰 수 있다. 

 

4. 연산 명령

1) 논리 연산

- AND, OR, XOR 연산 등의 연산들을 각 자리에 기본 연산을 적용함으로써 두 개의 비트 열을 조합하여 한 개의 출력 비트 열을 만드는 연산으로 확장될 수 있다. 

- AND 연산 ; 비트 패턴의 나머지 부분은 건들지 않고 일부만 0으로 만들기 == 마스킹(masking)

AND 연산의 경우 마스킹의 결과는 피연산자 중 하나에 대한 부분적인 복제본이 될 것이며, 복제되지 않는 자리는 0들로 채워진다. 

- OR 연산 ;  비트 패턴을 부분적으로 복제하면서 복제되지 않은 자리는 1들로 채운다. (복제되는 비트 자리에는 0을 사용하고 복제되지 않는 자리에는 1을 사용한다.)

- XOR 연산 ; 비트 열의 보수를 만든다. (1들로 채워진 마스크와 어떤 바이트에 대해 XOR 연산을 수행하면 그 바이트에 대한 보수가 만들어진다.)

 

2) 회전 및 자리 이동 연산

- 레지스터 내부에서 비트들을 이동하거나 자리 맞춤 문제를 해결하는 수단으로 이용

- 회전식 자리 이동 (circular shift)  : 오른쪽 끝에서 밖으로 나가는 비트를 왼쪽 자리에 넣는 것. (한 바이트 크기의 비트 패턴에 대해 오른쪽 방향 회전식 이동을 8번 하면 원래 비트 패턴으로 돌아옴.)

- 논리적 자리이동 (logical shift) : 가장자리 밖으로 나가는 비트를 버리고 빈자리는 0으로 채우는 것

(자리 이동을 왼쪽 방향으로 적용하면, 2의 보수 표현에 2를 곱한 것과 같아진다. ) 

- 산술적 자리 이동 (arithmetic shift) : 부호 비트가 변경되지 않도록 처리하는 자리 이동

 

3) 산술 연산

- 뺄셈은 덧셈과 부호 변경(negation)의 조합으로 대체할 수 있다. 

- 곱셈은 덧셈의 반복, 나눗셈은 뺄셈의 반복으로 계산 가능하다. 

- 덧셈의 경우 더할 값들이 2의 보수로 저장되어 있으면 한 자리씩 단순 덧셈으로 전체 덧셈 과정을 수행한다. 

- 덧셈의 경우 더할 값들이 부동소수점 값으로 저장되어 있으면, 각 값의 유효숫자 부분을 추출하고, 지수 필드에 따라 유효숫자를 오른쪽이나 왼쪽으로 자리이동시키고, 부호를 검사하고, 덧셈을 수행하고, 결과를 부동소수점 표기법에 맞게 표현하는 작업을 수행해야 한다. 

 

5. 다른 장치와의 통신

1) 제어기의 역할

- 컴퓨터와 다른 장치 사이의 통신은 보통 제어기 (controller)라 불리는 중개 장치를 통해 처리된다. 

- 제어기는 컴퓨터 본체 내부에서 케이블로 주변장치와 연결되거나 외부 장치들이 연결될 수 있는 컴퓨터 본체 뒷면에 포트(port)라고 불리는 연결단자(connector)에 케이블로 연결된다. 

- 제어기는 컴퓨터의 내부적 특성에 맞는 형식에서 제어기가 부착된 주변장치의 내부적 특성에 맞는 형식으로 또는 그 반대 방향으로 메시지와 데이터를 변환한다. 

- 컴퓨터 보급의 확대와 이용 가능 주변 기기의 증가로 하나의 제어기가 여러 종류의 장치들을 처리할 수 있도록 통신 표준들이 발전하였다. 

ex) 범용직렬버스(Universal Serial Bus ; USB), 고화질 멀티미디어 인터페이스 (High Definition Multimedia Interface ; HDMI), 디스플레이포트

- 각 제어기는 컴퓨터의 CPU와 주기억장치를 연결하는 버스에 연결을 만들어 컴퓨터와 통신한다. 

- CPU와 주기억장치 사이에 전송되는 신호를 감시할 수도 있고, 자신의 신호를 버스 상에 올려놓을 수 있다. 

- 메모리-사상 I/O (memory-mapped I/O)

: CPU에게는 컴퓨터의 입출력 장치들이 각기 다른 메모리 위치에 나타나는 것처럼 보임

  • 제어기로 오가는 데이터 전송에 주기억장치오의 통신을 위해 이미 포함되어 있는 LOAD, STORE 명령 코드를 사용하기도 한다. 
  • 각 제어기는 주기억장치에서는 무시하도록 되어 있는 특정 주소들에 반응하도록 설계된다. 
  • CPU가 어떤 제어기에 지정된 메모리 주소에 비트 패턴을 저장하기 위해 버스 상에 메시지를 보내면, 이 비트 패턴은 실제로 주기억장치가 아니라 해당 제어기 안에 저장된다. 
  • CPU가 그러한 메모리 주소에서 데이터를 읽으려 시도하면, CPU는 메모리가 아니라 제어기로부터 비트 패턴을 받게 될 것이다.  

2) 직접 메모리 접근

- 제어기는 컴퓨터의 버스에 연결되어 있기 때문에, CPU가 버스를 사용하지 않는 사이에 제어기 자체로 주기억장치와 통신을 수행할 수 있다.

- 직접 메모리 접근 (Direct Memory Access ; DMA) : 제어기가 주기억장치에 접근할 수 있는 기능

- CPU는 프로그램을 실행시키고 제어기는 디스크와 주기억장치 사이의 데이터 전송을 담당할 것이다. 

- 상대적으로 느린 데이터 전송 동안 CPU 계산 자원의 낭비를 피할 수 있게 된다. 

- DMA이 사용에는 컴퓨터의 버스 상에서 일어나는 통신을 복잡하게 만드는 부정적 효과도 있다. 

- 폰노이만 병목 현상 (von Neumann bottleneck) : CPU와 제어기가 버스 사용권을 두고 경쟁하면서 중앙의 버스가 정체의 원인이 됨. (폰노이만 구조에서 CPU가 메모리에서 명령들을 인출해올 때 중앙버스를 사용하기 때문)

 

3) 핸드셰이크

- 핸드셰이킹 (handshaking) : 지속적인 양방향 대화

; 컴퓨터와 주변장치가 장치의 상태에 관한 정보를 교환하고 서로의 활동을 조정한다. 

- 상태 단어 (status word) : 주변장치에서 만들어져 제어기로 전송되는 비트 패턴

; 비트들로 장치의 여러 가지 상태를 반영하는 비트맵이고, 상태 단어는 주변장치와의 통신을 조정할 수 있는 메커니즘을 제공한다. 

 

4) 많이 쓰이는 통신 매체

- 병렬 통신 (parallel communication)  : 여러 개의 신호가 각기 다른 회선을 이용하여 동시에 전송된다. 

; 데이터를 빠르게 전송할 수 있지만, 상대적으로 복잡한 통신 경로를 요한다. 

 

- 직렬 통신 (serial communication)  : 한 회선 상에서 한 번에 한 개씩 신호를 전송한다. 

; 병렬 통신에 비해 단순한 회로를 요하기 때문에 널리 사용된다. 

ex) USB, 파이어와이어

 

- 일반 전화 회선

  • 더욱 더 먼 거리의 통신을 위해 수십 년동안 이용되었다. 
  • 직렬 방식이다. 
  • 전화 회선 상에서의 디지털 데이터 전송은 먼저 모뎀(modem, modulator-demodulator의 줄임말)을 이용하여 비트 패턴을 음성 신호로 변환하고, 음성 신호를 전화 시스템을 통해 전송하고, 목적지 쪽의 모뎀으로 다시 음성 신호를 비트로 변환함으로써 이루어진다. 

- 디지털 가입자 회선 (Digital Subscriber Lines, DSL)

  • 보다 빠른 장거리통신을 위해 전화회사들이 제공하는 서비스
  • DSL은 낮은 주파수 대역은 음성 통신에 사용하고 음성 신호 전송에 사용하지 않는 높은 주파수 대역을 디지털 데이터 전송에 이용한다. 

 

케이블 모뎀 (cable modem)

  • DSL과 경쟁하고 있는 기술
  • 케이블 TV 시스템에서 전송되는 비트 패턴을 변조하거나 복조한다. 

 

5) 통신 속도

- 컴퓨터 구성요소 사이의 비트들이 전송되는 속도는 초 당 비트 수(bits per second, bps)로 측정된다. 

- 여러 개의 데이터를 섞어서 번갈아 인코딩하는 방법으로 하나의 통신 경로를 여러 개의 경로인 것처럼 사용하는 방식을 다중화(multiplexing)이라 한다. 

- 최대 전송 속도는 통신 경로의 대역폭(bandwidth)이라 표현된다. 

- 대역폭이라는 용어는 전송속도보다는 용량을 나타내는 의미가 담겨있다. 

- 통신 경로가 높은 대역폭을 갖는다거나, 초고속통신(broadband) 서비스를 제공한다는 것은 통신 경로가 높은 속도로 비트들을 전송할 수 있을 뿐만 아니라 대량의 정보를 동시에 전송할 수 있는 용량을 가지고 있다. 

 

6. 데이터 조작에 관한 프로그래밍

- 컴퓨터 프로그래밍언어가 갖추어야 할 필수적인 기능 중 하나는 낮은 수준의 기계적인 동작 세부사항들을 사용자로부터 감추는 것이다. 

- 고급 프로그래밍 언어 문장들을 실행시키기 위해서는 먼저 낮은 수준의 기계어 명령들에 대응되어야 한다. 

 

1) 논리 연산과 자리 이동 연산

^ : XOR 연산 ,  | : OR 연산, & : AND 연산

 

>>  이동할 비트 수 , <<  이동할 비트 수

 

2) 함수

- 함수 호출 (function call) : 식이나 문장에서 함수가 나타남

; 함수 호출은 프로그래밍 언어에서 중요한 단축 표현으로 코드의 복잡도를 줄이는 데 기여한다. 

; 함수 호출 구문은 함수 이름 바로 뒤의 괄호 안에 함수 정의를 실행할 때의 매개변수들에 주어질 함수 인수 값(argument value를 표시하는 형식을 취한다. )

 

- 결과 있는 함수 (fruitful function)

: 값을 리턴하는 함수

 

- void 함수, 프로시저(procedure) 

: 값을 리턴하지 않는 함수

 

7. 기타 구조

1) 파이프라이닝

- 컴퓨터의 실행속도를 증가시키기 위해서는 컴퓨터가 소형화되어야 한다. 

- 실행 속도를 증가시키는 것만이 컴퓨터 성능을 개선하는 것은 아니다. 실제 목표는 컴퓨터의 처리율(throughput)을 증가시키는 것이다. 

- 처리율 : 컴퓨터가 주어진 시간에 수행할 수 있는 작업량

- 파이프라이닝 (pipelining) : 기계 주기의 단계들을 중첩시키는 기술

;명령이 실행되는 동안 그 다음 명령이 인출될 수 있으며, 이는 임의의 시점에 각기 다른 처리 단계에 있는 둘 이상의 명령이 "파이프 안에" 들어 있을 수 있음을 의미한다. -> 개별 명령을 인출하고 실행시키는 데 소요되는 시간에는 변화가 없지만 컴퓨터의 총 처리율은 향상된다. 최근에는 동시에 여러 개의 명령을 인출할 수 있으며, 서로 독립적인 명령들의 경우 한 번 둘 이상을 실행할 수 있다. 

- 파이프라이닝은 동시에 여러 개의 동작을 수행하는 병렬 처리의 첫 단계로 볼 수 있다. 

 

2) 다중프로세서 컴퓨터 

- 다중프로세서(multiprocessor) 컴퓨터, 다중 코어(multi-core) 컴퓨터

- 각기 단일프로세서 컴퓨터의 CPU와 비슷한 프로세서 여러 개를 하나의 주기억장치에 연결한다. 

- 프로세서들은 독립적으로 작업을 진행하지만, 공통의 메모리 셀을 통해 서로에게 메시지를 남김으로써 활동을 조정한다. 

- MIMD(Multiple-Instruction stream, Multiple-Data stream) 구조 : 서로 다른 데이터 집합에 대해 서로 다른 일련의 명령을 수행하는 컴퓨터

- SISD (Single-Instruction stream, Single-Data stream) 구조 : 고전적인 구조

- SIMD (Single-Instruction stream, Multiple-Data stream) 구조 : 여러 개의 프로세서들을 엮어 각자의 데이터 집합에 대해 동일한 일련의 명령들을 일정히 실행하는 구조

; 큰 블록 안의 비슷한 데이터 항목 집합 각각에 동일한 작업이 적용되어야하는 응용분야에 유용하다.

- 각기 자체의 메모리와 CPU를 갖는 작은 컴퓨터들의 집합체로서의 대형 컴퓨터

; 각각의 작은 컴퓨터는 자신의 이웃 컴퓨터들과 깊이 연결되며, 전체 시스템에 주어진 작업을 개별 컴퓨터들에서 나누어 수행 가능