[CS] 컴퓨터 시스템으로의 여행 ch. 2

참새·2024년 4월 24일
0

컴퓨터 시스템

목록 보기
2/5

📌  프로세서는 메모리에 저장된 인스트럭션을 읽고 해석한다

hello.c 소스 프로그램은 컴파일 시스템에 의해 hello라는 실행가능한 목적파일로 번역되어 디스크에 저장되었다.

linux> ./hello
hello, world
linux> 

쉘(shell)이라는 응용 프로그램에 그 이름을 입력하면 쉘은 CLI로 프롬프트를 출력하고 명령어 라인을 입력받아 그 명령을 실행한다.

만약, 명령어 라인이 내장 쉘 명령어가 아니라면 쉘은 실행파일의 이름으로 판단하고 그 파일을 로딩해서 실행시켜 준다.

이후, 쉘은 해당 파일을 실행하고 hello파일은 메시지를 화면에 출력하고 종료한다.

시스템의 하드웨어 조직

hello 프로그램을 실행할 때 무슨 일이 일어나는지 설명하기 위해서는 아래 그림과 같은 시스템에서의 하드웨어 조직을 이해할 필요가 있다.

버스(Buses)

시스템 내를 관통하는 전기적 배선군을 버스(bus) 라고 하며, 컴포넌트들 간에 바이트 정보들을 전송하는데 일반적으로 워드(word) 라고 하는 고정 크긱의 바이트 단위로 데이터를 전송하도록 설계된다.

한 개의 워들 구성하는 바이트 수는 시스템마다 보유하는 기본 시스템 변수로 대부분의 컴퓨터들은 4바이트(32비트) 또는 8바이트(64비트)의 크기글 갖는다.

입출력 장치

시스템과 외부 세계와의 연결을 담당하는 장치로 예제 시스템은 입력장치인 키보드와 마우스, 출력용 디스플레이, 데이터와 프로그램의 장기 저장을 위한 디스크 드라이브 총 네 개의 입출력 장치를 가지고 있다.

각 입출력 장치는 입출력 버스와 컨트롤러나 어댑터를 통해 연결되는데 이들 각각의 목적은 입출력 버스와 입출력 장치들 간에 정보를 주고받기 위함이지만, 두 장치의 차이는 패키징에 있다.

  • 컨트롤러 : 디바이스 자체가 칩셋이거나 메인보드에 장착
  • 어댑터 : 어댑터는 메인보드 슬롯에 장착되는 카드

메인 메모리

프로세서가 프로그램을 실해나는 동안 데이터와 프로그램을 모두 저장하는 임시 저장장치이다.

물리적으로 메인 메모리는 DRAM(Dynamic random access Memory) 칩으로 구성되어 있으며, 논리적으로 메모리는 연속적인 바이트들의 배열로, 각각 0부터 시작해서 고유의 주소(배열의 인덱스)를 가지고 있다.

프로세서(CPU)

주처리장치 또는 간단히 프로세서는 메인 메모리에 저장된 인스트럭션들을 해독(실행) 하는 엔진이다.

중심에는 워드 크기의 저장장치(또는 레지스터)인 프로그램 카운터(PC)가 존재하는데 어느 한순간에 PC는 메인 메모리의 기계어 인스트럭션을 가리킨다.

전원이 공급되고 끊어질 때까지 프로세서는 PC가 가리키는 곳의 인스트럭션을 반복적으로 실행하고 PC값이 다음 인스트럭션의 위치를 가리키도록 업데이트 한다.

이 새로운 위치는 방금 수행한 인스트럭션과 메모리 상에서 연속적일 수도 있고, 그렇지 않을 수도 있다.

인스트럭션 요청에 의해 CPU가 실행하는 작업의 순서

  • 적재(Lode)
    • 메인 메모리에서 레지스터에 한 바이트 또는 워드를 이전 값에 덮어쓰는 방식으로 복사
  • 저장(Store)
    • 레지스터에서 메인 메모리로 한 바이트 또는 워드를 이전 값을 덮어쓰는 방식으로 복사
  • 작업(Operate)
    • 두 레지스터의 값을 수식/논리 처리기(ALU)로 복사하고 두 개의 워드로 수식연산을 수행한 뒤, 결과를 덮어쓰기 방식으로 레지스터에 저장
  • 점프(Jump)
    • 인스트럭션 자신으로부터 한 개의 워드를 추출하고, 이것을 PC에 덮어쓰기 방식으로 복사

hello 프로그램의 실행

지금까지 시스템 하드웨어 조직과 동작에 대한 간단한 이해를 바탕으로 예제 프로그램이 실행될 때 무슨 일이 일어나는지 이해할 수 있었고 아래는 실행 과정이다.

hello 명령을 키보드에서 읽어들이는 과정

":\hello"를 입력하면 쉘 프로그램은 각각의 문자를 레지스터에 읽어들인 후, 메모리에 저장한다.

실행파일을 디스크에서 메인 메모리로 로딩하는 과정


키보드에서 엔터를 누르면 쉘은 명령 입력을 끝마쳤다는 것을 알고 파일 내의 코드와 데이터를 복사하는 일련의 명령어를 실행하여 실행파일 hello를 디스크에서 메인 메모리로 로딩한다.

데이터 부분은 최종적으로 출력되는 문자 스트링인 "hello, world\n"을 포함한다. 직접 메모리 접근(DMA)이라고 알려진 기법을 이용해서 데이터는 프로세서를 거치지 않고 디스크에서 메인 메모리로 직접 이동한다.

출력 스트링을 메모리에서 화면으로 기록하는 과정

일단 hello 목적 파일의 코드와 데이터가 메모리에 적재된 후, 그림과 같이 프로세서는 hello 프로그램의 main 루틴의 기계어 명령어를 실행하기 시작한다.

이 명령어들은 "hello, world\n" 문자열을 메모리로부터 레지스터 파일로 복사하고, 거기로부터 디스플레이 장치로 전송하여 화면에 글자들이 표시된다.



📑  참고

Bryant O'Hallaron 컴퓨터 시스템(제 3판)

profile
응애 나 아기 개발자

0개의 댓글

관련 채용 정보