컴퓨터 구조

2024. 7. 22. 17:17Upstage AI Lab

부트캠프 정보의 주입 속도가 어마어마하게 빠르다.

걱정이 되는 거는 이렇게 많은 정보를 소화할 수 있을까, 어떻게 하면 시간과 돈이 아깝지 않게 만들 수 있을까 고민을 많이 하고 있다.

 

그래서 내린 결론!

1. 포트폴리오도 같이 생각해야 함 -> 블로그 작성 꾸준히

2. 폭풍처럼 몰아치는 정보의 양 -> 얼만큼 소화하느냐에 성공 여부가 있음 -> 당일 학습, 당일 복습 원칙으로 공부

 

그렇다. 화이팅이다.

 

#1 컴퓨터 구조

프로그램을 이루는 두 정보

  • 명령어
  • 데이터

컴퓨터의 핵심 부품

  • CPU (레지스터[값을 임시 저장], ALU[연산 수행], 제어장치[명령어 해석하고 제어 신호를 내보내기])
  • 메인 메모리 & 캐시 메모리 (전원꺼지면 삭제)
  • 보조기억장치(전원꺼져도 저장 유지), 입출력장치

+ 메인 보드(마더 보드) : 핵심 부품을 연결한 기판

+ (시스템) 버스 : 정보를 주고 받는 통로

 

명령어

high level로 작성된 소스 코드는 low level로 구성된 명령어와 데이터로 변환.

어떻게 변환?

  • 컴파일 (C/C++, Rust 사용, Ex. gcc, clang, VS)
    • 소스코드 전체가 컴파일러에 의해 검사, 목적 코드로 변환
    • 참고하면 좋을 사이트 : https://godbolt.org/ (소스코드 -> 명령어 과정 알려줌)
  • 인터프리트 (Python, JavaScript)
    • 소스 코드 한 줄씩 인터프리터에 의해 검사, 목적 코드로 변환

두 개념은 칼로 자르듯 구분하기 어려움. 두 가지의 특성을 모두 가진 언어도 있음.

 

low level언어

  • 기계어 (CPU에 따라 생긴게 다를 수 있음)
  • 어셈블리어

명령어의 구성

- 무엇을 대상으로 무엇을 수행하라

연산 코드 + 오퍼랜드(operand)

 

오퍼랜드 : 데이터가 직접 명시되기도 하고, 대상의 위치(메모리 주소[명령어의 길이가 한정 되어 있어서 주소 지정], 레지스터 이름)가 명시되기도 함

  • 오퍼랜드 개수에 따라 명령어의 개수가 달라질 수 있음

연산 코드는 종류가 많이 있으니 필요시 찾아보도록... (MOVE / ADD / CALL / RETURN 등)

 

주소 지정

유효 주소 : 연산 코드에 사용할 데이터가 저장된 위치, 연산의 대상이 되는 데이터가 저장된 위치

 

주소 지정이란 유효 주소를 찾는 방법이고 CPU마다 차이 존재!

 

  1. 즉시 주소 지정
    • 데이터를 오퍼렌드에 직접 명시
    • 가장 빠른 주소 지정, 데이터 크기에 제한
  2. 직접 주소 지정
    • 유효 주소 명시
    • 오퍼랜드 필드로 표현 가능한 메모리 주소 크기에 제한
  3. 간접 주소 지정
    • 유효 주소의 주소 명시(2중 주소)
    • 유효 주소 크기에 제한은 없지만 속도가 비교적으로 느림
  4. 레지스터 주소 지정
    • 데이터를 저장한 레지스터를 오퍼렌드에 직접 명시
    • 레지스터 접근은 메모리보다 빠름
  5. 레지스터 간접 주소 지정
    • 데이터를 메모리에 저장하고 유효 주소를 저장한 레지스터를 오퍼렌드 필드에 명시
    • 결국 메모리 접근은 한 번!

부동 소수점

a = 0.1
b = 0.2
c = 0.3

if a + b == c:
	print("Equal")
else:
	print("Not Equal")

위 코드의 결과는 -> Not Equal

왜? -> 부동 소수점 이슈...

 

컴퓨터 내부에서 소수를 표현 할때는 부동 소수점으로 표현한다.

이진수를 m(가수) x 2^n(지수) 꼴로 나타내고, 가수 부분은 1.XXX 형태.

  • 십진수 소수를 표현할 때 십진수 소수와 이진수 소수 표현이 딱 맞아 떨어지지 않을 수 있음.
  • 1/3이라는 분수 m X 3^n 꼴로 표현하면 딱 떨어지지만 m X 10^n 꼴로 표현하면 무한히 많은 가수 필요
위 문제 해결 (round 함수 이용)
a = 0.1
b = 0.2
c = 0.3

if round(a + b, 10) == round(c, 10):
    print("Equal")
else:
    print("Not Equal")

CPU

ALU

1.

레지스터(피연산자[연산의 대상]) -> ALU

제어장치(제어 신호[연산할 작업]) -> ALU

2.

ALU(결과값) -> 레지스터

ALU(플래그) -> 플래그 레지스터

 

플래그(Flag) 레지스터

부호 플래그

0
제로 플래그

1
캐리 플래그

0
오버플로우 플래그

0
인터럽트 플래그

0
슈퍼바이저 플래그

0
부호 플래그 연산한 결과의 부호를 나타낸다.
제로 플래그 연산 결과가 0인지 여부를 나타낸다.
캐리 플래그 연산 결과 올림수나 빌림수가 발생했는지 여부를 나타낸다.
오버플로우 플래그 오버플로우가 발생했는지 여부를 나타낸다.
인터럽트 플래그 인터럽트가 가능한지 여부를 나타낸다.
슈퍼바이저 플래그 커널 모드로 실행 중인지, 사용자 모드로 실행 중인지 나타낸다.

 

제어장치

  • 제어 신호를 내보내고, 명령어를 해석하는 장치
  • 클럭(clock)에 맞춰 움직인다.

클럭 신호

  • 부품을 움질일 수 있게하는 시간 단위
  • 부품이 움직이는 박자

레지스터

  • 프로그램 실행 전후로 값을 임시 저장하는 장치
  • CPU마다 레지스터의 이름, 크기, 종류가 다양하다.
  1. 프로그램 카운터 : 메모리에서 가져올 명령어 주소 (메모리에서 읽어들일 주소)
    • 프로그램 카운터는 일반적으로(일반적이지 않은 경우는 인터럽트) 1씩 증가되며 메모리의 프로그램이 순차적으로 증가된다.
      (프로그램 실행, 실행 완료 후 프로그램 카운터 증가)
  2. 명령어 레지스터 : 해석할 명령어 (메모리에서 읽어들인 주소)
  3. 메모리 주소 레지스터 : 메모리의 주소 (읽어들일 주소 값)
  4. 메모리 버퍼 레지스터 : 메모리와 주고받을 명령어 데이터
  5. 플래그 레지스터 : 연산 결과에 대한 부가 정보 저장
  6. 범용 레지스터 : 범용적으로 사용 가능한 레지스터 (여러 개 있음)
  7. 스택 포인터 : 스택의 꼭대기를 가리키는 레지스터 (스택 주소 지정 방식)
  8. 베이스 레지스터 : 떨어진 거리를 가리키는 레지스터 (변위 주소 지정 방식)
    • 변위 주소 지정 방식 : 베이스 레지스터 주소 지정
      오퍼랜드 + 베이스 레지스터(기준 주소) == 유효 주소

정리를 해봤는데 아래의 이유로 우선은 여기까지 하는게 좋을 것 같다.

  • 날마다 배우는 내용이 많다 -> 배우는 내용이 많아서 따라가기 어렵다. 따라가려면 어떻게 해야하는가?
    -> 쓰면서 정리하는 방법으로 복습 or 빠르게 반복 학습으로 복습 중 하나를 선택해야 한다.
    -> 날마다 배우는 내용이 많으므로 빠르게 반복 학습을 학습을 하고 잊어버린 내용에 대해서는 복습하는 형식으로 대처한다.
    -> 만약, 기술면접 때문에 준비해야할 사항이 있으면 수업 시간 때 배웠던 내용을 다시 정리하는 형식으로 준비한다. 지금은 기술 면접보다 프로젝트 실행 능력을 키워야 하기 때문에 블로그를 보면서 복습하는 방식은 시간과, 목적에 따라 좋은 학습법이 아니다.

그래서 앞으로는 세부적인 내용은 반복 복습으로 따라가는 것으로 하고, 블로그에는 프로젝트를 진행하면서 배운점이나 느낀점을 작성하는게 좋을 듯 싶다. 이 블로그의 목적은 개인 포트폴리오를 만드는 것이 목적이기 때문에 기술적인 내용을 서술하는 테크 블로그 방향성은 맞지 않는 것 같다.

'Upstage AI Lab' 카테고리의 다른 글

Git 학습일지 2  (0) 2024.08.11
Git 학습 일지  (0) 2024.08.10
Python 학습 일지  (0) 2024.08.06
컴퓨터 구조 + 부트캠프 생활 특강  (0) 2024.07.25
OT 및 인공지능 기술 특강  (0) 2024.07.16