Super Kawaii Cute Cat Kaoani [컴퓨터 구조] 1. 기본 개념 정리

[컴퓨터 구조] 1. 기본 개념 정리

2024. 3. 23. 21:24
728x90
SMALL

📌 컴퓨터가 이해하는 정보

컴퓨터는 0과 1로 표현된 정보(데이터, 명령어)만 이해한다.

 

✅ 데이터 

  • 컴퓨터가 이해하는 숫자, 문자, 이미지, 동영상과 같은 정적인 정보

✅ 명령어

  • 데이터를 움직이고 컴퓨터를 작동시키는 정보
🐣 ex)
데이터 : 1, 2
명령어 : '더하라'

 

 

📌 컴퓨터의 4가지 핵심 부품

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

  • 메모리에 저장된 명령어를 읽어 들이고, 해석하고, 실행하는 역할 (뇌랑 비슷!)

⭐️ CPU의 내부 구성 요소

  • 산술 논리 연산 장치(ALU, Arithmetic Logic Unit) : 계산기 역할
  • 레지스터(register)
    • 작은 임시 저장 장치
    • CPU 안에는 여러 개의 레지스터가 존재하고 각기 다른 이름과 역할을 가지고 있음
  • 제어 장치(CU, Control Unit)
    • 제어 신호(Control Sign)라는 전기 신호를 내보내고 명령어를 해석하는 장치
      ➡️ 제어 신호 : 컴퓨터 부품들을 관리하고 작동시키기 위한 신호
    • CPU가 메모리에 저장된 값을 읽고 싶을 땐 메모리를 향해 메모리 읽기라는 제어 신호를 보냄
    • CPU가 메모리에 저장된 값을 저장하고 싶을 땐 메모리를 향해 메모리 쓰기라는 제어 신호를 보냄

✅ 메모리 (주 기억 장치, Main Memory)

주 기억 장치
- RAM(Random Access Memory)
- ROM (Read Only Memory)
➡️ 메모리는 주로 RAM 
  • 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품
    ➡️ 반드시 메모리에 저장되어 있어야 프로그램이 실행됨
  • 메모리 속 명령어와 데이터가 정돈되어 있어야 컴퓨터가 빨리 작동
  • 주소 : 메모리 내에 원하는 위치에 접근 가능

❗️메모리의 약점

  • 가격이 비싸서 저장 용량이 적음
  • 전원이 꺼지면 저장된 내용을 잃게 됨
    ➡️ 보조 기억 장치를 사용하면 전원이 꺼져도 저장된 내용을 잃지 않음

✅ 보조기억장치 (Secondary Storage)

  • 메모리의 단점을 보완해줌
  • 하드디스크, SSD, USB 메모리, DVD, CD-ROM 등의 저장 장치

✅ 입출력장치 (Input/Output (I/O) device)

  • 마이크, 스피커, 프린터, 마우스, 키보드처럼 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환하는 장치
Q. 보조기억장치인 USB, 하드디스크 등도 컴퓨터 외부에 연결되어 내부와 정보를 교환하는 것 아닌가?
     입출력 장치 VS 보조기억 장치

A : 입출력 장치는 메모리를 보조하지는 않음 ➡️ 둘을 통들어서 주변장치라고 부름

 

✅  메인보드와 시스템 버스

  • 메인 보드(마더 보드)  : 컴퓨터의 핵심 부품들을 연결
    • 여러 컴퓨터 부품을 부착할 수 있는 슬롯연결 단자가 있음
    • 메인보드에 연결된 부품들은 메인보드 내에 버스라는 통로가 있기 때문에 서로 정보를 주고받을 수 있음
  • 시스템 버스 : 여러 버스 중 컴퓨터의 네 가지 핵심 부품을 연결하는 가장 중요한 버스 ⭐️
  • 시스템 버스의 내부 구성
    - 주소 버스 : 주소를 주고받는 통로
    - 데이터 버스 : 명령어와 데이터를 주고받는 통로
    - 제어 버스 : 제어 신호를 주고받는 통로

➡️ 컴퓨터의 네 가지 핵심 부품은 메인보드에 연결되어 시스템 버스를 통해 정보 또는 데이터를 주고받음!

 

 

 

 

 

📌 데이터 

✅ 정보 단위

  • 비트(bit) : 0과 1을 나타내는 가장 작은 정보 단위
    • 2비트 ➡️ 2² = 4 가지 정보 표현 가능
    • 3비트 ➡️ 2³ = 8 가지 정보 표현 가능
  • 바이트(byte) : 8bit = 1byte ➡️ 2⁸ = 256 가지 정보 표현 가능
  • 킬로바이트(KB, KiloByte) : 1000byte = 1KB
  • 메가바이트(MB, MegaByte) : 1000KB = 1MB
  • 기가바이트(GB, GigaByte) : 1000MB = 1GB
  • 테라바이트(TB, TeraByte) : 1000GB = 1TB
❗️1,024로 데이터를 묶어서 표현하는 단위는 kiB, MiB, GiB, TiB 등의 단위임. 
여기선 1000으로 묶음

 

💡워드(word) :  CPU가 한 번에 처리할 수 있는 데이터 크기
- 한 번에 16비트 처리 가능하다면 1워드는 16비트가 됨
- 한 번에 32비트 처리 가능하다면 1워드는 32비트가 됨

▪️ 하프워드(half word) : 절반 크기
▪️ 풀워드(full word) : 1배 크기
▪️ 더블 워드(double word) : 2배 크기

➡️ 워드 크기가 큰 CPU는 한 번에 처리할 수 있는 데이터가 많다.
️➡️ 워드 크기는 CPU마다 다르지만, 현대 컴퓨터의 워드 크기는 대부분 32bit or 64bit
➡️ 인텔의 x86 CPU => 32비트 워드 CPU,  x64 CPU => 64 워드 CPU

 

 

✅ 이진법(binary)

  • 0과 1로만 모든 숫자를 표현하는 방법
  • 1을 넘어가면 자리 올림을 하여 0과 1로 숫자를 표현하는 방식 ➡️ 이진수
  • 우리는 보통 십진법(decimal)을 사용
    • 9를 넘어가면 자리 올림을 하여 0~9로 숫자를 표현하는 방식 ➡️ 십진수

➡️ 10은 십진수로는 10 이지만 이진수로는 2이므로 혼동을 예방하기 위해 이진법은 아래첨자(2) 를 붙이거나 이진수 앞에 0b를 붙인다. 


🤍 이진수의 음수 표현 

  • 십진수의 음수 표현은 앞에 - 만 붙이면 끝이지만 이진수는 0과 1만으로 음수를 표현해야 한다
  • 이진수의 음수 = 2의 보수
    • 어떤 수를 그보다 큰 2ⁿ에서 뺀 값을 의미
      💡 ex) 11(2)의 보수는 11(2) 보다 큰 2(n) 즉, 100(2)에서 11(2)를 뺀 01(2)이 됨

➡️ 모든 0과 1을 뒤집고 거기에 1을 더하면 구해짐

Q. 0101(2)는 1011(2)의 음수일 수도 있고 십진수로 5를 나타내는 양수일 수도 있는데 어떻게 구분하는가?
➡️ 플래그(flag) 사용

 

 

✔️ 2의 보수 표현의 한계

  • 0이나 2ⁿ을 2의 보수로 취하면 원하는 음수 값을 얻을 수 없음

 

 

십육진법 (hexadecimal)

  • 십진수 32를 이진수로 나타내면 100000(2) 로 너무 길어진다는 단점이 있음
    ➡️ 이진법 만큼이나 십육진법도 많이 사용
  • 수가 15가 넘어가는 시점에서 자리 올림을 사용
  • 9가 넘어가는 10, 11, 12, 13, 14, 15는 A, B, C, D, E, F로 표현
    16은 10으로 다시 자리 올림으로 시작됨
  • 15(16) : 수학적 표기 방식 or ox15 : 코드상 표기 방식 으로 표현

➡️ 이진수를 십육진수로 십육진수를 이진수로 변환하기 쉬움

 

⚒️ 십육진수를 이진수로 변환하기

  • 십육진수의 한 글자를 4비트의 이진수로 생각하고 변환
    ex)
    ✔️ 1A2B(16)
    1(16) = 0001(2)
    A(16) = 1010(2)
    2(16) = 0010(2)
    B = 1011(2)
    ➡️ 다 이어붙인 값인 0001101000101011(2)이 값이다. 

 

⚒️ 이진수를 십육진수로 변환하기

  • 이진수를 끝에서 네 개씩 끊고 앞에 남는 숫자는 0으로 4 개로 맞춰준다
    ex)
    ✔️ 11010101(2)
    1101(2) = 13(10) = D(16)
    0101(2) = 5(10) = 5(16)
    ➡️ D5(16)
💡 코드에 십육진수를 직접 넣는 사례 ➡️ 코드에 십육진수를 쓰는 경우도 많다는 사실!

offset = _mem_to_opcode_arm(*(u32 *) loc);
offset = (offset & 0x00ffffff) << 2;
if (offset & 0x02000000)
    offset -= 0x04000000;
    offset += sym -> st_value - loc;

 

 

⚡️ 0과 1로 문자를 표현하는 방법

문자 집합과 인코딩

  • 문자 집합(character set) : 컴퓨터가 인식하고 표현할 수 있는 문자의 모음
    ➡️ 컴퓨터는 문자 집합에 속해 있는 문자만 0과 1로 변환해서 이해할 수 있다.
  • 인코딩(encoding) : 문자 집합에 있는 문자를 0과 1로 변환하는 과정
  • 디코딩(decoding) : 0과 1을 사람이 읽을 수 있게 변환하는 인코딩의 반대 과정,

 

아스키코드(ASCII)

  • 초창기 문자 집합 중 하나
  • 알파벳, 아라비아 숫자, 일부 특수 문자 포함
  • 아스키 문자들은 각각 7비트로 표현되므로 2⁷ 총 128개의 문자를 표현할 수 있음

    ➡️ 실제로는 하나의 아스키 문자를 나타내기 위해 8비트(1바이트) 사용
    8비트 중 1비트는 패리티 비트(parity bit)로 오류 검출을 위해 사용됨

코드 포인트 : 글자에 부여된 고유한 값

ex) A의 코드포인트는 65

 

⭐️ 아스키코드의 장점과 단점

  • 장점 : 간단하게 인코딩됨
  • 단점 : 한글, 아스키 문자 집합 외의 문자, 특수문자는 표현 불가

➡️ 1비트를 추가한 8비트의 확장 아스키가 등장하기도 했지만 그래도 256로 턱없이 부족 

➡️ EUC-KR로 한글 인코딩이 가능해짐

 

 

✅ EUC-KR

  • 한글 인코딩 (한글 완성형 인코딩, 한글 조합형 인코딩 두가지가 존재함)
  • EUC-KR : KS X 1001, KS X 1003이라는 문자 집합을 기반으로 하는 대표적인 완성형  인코딩 방식
    • 초성, 중성, 종성이 모두 결합된 한글 단어에 2바이트 크기의 코드(16비트)를 부여함
      → 4자리의 십육진수로 표현 가능
    • 총 2,350 개 정도의 한글 단어를 표현 가능 (쀍, 쀓 등은 표현 불가)

➡️ 모든 한글을 표현할 수 있는 것이 아니기 때문에 마이크로소프트의 CP949가 나옴

 

  • 완성형 인코딩 : 초성, 중성, 종성의 조합으로 이루어진 완성된 하나의 글자에 고유한 코드를 부여하는 인코딩 방식
  • 조합형 인코딩 : 초성을 위한 비트열, 중성을 위한 비트열, 종성을 위한 비트열을 할당하여 그것들의 조합으로 하나의 글자 코드를 완성하는 인코딩 방식

 

 

유니코드와 UTF-8

  • 유니코드 : EUC-KR보다 훨씬 다양한 한글을 포함하며 대부분 나라의 문자, 특수문자, 화살표나 이모티콘까지 코드로 표현할 수 있는 통일된 문자
    여러 나라의 문자를 광범위하게 표현할 수 있는 통일된 문자 집합
    → 유니코드 글자에 부여된 값 앞에 U+ 문자열이 붙은 것은 십육진수로 유니코드를 표현하는 표기
  • UTF : Unicode Transformation Format 유니코드를 인코딩하는 방법
    ➡️ UTF-8, UTF-16, UTF-32 등

 

 

📌 명령어

고급 언어와 저급 언어

  • 고급언어 : 사람을 위한 언어
  • 저급언어 : 컴퓨터가 직접 이해하고 실행할 수 있는 언어

  • 기계어 : 0과 1의 명령어 비트로 이루어진 언어
    ➡️ 이진수로 나열하면 너무 길어지기 때문에 가독성을 위해 십육진수(0~9, A~F)로 표현된 기계어를 사용
  • 어셈블리어 : 0과1로 표현된 명령어(기계어)를 읽기 편한 형태로 번역한 언어

 

<Ex. 어셈블리어>

push    rbp
mov	    rbp, rsp
mov     DWORD PTR [rbp-4], 1
mov     DWORD PTR [rbp-8], 2
mov     edx, DWORD PTR [rbp-4]
mov     eax, DWORD PTR [rbp-8]
add     eax, edx
mov     DWORD PTR [rbp-12], eax
mov     eax, 0
pop     rbp
ret

 

 

✅ 컴파일 언어와 인터프리터 언어

  • 고급언어가 저급언어로 변환되는 방법 : 컴파일, 인터프리트 방식
    • 컴파일 방식으로 작동하는 프로그래밍 언어 : 컴파일 언어
    • 인터프리트 방식으로 작동하는 프로그래밍 언어 : 인터프리터 언어

 

🤍 컴파일 언어

  • 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어
    ex) c언어
  • 컴파일 : 컴파일 언어로 작성된 코드 전체가 저급 언어로 변환되는 과정
  • 컴파일러 : 컴파일을 수행해주는 도구
    ➡️ 문법적인 오류, 실행 여부 등등 따지며 컴파일 (오류 발생시 컴파일 실패)
  • 컴파일을 통해 변환된 저급언어 : 목적코드 

💡 정리 : 고급 언어(소스코드) ➡️ 컴파일(컴파일러) ➡️ 저급언어(목적 코드)

 

 

🤍 인터프리터 언어

  • 인터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급언어
    ex) 파이썬
  • 인터프리터 : 소스 코드 한 줄씩 저급언어로 변환하여 실행해주는 도구
    ➡️ 소스코드를 한 줄씩 실행하기 때문에 변환하는 시간을 기다릴 필요가 없음!
    ➡️ 오류가 나도 한 줄씩 실행하기 때문에 그 전 줄까지 올바르게 수행됨
🧐 cf 1) 컴파일 언어 vs 인터프리터 언어
컴파일 언어와 인터프리터 언어 간의 경계가 모호한 경우가 많음.
둘 중 하나의 방식만으로 작동하는 것이 아니기 때문에 다른 거라고 하기 애매함
🧐 cf 2) 목적 파일 vs 실행 파일
▪️ 목적 파일 : 목적 코드로 이루어진 파일
    ➡️ 목적 코드 : 컴퓨터가 이해하는 저급 언어
▪️ 실행 파일 : 실행 코드로 이루어진 파일 

ex) .exe 확장자를 가진 파일
✔️ 링킹 : 목적 코드가 실행 파일이 되기 위해서 필요한 작업

 

 

연산 코드와 오퍼랜드

  • 명령어 : 연산코드와 오퍼랜드
    • 연산 코드 : 명령어가 수행할 연산
    • 오퍼랜드 : 연산에 사용할 데이터 or 연산에 사용할 데이터가 저장된 위치
push  rbp
mov   rbp, rsp
mov   DWORD PTR [rbp-4], 1
mov   DWORD PTR [rbp-8], 2
mov   edx, DWORD PTR [rbp-4]
mov   eax, DWORD PTR [rbp-8]
add   eax, edx
mov   DWORD PTR [rbp-12], eax
mov   eax, 0
pop   rbp
ret

 

➡️ 빨간 글씨 : 연산 코드

➡️ 까만 글씨 : 오퍼랜드

 

 

🤍 오퍼랜드

  • 연산에 사용할 데이터 or 연산에 사용할 데이터가 저장된 위치
    ➡️ 숫자와 문자 등을 나타내는 데이터 또는 메모리나 레지스터 주소 (보통 주소)
  • 오퍼랜드 필드 = 주소 필드

mov eax, 0     ➡️ 오퍼랜드가 두 개인 경우  : 2 - 주소 명령어 (3개면 3-주소 명령어)

pop rbp          ️➡️ 오퍼랜드가 한 개인 경우  : 1 - 주소 명령어

ret                   ️➡️ 오퍼랜드가 없는 경우      : 0 - 주소 명령어

 

🤍 연산 코드

  • 명령어가 수행할 연산
  • 유형
    • 데이터 전송
    • 산술/논리 연산
    • 제어 흐름 변경
    • 입출력 제어

 

 

✔️ 데이터 전송

MOVE 데이터를 옮겨라
STORE 메모리에 저장하라
LOAD(FETCH) 메모리에서 CPU로 데이터를 가져와라
PUSH 스택에 데이터를 저장하라
POP 스택의 최상단 데이터를 가져와라

 

✔️ 산술/논리 연산

ADD / SUBTRACT / MULTIPLY / DIVIDE 덧셈 / 뺄셈/ 곱셈/ 나눗셈을 수행하라
INCREMENT / DECREMENT 오퍼랜드에 1을 더하라 / 빼라
AND / OR / NOT AND / OR / NOT 연산
COMPARE 두 개의 숫자 또는 TRUE / FALSE 값을 비교하라

 

✔️ 제어 흐름 변경

JUMP 특정 주소로 실행 순서를 옮겨라
CONDITIONAL JUMP 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
HALT 프로그램의 실행을 멈춰라
CALL 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
RETURN CALL을 호출할 때 저장했던 주소로 돌아가라

 

✔️ 입출력 제어

READ (INPUT) 특정 입출력 장치로부터 데이터를 읽어라
WRITE (OUTPUT) 특정 입출력 장치로 데이터를 써라
START IO 입출력 장치를 시작하라
TEST IO 입출력 장치의 상태를 확인하라

 

 

주소 지정 방식

  • 오퍼랜드 필드에 데이터가 저장된 위치를 명시할 때 연산에 사용할 데이터 위치를 찾는 방법
    ➡️ 유효 주소 : 연산 코드에 사용할 데이터가 저장된 위치

 

🤍 즉시 주소 지정 방식

  • 연산에 사용할 데이터를 오퍼랜드 필드에 직접 U명시하는 방식
  • 단점 : 표현할 수 있는 데이터의 크기가 작아짐
  • 장점 : 연산에 사용할 데이터를 메모리나 레지스터로부터 찾는 과정이 없기 때문에 빠름

 

🤍 직접 주소 지정 방식

  • 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
  • 단점 : 오퍼랜드 필드의 길이가 연산 코드의 길이만큼 짧아져서 표현할 수 있는 유효 주소에 제한이 생길 수 있음
  • 장점 : 즉시 주소 지정 방식보다 표현할 수 있는 데이터의 크기는 커짐

 

🤍 간접 주소 지정 방식

  • 유효 주소의 주소를 오퍼랜드 필드에 명시
  • 단점 : 두번의 메모리 접근이 필요하기 때문에 느림
  • 장점 : 직접 주소 지정 방식보다 표현할 수 있는 유효 주소의 범위가 넓어짐

 

✔️ 연산에 사용할 데이터가 레지스터에 저장된 경우 사용하는 방법 

🤍 레지스터 주소 지정 방식 (직접 주소 지정 방식과 비슷)

  • 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시 
  • 단점 : 표현할 수 있는 레지스터 크기에 제한
  • 장점 : CPU 외부에 있는 메모리에 접근하는 것보다 CPU 내부에 있는 레지스터에 접근하는 것이 더 빠름
    ➡️ 직접 주소 지정 방식보다 빠르게 데이터에 접근 가능

 

🤍 레지스터 간접 주소 지정 방식 (간접 주소 지정 방식과 비슷)

  • 연산에 사용할 데이터를 메모리에 저장하고, 그 유효 주소를 저장한 레지스터를 오퍼랜드 필드에 명시
  • 장점 : 메모리에 접근하는 횟수가 한 번으로 줄어듦 (간접 주소 지정 방식보다 빠름)

 

❤️‍🔥 정리 

  • 즉시 주소 지정 방식 : 연산에 사용할 데이터
  • 직접 주소 지정 방식 : 유효 주소(메모리 주소)
  • 간접 주소 지정 방식 : 유효 주소의 주소
  • 레지스터 주소 지정 방식 : 유효 주소(레지스터 이름)
  • 레지스터 간접 주소 지정 방식 : 유효 주소를 저장한 레지스터 

 

💡cf) 스택과 큐
✔️ 스택 : 한쪽 끝이 막혀 있는 저장 공간
▪️  LIFO (후입 선출) : 늦게 들어온 순서로 데이터 꺼냄


✔️ 큐 : 양쪽이 뚫려 있는 저장 공간

▪️  FIFO(선입 선출) : 먼저 저장된 순서로 데이터를 꺼냄

 

 

 

 

 

 

혼자 공부하는 컴퓨터 구조 + 운영체제 교재 및 강의를 참고하여 작성한 글입니다.

 

728x90
LIST