> - 폰 노이만 아키텍쳐
> - The Fetch-Execute Cycle
> - 주기억장치와 보조기억장치
<br>
## 폰 노이만 아키텍쳐

#### 특징
- 정보를 처리하는 부분과 정보를 저장하는 부분이 분리되어 있음
<br>![[Data_flow_through_a_von_Neumann_machine.png]]
> 컴퓨터는 정보를 저장하고, 검색하고, 처리할 수 있는 장치
> 그러므로 컴퓨터에게 주는 모든 명령어는 이런 일들과 관련이 있음
<br>
#### 다섯가지 구성 요소
- **memory** (기억장치) : 데이터 및 명령어를 저장
- 메모리는 **셀(cell)**을 모아둔 것으로, 각 셀은 고유한 **물리 주소**가 있음
- addressability(주소지정 능력)
- = 메모리에서 주소 지정이 가능한 셀에 저장된 비트의 수
- 주소가 지정되는 위치의 비트의 수가 기계에 따라 다름
- 요즘 대부분의 컴퓨터는 매 **바이트**마다 주소가 지정됨
- 예를 들어, addressability가 8이고 메모리에 256개의 셀이 있다면 다음 그림과 같이 주소가 지정됨
<br>![[memeory_address.png]]
- 바이트나 워드에 들어 있는 비트를 가리킬 때, 비트는 오른쪽에서 왼쪽 방향으로 0부터 시작하여 번호가 부여됨
<br>![[bit_position.png]]
<br>
- **ALU**, arithmetic/logic unit (산술/논리 연산 장치) : 데이터에 대한 산술 및 논리 연산을 수행
- 기본적인 산술 연산 및 논리 연산을 수행함
- **워드(words)** 단위로 처리됨
→ 역사적으로 하나의 컴퓨터의 워드 길이는 ALU에 의해서 한 번에 처리되는 비트의 수였음
- **레지스터(Register)**
- 레지스터들은 하나의 워드를 갖고 있음
- 곧 다시 쓰이게 될 정보를 임시로 저장하는 데 쓰임
→ 메모리 위치에 접근하는 것보다 레지스터에 접근하는 게 훨씬 빠름
<br>
- **input unit** : 컴퓨터 외부로부터 내부로 데이터를 이동시키는 입력 장치
- 키보드, 마우스 등
- **output unit** : 컴퓨터의 내부에서 외부로 결과를 이동시키는 출력 장치
- 모니터, 프린터기 등
<br>
- **control unit** (제어 장치) : 다른 모든 구성 요소가 유기적으로 작동하도록 관리
- fetch-execute cycle을 담당함
- 특별한 레지스터 2개를 가지고 있음
- instruction register (IR) : 실행 중인 명령어를 가지고 있음
- program counter (PC) : 다음에 실행될 명령어의 주소를 가지고 있음
<br>
#### Stored-Program 개념 (내장 프로그램)
- 폰 노이만이 1944-1945에 **데이터와 데이터를 조작하는 명령어가 논리적으로 같다**는 것을 밝힘
→ 즉 데이터와 명령어를 함께 저장할 수 있음
<br>
## The Fetch-Execute Cycle (인출-실행 주기) ✨
> 폰 노이만 아키텍쳐에 따르면 데이터와 명령어는 논리적으로 비슷해서 같은 방식으로 다룸
> 즉, 둘 다 주소가 지정된다는 것을 의미함
> → 명령어(코드)는 연속적인 메모리 공간에 저장됨
> → 처리할 데이터는 메모리의 다른 구역에 저장됨
<br>
#### 프로세싱 주기 단계
- 처음 fetch-execure cycle을 시작하기 위해서는 **프로그램의 첫 번째 명령어의 주소를 PC에 로드한다**
- 다음 명령어를 가져온다 (Fetch)
- PC에 로드된 메모리 주소로 접근해서 워드의 내용(명령어)를 복사해 IR에 저장
- PC에 현재 명령어의 길이(바이트 수)를 더해서 다음 명령어의 주소를 저장
- 가져온 명령어를 디코드한다 (Decode)
- IR에 있는 명령어를 실행하기 위해 무슨 명령인지 해독해야 함
- CPU 안의 회로 논리에 따라 어떤 연산을 실행할 지 결정함
- 필요하다면 데이터를 가져온다
- 명령어를 실행한다 (Execute)
- 명령어가 해독되고 필요한 operand(data)가 CPU로 불러들여지면 명령 실행할 준비가 끝남
- ALU에 처리를 요구하는 신호를 전송함
<br>![[fetch-execute_cycle.png]]
![[how_ALU_works.png]]
![[fetch-execute_cycle_example.png]]
<br>
## RAM과 ROM (주 기억장치)
- **RAM**: random-access memory
- RAM 안에 있는 각 셀(보통 바이트)에 직접적으로 접근할 수 있는 메모리
- 각 셀에 다른 종류의 비트 패턴을 저장함으로써 각 셀의 비트 패턴을 변경할 수 있음 (데이터 변경 가능
- 휘발성 메모리 : 전원 꺼지면 즉시 비트 패턴을 잃어버림
- ROM: read-only memory
- ROM에 있는 데이터는 변경할 수 없음
- burning : ROM에 비트 패턴을 저장하는 작업 (ROM이 최초로 만들어질 때 구워짐)
- 영구적 메모리 : 전원이 꺼져도 비트 패턴 유지됨
→ 컴퓨터 부팅할 때 필요한 명령어들을 저장하는 데 사용함
<br>
## 보조 기억장치(Secondary Storage Devices)
- 주 기억장치의 대부분은 휘발성이고 그 크기가 제한적이기 때문에, 전원이 꺼지거나 프로그램/데이터를 더이상 처리하고 있지 않을 때도 계속 유지 저장할 수 있는 다른 종류의 저장 장치가 필요함
- 마그네틱 테이프
- 마그네틱 디스크 (하드 디스크 드라이브, HDDs)
- CD 랑 DVD
- Flash 드라이브 (USB나 SSD)
<br>
## 임베디드(Embedded) 시스템
- 임베디드 시스템 = 일부로 제한적인 기능만을 수행하도록 설계된 컴퓨터, 특장한 목적을 가진 컴퓨터
- 보통 한 개의 마이크로세스프로세서의 칩에 들어있고, 프로그램은 ROM에 저장하고 있음
- 시계, 전자레인지, 자동차 등 디지털 인터페이스를 가진 모든 제품들이 임베디드 시스템을 사용함
- 어디에나 있음 (유비쿼터스)
- 범용 컴퓨터(universal computer)와는 반대되는 개념
<br>
## 병렬(Parallel) 컴퓨팅
- 물리적인 CPU, 프로세서를 여러개 두고 프로세스를 처리하는 컴퓨팅 방법
- bit level, instruction level, data level, task level 의 네 가지 형태가 있음
- 명령어 수준 : 서로 관련성이 없는 데이터를 연산하려고 할때, 이 연산들을 동시에 수행 가능
- 데이터 수준 : 하나의 명령어 조합이 동시에 다른 데이터 조합에 대해 병렬로 실행될 수 있다는 생각에 기초함
- SIMD(single instruction, multiple data)라고 불림
- 많은 양의 데이터 집합에 동일한 처리과정을 적용할 필요가 있을 때 효과적 e.g. 이미지 밝기 증가
- **작업 수준** : 여러 개의 프로세서들이 동일하거나 다른 데이터에 대하여 서로 다른 작업을 실행할 수 있다는 생각에 기초함
- 폰 노이만 머신의 **파이프라이닝(pipelining)** 개념과 비슷함
- 파이프라이닝 = 각 명령어를 중복해서 실행할 수 있도록 좀 더 작은 단계로 명령어를 분할하는 기술
- 각 프로세서가 이전 단계로부터 데이터를 받아다가 처리하고 각각 다음 단계로 작업을 넘김
e.g. 머지 정렬
<br>
<br>
<br>
<br>