폰 노이만
- 오늘날 우리가 사용하고 있는 컴퓨터의 기본 모델을 제시한 사람.
- 초창기 컴퓨터
- 임의의 연산을 하고자 할 떄마다 여러 명의 엔지니어가 달라 붙어서 진공관 회로의 스위치를 변경해 줘야 했다.
- 프로그램이란 진공관 회로의 스위치 구성이라 오늘날 말하는 컴퓨터 프로그램과 거리가 멀었다.
- 프로그램이 컴퓨터 내부에 저장되는 구조를 생각함.
폰 노이만이 주장한 컴퓨터 구조
- 프로그램이라는 것이 존재하고, 이 프로그램은 컴퓨터 내부에 저장되어서 순차적으로 실행 되어야 한다.
- 폰 노이만 아키텍쳐(Stored Program Concept)라고도 부른다.
폰 노이만 아키텍처의 가장 큰 특징은 실행되어야 할 프로그램이 컴퓨터 내부에 저장된다는 것.
프로그램의 실행 과정 (1)

- 전처리기 -> 컴파일러 -> 어셈블러 -> 링커
단계 1 : 전처리기에 의한 치환작업
- 전치리기는 '#include', 'define' 같이 '#'으로 시작하는 지시자의 지시에 따라서 소스코드를 적절히 변경하는 작업을 한다.
단계 2 : 컴파일러에 의한 번역
- 소스코드는 컴파일러에 의해서 어셈블리 코드로 번역된다.
- 어셈블리 코드란?
- CPU가 디자인 될때 CPU에게 일을 시키기 위한 명령어도 같이 디자인 되었다.
- 이러한 명령어를 조합해서 만들어진 프로그램 코드를 의미한다.
- 만약 C와 같은 언어로 구현된 프로그램을 어셈블리 프로그램으로 변경해 주는 컴파일러가 없었다면 우리는 이 명령어 체계(어셈블리 언어)를 익혀서 프로그램을 작성해야 했을 것(과거에는 이렇게 했다함)
단계 3 : 어셈블러에 의한 바이너리 코드 생성
- 텍스트 코드에 상대되는 뜻.
- 즉, 1과0으로만 구성되는 코드를 말한다.
- 컴파일러에 의해 번역된 어셈블리 코드는 컴퓨터에 의해 실행되기에 앞서서 바이너리 코드로 번역되어야함.
- 어셈블리 코드를 CPU가 이해할 수 있는 바이너리 코드로 바꾸어 주는 프로그램이 필요한데, 이것이 바로 어셈블러다.
단계 4 : 링커에 의한 연결과 결합
- 프로그램 내에서 참조하는 함수나 라이브러리들을 하나로 묶는 작업이다.
- 과정이 끝나면 실제 실행가능한 실행파일(exe파일)이 나온다.
- 실행파일은 컴퓨터가 이해하는 바이너리 코드로 구성된다.
프로그램의 실행과정 (2)

1. 실행파일 실행
- 컴퓨터에게 일을 시키기 위한 명령어(바이너리 코드 형식의 명령어)가 들어 있다.
- 이것이 메모리 공간에 올라가고 난 다음 CPU에 의해서 실행되기 시작한다.
- 메모리 공간에 올라간 명령어들이 CPU에 의해서 순차적으로 실행된다.
- 명령어 A, 명령어 B, 명령어 C가 메모리에 올라가있당.
- 단계 1 : Fetch
- 메모리상에 존재하는 명령어를 CPU로 가져오는 작업.
- 단계 2 : Decode
- 가져다 놓은 명령어를 CPU가 해석하는 단계이다.
- 단계 3 : Execution
- 해석된 명령어의 명령대로 CPU가 실행하는 단게이다.
- 프로그램의 기본 실행은 Fetch, Decode, Execution 단계를 거친다.(중요)
하드웨어 구성의 재접근
폰 노이만의 컴퓨터 구조 vs 오늘날의 컴퓨터 구조
- 명령어 실행을 위해서 제일 먼저 하는 일이 Fetch인데 어떠한 이동 경로를 통해서 명령어의 Fetch가 진행되는 것인가.
- 명령어를 CPU 안에 가져다 놓을 떄 어디에 저장하는 것인가?
- 레지스터(IR{Instruction Register})
- CPU 안에 가져다 놓은 명령어는 Decode 단계에서 해석되는데, 이는 CPU 안에 존재하는 누구에 의해서 진행되는가?
- 마지막 단계인 Execution은 누구에 의해서 진행되는가?
- 산술 및 논리 연산을 하는 Execution의 주체는 ALU다.
데이터 이동의 기반이 되는 버스(BUS) 시스템
- 데이터를 이동하는데 있어서 사용되는 전송 경로를 가리켜 버스 시스템(Bus System)이다.
- I/O 버스는 여러 장치(Device)들이 데이터를 주고 받기 위한 통로의 역할을 한다.

데이터 버스(Data Bus)
어드레스 버스(Address Bus)
- 주소값을 이동하기 위해 필요한 버스
- 주소값을 이동해야만 하는가?
- CPU가 0x1024번지에 저장되어 있는 4바이트를 읽으려고 한다고 가정한다면.
- 메모리 영역에 주소값 0x1024를 먼저 전달해야 한다.(메모리는 주소가 전달되면 해당 주소의 데이터를 전송하는 컨트롤러가 포함되어 있다고 생각)
컨트롤 버스(Control Bus)
- CPU가 원하는 바를 메모리에 전달할 때 사용.
- CPU와 메모리가 서로 특별한 사이(Sign)을 주고 받는 용도로 사용되는 버스다.
버스 종합해서 정리
- 컨트롤 버스를 이용해서 CPU가 메모리에 사인을 전달해야 하는가?
- CPU는 메모리로부터 데이터를 가져온다.
- 메모리에 데이터를 저장하기도한다.

- 우선 CPU가 하고자 하는 일이 무엇인지 메모리에 알려주고있는데 이러한 용도로 컨트롤 버스가 사용된다.
- 두번째로 가는건 데이터의 주소값이다. 데이터가 저장된 주소값을 알아야 적절히 송신 및 수신 할것 이를 위한 버스는 어드레스 버스다.
- 실제로 데이터를 전송하는 일만 남았는뎅 이걸 하는 버스가 데이터 버스다.
1차 23.12.12
2차 23.12.18
3차 23.12.19
4차 23.12.20
5차 23.12.21
6차 23.12.26
7차 24.01.02