//구글콘솔 광고 추가가
주기억장치의 종류에는 크게 RAM과 ROM 두가지가 있으며,
메모리라는 용어는 그중 RAM을 지칭하는 경우가 많음.
RAM의 특징

: 전원이 꺼지면 저장된 내용이 날아감.

- RAM은 휘발성 저장 장치, 보조기억장치는 비휘발성 저장 장치.

 

RAM의 종류
DRAM(Dynamic RAM) 저장된 데이터가 동적으로 사라지는 램. 데이터 소멸을 막기 위해 주기적으로 재활성화 해야 함. 
상대적으로 소비전력이 낮고 저렴하고, 집적도가 높아 대용량으로 설계하기 용이하기 때문에 실제로 메모리로 사용되는 램.
SRAM(Static RAM) 전원이 연결되어 있다면, 저장된 데이터가 정적인(사라지지 않는) RAM.
DRAM보다 일반적으로 입출력 속도가 빠름.
상대적으로 소비 전력이 높고 가격도 높고, 집적도가 낮아 대용량으로 설계할 필요는 없으나 빨라야 하는 장치에서 사용. 캐시메모리에서 사용되는 RAM.
SDRAM
(Synchronous DRAM)
DRAM의 발전된 램 >> 특별한(발전된 형태의) DRAM. 클럭 신호와 동기화된 DRAM.
DDR SDRAM
(Double Data Rate SDRAM)
특별한(발전된 형태의) SDRAM, 최근 가장 대중적으로 사용하는 RAM. 
대역폭을 넓혀 속도를 빠르게 만든 SDRAM. 대역폭은 데이터를 주고받을수 있는 길의 너비

 

  DRAM SRAM
재충전 필요함 필요없음
속도 느림 빠름
가격 저렴함 비쌈
집적도(오밀조밀 꽉꽉) 높음 낮음
소비 전력 적음 높음
사용 용도 주기억장치(RAM) 캐시메모리

 


메모리의 주소 공간

(물리 주소 & 논리 주소)

CPU와 실행중인 프로그램은 현재 메모리 몇 번지에 무엇이 저장되어 있는지 알고 있을까?
NO.
메모리에 저장된 값들은 시시각각 변하기 때문.
- 새롭게 실행되는 프로그램은 새롭게 메모리에 적재
- 실행이 끝난 프로그램은 메모리에서 삭제
- 같은 프로그램을 실행하더라도 실행할 때마다 적재되는 주소는 달라짐.

이러한 점을 극복하기 위해 주소 체계를 물리주소와 논리 주소로 나눈다. 
물리 주소 논리 주소
메모리 입장에서 바라본 주소
말 그대로 정보가 실제로 저장된 하드웨어상의 주소
CPU와 실행 중인 프로그램 입장에서 바라본 주소.
실행중인 프로그램 각각에게 부여된 0번지부터 시작하는 주소
물리 주소와 논리 주소의 변환
CPU와 메모리 사이에 있는 MMU(메모리 관리 장치)라는 하드웨어에 의해  논리주소는 물리 주소로 변환.
CPU가 이해하고 실행하는 주소는 전부 논리주소.
MMU는 논리주소와 베이스 레지스터(프로그램의 기 주소, 시작 주소)값을 더하여 논리 주소를 물리 주소로 변환함. 

*베이스 레지스터 : 프로그램의 가장 작은 물리 주소(프로그램의 첫 물리 주소)를 저장하는 셈.
*논리 주소 : 프로그램의 시작점으로 부터 떨어진 거리 인 셈.
CPU가 접근하려는 논리 주소는 한계 레지스터가 저장한 값보다 커서는 안됨.

 

메모리 보호 기법

1. 한계 레지스터 :

- 프로그램의 영역을 침범할 수 있는 명령어의 실행을 막음.

- 베이스 레지스터가 실행중인 프로그램의 가장 작은 물리 주소를 저장한다면, 한계 레지스터는 논리 주소의 최대 크기를 저장.

2. 주소범위 제한:

- 프로그램의 물리 주소 범위는 베이스 레지스터 값 이상에서부터 베이스 레지스터 값에 한계 레지스터 값을 더한 값 미만까지로 제한된다.

- 베이스 레지스터 값 <= 프로그램의 물리 주소 범위 < 베이스 레지스터 + 한계 레지스터 값 

>> CPU는 메모리에 접근하기 전, 접근하고자 하는 논리 주소가 한계 레지스터보다 작은지를 항상 검사한다.
만약 검사를 했는데 논리 주소가 한계레지스터가 크면 인터럽트(트랩)를 발생시킨다.
이런 메모리 보호 기법을 통해 실행중인 프로그램의 독립적인 실행 공간을 확보하고, 하나의 프로그램이 다른 프로그램을 침범하지 못하게 보호한다.

 


 

 

CPU가 메모리에 접근하는 시간은 CPU 연산 속도보다 느리다.  

 

저장 장치 계층 구조(memory hierarchy)
: CPU에 얼마나 가까운가를 기준으로 계층적으로 나타낼수 있음

1. CPU와 가까운 저장 장치는 빠르고, 멀리 있는 저장 장치는 느리다.

2. 속도가 빠른 저장 장치는 저장 용량이 작고, 가격이 비싸다. 

메모리 저장 장치 계층 구조

캐시 메모리

- CPU와 메모리 사이에 위치한, 레지스터보다 용량이 크고 메모리보다 빠른 SRAM기반의 저장장치

- CPU의 연산 속도와 메모리 접근 속도의 차이를 조금이나마 줄이기 위해 탄생.

- CPU가 매번 메모리에 왔다 갔다 하는 건 시간이 오래 걸리니, 메모리에서 CPU가 사용할 일부 데이터를 미리 캐시 메모리로 가지고 와서 쓰자.가 캐시메모리의 취지.

메모리에 접근  ==  물건을 사러가는 것이라 생각하면,
메모리 == 물건은 많지만 집(CPU)과는 멀리떨어져 있어 왕복이 오래 걸리는 대형 마트
캐시메모리 == 물건이 많지는 않아도 집(CPU)과 가까이 있는 편의점 이라 생각해보면 된다. 

 

캐시메모리는 하나가 아님. 계층적으로 구성할수 있음. CPU내부에 있을수도 외부에 있을 수도 있음.

계층적 캐시 메모리(L1 - L2 - L3 캐시) - 일반적으로 L1캐시와 L2캐시는 코어 내부에, L3캐시는 코어 외부에 있다.

L3캐시의 용량은 메모리보다 작지만, L1과 L2캐시보단 크다. 

계층적 캐시 메모리까지 반영한 저장 장치 계층 구조

참조 지역성의 원리
: CPU가 미래에 원하는 데이터를 예측하여 속도가 빠른 장치인 캐시 메모리에 담아 놓는데 이때의 예측률을 높이기 위하여 사용하는 원리 >> CPU가 사용할 법한 데이터를 예측하는 방법.

- 캐시 메모리는 메모리보다 용량이 작다. 당연하게도 메모리의 모든 내용을 저장할 수 없다.

따라서, CPU가 자주 사용할 법한 내용을 예측하여 저장함.

캐시 히트 예측이 들어맞을 경우(자주 사용할 것으로 예측한 데이터가 실제로 들어맞아 CPU가 캐시메모리에 저장된 값을 활용할 경우)
>> 이 경우엔 메모리에 접근하는 것보다 성능이 높아짐
캐시 미스 예측이 틀렸을 경우(자주 사용할 것으로 예측하여 메모리에 저장했지만 예측이 틀려 CPU가 메모리에 접근해야 하는 경우) 
>> 성능 하락!
캐시 적중률 캐시 히트 횟수 / (캐시히트횟수 + 캐시미스 횟수)
>> 적중률이 높으면 높을 수록 성능 높아짐.
참조 지역성의 원리란, CPU가 메모리에 접근할 때의 주된 경향을 바탕으로 만들어진 원리.

CPU의 주된 경향 2가지
- CPU는 최근에 접근 했던 메모리 공간에 다시 접근하려는 경향(시간 지역성)이 있다.
- CPU는 접근한 메모리 공간 근처를 접근하려는 경향(공간 지역성)이 있다. 
728x90
반응형
어떻게 시간을 알뜰살뜰하게 쓰면서 명령어들을 빠르게 처리할 수 있을까?
명령어 파이프라인
: 순차적으로 명령어를 처리함.
명령어 인출 >> 명령어 해석 >> 명령어 실행 >> 결과 저장 
-같은 단계가 겹치지만 않으면 CPU는 각 단계를 동시에 실행할수 있다. >> 동시에 여러 개의 명령어를 겹쳐서 실행

ex>>
명령어 1  인출 >> 해석 >> 실행 >> 저장
명령어 2                인출 >> 해석 >> 실행 >> 저장
명령어 3                              인출 >> 해석 >> 실행 >> 저장

명령어 파이프라인이 성능향상에 실패하는 경우, 제대로 병렬처리가 되지 않는 경우 >> 파이프라인 위험이라 함.
파이프라인 위험에는 데이터 위험, 제어 위험, 구조적 위험이 있다.

데이터 위험 명령어 간의 의존성으로 인해 아직 수행되지 않은 명령어의 결과값을 참조함으로써 발생하는 위험.
모든 명령어를 동시에 처리할 수는 없다.
(이전 명령어를 끝까지 실행해야만 비로소 실행 할 수 있는 경우)
제어 위험 프로그램 카운터의 갑작스로운 변화로 발생하는 위험.
구조적 위험  서로 다른 명령어가 같은 자원(ALU, 레지스터 등)에 접근함으로써 발생하는 위험
- 슈퍼 스칼라: CPU내부에 여러개의 명령어 파이프라인을 포함한 구조 (오늘날의 멀티스레드 프로세서)
: 이론적으로는 파이프라인 개수에 비례하여 처리 속도가 증가해야 하는데, 현실적으로는 관리해야 하는 파이프라인도 증가를 하고, 파이프라이 위험도의 증가도 있어서 파이프라인 개수에 비례하여 처리 속도가 증가하진 않음.

 

비순차적 명령어 처리( Out-of-Order Execution, OoOE)

:파이프라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는 명령어 병렬 처리 기법. 

BUT, 아무 명령어가 순서를 바꿀 수는 없다. 전체 프로그램 실행 흐름에 영향이 없어야 함. 

728x90
반응형

코어와 멀티 코어

코어(core)란?
: CPU내에서 명령어를 실행하는 부품
현대적인 관점에서 "CPU"라는 용어를 재해석해야 함.
전통적으로 명령어를 실행하는 부품은 원칙적으로 하나만 존재.
그러나, 오늘날 CPU에는 여러개가 존재.
CPU안에서 명령어를 인출하고 해석하고 실행하는 부품 == 오늘날의 "코어"

싱글 코어 == 하나만 있는 코어.
멀티코어 == 두개 이상의 코어.
멀티코어 프로세서 == 여러 개의 코어를 포함하고 있는 CPU.

코어수에 비례해서 CPU의 속도가 증가하는 건 아님.


스레드와 멀티 스레드

스레드(thread)란?
: 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
스레드는 하드웨어적 스레드와 소프트웨어적 스레드가 있다.
- 하드웨어 스레드( 논리 프로세서라고도 함): 하나의 코어가 동시에 처리하는 명령어 단위. 
- 소프트웨어 스레드: 하나의 프로그램에서 독립적으로 실행되는 단위.
1코어 1스레드 CPU도 여러 소프트웨어적 스레드를 만들 수 있다.

 

멀티스레드(multi thread)란?

: CPU의 최대 활용을 위해 프로그램의 둘 이상을 동시에 실행하는 기술.


강의를 듣다가 하드웨어 스레드와 프트웨어 스레드에 대해 궁금해져서 더 찾아보았는데,

더 쉽게 이해 할수 있는 글을 읽었다.

 

'4코어 8(하드웨어) 스레드라는 것은, 상하권이 나뉜 4세트의 책과 같습니다. 이 4세트를 가지고 도서관에서 100명의 사람에게 빌려 줄 수 있습니다. 비록 한 번에 읽을 수 있는 사람은 8 사람 (소프트웨어 스레드) 밖에 없지만요.'

 

스레드들을 공부하다가 잘 정리된 블로그가 있어서 추가해둔다.

싱글스레드와 멀티스레드 참고 블로그

https://velog.io/@gil0127/%EC%8B%B1%EA%B8%80%EC%8A%A4%EB%A0%88%EB%93%9CSingle-thread-vs-%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%93%9C-Multi-thread-t5gv4udj

728x90
반응형

레지스터란?

CPU 내부의 작은 임시 저장 장치이며,

프로그램 속 명령어 & 데이터는 실행 전 후로 관련된 값들이 레지스터에 저장된다.

 

반드시 알아야 할 레지스터의 종류
1 프로그램 카운터 메모리에서 가져올 명령어의 주소를 저장 (메모리에서 읽어 들일 명령어의 주소)
>> Instruction Pointer(명령어 포인터) 라고도 부르는 cpu도 있음
2 명령어 레지스터 해석할 명령어를 저장 (방금 메모리에서 읽어 들인 명령어) >> 제어장치가 해석
3 메모리 주소 레지스터 메모리의 주소 저장 >> CPU가 읽어 들이고자 하는 주소를 주소버스로 보낼때 거치는 레지스터
4 메모리 버퍼 레지스터 메모리와 주고 받을 값을 저장(데이터와 명령어) >> CPU가 정보를 데이터 버스로 주고 받을떄 거치는 레지스터
5 플래그 레지스터 연산 결과 또는 CPU 상태에 부가적인 정보를 저장
6 범용 레지스터 다양하고 일반적인 상황에서 자유롭게 사용(주소, 명령어, 데이터 등 다양하게 저장 가능)
7 스택 포인터 주소 지정에 사용 스택 주소 지정 방식: 스택과 스택 포인터를 이용한 주소 지정 방식
스택 포인터: 스택의 꼭대기를 가리키는 레지스터. (스택이 어디까지 차 있는지에 대한 표시 같은거.)
8 베이스 레지스터 주소 지정에 사용 번위 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 특정 레지스터(프로그램 카운터, 베이스 레지스터)의 값을 더하여 유효 주소 얻기. 
상대 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 프로그램 카운터의 값을 더하여 우효 주소 얻기.
베이스 레지스터 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 베이스 레지스터(기준 주소)의 값을 더하여 유효 주소 얻기.

명령어 사이클과 인터럽트 ★ ★ ★

명령어 사이클

- 명령어 사이클이란, 프로그램 속 명령어들은 일정한 주기가 반복되며 실행되는데 이 주기를 말함.

인출 사이클 : 가장 먼저 CPU를 갖고 온다.
실행 사이클:  가지고 온 걸 실행한다.
인출 >> 실행 >> 인출 >> 실행... (반복). 
but, CPU로 명령어를 가지고 와도 바로 실행이 불가능한 경우도 있음.
이러한 메모리 접근이 더 필요한 경우엔 간접 사이클이 추가됨.
인출>> 간접 >> 실행 >> 인출 >>...(반복)

인터럽트가 발생했을 경우, 인터럽트 사이클 추가 됨.
인출 >> 간접 >> 실행 >> 인터럽트 >> 인출...(반복)
인터럽트
: 정해진 흐름대로 명령어를 처리하려는 CPU의 흐름을 끊어 버리는 행동을 함.

- 인터럽트(interrupt): 방해하다, 중단시키다.

- CPU가 꼭 주목해야 할 때이거나, CPU가 얼른 처리해야 할 다른 작업이 생겼을 때 발생.
ex>> 헤이헤이, 급해 급해!! 지금 하던 거 일단 멈추고 이것부터 실행해 줘!!
-인터럽트의 종류 :
1. 동기 인터럽트(예외) : CPU가 예기치 못한 상황을 접했을 때 발생.
 -동기 인터럽트의 종류 : 폴트, 트랩, 중단, 소프트웨어 인터럽트.
2. 비동기 인터럽트(하드웨어 인터럽트) : 주로 입출력장치에 의해 발생. 알림과 같은 역할(쿠쿠밥다됨 알림 같은 거)
하드웨어 인터럽트에 대해 더 자세하게 알아보자.
:  알림과 같은 인터럽트.

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

- 입출력장치는 CPU에 비해 느리다.
  인터럽트가 없다면 CPU는 명령 완료 여부를 확인하기 위해 주기적으로 확인해야 됨.
>> 그렇기 때문에 인터럽트를 이용해 입출력 작업동안 CPU가 다른 일을 할 수 있게 함.
하드웨어 인터럽트의 처리 순서
:인터럽트의 종류와 상관없이 인터럽트 처리 순서는 비슷함.
  1. 입출력 장치는 CPU에 인터럽트 요청 신호를 보냄.(입출력 장치들이 "지금 껴들어가도 되나요?" 하는 요청신호)
  2. CPU는 실행 사이클이 끝나고 명령어를 인출하기 전에 항상 인터럽트 여부를 확인함.
  3. CPU는 인터럽트 요청을 확인하고 플래그 레지스터에 있는 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인. >> 하드웨어 인터럽트에는 모든 인터럽트를 인터럽트 플래그로 막을 수 있진 않아. 막을수 있는 인터럽트와 막을수 없는 인터럽트로 나뉨
  4. 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업(스택영역에 백업)함.
  5. CPU는 인터럽트 벡터*를 참조하여 인터럽트 서비스 루틴*을 실행함.
  6. 인터럽트 서비스 루틴 실행이 끝나면 백업해 둔 작업을 복구하여 실행을 재개.

* 인터럽트 벡터 : 각각의 인터럽트를 구분하기 위한 정보.

* 인터럽트 서비스 루틴 :

인터럽트가 발생했 을 때 해당 인터럽트를 어떻게 처리하기 위한 프로그램. 프로그램이기에 메모리에 저장.

ex> 키보드가 인터럽트 요청을 보내면 이렇게 행동해야 함.

CPU가 인터럽트를 처리한 다라는 의미 >> 인터럽트 서비스 루틴을 실행하고, 본래 수행하던 작업으로 다시 되돌아온다.(+ 그리고 인터럽트의 시작 주소는 인터럽트 벡터를 통해 알 수 있다.)

728x90
반응형

명령어의 구조

저급언어에는 기계어와 어셈블리어로 이루어져 있는데 이런 저급언어는 명령어들로 이루어져 있음.

명령어의 구조 ( == 연산 코드 + 오퍼랜드)

연산 코드(수행할 연산) + 오퍼랜드(연산에 사용될 데이터 혹은 연산에 사용될 데이터가 저장된 위치(==주소필드))

**오퍼랜드의 개수는 여러개가 될수도 있고 하나도 없을 수도 있다.(하나도 없는경우 0주소, 한개인 경우 1주소, 두개인 경우 2주소 등 오퍼팬드의 갯수에 따라 "갯수+ 주소"로 불릴수 있음.)

연산코드란 수행할 연산을 뜻함

  • 연산 코드의 종류와 생김새는 CPU에 따라 다르지만 공통적으로 들어가는 요소들 4가지가 있음(1. 데이터 전송. 2.산술/논리 연산. 3. 제어 흐름 변경. 4. 입출력 제어)

대표적인 연산 코드의 종류

  1. 데이터 전송
  • move : 데이터를 옮겨라
  • store : 메모리에 저장하라
  • load(fetch) : 메모리에서 CPU로 데이터를 가져와라
  • push : 스택에 데이터를 저장하라
  • pop : 스택의 최상단 데이터를 가져와라
  1. 산술/논리 연산
  • ADD/ SUBTRACT/ MULTIPLY / DIVIDE: 덧셈, 뺄셈, 곱셈, 나눗셈을 수행해라
  • INCREMENT / DECREMENT: 오퍼랜드에 1을 더해라, 1을 빼라
  • AND / OR/ NOT:AND / OR / NOT 연산을 수행하라
  • COMPARE: 두개의 숫자 또는 TRUE/FALSE값을 비교해라
  1. 제어흐름 변경 - 특정 메모리 주소로 실행의 순서를 옮기는 연산코드
    • JUMP: 특정 주소로 실행 순서를 옮겨라
    • CONDITIONAL JUMP : 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라.
    • HALT : 프로그램의 실행을 멈춰라
    • CALL : 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
    • RETURN : CALL을 호출할 때 저장했던 주소로 돌아가라
    • *call과 return : 특정 함수를 실행하고 다시 돌아가라
  2. 입출력 제어
  • READ(INPUT): 특정 입출력 장치로부터 데이터를 읽어라
  • WRITE(OUTPUT): 특정 입출력 장치로 데이터를 써라
  • START IO: 입출력 장치를 시작하라
  • TEST IO: 입출력 장치의 상태를 확인하라

오퍼랜드에 저장된 위치인 주소값으로 저장하는 이유

  • 하나의 오퍼랜드에 표현될 수 있는 데이터의 크기가 훨씬 커짐

명령어 주소 지정 방식

  • 유효주소(effective adress): 연산에 사용할 데이터가 저장된 위치
  • 명령어 주소 지정방식(addressing modes): 연산에 사용할 데이터가 저장된 위치를 찾는 방법 == 유효 주소를 찾는 방법, 다양한 명령어 주소 지정 방식들이 있음.

명령어 주소 지정 방식

  • 즉시 주소 지정 방식(immediate addressing mode): 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시, 가장 간단한 형태의 주소 지정 방식, 단점으론 연산에 사용할 데이터의 크기가 작아질수 있지만 빠름.
  • 직접 주소 지정 방식(direct addressing mode) : 오퍼랜드 필드에 유효 주소 직접적으로 명시, 단점으론 유효 주소를 표현할 수 있는 크기가 연산 코드만큼 줄어듦.
  • 간접 주소 지정 방식(indirect addressing mode): 오퍼랜드 필드에 유효 주소의 주소를 명시, 단점으론 앞선 주소지정 방식들에 비해 속도가 느림. >>메모리를 뒤적뒤적해서 느림
  • 레지스터 주소 지정 방식(register addressing mode): 연산에 사용할 데이터가 저장된 레지스터 명시, 메모리에 접근하는 속도보다 레지스터에 접근하는 것이 빠름.
  • 레지스터 간접 주소 지정 방식(register indirect addressing mode) : 연산에 사용할 데이터를 메모리에 저장, 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시
728x90
반응형
고급 언어와 저급 언어란?

 

고급언어 : 개발자가 이해하기 쉽게 만든 언어

 

저급언어: 컴퓨터가 이해하고 실행하는 언어

  • 기계어 : 이진수(0과1)로 이루어진 명령어
  • 어셈블리어 : 0과 1로 이루어진 기계어를 읽기 편한 형태로 번역한 저급 언어

 

고급언어를 저급언어로 변환 하는 과정에는 컴파일방식과 인터프리터방식이 있음.
  • 컴파일 언어: 고급언어에서 쓴 소스 코드를 컴파일러에 의해 컴파일이 되어 저급언어인 목적코드로 변환이 됨. 컴파일러에 의해 소스코드를 전부 훑어보고 전체를 목적코드로 컴파일함. 이로 인해 소스코드 컴파일 중간에 오류가 발생하면 소스전체가 실행되지 않음.
  • 인터프리트 언어: 인터프리터에 의해 한 줄씩 실행. 소스코드 전체가 저급언어로 변환되기까지 기다릴 필요 X. 한줄씩 실행하기 때문에 소스코드 인터프리트 중 오류가 발생하면 오류 발생 전까지 코드는 실행됨.

** 컴파일과 인터프리트 과정을 살펴보려면

: https://godbolt.org/ 여기서 고급언어를 선택한 후 소스코드를 적어보면 저급언어로 어떻게 변환되는지 확인 가능.

 

728x90
반응형
문자 집합과 인코딩

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

 

대표적이고, 대중적인 문자 집합, 인코딩 방법인
" 아스키 코드 "
  • 초창기 문자 집합 중 하나.
  • 알파벳, 아라비아 숫자, 일부 특수 문자 및 제어 문자.
  • 7비트로 하나의 문자 표현(실제로는 8비트를 쓰지만 1비트는 오류 검출을 위해 사용되는 패리티 비트(parity bit)) == 0부터 127개의 아스키코드가 있으며 총개수는 2의 7승인 128개.
  • A는 65로 인코딩, a는 97로 인코딩.
  • 장점 : 간단한 인코딩.
  • 단점 : 한글을 포함한 다른 언어 문자, 다양한 특수 문자 표현 불가 - 아스키 코드는 7비트로 하나의 문자를 표현하기에 128개보다 많은 문자를 표현할 수 없음. 8비트 확장 아스키가 등장했지만, 여전히 부족함.

한글 인코딩: 완성형 인코딩(ex: 남) vs 조합형(ex: ㄴ + ㅏ + ㅁ) 인코딩

  • 초성, 중성, 종성의 조합으로 이루어진 한글은 전체를 하나로 묶어 글자 하나를 인코딩할지(완성형 인코딩), 다 나눠서 각각 인코딩할지(조합형 인코딩)로 나뉨.
  • EUC-KR : KS X 1001 KS X 1003 문자집합 기반의 한글 인코딩 방식, 완성형 인코딩이며 글자 하나하나에 2바이트 크기의 코드 부여(dencode.com에서 테스트확인 가능). 하지만 모든 한글을 표현할 순 없음.
하지만 모든 한글을 표현할순 없다. >> 그래서 만들어진 유니코드 문자집합
  • 이걸 해결 하기 위해 통일된 문자 집합인 유니코드 문자 집합이 만들어짐. - 한글, 영어, 화살표와 같은 특수 문자들이 포함되어 있으며 현대 문자 표현에 있어 매우 중요한 위치에 있다.
  • 유니코드의 인코딩 방식은 utf-8, utf-16, utf-32 ...이 있음. 여기서 utf의 뜻은 Unicode Transformation Format의 줄임말로 유니코드 인코딩 방법이란 뜻임. - 가장 대중적인 방식인 utf-8 인코딩 : 가변 길이 인코딩으로 인코딩 결과가 1바이트 ~ 4바이트가 될 수 있음(인코딩 결과가 몇 바이트가 될지는 유니코드에 부여된 값에 따라 다름.).
  •  https://onlineutf8tools.com/convert-utf8-to-binary직접 눈으로 확인 가능.

예전에 회사에서 프로젝트 안에서 가상 키보드를 띄워서 아이디나 닉네임을 저장하는 부분을 구현한 적이 있었는데 그때도 한글 키보드를 구현하기 어려워서 시간을 많이 쏟았던 기억이 있다. 지금의 공부를 하고나서 구글링 했을때 나왔던 방법 이해했으면 이해하기 더 쉬웠을 거란 생각이 든다. 

 

++ 추가로 한글 인코딩에 대해 더 자세하게 나온 블로그

https://www.vbflash.net/192

 

참고 : 인프런 < 개발자를 위한 컴퓨터공학 1: 혼자 공부하는 컴퓨터구조 + 운영체제 >

728x90
반응형

컴퓨터 구조

컴퓨터가 이해하는 정보
  • 데이터 : 숫자, 문자, 이미지, 동영상과 같은 정적인 정보, 컴퓨터와 주고받는/ 내부에 저장된 정보를 데이터라 통칭, 0과 1로 숫자, 문자를 표현하는 방법
  • 명령어 : 컴퓨터는 결국 명령어를 처리하는 기계, 명령어란 컴퓨터를 실질적으로 움직이는 정보이며, 데이터는 명령어를 위한 일종의 재료
컴퓨터의 네 가지 핵심 부품
  • CPU
  • 메모리
  • 보조기억장치
  • 입출력 장치
CPU(== 컴퓨터의 두뇌) : 메모리에 저장된 명령어를 읽어 들이고, 해석하고, 실행하는 부품.
1. CPU는 메모리에 저장된 값을 읽어 들이고, 해석하고, 실행하는 장치.
2. CPU 내부에는 ALU(계산하는 장치),레지스터(임시저장 장치), 제어장치(제어신호를 발생시키고 명령어를 해석하는 장치)가 있다.
- CPU의 핵심부품 3가지
1. ALU : 계산기(계산을 위한 회로들의 모임)
2. 제어장치 : CPU 내부의 작은 저장장치
3. 레지스터 : 제어 신호(컴퓨터 부품들을 관리하고 작동시키기 위한 전기신호)를 내보내고, 명령어를 해석하는 장치.( ++ CPU가 메모리에 저장된 값을 읽고 싶을 떈 메모리를 향해 메모리 읽기 라는 제어 신호를 보내고. CPU가 메모리에 어떤 값을 저장하고 싶을 땐 메모리를 향해 메모리 쓰기라는 제어 신호를 보냄)
메모리(== 주기억장치(RAM, ROM), 메인메모리) : 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품. 
1. 프로그램이 실행되기 위해서는 메모리에 저장되어 있어야 한다. 2. 메모리는 실행되는 프로그램의 명령어와 데이터를 저장한다. 3. 메모리에 저장된 값의 위치는 주소로 알 수 있다. * 메모리는 전원이 꺼지면 저장된 내용을 잃는다. 
보조기억장치(usb, sd카드, ssd, cd롬 등 백업용 저장장치) : 전원이 꺼져도 보관될 프로그램을 저장하는 부품. 실행되지 않는 부분 저장
입출력장치(컴퓨터 외부에서 컴퓨터로 정보를 주고받을 수 있는 장치 >> 키보드, 마이크, 마우스, 모니터, 프린터, 와콤 등등) :
컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환할 수 있는 부품.

 

메모리는 실행할 정보(실행할 프로그램)를 저장하고, 보조 기억장치는 보관할 정보(보관할 프로그램)를 저장한다.

 

이 모든게 부착되는 곳이 메인보드 혹은 마더보드(mainboard 또는 motherboard)라 함. 이 메인보드 안에서 CPU, 메모리, 보조기억장치, 입출력 장치들이 버스란 걸 통해 서로 정보를 주고받을 수 있음. 그중 가장 중요한 시스템 버스(== 인간의 척추정도)라는 통로를 통해서 정보를 주고받을 수 있다.
메인보드 :
1. 메인보드에 연결된 부품은 버스를 통해 정보를 주고 받음.
2. 버스는 컴퓨터의 부품끼리 정보를 주고 받는 일종의 통로.
3. 타양한 종류의 버스가 있음.
4. 컴퓨터의 핵심 부품을 연결하는 버스는 시스템 버스.(*시스템 버스의 내부 구성 : 주소버스(주소를 주고받는 통로), 데이터버스(명령어와 데이터를 주고받는 통로), 제어버스(제어신호를 주고받는 통로))
728x90
반응형

+ Recent posts