기본 컴퓨터 시스템 [ 크래프톤 정글 4일차 ]

jinsung·2025년 5월 16일

크래프톤 정글 9기

목록 보기
2/59

1. 정보는 비트와 컨텍스트로 이루어진다.

비트는 0 또는 1의 값을 가지며 비트가 8개 있을때 1byte 라고 한다.

그럼 컨텍스트는 뭘까?

컨텍스트는 비트를 읽는 방법 이다.

01000001 값을 가진 1byte 의 정보가 있다고 하자. ( 맨 앞은 음수 or 양수 보수 개념 )

  • 이걸 이진법(컨텍스트)으로 정수로 계산하면 65이다.
  • 이걸 ASCII(컨텍스트)로 문자열로 계산하면 A이다.
  • 이걸 RGB(컨텍스트)로 색깔로 계산하면 뭐.. 뭔 색이지 하여튼 색깔이다.**

이런 식으로 비트를 읽는 방법은 정하기 나름이기 때문에 무한대가 될 수 있으므로 컨텍스트도 무한대가 될 수 있다.

컴퓨터는 이처럼 비트와 컨텍스트로 이루어진다.

2. 프로그램은 다른 프로그램에 의해 번역된다.

비트는 0 또는 1의 값만 가질 수 있는데 우린 어떻게 사람의 언어로 프로그램을 짤 수 있을까?

그건 우리가 작성한 언어를 다른 프로그램이 "기계어 (01011101010) 로 바꿔주기 때문이다."

그게 프로그램은 프로그램에 의해 번역된다는 것이다.

#include <stdio.h>

#define MAX 100

int main()
{

    printf("Hello, World!\n");
    int x = MAX + MAX;

    return 0;
}

이 c 언어는 전처리기 -> 컴파일러 -> 어셈블러 -> 링커 를 거쳐서 11010101 로 번역되는데 그 과정이 어떻게 되는지 알아보자.

1. 전처리기

pre-processing ( 전처리 ) 는 #include <stdio.h> 같은 파일을 복사해서 붙여넣거나 #define 처럼 정의된 값을 치환해주는 역할을 한다 ( 모든 MAX 를 100 으로 바꿔주기 )

밑의 사진은 전처리를 한 hello.c 파일이다.

라인이 거의 1500 줄이 되는데 <stido.h> 안에 있는 파일의 내용이 "복사 붙여넣기" 되었기 때문이다
그리고 #define 으로 선언하고 MAX 라고 정의한 값들도 MAX 에서 100으로 바뀐걸 확인할 수 있다.

2. 컴파일러


컴파일러는 전처리 된 코드를 어셈블리어로 바꿔준다.
저 코드 저거 뭐야 ㅋㅋㅋ 무서워 ㅋㅋㅋ

3. 어셈블러

그 뒤에는 어셈블리어가 저걸 기계어로 바꿔준다. 수많은 0과 1이겠지?

4. 링커

그 다음에는 링커가 그 기계어를 컴퓨터의 디스크에 저장( 중요 )한다.

이렇게 네 가지 과정을 통틀어서 컴파일 시스템 이라고 부른다.

c 뿐만 아니라 각자 사용하는 어떻가 본인이 사용하는 언어를 어떻게 컴파일 하는지 이해하는 것은 좋은 코드를 짜기 위해선 중요하다.

  • switch 문은 if-else 문을 연속해서 사용하는 것 보다 언제나 효율적일까?
  • while 루프는 for 루프보다 효율적일까?
  • 수식 연산시 괄호 위치를 바꾸기만 해도 연산이 효율적인 건 왜일까?

이걸 알아야 하는 이유는 알았으니 각자 사용하는 언어가 컴파일을 어떻게 하는지 공부해보면 좋을 것 같다.

3. 프로세서(CPU)는 메모리에 저장된 인스트럭션을 해석한다.

토막상식!
인스트럭션 : 컴퓨터가 명령을 실행하는 최소단위

이해를 돕기 위해 피그마로 그림을 그려봤따 원래 봐야 이해가 빠르다

  • 우선 각각의 연결 선은 BUS 라고 되어있는데 BUS 는 서로를 연결해주는 전기적 배선을 의미한다.
  • 이 BUS 는 워드라고 하는 고정 크기의 바이트 단위로 데이터를 전송하게 되어있는데 보통 4byte 혹은 8byte 이다.
  • 글고 CPU 안에 pc 라고 있는데 저건 program counter 로 메인 메모리 안에있는 인스터럭션의 메모리주소를 가리키고 있다.
  • Register 는 각각 워드크기의 저장장치이다.

아까 2번에서 만든 hello.c 는 Disk 컨트롤러를 통해 디스크에 저장되어있다.

만약 여러분이 ./hello.c 로 c 언어를 실행하면

1. 디스크에서 메인메모리로 데이터를 전송한다.
2. 메인 메모리에서 레지스터로 인스트럭션 단위로 이동한다
3. 레지스터에서 ALU 로 연산후 다시 레지스터로 전송한다
4. 기계어 인스트럭션이 실행되면서 모니터로 hello world 가 화면에 출력된다.

우리가 여기서 주목할 거는 데이터가 엄청 많이 이동한다는거다

처음에는 디스크에 있었다가.
그 다음에는 메인 메모리 로 갔다가
그 다음에는 Register 로 간다.
용랑이 큰 저장장치에서 점점 용랑이 작은 저장장치로 이동한다.

왜그럴까? 그냥 바로 디스크에서 읽어오면안됨?

이건 그냥 물리적 이유인데

  • 용량이 큰 저장장치는 용량이 작은 저장장치에 비해 느리다.
  • 더 빠른 장치는 느린 장치보다 만드는데 비용이 많이 든다.

레지스터 파일은 수백바이트를 저장하는데
메인 메모리는 십억바이트를 저장한다.
디스크는 메인 메모리보다 천배 크지만 1워드의 데이터를 읽는데 천만배 더 느리다.

그러나 CPU 는 레지스터의 파일을 읽는데 메모리의 경우보다 100배 더 빨리 읽을 수 있다.

이~ 래 ~ 서 ~

4. 캐시가 중요하다.

프로세서 - 메모리 간 격차에 대응하기 위해 시스템 설계자들은 캐시메모리를 고안했다.

그래서 단기간에 사용할 가능성이 높은 데이터를 임시 저장한다.

프로세서 칩 내부에 있는 캐시메모리는 대략 수천바이트의 데이터를 저장할 수 있으며
거의 레지스터랑 똑같은 속도로 접근할 수 있다.

응용 프로그래머는 캐시를 활용해서 거의 10배 이상 개선할 수있단다. 속도를

진짜 팩트는 나는 응용 프로그래머가 아니라는거 ㅋㅋㅋ 그래도 좋은 개념 배웠다.


사진출처

좋은 사진이 있어서 퍼왔는데 이처럼 저장장치는 계층구조를 이루고 있다.

cpu 에 있는 데이터는 자기 보다 밑에 있는 데이터에는 무조건 있다.

작은 저장장치일수록 더 아래에 있는 저장장치의 캐시 역할을 하는것이다.

5. 프로세스 ( 프로세서 아님 주의 cpu 아님 )

작업관리자를 켜보면 왼쪽위에 프로세스라고 적혀있는게 보인다.

프로세스를 뭐라고 정의해야 할 지 모르겠지만 나는 메모리에 적재되어 실행된(되고있는) 프로그램 이라고 정의할랜다.

예를들어 hello.c 를 실행하고 hello,world 가 출력되고 종료되면
이건 하나의 프로세스가 실행되었다가 끝난 것이다.

위 사진에 있는 Google Chrome 은 실행중인 프로그램이니까 프로세스이다.

이 실행중인 프로세스의 정보를 운영체제가 컨텍스트 로 관리하는데 여기에는

  • 상태정보 PC ( 프로그램 카운터 )
  • 레지스터 파일
  • 메인 메모리의 현재 값 등

을 포함하고있다.

최근의 시스템에서는 프로세스가 쓰레드 라고하는 다수의 실행유닛으로 구성되어 있다. 쓰레드는 프로세스의 컨텍스트에서 실행되며 동일한 코드와 전역 데이터를 공유한다.

6. 동시성과 병렬성

디지털 컴퓨터 역사를 통해 두개의 "해줘" 가 있었다.

  • 컴퓨터가 더 많은 일 "해줘"
  • 컴퓨터가 더 빨리 "해줘"

이 두개의 "해줘" 를 해결하기 위해서는 CPU (프로세서)가 한 번 에 더 많은 일을 할 때 해결 될 수 있는데

동시성 이란? 컴퓨터가 다수의 동시에 벌어지는 일을 갖는걸 말하고
병렬성 이란? 동시성을 사용해서 시스템을 더 빠르게 "해줘" 는걸 말한다.

그래서 해주기 위해 어떤 방식을 고안해냈을까?

6-1. 쓰레드 수준 동시성

1960년대 초반에 time sharing system ( 시간공유기법 ) 의 출현으로
동시성 , 동시 실행 에 대한 지원이 나타났다.

시간공유기법은 마치 두 개가 동시에 작동되는 것처럼

시간을 나눠서 빨리 왔다갔다 하면서 번갈아 실행하는 것이다!

엥 이거 완전 조삼모사 아니냐

그래서 이렇게 다수의 사용자가 서버에 요청을 하더라도 시스템과 동시에 교신할 수 있게 해주는 것이다.
이러한 시스템 구성을

  • 단일 프로세서 시스템이라고 한다.
    (이거동시맞음? 맞긴해 근데)

그럼 멀티 프로세서 시스템은 ?

CPU (프로세서) 가 하나인 단일 프로세서 시스템은 동시에 처리할수가 없으니까
시간 죤나빨리왔다갔다 기법을 통해 동시에 처리하는 척! 했는데

멀티 프로세서는 여러개의 CPU (프로세서) 를 하나의 칩에 내장하고 있다.
코어는 L1, L2 캐시메모리도 가지고있고 더 상위수준의 캐시도 공유한다.

그래서 더 빠르다.

6-2. 인스트럭션 수준 병렬성

컴퓨터가 실행하는 작업의 최소단위인 인스트럭션은
최신 CPU (프로세서)가 추상화를 통해 여러 개의 인스트럭션을 한번에 실행할 수 있다.

인스트럭션을 실행하기 위해 요구되는 일들을 여러 단계로 나누고
프로세서 하드웨어가 일련의 단계로 구성되어 이들 단계를 하나씩 각각 수행한다.
이들 단계는 병렬로 동작할 수 있기 때문에
인스트럭션 수준 병렬성이다.

6-3. 싱글 인스트럭션, 다중 데이터 병렬성 (SIMD)

많은 최신 프로세서들은 한 개의 인스트럭션 ( 명령 ) 으로 다수의 연산을 수행할 수 있는 특수 하드웨어를 가지고있다. 이걸 ( Single Instruction Multiple Data ) 라고 한다.
보통 이런 SIMD 들은 영상,소리,동영상 데이터 처리를 위한 응용프로개름의 속도를 개선하기 위해 제공된다.

오늘 회고

캐시 메모리 까지는 이해가 갔는데
솔직히 프로세스부터는 머릿속으로 이해가 확 안간다.

책의 마지막장까지 하나씩 이해해보면서 직접 만들어보면 이해가 갈 것 같다.
정글에 핀토스라고 OS 를 직접 만들어보는 것도 있으니 재밌겠다.

0개의 댓글