혼자 공부하는 컴구 + 운영체제

김기재·2023년 7월 8일
0

혼공컴구

목록 보기
1/1

1주차 미션 (Chapter 1 ~ 3)

Q1. p51 - 3번.

프로그램이 실행되려면 반드시 '메모리' 에 저장되어 있어야 합니다.

Q2. p64 - 3번.

1101
-> 모든 0과 1 뒤집기
0010
-> 1 더하기
0011
-> 각각의 값을 더해서 0이 되는지 확인하기
1101 + 0011 = (1)0000 = 0


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

- CPU (Central Processing Unit): 중앙처리장치

: 메모리로부터 저장된 명령어와 데이터를 읽으며, 해석 및 실행하는 부품으로 컴퓨터의 두뇌로 여겨진다.
: CPU를 구성하는 부품들로는 ALU(산술논리연산장치, Arithmetic Logic Unit), 레지스터, 제어장치가 존재한다.
: 제어장치는 '제어 신호'라는 전기 신호를 내보내어 컴퓨터 부품들의 실행을 관리한다.

- 메모리: 주기억장치

: 메모리는 크게 RAM(Random Access Memory)과 ROM(Read Only Memory)가 존재한다. 평소에 주로 언급되는 메모리는 RAM을 의미한다.
: 명령어와 데이터가 주소의 개념 내에 저장되고, 이를 CPU와 교류하며 프로그램을 실행한다.
: 가격이 비싸 저장 용량이 적고, 전원이 끊기면 저장된 내용을 잃는 휘발성을 가진다는 특징이 있다.

- 보조기억장치

: 메모리보다 저장용량이 크고, 전원이 꺼져도 저장된 내용을 잃지 않는 저장 장치이다.
: 메모리가 '현재 실행중'인 프로그램을 저장한다면, 보조기억장치는 '앞으로 보관될' 프로그램을 저장한다.

- 입출력장치

: 마이크, 스피커, 프린터, 마우스 및 키보드와 같이 컴퓨터 외부에 연결되어 컴퓨터 내부와 교류하는 장치이다.

위의 장치들은 메인보드(마더보드)라는 사각형의 판에 설치되고, 메인보드에 내재된 시스템 버스(System Bus)라는 신호 통로를 통해 서로 정보를 교환한다.

  • 시스템 버스는 주소 버스, 데이터 버스, 제어 버스로 구성된다.
    • 주소 버스(Address Bus): 주소(of 메모리)를 주고받는 통로.
    • 데이터 버스(Data Bus): 실행 중인 프로그램의 명령어와 데이터를 주고받는 통로.
    • 제어 버스(Control Bus): 제어 신호를 전달하는 통로.

// 컴퓨터의 정보 단위

  • 이진법(binary)
    : 정보를 0과 1만으로 수를 표현.
    : 0과 1을 나타내는 가장 작은 정보 단위는 '비트(bit)'이며, 비트 한 개당 2개의 숫자 정보를 나타낼 수 있다.
    : n개의 비트를 사용한다면 2^n의 정보를 표현할 수 있다.

    1Byte = 8bit
    1kB = 1000Byte
    1MB = 1000kB
    1GB = 1000MB
    1TB = 1000GB

// 1kB는 1,024Byte이고, 1MB는 1,024kB...등 하위 정보 단위의 양에 대해 위의 내용과 다르게 표현되는 것을 본 적이 있다. 이는 정보의 양을 표현하는 단위를 결정하는 과정에 있어서 어떤 수 표현법을 결정할지에 대한 관점의 차이로 인해 발생하는 것이며, 자세한 정보는 아래의 링크를 첨부한다.
https://thrillfighter.tistory.com/250

  • 십진법(decimal): 우리가 평소 사용하는 수 체계. 0~9 사이의 수를 사용.

  • 2의 보수법(two's complement)
    : 이진법으로 음수를 표현하기 위한 방법.

    1) 이진법으로 표현된 수에서 모든 0과 1을 각각 1과 0으로 뒤집는다.
    2) 그 값에 1을 더한다. 값을 더했을 때 자릿수를 초과한다면 비트를 추가한다.

: 2진법으로 표현했을 때, 이게 양수인지 음수인지 눈으로만 판단했을 때는 구분되지 않는다. 이를 위해 컴퓨터 내부에서는 플래그(flag)라는 상태 정보를 사용한다.

  • 십육진법(hexadecimal)
    : 수를 2진법으로 표현했을 때 큰 수는 그 길이가 너무 길어진다는 불편함이 있다. 이를 간단히 표현할 때 사용하는 표현법이다.
    : 0~9의 수를 포함하여, 10~15까지 알파벳 A~F를 통해 표현한다.
    : 15를 넘어가는 수에서 자릿수를 올림한다.

  • 십육진수와 이진수의 변환
    : 십육진법은 한 단위로 16개의 수 정보를 표현할 있으며, 이는 이진법 한 단위의 표현가능 수의 네제곱배를 대신할 수 있다 (2^4 = 16).
    : 16진수로 표현된 하나의 자릿수를 이진수 네자리로 변환할 수 있다.

    ex) 1A2B(16) = (0001) (1010) (0010) (1011)(2)

: 같은 방식으로, 2진법으로 표현된 네자릿수를 16진법의 한 자릿수로 변환할 수 있다.


// 소스 코드와 명령어

컴퓨터는 우리가 코드로 입력하는 알파벳, 단어 그 자체를 데이터와 명령어로 이해하지 못한다. 컴퓨터는 그러한 알파벳과 단어로 이루어진 소스 코드를 0과 1의 비트로 바꾸어 실행한다.

  • 저급 언어(low-level programming language)

    : 컴퓨터가 이해할 수 있는 직접적인 정보 단위(언어)인 기계어(machine code)와, 기계어를 최소한 우리가 읽을 수 있게 번역한 언어인 어셈블리어(assembly language)로 존재한다.

  • 고급 언어(high-level programming language)

    : 우리가 대부분 코드를 짤 때 사용하는 프로그래밍 언어에 해당한다. 해당 언어로 코드를 짠 후 실행하면 해당 코드 내용이 저급 언어로 번역된 후 명령어로써 실행된다.
    : 번역되는 방식에 따라 컴파일(compile) 언어와 인터프리터(interpreter)언어로 구분된다.

  • 컴파일 언어
    : 코드를 실행하면 코드 전체가 컴파일러(compiler)에 의해 한 번에 저급 언어(목적 코드)로 변환되는 과정(컴파일)을 거친다.

    : 한 번에 전체를 번역하므로, 하나의 오류만 존재하더라도 코드는 실행되지 않는다.
    : 대표적인 컴파일 언어로는 C가 있다.

  • 인터프리터 언어
    : 인터프리터(interpreter)를 통해 코드를 한 줄 한 줄씩 차례로 번역하여 실행한다.

    : 한 줄씩 번역하여 실행하기 때문에 N번째 라인에 오류가 발생하더라도 N-1 번째 라인까지는 실행이 가능하다. 이로 인해 일반적으로 컴파일 언어에 비해 처리 속도가 느리다.
    : 대표적인 인터프리터 언어로는 python이 있다.


// 명령어의 구조

  • 명령어는 연산 코드(operation code)와 오퍼랜드(operand)로 구성된다.
    • 명령어 = 연산 코드 필드 (연산 코드가 담기는 영역) + 오퍼랜드 필드(오퍼랜드가 담기는 영역)
  • 연산 코드
    : 명령어가 수행할 연산

    : 데이터 전송, 산술/논리 연산, 제어 흐름 변경, 입출력 제어 등

  • 오퍼랜드
    : '연산에 사용할 데이터', 혹은 '연산에 사용할 데이터가 저장된 위치'

    : 많은 경우 데이터 그 자체보다는 데이터 저장 위치인 메모리 주소나 레지스터 이름이 오퍼랜드 필드에 담긴다. 이로 인해 오퍼랜드 필드를 주소 필드로 지칭하기도 한다.

    : 오퍼랜드는 명령어 내에 하나도 존재하지 않을 수 있고(오퍼랜드 0개), 여러 개일 수도 있다. 이 때 담겨있는 오퍼랜드의 개수(n개, n = 0, 1, 2...)에 따라 명령어를 'n-주소 명령어'라고 칭한다.


// 주소 지정 방식(addressing mode)

: 오퍼랜드에 연산에 직접적으로 사용될 데이터 대신 데이터가 저장된 주소를 대입하는 이유는 '명령어의 길이' 때문이다.

: n비트로 구성된 명령어에서 m비트(n >= m)로 구성된 연산 코드가 존재한다면, k개의 오퍼랜드 필드가 차지하는 영역은 (n-m)비트가 되고, 해당 (n-m)비트를 다시 오퍼랜드의 개수에 따라 1/k배를 해야 한다. 결국 오퍼랜드가 늘어날수록 각 오퍼랜드가 표현할 수 있는 범위는 줄어드는 셈이다.

: 데이터 자체를 표현하는 대신, 데이터가 담겨 있는 위치(유효 주소)를 표현한다면, 더 넓은 범위를 가진 위치 정보를 통해 데이터를 표현할 수 있다.

  • 즉시 주소 지정 방식(immediate addressing mode)
    : 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방법

    : 표현할 수 있는 데이터의 범위가 줄어들 가능성이 있지만, 다른 방식보다 처리 속도가 빠르다.

  • 직접 주소 지정 방식(direct addressing mode)
    : 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방법

    : 표현할 수 있는 데이터의 범위는 증가했지만, 유효 주소는 명령어에서 연산 코드의 범위를 제외한 범위만큼만 표현할 수 있다.
    : 한 번의 메모리 접근이 필요하다.

  • 간접 주소 지정 방식(indirect addressing mode)
    : 오퍼랜드 필드에 유효 주소의 주소를 명시하는 방법

    : 직접 주소 지정 방식보다 표현할 수 있는 유효 주소의 범위가 더 넓어진다.
    : 두 번의 메모리 접근으로 인한 시간이 요구된다.

  • 레지스터 주소 지정방식(register addressing mode)
    : 오퍼랜드 필드에 데이터를 저장한 레지스터를 명시한다.

    : 표현할 수 있는 레지스터의 범위에 제한이 생길 수 있다는 점에서 직접 주소 지정 방식과 비슷하다.

  • 레지스터 간접 주소 지정 방식(register indirect addressing mode)
    : 연산에 사용할 데이터를 메모리에 저장하고, 해당 데이터의 유효 주소를 저장한 레지스터를 오퍼랜드 필드에 명시한다.

    : 간접 주소 지정 방식과 과정이 비슷하지만, 메모리에 접근하는 횟수가 한 번으로 줄어든다.

profile
精神一到何事不成

0개의 댓글