kang9366
Repository
kang9366
글쓰기
설정
전체 방문자
오늘
어제
  • 분류 전체보기 (143)
    • Programming (70)
      • Java (1)
      • C++ (11)
      • Kotlin (12)
      • Keras (2)
      • Android (34)
      • Jetpack Compose (1)
      • Error Solution (7)
    • CS (36)
      • 자료구조 (13)
      • 운영체제 (1)
      • 알고리즘 (4)
      • 컴퓨터 보안 (8)
      • 기타 (10)
    • Data Science (28)
      • 데이터분석 (7)
      • 머신러닝 (14)
      • 딥러닝 (7)

인기 글

최근 글

최근 댓글

Github · Instagram · Facebook
kang9366

Repository

CS/기타

컴퓨터구조 정리

2022. 6. 26. 02:35

컴퓨터의 종류

컴퓨터의 종류를 크기와 성능, 용량, 사용 목적 등에 따라 여러 종류로 나눌 수 있다.

  • 슈퍼컴퓨터(Super computer): 고 성능, 고 용량의 컴퓨터다. 기상 해석, 핵융합 시뮬레이션 등 대량의 데이터의 고속 처리를 목적으로 한다.
  • 대형 컴퓨터(Main Frame): 대용량, 고속 처리를 주 목적으로 한다. 연구소, 기업, 은행 등에서 사용한다. 보통 여러 대의 단말기를 연결해서 다수의 사용자가 동시에 사용한다.
  • 개인용 컴퓨터(PC: Personal Computer): 개인이 사용하는 컴퓨터다. Desktop, Laptop이 있고 최근에는 Tablet과 SmartPhone도 PC로 인식한다.
  • 임베디드 컴퓨터(Embedded Computer): GPS(내비게이션), 휴대폰, 자동차 등과 같은 특수한 시스템에 내장된 소형 컴퓨터다. 임베디드 보드의 고성능화로 PC와의 구분이 무의미해졌다.

컴퓨터 전원을 켜면 어떤 일이?

  1. 전원을 켜면 CPU로 전기가 전달되고, PC 레지스터를 ROM BIOS의 부트 프로그램 주솟값으로 초기화한다.
  2. 부트 프로그램은 CPU 이상 유무를 테스트한 후, 테스트 결과가 ROM BIOS에 저장된 값과 일치하면 POST(Power On Self Test) 작업을 수행한다.

POST: 시스템 버스, RTC(Real Time Clock), 시스템의 비디오 구성 요소들, RAM, 키보드, 연결된 모든 드라이브에 신호를 보내 정상적으로 동작하는지를 테스트하는 과정이다.

  1. 부트 프로그램은 운영 체제를 로드하기 위해, 디스크의 첫 번째 섹터(MBR: Master Boot Record)를 메인 메모리로 읽는다. 이때부터 운영 체제에서 정의된 부팅 과정이 수행된다.
  2. 운영 체제는 자신의 'init'과 같은 첫 번째 프로세스를 실행하고, 사용자의 요청을 기다린다. 요청은 인터럽트(interupt)의 형태로 발생한다.
  • 하드웨어는 시스템 버스를 통해 인터럽트를 발생시킨다.
  • 소프트웨어는 시스템 호출로 인터럽트를 발생시킨다.

컴퓨터 구조 개괄

컴퓨터는 하드웨어(hardware)와 소프트웨어(software)로 이루어진다. 

  • 하드웨어: 각종 전자 회로와 물리적인 장치로 이루어진 기계 장치
  • 소프트웨어: 하드웨어를 활용할 수 있도록 해주는 프로그램

하드웨어: 다양한 기계, 전자 기기, 반도체 등이 사용된다. 만질 수 있고, 눈에 보이는 외형을 가진 전기, 기계 장치다. 하드웨어는 한번 제작/설치되면 변경이 쉽지 않다.

  • 중앙처리장치(CPU)
  • 주기억 장치(main memory)
  • 입출력 장치(I/O devices)

응용 프로그램(application program): 사용자의 여러 요구 사항을 해결하기 위해 제공되는 프로그램이다.

  • 워드프로세서
  • 스프레드시트
  • 인터넷 브라우저

시스템 소프트웨어(system software): 사용자를 위해 응용 프로그램 간의 하드웨어 사용을 제어하고, 조정하는 기능을 수행하는 프로그램이다. 

  • 운영체제
  • 컴파일러

펌웨어: 하드웨어와 소프트웨어 사이에 위치하는 소규모 프로그램이다. 펌웨어를 사용하면 하드웨어에 기능 추가나 업그레이드가 쉬워지는 장점이 있다.

시스템 소프트웨어와 응용 소프트웨어와의 구분을 위한 명확한 기준이 있는 것은 아니다. 다만 시스템 내부와 관련이 더 많은 것을 시스템 소프트웨어라고 할 뿐이다.

컴퓨터 내부의 데이터 표현

컴퓨터에서 사용하는 수

컴퓨터는 2진수를 사용한다.

정보 표현의 단위

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

워드 단위로 주소를 지정한다는 말은 CPU에서 메인 메모리로 보내는 주소가 워드 단위로 지정된다는 말이다.

진법(numeral system)

10진법

숫자 기호 10개(0~9)를 이용해서 무한 개의 숫자를 표현하는 방법이다.

2진법, 8진법, 16진법

  • 2진법(binary): 0과 1 두 심볼(symbol)만 사용해 수를 표현하는 방법이다.
    • 자릿수가 많고, 진곽적이지 않다.
    • 8진법 변환은 오른쪽부터 3비트씩 바꾼다.
    • 16진법 변환은 오른쪽부터 4비트씩 바꾼다.
  • 8진법(ocatl): 8개의 기호를 사용해 수를 표현하는 방법이다.
  • 16진법(hexa-decimal): 16개의 기호를 사용해 수를 표현하는 방법이다.
    • 2진법 보다 사용하기 편리하다.

정수의 표현

컴퓨터에서 숫자의 표현은 정수(integer numbers)와 실수(real numbers)로 나눈다. 두 방법은 완전히 다르다.

2진수로 변환: 정수 부분의 변환

해당 10진수를 2로 계속 나누면서 나오는 나머지를 역순으로 기입한다.

2진수로 변환: 소수 부분의 변환

해당 10진수를 2로 계속 곱해 가면서 나오는 정수 자리 올림을 역순으로 기입한다.

각 진법 간의 숫자 표현

  • 10진수 -> 2진수: 정수 부분과 소수 부분을 각각 2진수로 변환한다.
  • 2진수 -> 10진수: 2진수의 각 자리를 2의 지수 승에 맞추어 더해준다.
  • 2진수 -> 8진수: 정수 부분은 '소수점 기준 왼쪽'으로 3자리씩, 소수 부분은 '소수점 기준 오른쪽'으로 3자리씩 묶어서 변환한다.
  • 2진수 -> 16진수: 정수 부분은 '소수점 기준 왼쪽'으로 4자리씩, 소수 부분은 '소수점 기준 오른쪽'으로 4자리씩 묶어서 변환한다.
  • 8진수/16진수 -> 2진수: 8진수 1자리는 2진수 3비트로, 16진수 1자리는 2진수 4비트로 변환한다.

부호 없는 정수(unsigned integer: 0과 자연수)

0 또는 양의 정수만을 표현한다.

  • 0 ~ 2ⁿ-1 범위의 숫자를 표현할 수 있다.
  • 범위를 벗어나면 오버플로(overflow)가 발생한다.

부호 있는 정수(signed integer)

음수도 표현한다.

(1) 부호와 절댓값(sign and magnitude)

MSB(Most Significatn Bit: 가장 왼쪽의 비트)가 0이면 '0 또는 양의 정수'를, 1이면 '0 또는 음의 정수'를 나타낸다. 

  • -(2ⁿ⁻¹-1) ~ 2ⁿ⁻¹-1 숫자를 표현할 수 있다.
  • 0이 2개(+0, -0) 존재한다.
  • 연산이 느려 컴퓨터에서는 잘 사용하지 않는다.

부호와 절댓값의 덧셈 순서
1. 두 수의 부호를 비교한다.
2. 부호가 동일하면 절댓값을 서로 더한 후, 동일한 부호를 붙인다.
3. 부호가 다르면 절댓값이 큰 값에서 작은 값을 뺀 후, 큰 절댓값의 부호를 붙인다.

(2) 2의 보수 표현(two's complement binary representation)

해당 수에 NOT 연산 후 1을 더한다.

  • -2ⁿ⁻¹ ~ +2ⁿ⁻¹-1 숫자를 표현할 수 있다.
  • 쉽고 빠르다.
  • 0이 1개다.
  • MSB가 1이면 음수, 0이면 양수다.
  • 양수보다 음수가 1가지 더 많은 숫자를 표현한다.
  • MSB를 제외한 나머지 비트들의 절댓값이 큰 수가 실제로도 큰 수다.
  • MSB가 '1'이면 그 수의 2의 보수를 구한 값에 '-'를 붙인다.
  • 범위를 벗어나면 오버플로(overflow)가 발생한다.

보수 표현을 사용하면 부호에 신경 쓰지 않고 덧셈 연산을 수행할 수 있다. 보수라는 개념 자체가 부호가 없는 표현이기 때문이다.

정수 연산

  • 덧셈: LSB에서 MSB 방향으로 차례로 더한다.
  • 뺄셈: 2의 보수를 이용해 덧셈으로 변환 후 연산한다.
  • 곱셈: 10진법의 곱셈과 동일하다.
  • 나눗셈: 10진법의 나눗셈과 동일하다.

실제로 2진수 나눗셈 방법은 단순하지 않다.

실수의 표현

실수의 표현 방법에는 고정 소수점 표현(fixed-point representation)과 부동 소수점 표현(floating-point representation) 방법이 있다.

고정 소수점 표현 방법

소수점의 위치를 고정시켜 표현한다. 

  • 연산 속도가 빠르지만 제한된 부분에만 사용할 수 있다. 
  • 보통 컴퓨터는 이 방법을 사용하지 않는다.

사용하지 않는 경우: 절댓값이 아주 큰 숫자이거나 소수점 아래가 아주 길어서 정확한 실숫값을 사용하지 않는 경우다.

부동 소수점(floating point) 표현 방법

더 정확한 실수를 표현하기 위해 사용한다.

(1) 부동 소수점 표현

  1. 10진수를 2진수로 바꾼다.
  2. 정규형(normalized form)으로 변환한다.
  3. 부호, 지수(초과 표현으로 표기), 가수를 비트로 표현한다.

(2) 초과 표현(excess representation)

표현하고자 하는 수보다 n(숫자)을 초과시켜서 표현한다.

  • 숫자들을 절댓값으로 고려해 쉽게 대소 판정을 할 수 있다.
  • 지수에 n 개 비트를 사용하면 2^(n-1) - 1 초과 표현을 사용한다.

(3) 히든 비트

정규형으로 표현한 모든 2진수의 정수는 1이다. 이 부분을 숨기기(hidden)로 한다. 이를 통해 가수를 1비트 더 표현할 수 있다.

(4) 특별하게 다루어야 하는 값들(Special Values)

  • 0000 0000₍₂₎는 0이라고 약속한다.
  • NaN(not a number)
  • denormalized form

표현 범위를 넘으면 오버플로(overflow)나 언더 플로(underflow)가 발생한다.

부동 소수점 연산

과학적 표기법(scientific notation)으로 되어있는 것을 제외하면 10진수 연산과 동일하다.

  • 덧셈
    1: 피연산자들이 0인지를 검사한다. 하나가 0이면 나머지 피연산자 값과 동일하다.
    2: 지수를 큰 값(또는 작은 값)으로 통일한다.
    3: 가수들 간의 덧셈 연산을 수행한다.
    4: 결과를 정규화한다.
  • 곱셈
    1: 피연산자들이 0인지를 검사한다. 하나가 0이면 결과는 0이다.
    2: 가수들을 곱한다.
    3: 지수들을 더한다.
    4: 결과를 정규화한다.

문자의 표현

0000 0000₍₂₎은 숫자 '0', 1111 1111₍₂₎은 숫자 '256'처럼 문자와의 약속을 문자 코드 테이블(code table)이라 한다.

ASCII 코드

가장 많이 사용하는 코드 테이블은 ASCII 코드다. 총 256개의 문자를 표현한다.

유니코드(Unicode)

65,536개(2바이트)의 문자를 표현할 수 있어서 전 세계의 거의 모든 문자를 표현할 수 있다. 유니코드 앞 부분의 256개의 문자는 ASCII 코드와 일치한다.

BCD(Binary Coded Decimal) 코드

10진수 1자릿수 숫자를 4비트의 2진수로 표현한다.

논리 회로 기초

논리 회로를 시작하며

논리 회로(logic circuit)는 컴퓨터 하드웨어를 구성하는 원리에 대한 분야다.

논리(logic)라고 불리는 이유는 논리학에서의 참 또는 거짓이 컴퓨터가 0 또는 1 값을 사용한다는 점과 비슷해서다.

기계어 프로그래밍

  • 기계어(machine language): 컴퓨터 내부에서 수행되는 2진수 형태의 언어
  • 고급 프로그래밍 언어(high-level programming language): 기계어보다 사용하기 편리한 형태의 언어
  • 컴파일(compile): 고급 프로그래밍 언어로 작성한 프로그램을 기계어로 변환하는 과정
  • 컴파일러(compiler): 컴파일 해주는 프로그램
  • 소스 프로그램(source program): 고급 프로그래밍 언어를 이용해서 작성한 프로그램
  • 오브젝트 프로그램(object program): 컴파일러로 소스프로그램을 번역한 기계어 프로그램
  • 어셈블리어(assembly language): 기계어와 유사하지만 조금 더 읽기 편한 형태의 언어

기계어 밑에는 무엇이 있을까?

하드웨어가 있다. 하드웨어 위에서 기계어가 수행된다.

논리 회로 기초

기계어가 어떻게 하드웨어에 의해 수행되는지를 이해하면, 컴퓨터 시스템의 모든 부분이 머릿속에서 꿰어지는 느낌을 받을 수 있다. 이것이 논리 회로를 공부하는 이유다.

컴퓨터는 0과 1을 표현하는 것이 가장 기본이다. 어떻게 0과 1을 표현, 저장, 연산하는지에 대해 다루는 부분이 '논리 회로(logic gate)'다.

게이트(gate: 다양한 연산들을 실제로 수행하는 하드웨어 소자)가 모여 회로(circuit)이 되고, 회로가 모여 컴퓨터(computer)가 된다.

기본 게이트

논리 회로를 만드는 데 사용되는 기본 소자가 게이트(gate)다. 게이트는 입력을 받고 정해진 연산을 거쳐 결과를 출력한다.

  • AND
  • OR
  • NOT
  • XOR
  • NAND
  • NOR

반도체 게이트 이전에는 무엇이 계산에 사용되었을까?

  • 기계식 컴퓨터
    • 사람의 손이나 모터를 이용해 톱니바퀴를 움직여 계산한다.
  • 전자식 컴퓨터
    • 진공관, 트랜지스터를 사용한다.
    • 기계식 컴퓨터에 비해 빠르지만, 반도체 소자에 비해 느리다.
  • 반도체
    • 진공관, 트랜지스터를 대체한다.
    • 전기 흐름의 유무로 정보를 표현한다는 점은 동일하다.

논리 회로 표현 방식 기초

회로의 내부 동작 방식은 숨기고, 입력과 출력의 개수와 이름만 표시한다. 

간단한 경우 #1

회로가 수행하는 기능을 설명하는데 가장 많이 사용되는 방법은 진리표(truth table)다.

간단한 경우 #2

논리식(logic expression, boolean expression), 논리도(logic diagram) 또는 회로도(circuit diagram)로 표현할 수 있다.

논리식/논리도/진리표

논리 회로의 동작 원리를 설명하기 위한 표현 방법들이다.

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

논리 회로의 2가지 종류: 조합 논리 회로/순서 논리 회로

  • 조합 논리 회로(combinational logic circuit): 입력값 만으로 출력값이 결정되는 회로
  • 순서 논리 회로(sequential logic circuit): 입력값과 회로 내부의 상태가 출력값을 결정하는 회로

차이점

  • 회로 내부의 상태 값을 저장하는지(기억 소자)의 여부
  • 순서 논리회로는 클럭(clock)이 필요

조합 논리 회로

조합 논리 회로를 만들자

조합 논리 회로는 입력값이 주어지면 출력값이 결정되는 회로다.

불 대수 법칙

하나의 명제가 참 또는 거짓임을 판단하는데 이용하는 수학적 방법이다.

  • 교환 법칙
    • x + y = y + x
    • x * y = y * x
  • 결합 법칙
    • (x+y) + z = x + (y + z)
    • (x*y) * z = x * (y * z)
  • 분배 법칙
    • x + (y * z) = (x + y) * (x + z)
    • x * (y + z) = (x * y) + (x * z)
  • 항등 법칙
    • x + 0 = x
    • x + 1 = 1
    • x * 0 = 0
    • x * 1 = x
  • 보수 법칙
    • x + x' = 1
    • x * x' = 0
  • 멱등 법칙
    • x + x = x
    • x * x = x
  • 흡수 법칙
    • x + (x * y) = x
    • x * (x + y) = x
  • 드보르 강의 법칙
    • (a * b)' = a' + b'
    • (a + b)' = a' * b'
  • 부정
    • (x')' = x
    • 1' = 0
    • 0' = 1

쌍대 수식(짝 수식): 원래의 식을 아래와 같이 변경하면 그에 대응하는 불 식이 있다.

  • +와 *를 서로 바꾼다.
  • 1과 0을 서로 바꾼다.

And-Or/Or-And 회로

  • 곱의 합(SOP: Sum Of Product): And-Or 회로
  • 합의 곱(POS: Product of Sum): Or-And 회로

논리식(부울식: boolean expression)의 간소화

간소화하면 실제 회로가 간단해진다. 불 대수를 이용해 식을 간단하게 할 수 있다.

논리식의 간소화: Karnaugh map(K-map)

논리식으로 도출한 곱의 합 형태의 식을 간소화하는 방법이다.

조합 논리 회로 설계 절차

  1. 문제가 제시된다.
  2. 입력 신호와 출력 신호의 문자 기호를 정한다.
  3. 진리표를 만든다.
  4. 각 출력에 대한 논리식을 만든다.
  5. 논리도를 그린다.
  • 최소항(min-term): 모든 입력 변수를 포함하는 AND 항
  • 최대항(max-term): 모든 입력 변수를 포함하는 OR 항

카르노 맵 주의사항

  • 이웃한 셀들끼리 묶는다.
  • 2의 거듭제곱 값 개수로 그룹을 묶는다.
  • 직사각형이나 정사각형 형태로 묶는다.
  • 최대한 크게 묶는다.
  • 어떤 셀을 여러 번 묶어도 상관없다.
  • 이웃한 셀들은 1비트씩만 달라야 한다.
  • 좌우 또는 상하 양 끝은 연결되어 있다.

Don't care 조건

입력값이 출력값에 영향을 미치지 않는 경우다.

  • x로 표시한다.
  • 카르노 맵에서 병합할 필요가 있을 때 선택적으로 사용할 수 있다.

Don't care 실용적인 예제

7-세그먼트(seven segments) 디스플레이가 있다.

Dual K-Map

카르노 맵은 합의 곱 형태로도 표현할 수 있다. 출력값 0을 중심으로 묶고, NOT 연산을 취하면 된다.

NAND 게이트

And-Or 회로를 한 종류의 게이트(NAND)로 설계하면 편리하다. NOR 게이트도 동일하다.

K-map 말고 Quine-McCluskey 방법도 있다.

디지털 부품

작동 구호 신호(Enbaling Lines)

Enable 신호는 '스위치'처럼 사용할 수 있다.

멀티플렉서(multiplexer)와 디-멀티플렉서(de-multiplexer)

  • 멀티플렉서: 여러 입력 중 1개 선택해 출력한다.
  • 디-멀티플렉서: 1개의 입력을 받아 여러 출력 중 1개만 선택해 출력한다.

이진 디코더(binary decoder)와 이진 인코더(binary encoder)

  • 이진 디코더: 2진수를 입력받아 1개의 출력만 1을 출력하고 나머지는 0을 출력한다.
  • 이진 인코더: 2진 비트 열을 받아 2진수로 출력한다.

어떤 정보를 표현할 때, 더 짧은 비트로 변환하는 것은 '인코딩', 그 반대를 '디코딩'이라고 생각하면 된다.

순서 논리 회로는(순차 논리 회로)

Stable(안정)/Unstable(불안정)

순서 논리 회로는 상태를 저장하기 위해 플립플롭(flip-flop)이라는 회로를 사용한다.

플립플롭은 한 비트의 정보를 저장하는 이진 셀(binary cell)이다.

  • 입력 신호가 변할 때까지 현재 상태를 유지한다.
  • 0과 1을 저장(메모리) 할 수 있다.
  • 램(RAM), 레지스터(register) 등에 사용한다.

플립플롭의 종류

  • SR 플립플롭(RS 플립플롭)
  • JK 플립플롭
  • D 플립플롭
  • T 플립플롭

회로의 상태

  • 안정(stable): 일정한 값이 유지
  • 불안정(unstable): 회로의 값이 계속 변화

SR latch

플립플롭에서 값을 S(Set) 또는 R(Re-Set) 하는 역할을 한다.

SR flip-flop

컴퓨터 내부 모듈들 간의 데이터 송수신을 동기화하기 위해 클럭 신호를 사용한다. 즉, 컴퓨터 내의 모든 부품은 클럭에 맞추어 동작한다.

SR 플립플롭은 SR latch에 클럭 신호를 추가한 회로다. 

  • 클럭이 들어올 때만 회로가 작동한다.
  • SR 플립플롭의 특성표는 SR 래치와 같다.

순서 논리 회로 특징

  • '입력값'과 '현재의 상태'에 의해서 출력값이 결정된다.
  • 피드백(feedback)을 가진다
  • 플립플롭과 같은 기억회로를 가진다.
  • 클럭에 의해 동작한다.

피드백: 회로의 출력 결과가 회로의 상태 변경을 위해 다시 사용된다.

클럭 동작 방식

  • 레벨 트리거(level trigger): 클럭 신호의 전압 레벨이 높을 때 작동하는 방식
    • 클럭 신호가 들어오면 항상 작동한다.
    • 원하지 않은 결과를 얻을 수 있다.
  • 에지 트리거(edge trigger): 클럭이 상승(positive) 또는 하강(negative) 할 때만 작동하는 방식
  • Master-slave: 클럭이 1일 때는 Master가 작동하고, 0일 때는 Salve가 작동하는 방식

다양한 종류의 플립플롭

종류기능

SR 플립플롭 Set/Rest
JK 플립플롭 Set/Reset/Toggle
D 플립플롭 Data 또는 Delay
T 플립플롭 Toggle

SR 플립플롭

특성표

SRQ(t+1)

0 0 Q(t)
0 1 0
1 0 1
1 1 (부정)

여기표

Q(t)Q(t+1)SR

0 0 0 X
0 1 1 0
1 0 0 1
1 1 X 0

JK 플립플롭

SR 플립플롭 입력 (S, R)에 (1, 1)을 사용하지 못하는 것을 수정한 플립플롭이다. 

입력이 (1, 1)이면 현재 출력값이 반전된다.

특성표

JKQ(t+1)

0 0 Q(t)
0 1 0
1 0 1
1 1 toggle

여기표

Q(t)Q(t+1)JK

0 0 0 X
0 1 1 X
1 0 X 1
1 1 X 0

D 플립플롭

입력하는 값을 그대로 저장한다.

특성표

DQ(t+1)

0 0
1 1

여기표

Q(t)Q(t+1)D

0 0 0
0 1 1
1 0 0
1 1 1

T 플립플롭

T는 toggle을 의미한다.

특성표

TQ(t+1)

0 Q(t)
1 Q(t)'

여기표

Q(t)Q(t+1)T

0 0 0
0 1 1
1 0 1
1 1 0

카운터(counter) 회로

순서 논리 회로는 클럭 신호의 타이밍에 따라 2 종류로 나뉜다.

  • 동기(synchronous) 순서 회로: 클럭 펄스의 입력 시간에 모든 플립플롭이 동기(시간을 맞춰서 동시에) 되어서 동작하는 회로다.
  • 비동기(asynchronous) 순서 회로: 클럭 펄스에 관계없이, 플립플롭의 입력이 변화하는 순서에 따라 동작하는 논리 회로다. 각각의 플립플롭이 앞 단의 플립플롭의 출력 결과에 따라 차례로 동작한다.

카운터란 숫자를 순서대로 출력하는 회로다. 카운터는 순서 논리 회로다.

  • 비동기식 카운터(asynchronous counter): 플립플랍들의 동작 시간이 서로 일치하지 않는 방식의 카운터다. 한 플립플랍의 출력이 결정되면, 다음 플립플랍이 그 값을 받아서 동작을 수행하도록 구성되어 있다.
  • 동기식 카운터(synchronous counter): 하나의 공통 클럭으로 모든 플립플랍들의 동작 시간이 일치되는 방식의 카운터다.

컴퓨터 하드웨어

하드웨어 구성 요소

  • 중앙처리장치(CPU: Central Processing Unit): 컴퓨터의 머리 역할을 하며, 연산과 제어를 담당한다.
  • 주 기억 장치(Main Memory): 입력 장치로부터 읽은 데이터와 프로그램 코드를 저장한다.
  • 입출력 장치(I/O Devices: Input/ Output Devices): 입력 장치는 외부에서 주 기억 장치나 CPU로 데이터를 입력하고, 출력 장치는 컴퓨터 내부의 데이터를 외부로 출력한다.
  • 버스(Bus): 컴퓨터 구성 요소들 사이의 데이터를 주고받는 통로다.

버스(전선)가 넓은 수록 많은 데이터를 전송한다.

중앙처리장치(CPU: Central Processing Unit)

'기계어 명령어'를 해독하고 해당 명령어를 수행하기 위해 세부 작업을 실행한다.

기본 역할

  • 제어 명령
  • 연산 수행

내부 모듈

  • 산술/논리 연산 장치(ALU: Arithmetic and Logic Unit)
  • 제어 장치(CU: Control Unit)
  • 레지스터(Register)

내부 모듈은 내부 버스(internal bus)로 연결한다.

레지스터(Register)

실제 연산에 사용되는 데이터와 CPU의 상태를 저장하는 공간이다.

  • 메인 메모리로부터 불러온 데이터를 저장하기위한 임시 저장공간
  • CPU가 연산중에 필요한 상태를 보관하는 공간

플립플랍으로 구성한다.

(1) 레지스터 구현 방법

  • SISO(Serial Input Serail Output): 입력 데이터를 그대로 갖고 있다가 클럭에 따라 플립플롭을 거쳐 출력하는 회로다.
    • 출력 시에 플립플롭의 데이터가 변경된다.
  • SIPO(Serial Input Parallel Output): 클럭이 발생할 때마다 기존의 입력은 다음 플립플롭으로 옮겨가고 각 플립플롭의 값을 출력한다.
    • 모든 값을 동시에 출력한다.
  • PISO(Parallel Input Serial Output): 다수의 입력 데이터들을 병렬로 받아, 클럭이 발생할 때마다 하나씩 출력한다.
  • PIPO(Parallel Input Parallel Output): 클럭이 발생할 때마다 즉시 각 플립플롭의 값을 수정하고, 발생하지 않을 때는 유지시킨다.

레지스터는 간단한 연산을 직접 수행한다.

  • 대표적인 연산은 시프트(shift) 또는 로테이트(rotate)이다.
  • 산술/논리 연산 장치를 거치지 않기 때문에 빠르다.

(2) 레지스터의 종류

레지스터는 '범용 레지스터(Genearl Purpose Register)'와 '특수 목적 레지스터(Special Purpose Register)'로 구분한다.

  • PC(Program Counter): 다음에 실행할 명령어의 주소를 기억한다.
  • IR(Instruction Register): 현재 실행 중인 명령어를 기억한다.
  • AC(Accumulator): 연산 결과를 일시적으로 저장한다.
  • MAR(Memory Address Register): 메인 메모리에 읽기/쓰기 주소를 저장한다.
  • MBR(Memory Buffer Register): 메인 메모리에 읽기/쓰기 데이터를 저장한다.
  • Status Register(상태 레지스터): CPU 내부의 상태를 저장한다.
  • Base Register(베이스 레지스터): 간접 주소 지정 방식에서 주소의 시작 번지를 기억한다.
  • Index Register(인덱스 레지스터): 반복 연산의 횟수나 인덱싱에 사용된다.
  • Shift Register(시프트 레지스터): 저장된 값을 왼쪽/오른쪽으로 1비트씩 이동시킨다.

산술/논리 연산 장치(ALU: Arithmetic and Logic Unit)

CPU 내부에서 산술 연산과 논리 연산을 수행한다.

  • 산술 연산: 사칙연산을 말한다. 
    • 1비트 덧셈기(가산기)를 만들고, 이를 확장해 뺄셈, 곱셈, 나눗셈을 수행한다.
  • 논리 연산: 논리값(0과 1)을 사용하는 연산이다. 
    • 산술 연산기보다 쉽게 구현할 수 있고 더 빠르다.

4 * 2 보다 4 << 1이 더 빠르다. 시프트 연산은 레지스터에서 바로 이루어지기 때문이다. 이는 많은 데이터를 다루는 서버 프로그램이나 자원이 한정된 임베디드 환경에서 중요하게 사용될 수 있다.

(1) 산술 연산기

컴퓨터에서 가장 기본적인 연산은 덧셈이다.

  • 감산기: 컴퓨터에서 가장 기본적인 연산이다.
  1. 1비트 반가산기(Half Adder) 구성
  2. 2개의 반가산기를 이용해서 1비트 전가산기(Full Adder) 구성
  3. 여러 개의 전가산기를 이용해서 멀티 비트 전가산기 구성
  • 감산기: 2의 보수를 이용해 가산기를 활용한다.
  • 상태 레지스터: Negative(N), Zero(Z), Overflow(V), Carry(C) 등의 상태를 파악하기 위해 사용한다.

반가산기는 올림수(Carry)를 포함한 계산 처리를 할 수 없다. 때문에 2개를 이용해 전가산기로 만들어 주어야 한다.

오버플로는 같은 부호의 숫자들을 더할 때 발생한다. 다른 부호의 덧셈은 절댓값이 작아지기 때문이다.

(2) 논리 연산기

1비트 논리 연산기는 AND, OR, XOR, NOT 등의 연산을 수행한다. 처리된 연산은 멀티플렉서에 의해 출력된다.

(3) ALU 통합

ALU가 4비트 2진수 숫자 2개를 입력받아 산술/논리 연산을 수행하는 시나리오

  1. 제어 장치(CU)에서 ALU로 4비트 ALU 제어 신호를 보낸다. 4-to-16 decoder로 들어오면 16개 중 하나의 연산을 선택한다.
  2. ALU 내부에 16-to-1 멀티플렉서를 사용하면 16개의 연산 결과 중 1개의 결과를 선택할 수 있다.

제어 장치(CU: Control Unit)

제어 장치(CU)는 처리할 명령어들을 해석하고, 명령어 수행에 필요한 제어 신호를 생성해 모듈에게 보낸다. 명령어, CPU 상태 신호, 클럭을 입력으로 받는다.

(1) 마이크로 프로그램 방식의 제어 장치 구현

제어 장치 구현은 '하드와이어(Hardwired) 제어 방식'과 '마이크로 프로그램 기반(Micro-Programmed) 제어 방식'이 있다.

  • 하드 와이어 방식: 조합 논리 회로를 이용하여 구현하는 방식이다.
    • 실행 속도가 빠르지만, 한번 만들어진 명령어 세트를 변경할 수 없다.
    • RISC(Reduced Instruction Set Computer) 컴퓨터에 주로 사용된다.
  • 마이크로프로그램 방식: PROM(Programmable ROM)을 이용한다. 
    • 메인 메모리 외에 별도의 메모리가 필요하다.
    • 명령어 세트 변경 시에 설계를 변경하거나 검증이 쉽다.
    • 하드웨어 방식에 비해 느리다.
    • 다양한 어드레싱 모드(Addressing Mode)를 지원해 복잡한 명령어 세트를 가진 시스템에 적합하다.

마이크로프로그램이란 제어 메모리(Control Memory) 내부에 있는 마이크로 명령어들의 집합이다.

마이크로프로그램 방식 제어장치의 구성 요소

  • 명령어 레지스터(IR: Instruction Register): 현재 실행할 명령어를 기억한다.
  • 명령어 해독기(Instruction Decoder): IR에 있는 명령어의 연산 코드를 해독해, 해당 연산을 수행하기 위한 루틴의 시작 주소를 결정한다.
  • 제어 주소 레지스터(CAR: Control Address Register): 다음에 실행할 마이크로 명령어의 주소를 저장한다.
  • 제어 기억 장치(Control Memory): 마이크로프로그램을 저장한다.
  • 제어 버퍼 레지스터(CBR: Control Buffer Register): 제어 기억장치로부터 읽은 마이크로 명령어 비트들을 일시 저장한다.
  • 디코더(Decoder): 명령어의 해독 결과로 생성된 마이크로 명령어에 따라서 각 장치로 보낼 제어 신호를 생성하는 회로다.
  • 순서 제어 모듈(Sequencing Logic): 마이크로 명령어의 실행 순서를 결정하는 회로들의 집합이다. 기계어 명령어의 실행 순서에 따라 다음에 실행할 명령어의 주소를 결정한다. 명령어의 주소는 아래와 같은 내용에 의해 결정된다.
    • CAR: 하나의 명령어를 수행 중에 차례로 값을 1 증가
    • IR: 분기 명령어의 경우 지정하는 번지로 무조건 분기
    • ALU 플래그(ALU Flags): 조건에 따른 조건 분기
    • 서브루틴의 Call과 Return 경우: 함수 호출과 관련된 경우
  • 마이크로 명령어(Micro Instruction): 명령어 사이클의 각 주기에서 실행되는 마이크로 연산들에 대응되는 비트들로 이루어진 단어다. 제어 단어(Control Word)라고도 한다.
  • 마이크로 프로그램(Micro Program): 마이크로 명령어들의 집합이다.

(2) 마이크로 명령어 종류

마이크로프로그램 CU를 설계하려면 마이크로 인스트럭션의 순서 제어, 마이크로 인스트럭션의 실행, 연산 코드(Operation Code)의 해독, 상태 ALU 플래그의 결정들에 대한 논리를 포함해야 한다.

마이크로 명령어 구성 요소

  • 마이크로 오퍼레이션 필드: 컴퓨터의 마이크로 오퍼레이션 지정
  • 조건 필드: 상태 비트 조건 선택
  • 분기 필드: 분기의 종류 지정
  • 마이크로 주소 필드: 분기 주소

마이크로 명령어의 형식

  • 수평 마이크로 명령어: 마이크로 명령의 한 비트가 한 개의 마이크로 오퍼레이션을 관할하게 하는 명령어다.
    • 명령어 형식이 길다.
    • 마이크로 명령 수행 시 병렬도가 높다.
    • 제어 정보에 대한 인코딩이 필요 없다.
    • 여러 하드웨어가 동시에 동작하므로 효율적이다.
    • 제어 워드들이 충분히 활용되지 못해 하드웨어 비용이 늘어난다.
  • 수직 마이크로 명령어: 제어 기억장치 외부에 디코딩 회로를 필요로 하는 명령어다.
    • 명령어 형식이 짧다.
    • 마이크로 명령 수행 시 병렬도가 낮다.
    • 제어 정보에 대한 인코딩이 필요하다.
    • 한 개의 마이크로 오퍼레이션만 수행한다.

(3) 폰 노이만(Von Neumann)의 내장형 프로그램(Stored-Program) 방식

폰 노이만의 내장형 프로그램은 주 기억장치에 프로그램을 데이터와 함께 내장한다. 그래서 주 기억장치에 있는 프로그램의 명령어를 실행하려면 CPU로 가져와서 실행한다.

명령어 수행 사이클(Instruction Execution Cycle)의 구성

  • 명령어 인출(Fetch): 메인 메모리로부터 수행할 명령어를 가져온다. 명령어의 주소는 PC가 갖고 있다.
  • 명령어 해독(Decode): 인출된 명령어의 종류를 해독한다.
  • 명령어 실행(Execute): 제어 장치가 명령어 해독 결과에 따라 필요한 제어 신호를 실행한다.

명령어 실행이란 제어 장치에서 명령어 수행에 필요한 제어 신호를 제어 버스를 통해서 전송한다는 의미다.

명령어 수행 사이클 과정

  • 인출 단계(Fetch Cycle): 주 기억 장치로부터 명령어를 읽어 CPU로 가져오는 단계다. 인터럽트를 처리한 후 전환될 메이저 스테이트(major state)다.

마이크로 오퍼레이션의미

MAR ← PC PC에 있는 명령어를 MAR에 전송
MAR ← M[MAR], PC ← PC+1 MAR 위치 값을 MBR로 전송하고 PC 1 증가
IR ← MBR[0P] 명령어의 0P 코드를 IR에 전송
상태 전이 Indirect 모드이면 Indirect Cycle, 그렇지 않으면 Execute Cycle로 상태 전이
  • 간접 사이클(Indirect Cycle): 인출 단계에서 읽어온 명령 중, 피연산자 값을 가져오는 단계다.

마이크로 오퍼레이션의미

MAR ← MBR[AD] MBR에 있는 명령어의 주소를 MAR에 전송
MBR ← M[MAR] MAR 위치 값을 MBR로 전송
상태 전이 Execute Cycle로 상태 전이
  • 실행 사이클(Execute Cycle): 실제 명령을 이행하고, 인터럽트 요청 신호 플래그 레지스터를 검사하는 단계다.

ADD 연산

마이크로 오퍼레이션의미

MAR ← MBR[AD] MBR에 있는 명령어의 주소를 MAR에 전송
MBR ← M[MAR] MAR 위치 값을 MBR로 전송
AC ← AC + MBR AC의 값과 MBR의 값을 더해 AC에 전송
상태 전이 인터럽트 요청이 있으면 Interupt Cycle, 그렇지 않으면 Fetch Cycle로 상태 전이
  • 인터럽트 사이클(Interupt Cycle): 인터럽트 발생 시 복귀 쥐소(PC)를 스택에 저장한 후 처리한다. 다른 인터럽트 요청을 막기 위해 IEN(Interrupt Enable) 값은 0으로 변경한다. 인터럽트가 끝나면 Fetch 사이클로 돌아가 복귀 주소의 하던 작업을 마무리한다.

마이크로 오퍼레이션의미

MBR[AD] ← PC, PC ← 0 MBR 주소에 PC 값 전송, PC를 0으로 설정
MAR ← PC, PC ← PC+1 PC 값 MAR에 전송, PC 값 1 증가
M[MAR] ← MBR, IEN ← 0 MBR을 MAR 위치에 저장, IEN에 0을 전송
상태 전이 Fetch Cycle로 상태 전이

파이프 라이닝

명령어 수행 사이클의 각 세부 단계들을 인접한 명령어들 사이에 중복 수행하는 것을 파이프 라이닝이라 한다. 즉, 순차적인 명령어들 간의 병렬성을 사용하는 기술이다. 

  • 속도가 증가한다.
  • RISC 구조의 명령어가 더 효율적이다.

CISC/RISC

CPU는 기계어 명령어의 길이와 형식에 따라 CISC(Complex Instruction Set Computer)와 RISC(Reduced Instruction Set Computer)로 나눈다.

  • CISC: RISC에 비해 상대적으로 명령어의 개수도 많고 구조도 복잡하다. 최근에는 복잡한 명령들을 단순한 명령들로 나누어 명령어 파이프라인에서 처리하는 경우가 있다. 그래서 실제 내부 작동 원리는 RISC와 유사하기도 하다.
    • 장점
      • 컴파일러 작성이 쉽다.
      • 복잡한 명령도 마이크로 코드이므로 실행 효율이 좋다.
    • 단점
      • 하나의 명령어가 복잡해 디코딩에 시간이 오래 걸리며, 해석에 필요한 회로가 복잡하다.
      • 적은 수의 일부 명령어만 쓰인다.
      • 명령어의 길이가 달라 동시에 여러 개의 명령 처리가 어렵다.
  • RISC: 고정된 길이의 명령어를 사용하고 명령어의 종류가 상대적으로 적다. 때문에 단순한 명령어들을 연속적으로 중복 수행하는 '파이프 라이닝'에 효율적이다. RISC는 최근 대부분의 프로세서 디자인으로 채택되고, 전력 소모가 적어 임베디드 프로세서에도 많이 사용된다.
    • 장점
      • 명령어들이 단순해서 프로세서 설계 비용을 줄인다.
      • 적은 수의 명령어 셋을 이용하므로 쉽게 프로그래밍할 수 있다.
      • 고급 언어 컴파일러들이 소수의 명령어만을 사용하므로 효율적인 코드를 생산할 수 있다.
      • 각 명령어의 실행이 한 클럭에 고정되어, 파이프라인 성능에 최적화할 수 있다.
      • 고정된 명령어라 디코딩 속도가 빠르다.
    • 단점
      • 컴파일러의 최적화 과정이 복잡해진다.
      • 명령어의 길이가 고정되어 있기 때문에 코드 효율이 낮다.

버스(BUS)

버스는 CPU, 주 기억 장치, 외부 입출력 장치 사이의 정보를 전송하는 전기적 통로다.

버스 구성

  • 데이터 버스(Data Bus): 주 기억 장치와 CPU, 입출력 장치와 주 기억 장치, CPU 내부 모듈들 간의 데이터가 이동하는 경로
  • 주소 버스(Address Bus): CPU가 사용하려는 데이터의 주소가 이동하는 경로
  • 제어 버스(Control Bus): CPU에서 발생하는 제어 신호들이 이동하는 경로. 다음과 같은 제어 신호들이 있다.
    • 기억 장치 읽기/쓰기
    • 입출력 장치 입력/출력
    • 버스 중재(Bus Arbitration): 버스에 연결된 장치들이 동시에 버스를 사용하려고 할 때 이들을 중재하는 신호
    • 인터럽트

버스의 위치에 따라 내부 버스(CPU 내부), 외부 버스(CPU 외부)로 구성한다.

  • 내부 버스: CPU 내부에 위치한 버스
  • 외부 버스(시스템 버스): CPU와 주 기억 장치, 입출력 장치를 연결하는 버스

CPU와 주 기억 장치의 읽기/쓰기 과정

  1. CPU가 버스에 데이터를 싣는다.
  • 주소 버스: 읽기/쓰기 데이터의 주 기억 장치 주솟값
  • 데이터 버스: 쓰는 경우에는 쓰려는 데이터 값
  • 제어 버스: 기억장치 읽기 신호 또는 쓰기 신호
  1. 주 기억 장치는 제어 버스에 실린 제어 신호를 확인한다.
  • 읽기 신호인 경우, 주소 버스의 데이터 주솟값을 주 기억 장치에서 읽어서 데이터 버스에 싣는다.
  • 쓰기 신호인 경우, 주소 버스에 해당하는 주소에 데이터 값을 쓴다.
  1. 읽기 작업인 경우, 일정 시간 후 CPU는 데이터 버스에 실린 값을 CPU로 가져온다.

버스 중재(Bus Arbitration) 신호

  • 버스 요구(Bus Request) 신호: 특정 장치가 버스 사용을 요구했음을 알리는 신호
  • 버스 승인(Bus Grant) 신호: 버스 사용을 요구한 장치에게 사용을 허가하는 신호
  • 버스 사용 중(Bus Busy) 신호: 현재 버스가 사용되고 있는 중임을 나타내는 신호

기억(저장) 장치

기억 장치의 특성을 결정하는 요소

  • 기억 용량: 동일한 비용에서의 기억 장치의 용량
  • 접근 시간(Access Time): 기억 장치에 읽기/쓰기 요청 후, 요청한 정보를 사용 가능하기까지의 시간
  • 사이클 시간(Cycle Time): 기억 장치에 읽기/쓰기 요청 후, 다시 요청 가능하기까지 시간
  • 대역폭(Bandwidth, 전송률): 기억 장치가 단위 시간에 처리할 수 있는 정보량

주 기억 장치

CPU에 의해 실행될 프로그램과 데이터가 저장되는 곳이다. 주 기억 장치는 RAM과 ROM으로 나눈다.

  • RAM(Random Access Memory): 전원을 차단하면 저장된 내용이 지워지는 휘발성 메모리다. 대부분의 개인용 컴퓨터 메인 메모리에 사용된다. Random Access는 어느 주소든지 동일한 속도로 데이터에 접근해 사용할 수 있다는 의미다.
    • 정적(Static) RAM: SRAM은 플립플롭으로 구성한다.
      • 전원이 공급되는 동안 내용이 유지된다.
      • DRAM보다 빠르고 비싸다.
      • 캐시 메모리로 사용된다.
    • 동적(Dynamic) RAM: DRAM은 콘덴서로 구성한다.
      • 전원이 공급되는 동안에도 일정 시간이 지나면 방전되므로 주기적인 재충전이 필요하다.
      • 일반적인 주 기억 장치에 사용한다.
  • ROM(Random Access and Read Only Memory): 전원을 차단해도 저장된 내용이 지워지지 않는 비휘발성 메모리다. Random Access 특성을 가지고 있으며, 내용을 유지시키기 위해 ROM 내의 데이터는 읽을 수만 있고 보통은 변경할 수 없게 한다. 이러한 특성으로, 주로 기본 입출력 시스템(BIOS), 자가 진단 프로그램(POST), 부트스트랩 로더(Bootstrap Loader)들을 저장한다. ROM은 저장 방식에 따라 세부 종류들로 나눈다.
    • PROM(Programmable ROM): 단 한 번만 프로그래밍 할 수 있다.
    • EPROM(Erasable PROM): 자외선을 이용해 프로그래밍 할 수 있다.
    • EEPROM(Electrically EPROM): EPROM과 달리 별도의 장치 없이 PCB에 프로그래밍 할 수 있다. 아두이노 보드에 사용한다.
    • 플래시메모리(Flash Memory): EEPROM에 기반하여 전원이 꺼진 상태에서도 데이터가 지워지지 않는 반도체 메모리다.
      • 읽는 속도가 빠르고 하드 디스크보다 충격에 강하다.
        + SSD(Solid State Drive)는 플래시메모리를 이용한 디스크다.

주 기억 장치의 특징

  • 수행할 프로그램은 주 기억 장치에 있어야 한다.
  • 프로세서가 직접 접근할 수 있는 유일한 대용량 저장 장치다.
  • 워드의 배열로 구성되어 있으며, 각 워드는 자신의 주소를 가진다.
  • CPU와의 상호 작용은 load(read)나 store(write) 명령으로 수행한다.
    • load: 주 기억 장치로부터 CPU 레지스터로 워드를 이동
    • store: 레지스터의 내용을 주 기억 장치로 이동

보조 기억 장치

보조기억 장치는 주 기억 장치보다 느리지만 전원을 차단해도 내용을 유지시킨다. 그리고 단위 비용 당 저장 용량이 크다.

(1) 자기 테이프

초기 컴퓨터들의 저장 매체로 많이 사용했다.

  • 백업이나 시스템 간의 정보 전송을 위한 매체로 사용한다.
  • 반영구적이며, 많은 양의 자료를 보관할 수 있다.
  • 순차 접근(sequential access) 방식이라서 느리다.

(2) 자기 디스크

주기억 장치의 확장용으로 매우 큰 프로그램과 자료를 장기간 저장하는 용도로 사용한다.

  • 직접 접근(direct access) 방식이다.
  • 플래터(platter), 읽기-쓰기 헤드 등으로 구성한다.

디스크 방식의 기억 장치는 헤드를 원하는 트랙에 직접 위치시킬 수 있기 때문에 직접 접근 방식이라고 한다.

직접 접근 장치 데이터를 쓰기/읽기 과정

  1. 디스크 헤드를 트랙으로 이동(seek tiem).
  2. 디스크를 회전시켜 섹터 탐색(rotation latency 또는 rotation delay).
  3. 디스크 헤드를 통해 데이터를 전송(transfer tiem).

디스크 접근 시간 = seek time + rotation latency + transfer time

(3) SSD(Solid State Disk)

플래시 메모리를 이용한 보조 기억장치다.

  • 하드 디스크보다 빠르고, 크기가 작다.
  • 전력 소비가 적고, 충격에 강하다
  • 쓰기보다 읽기가 더 빠르다.
  • 읽기와 쓰기 횟수가 한정적이다.

(4) RAID(Redundant Array of Inexpensive Disks)

RAID는 여러 대의 하드 디스크에 동일한 데이터를 중복 저장하는 방법이다.

  • 서버(server)에 주로 사용된다.
  • 입출력 성능이 개선된다.
  • MTBF(Mean Time Between Failure)을 증가시켜 고장 대비 능력이 향상된다.
  • 동시 액세스(concurrent access)가 가능하다.
  • 데이터 전송 속도를 향상시킨다.
  • 고장이 잦을 수 있다.
  • 스트라이핑(striping) 기술을 사용한다.

RAID 종류

  • RAID-0: 스트라이프를 가지고는 있지만 데이터를 중복해서 기록할 수 없다.
    • 가장 높은 성능을 기대할 수 있다.
    • 고장 대비 능력이 없다.
  • RAID-1: 중복 저장된 데이터를 가진 2개 이상의 드라이브로 구성한다.
    • 디스크 미러링(disk mirroring) 방식이라고도 한다.
    • 읽기 성능이 향상된다.
    • 다중 사용자 시스템에서 성능과 고장 대비 능력이 좋다.
    • 결함 허용도(fault tolerance)를 제공
    • 가격이 높다.
  • RAID-2: 비트 단위 인터리빙 방식을 사용해, 데이터를 각 디스크에 비트 단위로 분산 저장한다.
    • 오류가 많이 발생하는 환경에서 사용한다.

디스크 인터리빙(disk interleaving): 데이터 블록들을 여러 개의 디스크들로 이루어진 디스크 배열에 분산 저장하는 기술이다.

캐시메모리(Cache Memory)

캐시메모리란 CPU와 메인 메모리 사이의 속도 차이를 줄이기 위한 메모리다.

캐시메모리는 지역성의 원칙(principle of locality)을 활용한 아이디어다.

  • 시간적 지역성: 한번 사용한 정보는 시간적으로 곧 다시 사용될 가능성이 많다는 의미다.
  • 공간적 지역성: 한번 사용한 정보의 근처 영역이 다시 사용될 가능성이 많다는 의미다.

캐시 메모리 동작 과정

  1. 데이터를 주 기억 장치에서 캐시로 복사한다.
  2. 캐시에서 데이터를 꺼내 처리한다.
  3. 다음 데이터 요구 시 캐시를 검사하여, 해당 데이터가 있으면 꺼내온다.
  4. 해당 데이터가 캐시에 없으면 주 기억 장치에서 꺼내온다.
  5. 다시 사용하는 메모리 부분을 캐시에 복사한다.

캐시 메모리 내용 교체 방법

  • 최소 최근 사용(LRU: Least Recently Used): 사용되지 않은 채로 가장 오래 있었던 블록을 교체하는 방식
  • FIFO(First In First Out): 캐시에 적재된 가장 오래된 블록을 교체하는 방식
  • 최소 사용 빈도(LFU: Least Frequently Used): 참조되었던 횟수가 가장 적은 블록을 교체하는 방식

캐시 메모리 내용 변경에 따른 주 기억 장치 갱신 방법

  • Write-through: 모든 쓰기 동작들이 캐시뿐만 아니라 주 기억 장치에도 동시에 수행되는 방식
    • 캐시와 주 기억 장치에 있는 특정 블록의 내용이 항상 같다.
    • 쓰기 동작에 주 기억 장치도 포함되므로, 쓰는 시간이 길어진다.
  • Write-back: 블록을 교체할 때 캐시의 상태를 확인하고, 필요시 주 기억 장치에 갱신한다.
    • 주 기억장치 쓰기 횟수가 최소화되고, 쓰는 시간이 짧아진다.
    • 캐시의 내용과 주 기억 장치의 특정 블록 내용이 서로 다르다.
    행 우선 방식 코드가 열 우선 방식 보다 빠르다.

입출력 장치(I/O Device)

포트(port)는 컴퓨터와 외부 장비를 연결하는 통로다.

  • 직렬 포트: 한 번에 하나의 신호를 전달할 수 있고, 보통 저속의 장치와 연결된다.
  • 병렬 포트: 여러 비트의 신호를 동시에 전달할 수 있고, 고속 인터페이스를 제공한다.
  • USB(Universal Serial Bus): 컴퓨터와 주변 기기를 연결하는데 쓰이는 입출력 표준 중 하나다.

소프트웨어에서의 포트는 프로그램 사이에서 정보를 교환할 때 사용하는 가상의 논리적 주소를 의미한다.

입출력 장치

  • 입력 장치: 외부의 데이터를 컴퓨터의 CPU나 주 기억 장치로 입력할 때 사용하는 장비
  • 출력 장치: CPU나 주 기억 장치의 데이터를 외부로 옮길 때 사용하는 장비

입출력 장치의 제어 방식

입출력 제어기(I/O controller)로 입출력 장치를 제어한다.

입출력 제어기 역할

  • 인터페이스
  • CPU로부터 명령을 받아 입출력 장치 조절
  • 데이터 버퍼링, 오류 검출 등

(1) CPU에 의한 입출력 제어

CPU에 의한 입출력 제어 방식은 입출력의 전체적인 과정을 CPU가 수행한다.

  • 프로그램에 의한 방법(Programmed I/O): 현재 수행되는 프로그램이 I/O를 직접 수행하며, 입출력 장치와 관련된 모든 과정을 CPU가 담당한다.
    • CPU가 다른 작업을 수행하지 못해 효율을 떨어뜨린다.
    • CPU가 상태 플래그를 계속 조사하여 I/O 완료 여부를 처리한다.
  • 인터럽트에 의한 방법(Interrupt-driven I/O): 입출력 명령이 발생하면 CPU는 다른 작업으로 전환한다. 입출력이 완료되면 이터럽트가 발생하고, 인터럽트 처리 루틴을 수행함으로 CPU는 입출력 과정을 종료한다.
    • 다른 작업으로 전환해서 효율성을 올린다.

(2) DMA(Direct Memory Access) 방식

DMA는 별도의 I/O 컨트롤러가 입출력 장치와 주 기억 장치 사이의 데이터를 이동시켜, CPU의 효율성을 높이는 방법이다.

  • 하드 디스크와 같은 장치와 대량의 데이터를 입출력할 때 사용한다.
  • 사이클 스틸로 인해 DMA가 시스템 버스를 너무 많이 사용할 수 있다.

DMA 방식의 입출력 과정

  1. 프로그램 또는 운영 체제가 데이터 입출력을 요구
  2. CPU는 DMA 제어기의 레지스터들에게 다음의 정보를 전송
  • I/O 장치 주소
  • 데이터가 있는 주 기억 장치의 시작 주소
  • DMA 시작 명령
  • 입출력하고자 하는 데이터의 양
  1. DMA가 입출력 동작을 시작하며, 사이클 스틸(cycle steal) 방식으로 데이터를 전송한다.
  2. 입출력 동작이 완료되면 DMA 제어기는 CPU를 인터럽트 한다.

(3) 채널(channel)에 의한 I/O

CPU 관여 없이 입출력을 제어하는 전용 프로세서(IOP)를 사용하는 방식이다.

  • DMA의 확장된 개념이다.
  • 한 개의 명령어로 여러 개의 블록을 입출력할 수 있다.

(4) 기억 장치-사상 입출력(Memory-mapped I/O)

메모리 주소의 일정 범위를 지정하여 장치 레지스터에 매핑한다. 이를 통해 메인 메모리의 읽기/쓰기와 동일한 명령어를 사용해서, 보다 편리한 입출력 장치 접근을 제공하는 방식이다.

고속의 응답 시간을 갖는 장치에 적합하다.

인터럽트

인터럽트란 CPU가 특정 기능을 수행하는 도중에 급하게 다른 일을 처리하고자 할 때 사용할 수 있는 기능이다.

인터럽트 처리 과정

  1. 인터럽트가 발생한다.
  2. 진행하던 일을 중지하고 현재의 컴퓨터 상태를 보관한다.
  3. 인터럽트를 처리하기 위해 인터럽트 서비스 루틴(Interrupt Service Routine)을 수행한다.
  4. 인터럽트 처리 후 저장되었던 이전 작업의 상태를 복구하고 재개한다.

인터럽트 종류

  • 외부 인터럽트: 입출력 장치, 타이밍 장치, 전원 등의 외부적인 요인에 의해서 발생한다.
  • 내부 인터럽트: 잘못된 명령이나 데이터를 사용할 때 발생한다.

(1) 인터럽트 우선순위

  1. 전원 공급의 이상
  2. CPU의 기계적인 오류
  3. 외부 신호에 의한 인터럽트
  4. 입출력 전송 요청 및 전송 완료, 전송 오류
  5. 프로그램 검사 인터럽트
  6. 슈퍼바이저 호출(SVC 인터럽트)

인터럽트 우선순위 결정 방식

  • 소프트웨어 방식(Polling): CPU가 모든 제어기에 연결된 TEST I/O 선을 이용해, 인터럽트를 요청한 장치를 검사하는 방식이다.
    • 추가 하드웨어가 필요 없어 회로가 간단한다.
    • 인터럽트를 조사하는 비용이 들어 반응 시간이 느리다.
  • 하드웨어 방식(Vectored Interrupt): 인터럽트를 요청할 수 있는 장치에 버스를 직렬 또는 병렬로 연결해, 인터럽트 요청 장치의 번호를 CPU에게 알린다.
    • 병렬연결 방식: I/O 제어기마다 별도의 버스 선 INTR(Interrupt Request), INTA(Interrupt Acknowledgment)을 이용해서 확인하는 방식이다.
      • 인터럽트를 요청한 장치를 쉽게 찾을 수 있다.
      • 하드웨어 구성이 복잡하다.
      • 인터럽트 포트 수에 연결할 수 있는 장치의 수가 한정적이다.
    • 직렬연결 방식(Daisy Chain): 하나의 INTR, INTA 선에 장치들을 우선순위로 연결한 방식이다.
      • 하드웨어 구성이 간단한다.
      • CPU와 멀리 있는 장치는 인터럽트 요청이 지연될 수 있다(기근).
저작자표시 비영리 변경금지 (새창열림)

'CS > 기타' 카테고리의 다른 글

.DS_STORE  (0) 2022.09.29
markdown 문법  (0) 2022.09.29
Stack과 Heap  (0) 2022.06.16
라이브러리 vs 프레임워크  (0) 2022.06.16
API  (0) 2022.06.16
    'CS/기타' 카테고리의 다른 글
    • .DS_STORE
    • markdown 문법
    • Stack과 Heap
    • 라이브러리 vs 프레임워크
    kang9366
    kang9366

    티스토리툴바