1. 컴퓨터 시스템으로의 여행
CS/컴퓨터 시스템

1. 컴퓨터 시스템으로의 여행

#include <stdio.h>

int main()
{
    printf("hello, world\n");
    return 0;
}

위와 같은 hello.c 파일이 있다고 하자. 우리한텐 글자로 보이지만 컴퓨터에겐 아스키코드(ASCII) 표준으로 정해진 숫자로 저장되어 있고, 우리에게 보여줄 땐 치환해서 보여주는것 뿐이다.

이 각 C로 이루어진 문장들은 실제 실행이 가능한 저급 인스트럭션으로 번역되어야 그제서야 실행이 된다.

gcc 컴파일러가 위 코드를 실행 가능한 바이너리 코드로 변경한다. 물론 그 과정엔 어셈블리로 변경, 기본 라이브러리랑 링크 연결 하는 등의 과정을 거쳐 만들어진다.

gcc -o hello hello.c

 

linux> ./hello
hello, world
linux>

어떻게 작동하는지도 모르는 기본 라이브러리에 링크해주기 때문에, printf를 실행할 수 있다.

 

근데 키보드에서 입력을 한다는건 기존에 입력한 내용을 기억하면서 모니터에 띄워주는 것이다. 그래서 키보드로 입력하면 이벤트 발생으로 기억하여 메모리에 저장하고 화면에 출력한다. 이 내용들은 Buses(버스)를 통해 서로에게 전달된다.

 

Bus에 전달되는 용량 크기는 word(워드)단위고, 1 word가 보유하는 byte 수는 컴퓨터마다 다르지만 오늘날의 컴퓨터는 대부분 4byte(32bit), 8byte(64bit)이다.

방금 만든 hello는 디스크에 저장되어 있다. 프로세서가 프로그램을 실행하는 동안 데이터와 프로그램을 모두 메모리에 저장한다. 물론 short는 2byte, int는 4byte 등으로 저장되며 메모리는 연속적인 byte의 배열 형태로 저장된다. 물리적을 메인 메모리는 DRAM(Dynamic Random Access Memory)칩 들로 구성되어 있다.

 

프로세서는 Load(적재), Store(저장), Operate(작업), Jump(점프) 같은 단순한 작업 단위를 실행한다. for문이니 while같은 loop를 하는건 어셈블리어를 잘 보면 그냥 if와 jump를 잘 한 거다.

 

hello 프로그램을 실행하는 과정을 보자.
일단 USB controller에 연결된 키보드가 I/O bridge를 통해 cpu 레지스터에 읽어들여 메모리에 저장한다. 가만히 생각해보면 기존에 입력한걸 화면에 띄울려면 어딘가에 저장했어야 했다고 생각할 수 있다. 그래서 컴퓨터 너무 렉걸려서 화면에 적용 안되는건 그것조차 하기 힘들정도로 CPU가 바쁘단거임.

다 입력한 뒤 엔터를 누르면 이제 입력이 끝났다는걸 shell(쉘)이 인지하여 파일 내의 코드와 데이터를 복사하는 명령을 실행하여 실행파일 hello를 디스크에서 메모리로 로딩한다. 데이터 부분은 최종적으로 출력되는 문자 스트링인"hello, world\n"을 포함한다. 직접 메모리 접근(DMA)라고 알려진 기법을 이용해서 데이터는 프로세서를 거치지 않고 디스크에서 메모리로 직접 이동한다.

main을 실행하기 시작하면 "hello, world\n"를 메모리에서 레지스터 파일로 복사해서 디스플레이 장치로 띄워준다.

 

 

근데 사실 이 과정들을 보면 막 복잡하게 실행하는 과정보다는, bus를 통해 왔다갔다 하는 시간이 더 걸린다. 그래서 이 시간을 줄이는게 관건이라 저장장치들이 계층 구조를 이루게 되었다. CPU는 수백 바이트를 저장하는 레지스터를 읽는것만 있어서 메모리보다 더 빠

른 캐시메모리를 개발했다. L1, L2, L3,...

 

 

그리고 CPU, 메모리, 입력장치 이런 하드웨어들을 OS가 관리해주고.. 특히 CPU는 여러 프로세스를 하나의 CPU에서 같이 실행하는 기법(contect switch를 사용하면서 등)라던지, CPU의 쓰레드, 동시성 같은것들 해준다.

 

프로그램 실행할 때 마치 그 프로그램만을 위한 메모리인것 처럼 바닥부터 차근차근 올라오며 차지하는데, 사실 물리메모리를 보면 아니다. 하지만 프로그램한테 그렇게 보이는 이유는 가상메모리 써서 그렇다. malloc용은 중간부터 쌓이고, dfs같은 함수 스택 쌓이는건 위에서부터 밑으로.. 이 외를 접근하면 어디를 갈 지 모름. rust가 그래서 언어단에서 막는거고.

 

네트워크는 위에서 봤던 입력장치들 중 하나로 보면 된다. telnet서버로 원격 서버에 신호를 보내면 원격서버에서 받아 출력한 결과를 클라이언트에서 보여주고 하는 방식으로...

 

 

동시성. 프로그램 실행할 때 답답하다! 느리다! 하는 것들은 대부분 동시성으로 해결 가능하다고 한다.

다중 CPU는 L1, L2는 각각의 CPU가 가지고 있지만 L3 캐시 메모리조차 공유하는 방식이라 함.

'CS > 컴퓨터 시스템' 카테고리의 다른 글

2. 정보의 표현과 정리  (0) 2023.04.09
0. 무슨 게시판?  (0) 2023.04.05