본문 바로가기
Study/CS

02.컴퓨터 구조

by dailycoding777 2025. 1. 22.

컴퓨터는 언어를 이해하지 못한다.

(java,C++,python,Js 등등)

그래서 이런 언어들을 컴퓨터 언어로 번역해주는 작업이 필요하다. 그 작업을 컴파일(Compile)이라고 하고

언어에 따라 두가지 방법으로 나뉜다.

1.컴파일러(Compiler)

  • 전체 코드를 한 번에 번역해서 실행 파일(executable file)로 만들어주는 방식
  • 번역된 파일을 실행하니까 실행 속도가 빠르고, 한 번 번역만 하면 반복적으로 실행 가능
  • 예시 언어: C, C++, Java (Java는 살짝 애매하지만 컴파일 과정을 거친다.)

작동 흐름:

  1. 소스 코드 작성.
  2. 컴파일 -> 실행 파일 생성.
  3. 실행 파일 실행.

컴파일은 마지막 한번(One-Time Process)

2.인터프리터

  • 코드를 한 줄씩 읽어서 바로 실행하는 방식
  • 실행 속도는 느릴 수 있지만, 바로 결과를 확인할 수 있어서 디버깅이 편리하다.
  • 예시 언어: Python, JavaScript, Ruby

작동 흐름:

  1. 소스 코드 작성.
  2. 인터프리터가 코드 한 줄씩 읽고 실행.

인터프리터는 라인마다(Line-by-Line Execution)


컴퓨터 구조의 큰그림

컴퓨터는 데이터,명령어로 나뉜다.

 

데이터(수행할 대상)

  • 정적인 정보(숫자,문자,이미지,동영상)
  • 종속적인 정보
  • 명령의 대상
  • 명령어의 재료

명령어(수행할 동작)

  • 데이터를 명령하는 말

이 둘은 이진법(0,1)만 취급한다. 10진법이니 문자니 그런거 안됨

CPU

정보를 읽어 들이고,해석하고, 실행하는 부품

  • ALU(산술논리연산장치) : 연산을 수행하는 장치(사칙연산,논리연산)
  • 제어장치(Control Unit) 명령어 해석 → 제어신호(전기신호)를 보내는 장치
  • 레지스터: CPU의 임시 저장장치 (데이터 ↔ 명령어 사이 중간값을 저장한다.

예를 들어 2+5x3라는 식이 있다고 하자.

5x3 = 15다. 이 15를 저장해놓는 것이다.

메모리

실행중인 프로그램을 구성하는 데이터와 명령어를 저장하는 부품

뭘 저장하는데? → 메모리주소

데이터는 주소로 저장되어 있고

메모리는 그 주소를 찾아서 보여주는 것이다.

Ex)

getMyRoom 함수 가져와

아 getMyRoom가 5번지에 있네?

ㅇㅋ 찾음 여깄음

메모리의 특징(휘발성)

전원이 공급되지 않을 때 저장하고 있는 정보가 지워지는 특성

즉 , 컴퓨터 끄면 날라간다는 소리다.

이제부터 캐시메모리

메모리랑 다르다. CPU 바로 옆에 있는 초고속 메모리다.

캐시 메모리는 CPU 안에도 있고 밖에도 있다. 여러가지 있다.

보조기억장치

hdd,ssd,usb, sd카드

  • 보관할 프로그램을 저장
  • 컴퓨터를 꺼도 날아가지 않음 (비휘발성)
  • CPU가 저장된 프로그램을 곧장 가져와 실행 불가 (메모리로 복사가 필요)

입출력 장치

  • 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환하는 장치
  • ex)마우스,키보드,스피커,모니터,프린터

주변장치

  • 보조기억장치와 입출력장치를 통칭하는 단어

메인보드와 버스

이렇게 생긴 판이 메인보드다.

이 안엔 CPU,SSD,RAM,그래픽 카드 등등 컴퓨터에 필요한 것들을 넣는다.

버스

메인보드 있는 것들끼리 신호를 주고 받을 수 있게 만든 파이프다. (도시가스 파이프 생각하면 편할듯)

이중에서 시스템버스가 중요하다.

시스템버스 종류는 이렇게 3가지가 있다.

1. 데이터 버스 (Data Bus)

  • 역할: 데이터를 실어나르는 통로
  • 특징: CPU와 메모리, 주변 장치 간에 데이터를 주고받을 때 사용
  • 비유: 마치 트럭이 짐을 싣고 나르는 길 같은 것

2. 주소 버스 (Address Bus)

  • 역할: 데이터를 어디로 보낼지, 어디에서 가져올지를 지정
  • 특징: 주소만 실어나르기 때문에 단방향
  • 비유: "여기 배달해주세요~" 라고 위치를 알려주는 지도

3. 제어 버스 (Control Bus)

  • 역할: 데이터 이동을 제어하고 명령을 전달하는 역할
  • 특징: CPU가 "이제 데이터 보내!" 같은 명령을 내릴 때 사용
  • 비유: 신호등 같은 느낌? 언제 멈추고 움직일지 알려주는 것이다.

컴퓨터가 이해하는 정보

1 byte 8 비트
1 kB 1,000 바이트
1 MB 1,000 킬로바이트
1 GB 1,000 메가바이트
1 TB 1,000 기가바이트

(10진법은 1000비트 , 2진법은 1024비트다.)

CPU는 0,1만 이해한다.(2진법)

비트는 0,1의 가장 작은 단위

3비트는 8개(2의 3제곱)

N 비트는 2”개의 정보

2진수와 10진수

차이점

  • 2진수: 0과 1만 사용하는 숫자 체계 (컴퓨터가 이해하는 방식).
  • 10진수: 0부터 9까지 사용하는 숫자 체계 (사람이 쓰는 방식).

변환 방법

  1. 25를 2로 계속 나누면서 나머지를 구한다. (2진수 예시)
25 ÷ 2 1
12 ÷ 2 0
6 ÷ 2 0
3 ÷ 2 1
1 ÷ 2 1

25의 2진수 = 11001

  1. 11001을 10진수로 바꾸기 (10진수 예시)

16+8+0+0+1=25다.


데이터 - 0과 1로 문자 표현하기

문자 집합이란? : 컴퓨터가 이해할 수 있는 문자들의 집합

인코딩 : 한글 → 0,1로 변환

디코딩 : 0,1 → 한글로 변환

아스키 코드

아스키 문자에 대응 된 고유한 수 (한글은 안됨)

그래서 나온게 EUC-KR이다.

아스키 코드 표

ECU-KR

  • 영어는 1바이트, 한국어는 2바이트로 고정.
  • 단순하지만 유니코드처럼 다양한 문자를 다룰 수 없다.

근데 EUC-KR도 문자에 다 대응할 수 없어서

이후에 UTF-8이라는 게 등장했고 이게 글로벌 표준으로 자리잡았다.

그 이유는 호환성이다. 어느나라 언어든 다 된다. (한국어도 ECU-KR보다 이게 더 좋다.)

UTF-8도 ECU-KR처럼 문자에 따라 필요한 바이트 수가 달라진다.

즉, 가변길이 인코딩 방식이다. (고정된 길이가 아닌 다양한 길이로 인코딩 하는 방식)

영어는 1byte, 한국어는 3byte를 사용한다.

1바이트를 더 먹는 이유는 글로벌 호환성 때문이다.

 

base64

base64는 비단 문자 뿐만 아니라,이진 데이터까지 반환할 수 있는 인코딩 방식이다.

(코딩 초창기 때 이걸로 암호화 시켰던 때가 있었다..)


명령어

명령어를 하기 위해선 수행할 동작(~~~해라!)과 대상(데이터)이 필요하다.

  • 연산코드: 명령어가 수행할 동작
  • 오퍼랜드: 데이터,레지스터주소 동작에 사용될 데이터가 저장된 위치
  • 오퍼랜드 필드(주소 필드) : 오퍼랜드가 담기는 영역
  • 연산 코드필드: 명령어에서 연산코드가 담기는 영역

명령의 순서

CPU→메모리 접근→ 오퍼랜드 필드의 메모리주소


후입선출의 다른말 Stack(Last In First Out)

나중에 저장한 데이터를 가장 먼저 뺴내는 데이터 관리 방식 (후입 선출)

이 방식이 다양한 곳에서 쓰인다.(JS도 이런 방식이었다.)

왜 이렇게 쓰는가 했더니 렉걸리는 거 처리할 때 뒤로가기 호닥 눌러야하니까.

굉장히 소중한 개념이라고 느꼈다.

예시

(1) CPU의 함수 호출 관리 (Call Stack)

(2) 재귀 함수 (Recursive Function)

(3) 컴파일러와 메모리 관리

(4) Undo 기능 (되돌리기)

(5) 브라우저의 뒤로 가기

(6) 수식 계산 (Expression Parsing)

(7) DFS (깊이 우선 탐색)


기계와 어셈블리어

  • 기계어 : CPU가 이해할 수 있도록 0과 1로 표현된 정보를 있는 그대로 표현한 언어
  • 어셈블리어 : 기계어를 읽기 편한 형태로 단순 번역한 언어

명령어 사이클

CPU가 명령어를 처리하는 과정에서 프로그램 속 각각의 명령어들은 일정한 주기를 반복하며 실행한다.

  • 인출 사이클 : 메모리에 있는 명령어를 CPU로 가지고 오는 단계
  • 실행 사이클 : CPU로 가져온 명령어를 실행하는 단계

그런데 명령어가 간단하지 않을 때가 있다.

이럴 땐 메모리에 한번 더 접근하는데 이 단계를 ‘간접사이클’ 이라고 한다.