어떻게하면 CPU가 시간낭비없이 메모리에 있는 명령어들을 처리할 수 있을까?

 

명령어 병렬기법

1. 명령어 파이프라인

여러개의 명령어를 겹쳐서 실행하는 방법이다.

명령어가 처리되는 과정을 비슷한 시간 간격으로 나누면?

  1. 명령어 인출 (Instruction Fetch) : 메모리에서 명령어를 가져온다.
  2. 명령어 해석 (Instruction Decode)
  3. 명령어 실행 (Execute Instruction)
  4. 결과 저장 (Write Back)

같은 단계가 겹치지만 않는다면 CPU는 '각 단계를 동시에 실행할 수 있다'

CPU 동시처리
명령어 파이프라인

 

 

명령어 파이프라인이 항상 이상적으로 실행되는 것은 아니다. 동시에 처리할 수 없는 경우도 있는데 그것이 파이프라인 위험이다.

(병렬로 명령어 처리가 되지 않는 경우)

 

파이프라인 위험 : 명령어 파이프라인이 성능 향상에 실패하는 경우

  • 데이터 위험
  • 제어 위험
  • 구조적 위험

1) 데이터 위험 : 명령어 간의 의존성에 의해 야기된다. 모든 명령어를 동시에 처리할 수는 없다.

                         (이전 명령어를 끝까지 실행해야만 비로소 실행할 수 있는 경우)

데이터 위험

 

위의 그림에서 명령어1에서 R1이 계산되기전에 명령어2를 처리할 수는 없다.

 

 

2) 제어 위험 : 프로그램 카운터의 갑작스러운 변화

제어 위험

 

 

3) 구조 위험 : 서로 다른 명령어가 같은 CPU 부품(ALU, 레지스터)를 쓰려고 할 때

 

 

2. 슈퍼스칼라

CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조 (오늘날의 멀티스레드 프로세서)

슈퍼스칼라
슈퍼스칼라(2)

 

이론적으로는 파이프라인 개수에 비례하여 처리 속도가 증가한다. 그러나 파이프라인 위험도 증가하기 때문에 파이프라인 개수에 비례하여 처리 속도가 증가하진 않는다.

 

 

 

3. 비순차적 명령어 처리

비유하자면 합법적인 새치기이다.

비순차적 명령어 처리

 

명령어를 순차적으로 처리하면 결과적으로 순차적으로 처리할 수 없게된다.

명령어의 순차적 처리 불가

 

그렇다면 3번순서의 명령어를 의존성이 없는 순서로 변경하면 어떻게 될까?

순서 변경

 

결과에는 변함이 없다. 하지만 이렇게 순서를 변경하게 되면 원활한 파이프라이닝이 가능하다.

 

하지만 아무 명령어의 순서를 변경할 수 있는 것은 아니다.

 

위의 예시를 보면 1번과 3번의 순서를 바꿀 수 없다. (3 수행을 위해 M(100)이 필요하다)

1번과 4번의 순서를 바꿀 수도 없다. (1을 토대로 3이 수행되고, 3을 토대로 4가 수행된다)

 

4번과 5번의 순서는 변경 가능하다.

 

이렇게 변경하여도 전체 프로그램 실행 흐름에는 영향이 없다.

'컴퓨터구조와 운영체제' 카테고리의 다른 글

RAM의 특성과 종류  (1) 2024.07.03
명령어 집합 구조  (0) 2024.07.02
빠른 CPU를 위한 설계 기법  (0) 2024.06.28
명령어 사이클과 인터럽트  (0) 2024.06.27
레지스터  (0) 2024.06.26

CPU를 어떻게 하면 빠르게 설계 할 수 있을까? 

 

단순하게 생각해보면 CPU는 클럭 신호에 맞춰 움직이기 떄문에 클럭 속도를 빠르게 하면 되지 않을까? 클럭 신호에 맞춰 명령어 사이클이 실행되기 때문에 명령어 사이클 주기도 빨리 돌 것 같다.

 

'그럼 클럭 신호가 빠르게 반복되면 CPU를 비롯한 컴퓨터 부품들은 그만큼 빠른 박자에 맞춰 움직이겠네?'

 

꼭 그런건 아니지만 일반적으로는 맞다.

 

클럭 속도

  • 클럭 속도 : 헤르츠(Hz) 단위로 측정
  • 헤르츠(Hz) : 1초에 클럭이 반복되는 횟수
  • 클럭이 '똑-딱-' 하고 1초에 한 번 반복되면 1Hz
  • 클럭이 1초에 100번 반복되면 100Hz   

실제 CPU의 클럭 속도는 어떨까?

 

1초에 클럭이 기본적으로 25억(2.5x4 109)번, 순간적으로 최대 49억(4.9 x 109)번 반복된다.

 

그럼 클럭 신호를 계속해서 높이면 CPU가 무지막지하게 빨라지지 않을까? CPU의 클럭 속도를 필요 이상으로 높이면 발열이 심각해지기ㅔ 때문에 불가능하다.

 

그럼 클럭 속도에는 한계가 있는데 클럭 속도 말고 CPU의 속도를 높이는 방법은 무엇이 있을까?

  • 코어 수를 늘리는 방법 (듀얼 코어, 멀티 코어...)
  • 스레드 수를 늘리는 방법 (멀티 스레드...)

 

코어

코어란?

코어를 이해하기 위해서는 현대적인 관점에서 CPU라는 용어를 재해석 해야 한다. 전통적으로 명령어를 실행하는 부품은 원칙적으로 하나만 존재했다. 그러나 오늘날에는 CPU에는 명령어를 실행하는 부품이 여러개 존재한다.

코어와 멀티 코어

 

 

 

멀티 코어와 종류

 

CPU내부에 코어수와 속도는 비례하지 않는다.

 

 

스레드

스레드의 종류

 

스레드란 실행 흐름의 단위이다.

 

  • 하드웨어 스레드(=논리 프로세서) : 하나의 코어가 동시에 처리하는 명령어 단위

 

위 그림처럼 여러개의 명령어를 동시에 처리할 수 있는 프로세서, CPU를 멀티 스레드 프로세서, 멀티스레드 CPU라고 부른다.

 

멀티스레드 프로세서를 실제로 설계한는 일은 매우 복잡하지만, 가장 큰 핵심은 레지스터이다. 레지스터 세트가 코어에 여러개가 있으면 하나의 코어가 여러 명령어를 동시에 처리할 수 있다.

레지스터 세트

 

  • 소프트웨어 스레드 : 하나의 프로그램에서 독립적으로 실행되는 단위

소프트웨어 스레드

 

예를 들어 

  1. 사용자로부터 입력받은 내용을 화면에 보여 주는 기능
  2. 사요자가 입력한 내용이 맞춤법에 맞는지 검사하는 기능
  3. 사용자가 입력한 내용을 수시로 저장하는 기능

위 3가지 기능을 동시에 하고 싶으면 스레드를 3개 만들면 된다.

멀티 스레드

 

근데 여기서 중요한게 있다.

1코어 1스레드 CPU도 여러 소프트웨어적 스레드를 만들 수 있다.

 

'컴퓨터구조와 운영체제' 카테고리의 다른 글

명령어 집합 구조  (0) 2024.07.02
명령어 병렬 처리 기법(CPU)  (3) 2024.07.01
명령어 사이클과 인터럽트  (0) 2024.06.27
레지스터  (0) 2024.06.26
ALU와 제어장치  (0) 2024.06.25

 

프로그램 속 명령어들은 일정한 주기가 반복되며 실행 된다. 이 주기를 명령어 사이클이라고 하며, 이 주기를 끊어내는 것을 인터럽트라고 한다.

인터럽트

 

명령어나 프로그램을 CPU가 처리하기 위해서는 가장 먼저 메모리에 있는 명령어를 가져와야 한다. 

  • 인출 사이클 : 가장 먼저 CPU로 가져온다.

인출

이렇게 가져온 명령어를 실행한다.

  • 실행 사이클 : 가져온 명령어를 실행한다.

실행

 

일반적으로 CPU는 위 2가지 사이클이 계속해서 반복되며 동작한다. 인출-실행-인출-실행-......

사이클 주기

 

그런데 CPU로 명령어를 가지고 왔지만 바로 실행이 불가능한 경우도 있다.

아래 그림과 같이 인출을 하더라도 추가적으로 메모리에 접근해야 하는 경우가 있다. ex) 간접 주소 지정 방식

명령어 실행 불가능

 

이런 경우 간접사이클이 추가된다. 

간접 사이클

 

 

인터럽트

CPU가 꼭 주목해야 할 때, CPU가 우선적으로 처리해야 하는 작업이 생겼을 때 발생한다.

 

인터럽트의 종류

  • 동기 인터럽트 (예외) : CPU가 예기치 못한 상황을 접했을 때 발생

동기 인터럽트의 종류

  • 비동기 인터럽트 (하드웨어 인터럽트) : 주로 입출력장치에 의해 발생한다. ex) 알림(세탁기 완료 알림, 전자레인지 조리 알림)과 같은 역할

비동기 인터럽트 예시

 

비동기 인터럽트 예시2

 

왜 존재할까? 

 

CPU가 입출력 작업 도중에서도 효율적으로 명령어를 처리하기 위해 하드웨어 인터럽트를 사용한다.

 

입출력장치는 CPU에 비해 느리다. 그렇기 때문에 인터럽트가 없다면 CPU는 프린트 완료 여부를 확인하기 위해 주기적으로 확인을 해야한다.

CPU의 주기적 확인

 

하지만 인터럽트가 있다면 CPU는 계속해서 자기 일을 할 수 있다. 

 

 

 

하드웨어 인터럽트 처리 순서

하드웨어 인터럽트 처리 순서

 

처리 순서 중 

  • 인터럽트 요청 신호
  • 인터럽트 플래그
  • 인터럽트 벡터
  • 인터럽트 서비스 루틴

에 대해 알아보자.

 

  • 인터럽트 요청 신호 : 말 그대로 CPU의 정상적인 흐름을 끊는 것이기 때문에 요청 신호를 보내게 된다.

인터럽트 요청 신호

 

 

CPU가 인터럽트 요청을 받아들이려면 ??

인터럽트 플래그를 확인한다. 현재 인터럽트를 받아들일 수 있는지 없는지 확인이 가능하다. 

  • 인터럽트 플래그 : 현재 인터럽트를 받아들일 수 있는 상태인지 아닌지 관리

다만 모든 인터럽트를 인터럽트 플래그로 막을 수 있는건 아니다.

 

 

이후 CPU가 인터럽트를 받아들이기로 했다면 인터럽트 서비스 루틴(=프로그램)을 실행한다.

  • 인터럽트 서비스 루틴 : 인터럽트가 발생했을 때, 해당 인터럽트를 어떻게 처리하기 위한 프로그램

인터럽트 서비스 루틴 예시

 

인터럽트 서비스 루틴도 프로그램이기 때문에 메모리에 저장되어 있다. 메모리에 시작주소를 가지고 있다.

메모리에 저장되어 있는 인터럽트 서비스 루틴

 

  • 인터럽트 벡처 : 각각의 인터럽트를 구분하기 위한 정보. CPU가 해당 인터럽스 서비스의 시작주소를 알기 위해 

인터럽트 벡터

 

"CPU가 인터럽트를 처리한다" == "인터럽트 서비스 루틴을 실행하고, 본래 수행하던 작업으로 다시 되돌아온다." 

(+인터럽트의 시작 주소는 인터럽트 벡터를 통해 알 수 있다.)

 

 

근데 문제가 있다. 

아래 그림과 같이 이미 CPU 레지스터 안에는 여러 정보가 저장되어 있을것이다. 이런 것들은 버리고 인터럽트를 먼저 실행해야 할까?

인터럽트를 끝내고 나면 되돌아와 이전에 수행하던 작업을 이어서 실행해야 하기 때문에 인터럽트를 실행하기 전 백업을 해둬야 한다.

 

이러한 백업을 메모리 스택에 저장해두게 된다.

메모리 스택에 백업

 

 

인터럽트의 처리 순서 정리

인터럽트 처리 순서

 

인터럽트가 추가된 명령어 사이클

 

'컴퓨터구조와 운영체제' 카테고리의 다른 글

명령어 병렬 처리 기법(CPU)  (3) 2024.07.01
빠른 CPU를 위한 설계 기법  (0) 2024.06.28
레지스터  (0) 2024.06.26
ALU와 제어장치  (0) 2024.06.25
소스 코드와 명령어  (0) 2024.06.24

레지스터는 CPU 내부의 작은 임시저장장치로 프로그램 속 명령어와 데이터는 실행 전후로 레지스터에 저장된다.

레지스터

 

로우레벨 개발자들은 레지스터에 들은 데이터를 확인할 일이 많다. 

 

CPU 내부에는 다양한 레지스터들이 있고, 각기 다른 역할을 가진다. 레지스터의 종류는 CPU마다 다르며 공용으로 사용하는 레지스터도 있다.

 

반드시 알아야 할 레지스터에는 다음과 같은 것들이 있다.

  1. 프로그램 카운터 : 메모리에서 가져올 명령어의 주소 (메모리에서 읽어 들일 명령어의 주소)
  2. 명령어 레지스터 : 해설할 명령어 (방금 메모리에서 읽어 들인 명령어)
  3. 메모리 주소 레지스터 : 메모리의 주소 (CPU가 읽어 들이고자 하는 주소를 주소 버스로 보낼 때 거치는 레지스터)
  4. 메모리 버퍼 레지스터 : 메모리와 주고받을 값 (데이터와 명령어) (CPU가 정보를 데이터 버스로 주고받을 때 거치는 레지스터) 
  5. 플래그 레지스터 :  연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장하는 레지스터
  6. 범용 레지스터 : 다양하고 일반적인 상황에서 자유롭게 사용 가능한 레지스터
  7. 스택 포인터 : 주소 지정에 사용
  8. 베이스 레지스터 :  주소 지정에 사용

 

 

위 그림처럼 CPU가 처리하고자 하는 프로그램이 1000번지 부터 ~ 1500번지까지 있다고 가정해보자 또 처음부터 프로그램을 실행한다고 가정했을때 프로그램 카운터에는 1000번지가 저장될 것이다.

 

프로그램 카운터에 저장

 

프로그램 카운터가 1000번지 프로그램을 실행하기 위해서는 메모리에 있는 1000번지 데이터를 가져와야 하는데 이때 메모리에 접근하기 위해서 메모리 주소 레지스터를 거치게 된다. (복사가 된다)

메모리 주소 레지스터

 

메모리 제어 신호를 통해 몇번지 메모리를 읽고 싶은지 메모리에게 쏴준다.

메모리 읽기

 

그렇게 되면 메모리는 1000번지에 저장된 값을 메모리 버퍼 레지스터로 데이터 버스를 통해 전달한다. 

전달한 이후 프로그램 카운터는 1이 증가한다. 다음으로 실행할 주소값을 셋팅한다.

 

메모리 -> 메모리 버퍼 레지스터

 

이렇게 가지고 온 1101 명령어를 제어장치가 해석하기 위해서 명령어 레지스터에 복사하게 된다. 

명령어 레지스터로 이동

 

위에서 강조된게 프로그램 카운터는 1 증가한다고 하였는데 이것이 프로그램이 순차적으로 실행할 수 있는 원리가 된다.

 

프로그램 카운티 1증가

 

하지만 항상 이렇게 순차적으로 프로그램이 실행되는 것은 아니다. 

  • 특정 메로리 주소로 실행 흐름을 이동하는 명령어 실행 시 ex) JUMP, CONDITIONAL, CALL, RET
  • 인터럽트 발생 시

위와 같은 경우에 순차적인 흐름이 끊기게 된다.

 

스택 포인터 레지스터에 대해 알아보자.

  • 스택 주소 지정 방식 : 스택과 스택 포인터를 이용한 주소 지정 방식 
  • 스택 포인터 : 스택의 꼭대기를 가리키는 레지스터 

스택 포인터

 

위 그림과 같이 4번지까지 스택이 차있으면 스택 포인터에는 4번지 주소값이 저장된다. 

 

스택은 어디에 있을까??

 

스택은 메모리에 스택 영역이라는 곳에 존재한다.

스택 영역

 

다음은 베이스 레지스터에 대해 알아보자.

  • 변위 주소 지정 방식  : 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소 얻기

변위 주소 지정 방식에서 사용되는 특별한 레지스터이다.

변위 주소 지정 방식이란 오퍼랜드라는 값을 변위로 삼고 특정 레지스터에 있는 값을 더해서 유효 주소를 얻어내는 주소 지정 방식이다.

변위 주소 지정 방식

 

어떤 레지스터에 어떤 변위를 더할것인지 정해야 하기 때문에, 변위 주소 지정 방식을 사용하는 명령어는 다음과 같은 모양을 띄고 있다.

변위 주소 지정 방식 명령어

 

변위 주소 지정 방식에서 어떤 특정 레지스터의 값을 더할것이지에 따라 분류가 된다.

  • 상대 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 프로그램 카운터의 값을 더하여 유효 주소 얻기

상대 주소 지정 방식

 

위 그림은 다음으로 읽을 메모리 주소에서 3번째 전의 명령어를 실행해라 라는 명령어를 실행하려면 위 그림과 같이 표현할 수 있다.

 

  • 베이스 레지스터 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 베이스 레지스터의 값을 더하여 유효 주소 얻기

베이스 레지스터 주소 지정 방식

베이스 레지스터 주소 지정 방식의 경우 베이스 레지스터는 기준 주소역할을 한다. (=프로그램의 시작점) 그 기준으로 부터 오퍼랜드 필드 만큼 떨어져 있는 주소에 접근하고 싶을때 사용한다.

 

 

'컴퓨터구조와 운영체제' 카테고리의 다른 글

빠른 CPU를 위한 설계 기법  (0) 2024.06.28
명령어 사이클과 인터럽트  (0) 2024.06.27
ALU와 제어장치  (0) 2024.06.25
소스 코드와 명령어  (0) 2024.06.24
0과 1로 문자를 표현하는 방법  (0) 2024.06.21

ALU

ALU

계산을 하기 위해서는 피연산자수행할 연산이 필요하다.

ALU는 레지스터로부터 피연산자를 받아들이고, 제어장치로부터 제어 신호를 받아들인다. 결과값을 레지스터에 담아준다.

 

메모리가 아닌 레지스터에 저장하는 이유가 뭘까? CPU가 메모리에 접근하는 것 보다 레지스터에 접근하는것이 훨씬 빠르기 때문이다.

 

 

플래그에 대해 알아보자

 

플래그

 

ALU가 계산한 값이 음수라면 연산 결과가 음수다라는 플래그 값이 플래그 레지스터에 담기게 된다. 

 

플래그의 종류

 

 

제어장치 - 받아들이는 정보

제어장치

 

위에서 클럭이란 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위이다.

클럭

 

명령어 레지스터라는 특수한 레지스터에 의해 해석할 명령어가 제어장치에 입력되게 된다. 받아들인 명령어를 해석하여 제어신호를 내보낸다.

 

여러 장치들의 제어신호를 감지한다. ex) 입출력 장치

 

 

 

 

'컴퓨터구조와 운영체제' 카테고리의 다른 글

명령어 사이클과 인터럽트  (0) 2024.06.27
레지스터  (0) 2024.06.26
소스 코드와 명령어  (0) 2024.06.24
0과 1로 문자를 표현하는 방법  (0) 2024.06.21
0과 1로 숫자를 표현하는 방법  (0) 2024.06.20

개발자가 작성한 소스 코드를 컴퓨터는 어떻게 실행할까?

 

소스 코드
소스변환

 

개발자가 작성한 소스 코드는 고급 언어에 해당하고 이를 컴퓨터가 이해하고 실행할 수 있는 저급 언어로 변환을 해야한다.

 

저급 언어에는 2가지가 존재한다.

저급 언어

저급 언어 

 

1. 기계어

기계어

0과 1로 이루어진 언어 = 명령어로 이루어진 언어이다. 위에 0과 1이 명령어라고 생각하면 된다.

사람 입장에서 이것을 해석하는 것은 알기가 너무 어렵다. 이것을 조금 알아보기 쉬운 저급 언어로 변환한 것이 어셈블리어이다.

 

2. 어셈블리어

어셈블리어
어셈블리어 명령어
어셈블리어 예시

 

고급 언어

고급 언어

 

1. 컴파일 언어

컴파일 언어

 

고급언어가 컴파일러라는 특수프로그램에 의해 컴파일이 된다. 그렇게 되면 명령어로 이루어진 저급 언어로 변환이 된다.

 

 

 

2. 인터프리트 언어

소스 코드를 한 줄씩 실행해주는 언어. (컴파일을 할 수 있는지 없는지 확인)

인터프리터에 의해 한 줄씩 실행된다.  소스 코드 전체가 저급 언어로 변환되기까지 기다릴 필요가 없다

인터프리트 언어

 

컴파일 언어와 인터프리트 언어 비교

컴파일 방식 vs 인터프리트 방식

 

컴파일 & 인터프리트 과정 살펴보기

https://godbolt.org/

 

Compiler Explorer

 

godbolt.org

 

'컴퓨터구조와 운영체제' 카테고리의 다른 글

레지스터  (0) 2024.06.26
ALU와 제어장치  (0) 2024.06.25
0과 1로 문자를 표현하는 방법  (0) 2024.06.21
0과 1로 숫자를 표현하는 방법  (0) 2024.06.20
컴퓨터 구조를 알아야 하는 이유  (0) 2024.06.19

0과 1밖에 모르는 컴퓨터가  어떻게 문자를 표현하고 이해할 수 있을까?

 

문자 집합과 인코딩

  • 문자 집합 (character set) : 컴퓨터가 이해할 수 있는 문자의 모음
  • 인코딩 (encoding) : 문자를 0과 1로 이루어진 문자 코드로 변환하는 과정
  • 디코딩 (decoding) : 0과 1로 표현된 문자 코드로 문자를 변환하는 과정

 

아스키 코드

  • 초창기 문자 집합 중 하나
  • 알파벳, 아라비아 숫자, 일부 특수 문자 및 제어 문자
  • 7비트로 하나의 문자 표현 (실제로는 8비트이지만 1비트는 오류 검출을 위해 사용되는 패리티 비트이다.)

https://namu.wiki/w/%EC%95%84%EC%8A%A4%ED%82%A4%20%EC%BD%94%EB%93%9C

 

아스키 코드

파일:attachment/1275273992_asciitable.gif 2열 이후의 코드들은 위키에서 사용할 수

namu.wiki

 

표를 보면 "A" 는 65로 인코딩, "a"는 97로 인코딩하는 것을 볼 수 있다.

 

아스키 코드는 간단한 인코딩만 가능하고, 한글을 포함한 다른 언어 문자, 다양한 특수 문자 표현이 불가능하다.

7비트로 하나의 문자를 표현하기 때문에 128개보다 많은 문자를 표현할 수 없다.

 

 

한글 인코딩 : 완성형 vs 조합형 인코딩

한글은 한글을 위한 인코딩이 필요하다. 알파벳을 이어 쓰면 단어가 되는 영어. 한글은 초성, 중성, 종성의 조합으로 이루어져있다.  그래서 2가지 인코딩 방식이 존재한다.

  • 완성형 인코딩 방식
  • 조합형 인코딩 방식

한글 인코딩 방식

 

EUC-KR 

  • KS X 1001 KS X 1003 문자집합 기반의 한글 인코딩 방식
  • 완성형 인코딩
  • 글자 하나 하나에 2바이트 크기의 코드를 부여(2바이트 ==  16비트 == 4자리 십육진수로 표현)
  • 2300여개의 한글 표현 가능
  • 여전히 모든 한글을 표현하기에는 부족한 수
  • 쀏, 뙠, 휔 같은 한글은 표현 불가능 (실제로 EUC-KR로 인코딩되어 피해를 본 피해자 존재)

EUC KR

직접 인코딩 해보기 

https://dencode.com/

 

DenCode | Encoding & Decoding Online Tools

Encoding and Decoding site. e.g. HTML Escape / URL Encoding / Base64 / MD5 / SHA-1 / CRC32 / and many other String, Number, DateTime, Color, Hash formats!

dencode.com

 

언어별로 인코딩을 국가마다 하게 되면 다국어를 지원하는 프로그램을 개발할 때엔 언어별 인코딩 방식을 모두 이해해야 한다.

 

언어별 인코딩

 

그렇다면 

 

"모든 언어, 특수문자까지 통일된 문자 집합을 사용하면 어떨까?"

"통일된 문자 집합 & 인코딩 방식이 있다면?"

 

 

유니코드 문자 집합과 UTF-8

 

유니코드

  • 통일된 문자 집합
  • 한글, 영어, 화살표와 같은 특수 문자, 심지어 이모티콘까지
  • 현재 문자 표현에 있어 매우 중요한 위치
  • 유니코드의 인코딩 방식 : UTF-8, UTF-16, UTF-32 ...

https://symbl.cc/en/unicode/blocks/

 

Unicode Blocks (◕‿◕) SYMBL

Unicode web service for character search. Find, copy and paste your favorite characters: 😎 Emoji, ❤ Hearts, 💲 Currencies, → Arrows, ★ Stars and many others 🚩

symbl.cc

 

 

UTF-8 인코딩

  • UTF(Unicode Transformation Format) == 유니코드 인코딩 방법
  • 가변 길이 인코딩 : 인코딩 결과가 1바이트 ~ 4바이트
  • 인코딩 결과가 몇 바이트가 될지는 유니코드에 부여된 값에 따라 다름

 

"한" 과 "글" 글자를 2진수로 표현하면 다음과 같다.

  • "한": D55C (== 1101 0101 0101 1100)
  • "글" : AE00 (== 1010 1110 0000 0000)

이걸 UTF-8로 인코딩 해보자.

  • "한": 11101101 10010101 10011100
  • "글" : 11101010 10111000 10000000

 

직접 인코딩 해보기

https://onlinetools.com/utf8/convert-utf8-to-binary

 

Convert UTF8 to Binary Bits

World's simplest online utility that converts UTF8 to binary. Free, quick, and powerful. Import UTF8 – get binary bits.

onlinetools.com

 

 

'컴퓨터구조와 운영체제' 카테고리의 다른 글

레지스터  (0) 2024.06.26
ALU와 제어장치  (0) 2024.06.25
소스 코드와 명령어  (0) 2024.06.24
0과 1로 숫자를 표현하는 방법  (0) 2024.06.20
컴퓨터 구조를 알아야 하는 이유  (0) 2024.06.19

컴퓨터는 0과 1로 모든 연산을 처리하는데 어떻게 많은 일들을 처리할 수 있을까?

 

정보 단위

비트(bit) : 0과 1을 표현하는 가장 작은 정보 단위 (=컴퓨터가 이해할 수 있는 가장 작은 정보 단위)

 

 

  • n비트로 2^n가지의 정보를 표현 가능하다.
  • 프로그램은 수많은 비트로 이루어져 있음
  • 비트보다 더 큰 단위가 존재한다. ex) 바이트, 킬로바이트, 메가바이트, 기가바이트 ...

정보의 단위

 

워드(word)

CPU가 한 번에 처리할 수 있는 정보의 크기 단위

  • 하프 워드(half word) : 워드의 절반 크기
  • 풀 워드(full word) : 워드 크기
  • 더블 워드(double word) :  워드의 두 배 크기

 

 

0과 1로 숫자를 표현하기

이진법(binary)

  • 0과 1로 수를 표현하는 방법
  • 숫자가 1을 넘어가는 시점에 자리올림
  • 우리가 일상적으로 사용하는 진법은 십진법(decimal)

십진법과 이진법

 

0과 1로 음수 표현하기 : 2의 보수

 - 어떤 수를 그보다 큰 2^n 에서 뺀 값(= 모든 0과 1을 뒤집고 1 더한 값)

2의 보수법

 

 

음수 두 번 구해보기

 

 

 

" -1011(2) 를 표현하기 위한 0101(2)과 십진수 5를 표현하기 위한 0101(2)는 똑같이 생겼는데 어떻게 구분할까?"

 

이것을 구분하기 위해 CPU 내부에는 플래그(flag) 레지스터가 존재한다.

플래그

 

 

십육진법

이진법으로는 숫자의 길이가 너무 길어진다. ex) 십진수 32 = 이진수 100000

그래서 컴퓨터의 데이터를 표현할 때 십육진법도 많이  사용한다. 수가 15를 넘어가는 시점에 자리올림을 한다.

 

16진법
2진수 -> 16진수 변환

 

16진수 -> 이진수 변환

 

'컴퓨터구조와 운영체제' 카테고리의 다른 글

레지스터  (0) 2024.06.26
ALU와 제어장치  (0) 2024.06.25
소스 코드와 명령어  (0) 2024.06.24
0과 1로 문자를 표현하는 방법  (0) 2024.06.21
컴퓨터 구조를 알아야 하는 이유  (0) 2024.06.19

프로그래밍 언어의 문법만 완벽하게 숙지한다면 좋은 개발자가 될 수 있지 않을까?

하지만 컴퓨터의 구조와 운영체제에 대해 알지 못한다면 나사가 빠진 개발자가 될 수 밖에 없다. 컴퓨터의 구조와 운영체제를 알아야 프로그래밍을 근본적으로 이해하고 다양한 문제를 쉽게 해결할 수 있는 능력을 가지게 되기 때문이다.

 

컴퓨터 구조와 운영체제를 알아야 하는 이유

  • 문제 해결 능력이 향상된다.
  • 프로그래밍 언어의 문법만으로는 알기 어려운 성능/용량/비용을 고려하여 개발할 수 있다.
  • 운영체제의 작동 원리를 이해하여 하드웨어와 프로그램을 더 깊이 이해하고 문제 해결의 실마리를 찾을 수 있다.

 

컴퓨터의 구조를 간략하게 살펴보면 아래와 같이 나타낼 수 있다.

컴퓨터의 구조

여기에서 컴퓨터가 이해하는 두 가지 정보 중 데이터

  • 숫자, 문자, 이미지, 동영상과 같은 정적인 정보
  • 컴퓨터와 주고받는/내부에 저장된 정보를 데이터
  • 0과 1로 숫자를 표현하는 방법
  • 0과 1로 문자를 표현하는 방법

등을 데이터라고 부를 수 있다.

 

컴퓨터는 0과 1밖에 이해하지 못하는데 어떻게 숫자, 이미지, 동영상 같은 정보를 이해할 수 있을까?

 

컴퓨터가 이해하는 두 가지 정보중 명령어

  • 컴퓨터를 실질적으로 움직이는 정보
  • 데이터는 명령어를 위한 일종의 재료

라고 이해할 수 있다. ex) "1과 2를 더하라"

 

 

컴퓨터의 네 가지 핵심 부품

네 가지 핵심 부품

 

  1. CPU (중앙처리장치)
  2. 메모리 (RAM(하드웨어)) : 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품
  3. 보조기억장치
  4. 입출력장치 (마우스, 키보드, 프린터 등등)

이 네 가지의 부품이 부착되어 모여있는 곳이 마더보드(=메인보드)이다.

 

 

메모리

  • 프로그램이 실행되기 위해서는 메모리에 저장되어 있어야 한다.
  • 메모리는 실행되는 프로그램의 명령어와 데이터를 저장한다.
  • 메모리에 저장된 값의 위치는 주소로 알 수 있다.

메모리는 주소를 갖는다.

 

 

CPU

CPU

 

CPU 내부에 있는 대표적인 장치 3가지

  • ALU : 계산기
  • 레지스터 : CPU 내부의 작은 저장장치
  • 제어장치 : 제어 신호(전기신호)를 내보내고, 명령어를 해석하는 장치

 

메모리에 있는 명령어를 CPU에서 처리한다고 생각하면 된다.

CPU에서 메모리 읽기

 

CPU에서 메모리 읽기(2)

 

CPU에서 읽은 메모리 처리

 

CPU에서 처리된 메모리 쓰기

 

  • CPU는 메모리에 저장된 값을 읽어 들이고, 해석하고, 실행하는 장치다.
  • CPU 내부에는 ALU, 레지스터, 제어장치가 있다. 

        *  ALU는 계산하는 장치

        *  레지스터는 임시 저장 장치

        *  제어장치는 제어 신호를 발생시키고 명령어를 해석하는 장치

 

 

보조기억장치

RAM같은 메모리는 비싸고, 전원이 꺼지면 저장된 내용을 잃는다. (=휘발성 저장장치) 그렇기 때문에 전원이 꺼져도 저장될 수 있는 저장 장치가 필요하게 되는데 이것이 보조기억장치이다.

 

메모리는 실행할 정보를 저장하고, 보조기억장치는 보관할 정보를 저장한다.

 

 

 

'컴퓨터구조와 운영체제' 카테고리의 다른 글

레지스터  (0) 2024.06.26
ALU와 제어장치  (0) 2024.06.25
소스 코드와 명령어  (0) 2024.06.24
0과 1로 문자를 표현하는 방법  (0) 2024.06.21
0과 1로 숫자를 표현하는 방법  (0) 2024.06.20

+ Recent posts