컴퓨터의 동작 원리

YunGyu Choi·2023년 1월 21일
0

Computer Science

목록 보기
2/6

컴퓨터 기본 구조

  1. 메모리(RAM) : 컴퓨터가 수행해야할 명령어와 데이터를 쌓는 공간

  2. 프로세스(CPU) : 메모리에서 명령어와 데이터를 읽어 계산하는 공간

메모리

  • 메모리는 수많은 셀로 나누어져 있다.
  • 각 셀은 저마다 미세한 데이터 or 명령을 저장한다.
  • 각 셀은 서로 구분하기 위한 주소값을 갖는다.
  • 메모리는 전기 부품이므로 셀의 주소는 여러가닥의 전기선을 통해 이진수로 전송해야 한다.
    주소가 특정셀을 가리키고 있을 때 '읽기'와 '쓰기' 작업을 할 수 있다.
    그리고 어느 동작을 수행할지 동작모드를 결정하기 위한 별도의 데이터를 입력받는다.

버스

한 덩어리의 데이터를 전송하는 전선 모음

  • 주소 버스 : 주소를 전달할 때 사용(단방향)
  • 데이터 버스 : 메모리를 주고 받을 때 사용(양방향)
  • 제어 버스 : 어떤 동작을 수행할 지 어떤 모드일지 결정(?)


CPU

  • CPU 내부에는 레지스터라고 하는 자체 메모리 셀이 있다.
  • RAM에 있는 데이터를 레지스터로 불러와서 연산을 수행한다.
  • CPU가 수행할 수 있는 모든 연산의 집합을 명령어 집합이라 한다.
  • 명령어 집합의 각 연산에는 번호가 할당되어 있다.
  • 프로그램 코드는 수행할 연산 번호들을 순서에 따라 배열한 것이다.
  • CPU의 동작은 메모리의 명령어를 끊임없이 가져와서 수행하는 무한루프다.
  • 프로그램 카운터는 다음에 수행해야할 명령어가 기록된 메모리의 주소를 가리키는 특별한 레지스터이다.

    ex)
    프로그램 카운터가 가리키는 메모리 주소에서 명령어를가져온다.
    프로그램 카운터를 1 증가시킨다.
    가져온 명령을 수행한다.
    무한반복한다.

  • 점프는 프로그램 카운터에 새로운 값을 써넣어 실행 흐름을 메모리의 다름 지점으로 건너 뛰도록 하는 명령이다.
  1. CPU 클락
    CPU가 1초 동안 실행하는 기본 연산이 몇 개인지 나타내는 단위

  2. CPU 아키텍쳐
    CPU의 아키텍처가 다르다는 것은 명령어 집합이 다르며, 명령어에 숫자 번호를 매기는 방법도 다르다는 것을 의미한다.
    따라서 아키텍처가 다른 다비아스 간에는 프로그램이 호환되지 않는다.

  3. 리틀 엔디언과 빅 엔디언

    • 리틀 엔디언 : RAM과 CPU의 수를 왼쪽에서 오른쪽으로 저장
    • 빅 엔디언 : RAM과 CPU의 수를 오른쪽에서 왼쪽으로 저장
    • 엔디언 불일치 : 리틀인지 빅인지에 따라 값이 달라 호환이 안되서 발생(오늘날 대부분은 리틀엔디언방식을 사용)
  4. 에뮬레이터
    - 특정 장치를 위해 설계된 코드를 다른 장치에서 실행하고 싶을 때 사용
    - 목표로하는 기계를 흉내내는 프로그램
    - 그 기계와 동일한 CPU, RAM, 기타 하드웨어의 가상 기계 구성

컴파일

  • 프로그램을 만들 때는 작성하고 이해하기 쉬운 프로그래밍 언어로 이용
  • 프로그래밍 언어를 컴파일러로 CPU가 실행할 수 있는 기계어로 번역
  • 수십억개의 CPU 명령어가 필요한 프로그램을 훨씬 적은 코드로 표현 가능
  1. 운영체제

    • 운영체제는 자원을 관리하는 프로그램이다.
    • 동일한 CPU아키텍처로 설계되어도 운영체제가 다르면 호환이 안된다.프로그램이 동작을 위해 운영체제와 소통하기 때문이다.
    • 따라서 프로그램을 특정 컴퓨터에 맞게 컴파일 한다는 것은 특정 아키텍처와 특정 운영체제에 맞게 컴파일 한다는 것을 의미한다.
  2. 스크립트 언어

    • 컴파일 하지 않고도 실행할 수 있는 코드이다.
      코드를 CPU가 직접 실행하는 것이 아니라 인터프린터라는 해석기를 통해 실행하기 때문이다.
    • 따라서 스크립트 언어로 만든 코드를 실행하기 위해선 인터프린터가 설치되어 있어야 한다.
    • 일반적으로 스크립트 언어는 컴파일 된 코드에 비해 '훨씬'느리다.
      컴파일 된 코드는 번역이 미리 이루어진 상태로 실행되지만, 스크립트 언어의 코드는 실행 지점에서 실시간으로 번역되기 때문이다.
    • 그러나 컴파일 과정이 길어지면 컴파일하는 시간도 무시 못하기 때문에 컴파일 속도가 빠르고 실행성능도 좋은 GO가 개발되었다.
  3. 역어셈블리어와 역공학

    • 컴파일된 프로그램을 컴파일 이전의 소스코드로 되돌리는 것은 불가능 하다.
    • 역어셈블 : 이진 프로그램의 기계어 코드 배열을 사람이 읽을 수 있는 명령어 배열로 변환하는 것
    • 역공학 : 이진수 코드를 명령어 코드로 변환한 후, 이 기계어를 읽어서 뭇느 작업을 하는 것인지 조사하는 것
  4. 오픈 소스 소프트웨어

    • 이진 실행 파일의 기계어를 분석하는 것은 가능하지만, 그 이진 파일을 생성하는 데 사용된 원본 소스코드를 복구하는 것은 불가능하다.
    • 따라서 이진 파일을 조금씩 해킹하는 것이면 몰라도, 원본 소스코드 없이 프로그램에 상당한 수정을 가하는 것은 불가능하다.
    • 오픈 소스 : 자신의 소스 코드를 다른 사람이 수정할 수 있도록 공개한 것

메모리 계층 구조

  • 컴퓨터는 CPU가 간단한 명령을 실행하면 동작한다.
  • 이 명령어들은 CPU 레지스터에 저장된 데이터만을 연산할 수 있다.
  • 하지만 레지스터는 용량이 작아서 RAM과 끊임없이 데이터를 주고 받는다.
  • 따라서 메모리 접근 속도가 느리면 CPU는 RAM이 데이터를 읽고 쓰는 동안 기다릴 수 박에 없다.
  • 즉, 메모리 속도를 높이면 CPU속도를 높이는 것 만큼 컴퓨터 성능이 좋아진다.

프로세서-메모리 격차

  • CPU속도는 매우 빠르고 지속적으로 증가하고 있는데 반해 RAM속도는 아주 천천히 증가하고 있어서 발생하는 격차이다. 이 격차가 벌어질 수록 메모리에 효율적으로 접근하는 것이 중요해질 것이다.

시간/공간 인접 주소

  • RAM에 접근 횟수를 최소화하는 방법을 연구한 결과
    시간 인접 주소
    어떤 메모리 주소에 접근한 경우, 잠시 후 같은 주소에 다시 접근 할 가능성이 높다.
    공간 인접 주소
    어떤 메모리 주소에 접근한 경우, 잠시 후 인접한 주소에 접근할 가능성이 높다.

  • 이를 근거로 조만간에 접근할 가능성이 높은 메모리 주소들을 예측하여 CPU 레지스터에 저장해둔다. 그럼 연산량을 줄일 수 있다. 그러나 이렇게 되면 레지스터 용량이 더 커져야 하는데 현실적으로 불가능하다.

  1. 1차 캐시 메모리(L1)

    • 레지스터 용량을 늘리지 못해도, CPU와 통합된 극도로 빠른 보조 메모리를 만드는 것은 가능하다.
    • 이는 레지스터 자체 데이터에 접근하는 것 보다 아주 조금 느릴 뿐이다.
  2. 2차 캐시 메모리(L2)

    • 1차 캐시 용량을 더 늘려서 RAM에 데이터를 조회하는 연산의 횟수를 더 줄여 CPU의 대기시간을 아낄 수는 있다.
    • 그러나 1차 캐시의 속도를 떨어트리지 않으면서 용량을 늘리는 것은 어렵다.
      따라서 캐시 메모리를 한단 계 더 추가하는 것이 더 효율적이다.
    • 접근 가능성이 가장 높은 주소는 1차 캐시에 복사되고, 그 다음으로 접근 가능성이 높은 메모리는 2차 캐시에 복사된다.
    • CPU는 1차 캐시에 없으면 2차 캐시에 접근하고 거기에도 없을 때에만 RAM에 접근하게 된다. (제조사에 따라 L3까지 있는 경우도 있다.)
  3. 1차 메모리와 2차 메모리

    RAM이 가득 찼을 때, 당장 사용하지 않아 우선순위가 낮은 데이터는 하드 디스크에 저장된다. (문제는 하드 디스크가 느리다는 것)
    RAM을 1차 메모리, 하드 디스크를 2차 메모리라고 한다.
    CPU는 2차 메모리에는 접근할 수 없다. CPU가 쓰기 위해서는 2차 메모리에 있는 데이터가 1차 메모리로 복사되어야 한다.
    만약 RAM 이 초가되면 1차 메모리와 2차 메모리가 끊임없이 소통하는데 2차 메모리 속도가 느려서 성능이 잘 나오지 않는다.

    • 스래싱모드: 디스크에서 RAM으로 데이터를 끝없이 읽어들이는 상태
      특히 서버는 스래싱 모드에 빠지지 않도록 주의해야한다!
  4. 외부 저장 장치와 3차 저장 장치

    • 컴퓨터가 네트워크에 연결된 경우, 지역 네트워크 또는 인터넷을 통해 다른 컴퓨터가 관리하는 메모리에 접근할 수 있다. 그러나 느리다.
    • 3차 저장 장치는 USB와 같이 언제나 컴퓨터와 연결되어 있는 것도 아니고, 늘 사용 가능한 상태도 아닌 저장장치 이다.
      그러므로 3차 저장장치는 접근할 일이 많지 않은 데이터를 보관하는 용도로만 쓰는게 좋다.
profile
velog에는 이론을 주로 정리하고, 코드와 관련된 것은 Git-hub로 관리하고 있어요. 포트폴리오는 링크된 Yun Lab 홈페이지를 참고해주시면 감사하겠습니다!

0개의 댓글