본문 바로가기
개발자 일지/컴퓨터구조, 운영체제

[혼공컴운] 1주차 컴퓨터 구조 시작하기, 데이터, 명령어 정리

by 네빌링 2025. 1. 9.
반응형

혼공학습단13기 1주차 활동의 일환으로 혼자공부하는 컴퓨터구조 + 운영체제 학습 내용을 정리해보는 포스팅입니다.

 

혼공학습단-혼공컴운-1주차-학습-썸네일

 

[목차]

  1. 컴퓨터 구조 시작하기
  2. 데이터
  3. 명령어
  4. 정리

 

1. 컴퓨터 구조 시작하기

 

1) 컴퓨터 구조를 알아야 하는 이유

 

실무에서 오류가 발생했을 때, 컴퓨터 구조를 잘 알고 있으면

문제 상황을 좀 더 빠르고 정확하게 캐치할 수 있습니다.

 

그밖에도 컴퓨터를 실제 구매할 때 더 적합한 컴퓨터 구매를 할 수도 있습니다.

 

채용 공고를 봐도 전공자 수준의 지식,

컴퓨터 구조 지식을 요구하는 회사도 많기 때문에

취업 및 이직시에도 도움이 될 수 있습니다.

 

2) 컴퓨터 구조의 큰 그림

 

크게 컴퓨터 구조 지식은 컴퓨터가 이해하는 정보4가지 핵심 부품으로 

나눠볼 수 있습니다.

 

컴퓨터가 이해하는 정보는 2장에서 배울 데이터, 3장에서 배울 명령어입니다.

 

그리고 4가지 핵심 부품은 CPU, 메모리, 보조기억장치, 입출력장치가 있습니다.

이 부품들은 메인보드라는 판에 연결되고 여기에는 장치들을 장착할 수 있는

슬롯, 연결단자가 있습니다.

 

그리고 이 부품들끼리 정보를 주고 받기 위한 통로, 버스가 있습니다.

 

버스 중에서도 가장 중요한 버스는 시스템버스라고 합니다.

 

시스템버스는 다음으로 구성되어 있습니다.

  • 주소버스
  • 데이터버스
  • 제어버스

 

주소버스는 주소를 주고 받는 통로

데이터버스는 명령어와 데이터의 통로,

제어 버스는 CPU의 제어장치가

내보내는 신호가 드나드는 통로입니다.

 

2. 데이터

 

1) 0과 1로 숫자를 표현하는 방법

 

컴퓨터는 정보를 0,1로만 표현합니다. 

0과 1을 나타내는 가장 작은 정보단위를 비트라고 합니다.

그래서 n비트는 2^n가지 정보 표현이 가능합니다.

 

컴퓨터의 정보는 수십, 수백만 이상의 비트로 이루어져 있는데

이를 편하게 표현하기 위해 단위들을 나눠놨습니다.

 

아래와 같습니다.

 

1바이트(byte) 8비트(8bit)
1킬로바이트(1kB) 1,000바이트(1,000byte)
1메가바이트(1MB) 1,000킬로바이트(1,000kB)
1기가바이트(1GB) 1,000메가바이트(1,000MB)
1테라바이트(1TB) 1,000기가바이트(1,000GB)

 

어릴 때 게임 좋아했던 분들은 하드디스크 용량이

주된 논의거리(?)였기 때문에 용량 단위가 익숙할 것이라 생각합니다.

 

그리고 추가로 CPU가 한 번에 처리할 수 있는 데이터 크기를

워드라고 표현합니다.

요즘 대부분 CPU의 워드 크기는 32비트, 64비트입니다.

 

비트는 0,1로만 구성되어 이진법으로 표현 가능합니다.

그래서 십진수 2를 컴퓨터에 알려주면 컴퓨터는 이진수 10으로 해석합니다.

 

해당 숫자가 십진수인지 이진수인지 어떻게 알까요?

두 가지 방법이 있는데 보통 수학에서는 이진수 끝에 아래첨자(2)를 붙이거나,

코드상으로는 이진수 앞에 0b를 붙입니다.

 

음수는 어떻게 표현할까요?
이진수의 2의 보수를 구해서 이 값을 음수로 간주하면 됩니다.

'2의 보수'는 모든 0,1을 뒤집은 후 1을 더한 값으로 간단히 계산할 수 있습니다.

 

추가로 이진수만 봐서 이게 음수인지 양수인지 구분이 어렵기 때문에

플래그라는 부가정보를 사용합니다.

 

그리고 이진수는 너무 길기 때문에 십육진법을 자주 사용합니다.

특히 이진수와 십육진수는 서로 변환이 쉽기 때문입니다.

코드상으로 십육진수 앞에는 0x가 붙습니다.

 

2) 0과 1로 문자를 표현하는 법

 

앞에서는 숫자를 표현하는 방법을 알아봤습니다.

0과 1로 문자는 어떻게 표현할까요?

 

이를 위해 문자집합, 인코딩, 디코딩 개념이 나옵니다. 

아래에 간단히 정리했습니다.

 

  • 문자집합(Character set): 컴퓨터가 인식하고 표현할 수 있는 문자의 모음
  • 문자 인코딩: 문자집합 속 문자를 컴퓨터가 이해할 수 있도록 0,1로 구성된 결과값으로 변환하는 과정
  • 문자 디코딩: 인코딩의 반대과정. 0과 1로 이루어진 문자 코드를 사람이 이해할 수 있는 문자로 변환하는 과정

 

책에 나온 문자집합 종류를 아래 표로 정리해봤습니다.

 

문자집합 종류 내용 비고
아스키 코드 -초창기 문자 집합이며 영어 알파벳, 아라비아숫자, 일부 특수문자 표현
-7비트로 표현(128개의 문자)
-실제 8비트사용하나 하나는 오류검출을 위한 패리티 비트
-한글 표현 불가!
ex)

'A' → 65(10)
'a' → 97(10)
확장 아스키 -아스키 코드에 1비트 추가하여 256가지 표현 가능하나, 부족  
EUC-KR -한국에서 쓸 수 있는 인코딩 방식으로 등장
-한글 표현 가능
-완성형 인코딩: 글자 하나에 고유한 코드 부여하는 인코딩방식
-조합형 인코딩: 초성,중성,종성에 각각 코드 부여하여 조합하는 인코딩 방식
-모든 한글 표현 불가! 일부 사이트에서 한글 깨짐 발생
EUC-KR은?
대표적인 완성형 인코딩 방식

ex)
'가' → b0a1
CP949 -EUC-KR을 조금 보완한 버전으로 나왔지만 이것도 전체 표현은 불가  
유니코드 -EUC-KR은 모든 한글 표현 불가
-언어별로 인코딩해야하는 한계
-유니코드는 위의 한계때문에 나온 문자집합이며 대부분 나라 언어를 표현할 수 있는 통일된 문자집합
-아스키코드, EUC-KR과 달리 글자에 부여된 값 그대로 인코딩x 다양한 방법을 통해 인코딩 → UTF-8, UTF-16 등
 

 

 

3. 명령어

 

1) 소스 코드와 명령어

 

우리가 프로그래밍 하는 언어는 일반적으로 영어로 되어있고

이는 컴퓨터가 바로 이해할 수 없습니다.

그래서 이 언어들을 0과1로 구성된 언어로 변경해야 

컴퓨터가 실행할 수 있습니다.

 

그래서 사람을 위한 언어를 고급언어라고 하며,

컴퓨터가 직접 이해하고 실행할 수 있는 언어를 

저급언어라고 합니다.

 

즉, 고급언어를 변환하여 컴퓨터가 이해하도록 

저급언어로 변환해야 합니다.

 

저급언어는 기계어, 어셈블리어 2가지가 있습니다.

 

기계어는 0,1로 이루어진 명령어 모음입니다.

그러나 사람이 아예 이해할 수가 없기 때문에

어셈블리어라는 저급언어가 등장했습니다.

 

//기계어
B8 04 00 00 00
83 C0 01

//어셈블리어
MOV EAX, 4   ; EAX에 4를 저장
ADD EAX, 1   ; EAX에 1을 더함

 

 

고급언어에서 저급언어로 변환하는 과정은

컴파일 방식, 인터프리트 방식으로 크게 나뉩니다.

 

컴파일 방식은 컴파일러에 의해 소스 전체가

저급언어로 변환되어 실행되는 방식입니다.

이 과정을 컴파일이라고 하며 컴파일을 

수행해주는 도구를 컴파일러라고 합니다.

대표적으로 자바, C가 있습니다.

 

반면, 인터프리터 방식은 소스코드를 한줄씩 해석하여

저급언어로 변경하는 방식입니다.

대표적으로 파이썬, 자바스크립트가 있습니다.

 

참고로 두 방식을 보통 나누긴 하지만,

한 언어에서 두 방식을 완전히 구분해서 쓰진 않는다고 합니다.

내부적으로 컴파일 언어도 인터프리터 방식을 일부 사용하기도 하고,

그 반대의 경우도 있다고 합니다.

 

그리고 일반적으로 컴파일언어가 더 빠르다고 합니다.

 

추가로 목적코드로 이루어진 파일을 목적파일이라고 하는데

실행파일과 다릅니다.

목적파일은 링킹의 과정을 거쳐야 실행파일이 됩니다.

 

예를들어 helper.c와 main.c는 각각 

helper.o, main.o라는 목적파일로 변환될 수 있지만

바로 실행할 수 없습니다. 서로 메소드, 변수등을

공유하기 때문에 링킹 과정을 거쳐서 연결작업이 필요합니다.

이후에 실행파일이 만들어집니다.

 

2) 명령어의 구조

 

명령어는 크게 연산코드오퍼랜드로 구성됩니다.

연산코드는 명령어가 수행할 연산을 나타내며,

오퍼랜드는 연산에 사용할 데이터를 나타냅니다.

전자를 연산자, 후자를 피연산자라고 하기도 합니다.

 

오퍼랜드 필드에는 숫자, 문자 등 데이터가 직접 담기기도 하지만,

대부분 연산에 사용할 데이터가 저장된 위치,

메모리주소 또는 레지스터 주소가 많이 담깁니다.

주소필드라고도 합니다.

 

오퍼랜드는 하나도 없을수도, 하나만 있을수도, 여러개 있을 수도 있습니다.

 

하나면 1-주소 명령어, 두개면 2-주소 명령어 등과 같이 말합니다.

 

앞에서 오퍼랜드 필드에 직접 데이터가 아니라 주소값을 담는다고 했는데,

이는 오퍼랜드 필드에 주소를 입력해서 데이터 크기에 제한받지 않고

데이터를 담기 위함입니다.

 

이 데이터가 저장된 위치를 유효 주소라고 하며,

이 유효 주소를 찾는 방법을 주소 지정 방식이라고 합니다.

 

주소 지정 방식은 여러가지가 있어 정리해봤습니다.

 

주소지정방식 설명
즉시 주소 지정 방식 -사용할 데이터를 직접 오퍼랜드 필드에 명시
-간단하지만 데이터 크기의 한계
직접 주소 지정 방식 -오퍼랜드 필드에 유효 주소 직접 명시
-데이터 크기는 좀 늘었으나 연산코드 길이만큼 오퍼랜드 필드가 짧아져서 제한
간접 주소 지정 방식 -유효주소의 주소를 오퍼랜드 필드에 명시
-직접 주소 지정 방식보다 표현가능한 범위 넓어졌음
-그러나 이중으로 메모리 접근해야해서 좀 느림
레지스터 주소 지정 방식 -직접 주소 지정 방식과 비슷하게 데이터를 저장한 레지스터 주소를 명시
-직접 주소 지정 방식보다 빠르지만 연산코드 길이만큼 오퍼랜드 필드가 짧아져서 제한
레지스터 간접 주소 지정 방식 -오퍼랜드 필드에 레지스터 주소를 담고, 레지스터 주소에 데이터가 담긴 유효주소를 담아서 명시하는 방법
-간접 주소 지정 방식보다 빠름

 

4. 정리

 

1주차 스터디 진행을 해봤습니다.

우선 인프런 강의로 빠르게 들어보긴 했지만,

책으로 직접 공부하는 것이 역시 더 기억에 남는 것 같습니다.

 

강의는 서브로 활용하면 정말 좋은 공부가 될 것 같습니다!

 

이번주는 기초적이지만 다음 진도를 위해

꼭 알아야 하는 내용들인 것 같습니다.

 

2주차도 잘 정리해서 잘 마무리해보겠습니다.

 

감사합니다!

반응형