Computer Basic Components
- 프로세서 (CPU)
- 메인 메모리
- 휘발성: 전기가 나가면 데이터가 사라짐
- 시스템 버스
- CPU, 메모리, I/O 모듈들이 서로 데이터를 주고 받기 위한 통로
- CPU가 메모리에서 데이터, 명령어를 가져오고
- CPU가 I/O 모듈로 부터 데이터, 명령어를 쓰고 읽고
- I/O 모듈
- 주변 장치 ex) HDD
CPU Components
- Arithmatic Logic Unit
- 계산 담당
- Control Unit
- CPU 자체를 제어
- Register
Register
- CPU가 연산을 위해 필요한 매우 작은 저장 장치
- CPU 안에 있어서 속도가 매우 빠름
Register for Data I/O
- 메모리와 CPU 사이의 데이터를 주고 받기 위한 레지스터
- CPU가 메모리로부터 계산에 필요한 데이터를 가져오고 (LOAD) 나 메모리에 계산 값을 쓴다 (STORE)
Memory Address Register (MAR)
- CPU가 메모리에서 데이터를 읽어올때 어느 위치에 있는 data인지 알아야한다
- 그 위치는 메모리 주소로 표시된다
- MAR은 이 메모리 주소값을 저장하는 레지스터다
Memory Buffer Register (MBR)
-
MBR은 메모리에서 읽어온 데이터를 CPU안에 저장하는 역할을 한다
-
LOAD 과정
- 읽고자하는 데이터의 메모리 주소를 MAR에 적고 LOAD 명령 실행하면 실제로 그 메모리 위치에가서 데이터를 읽어와 MBR에 저장된다
-
STORE 과정
- 쓰고자하는 데이터의 메모리 주소를 MAR에 적고 데이터를 MBR에 적고 STORE 명령 실행하면 그 메모리 위체에 MBR에 적힌 데이터가 써진다
I/O Address Register, Buffer Register
- MAR, MBR은 기본적으로 메인 메모리에서 데이터 I/O할 때 쓰인다
- I/O 장치에도 동작 원리가 똑같은 레지스터들이 존재한다
CPU는 메모리 주소만 아는데 CPU가 어떻게 I/O 장치에 접근할까? 메모리를 거쳐서
- 모든 I/O 장치에는 제어 장치인 controller가 있고 이 안에는 buffer 메모리가 있다
- buffer 메모리는 메인 메모리의 특정 주소 영역과 매핑 되었있다
- CPU가 이 특정 영역의 데이터에 대해 메모리 operation을 수행하면 매핑된 buffer 메모리에 대해 메모리 operation하는 행위로 변환된다
- CPU는 메모리 접근인지 I/O인 구분할 필요없이 매핑된 주소 영역에 메모리 operation를 수행하여 I/O 장치에 접근한다
User-visible Registers
- 개발자가 직접 건드릴 수 있는 레지스터
- 자주 실행되는 부분의 속도를 빠르게 하기 위해 high level language를 compile하지 않고 개발자가 직접 assembly language로 코딩할 때 사용된다
Program Counter (PC)
- cpu가 명령을 수행하려면 instruction을 가져와야한다
- cpu는 메모리에 올라온 instruction을 가져와서 실행한다
- PC는 다음번에 실행되야하는 instruction의 메모리 주소들을 저장한다
Instruction Register (IR)
- PC에 적힌 메모리 주소로 가서 거기 있는 instruction을 가져와서 IR에 저장한다
- 즉 IR에는 지금 실행해야하는 instruction이 저장된다
- CPU는 IR의 instruction을 읽고 실행한다
Instruction Categories
- 프로그램을 구성하는 instruction들은 4가지 중 하나에 해당한다
- Processor-memory
- processor와 메모리 사이에 데이터를 LOAD STORE하기 위한 명령어
- Processor-I/O
- processor와 IO 장치 사이에 데이터를 LOAD STORE하기 위한 명령어
- Data processing
- 논리, 산수 계산 명령어
- Control
- jmp와 같이 instruction 실행 순서를 바꾸는 명령어
Program Status Word (PSW)
Condition code
- 비교연산과 문제 대처용
-CPU가 메모리에서 명령어를 가져와서 실행했을때 이 결과가 어떤 결과인지 저장한다
- ex) +,-,0,overflow 여부
- 문제가 생겼을때 빠르게 대처하기 위해서 필요하다
- CPU는 워낙 빨리 실행되기 때문에 한 문제가 생기면 파급 효과가 급속도로 커지고 시스템 전체적으로 영향을 미친다
- 해결 과정 시간을 단축하기 위해 cpu안에서 기본적인 문제를 걸러낼 수 있어야한다
- PSW의 condition code로 기본적인 검사를 할 수 있다
Interrupt Enable/Disable
Supervisor/User Mode
- 현재 cpu가 수행하고 있는 코드가 사용자 코드인지 os 코드인지 나타낸다
Instruction Execution
- cpu가 메모리에 있는 instruction 실행하는 과정

-
Fetch
- instruction을 메모리에서 가져오는 단계
- PC에 적힌 메모리 주소로 가서 instruction을 가져와서 IR에 저장하는 단계
-
Fetch가 끝나면 PC에 적힌 메모리 주소에 1 더하여 그 다음 instruction 주소를 저장한다
-
Execute
- IR에 저장한 instruction을 실행하는 단계
-
Fetch -> PC값 1증가 -> Execute -> Fetch ..반복
-
cpu는 sequential, pc 값 변경으로 jump
Top-Level Components

- CPU, memory, I/O 상관 관계
- CPU
- Execution Unit == Arithmatic Logic Unit (ALU)
- Control : PC, IR
- Data I/O : MAR, MBR
- I/O 장치의 I/O 작업: I/O AR, I/O BR
- Memory
- CPU에서 명령어를 실행하기 위해서 memory에서 데이터와 instruction을 가져온다
- 프로그램 코드가 instruction sequence로 쭉 저장됨
- 프로그램 실행을 위한 데이터도 쭉 저장됨
- I/O module
- Buffer 메모리: 메인 메모리와 매핑됨
Characteristics of Machine Code

- 이렇게 구성된 컴퓨터로 프로그램을 실행해보자
- Opcode: 어떤 명령어인지 나타냄
- Address: 명령어 대상의 주소
- ex) opcode가 5이면 address에 저장된 값을 AC에 더한다

-
Fetch
- PC에 적힌 300 메모리 주소로 가서 1940을 가져와서 IR에 LOAD 한다
-
Execution
- opcode 1 (LOAD), address 940이다
- 940 메모리 주소로 가서 0003을 AC에 LOAD한다
-
Fetch
- PC에 적힌 301 메모리 주소로 가서 5941을 가져와서 IR에 LOAD 한다
-
Execution
- opcode 5 (ADD), address 941이다
- 941 메모리 주소로 가서 0002을 AC에 ADD한다
-
Fetch
- PC에 적힌 302 메모리 주소로 가서 2941을 가져와서 IR에 LOAD 한다
-
Execution
- opcode 2 (STORE), address 941이다
- AC의 0005를 941 메모리 주소에 STORE한다
Interrupt
-
비동기 event를 실시간 처리하기 위해 interrupt 사용
-
CPU가 프로그램을 실행하는 도중에 예기치 않게 I/O 장치에서 입력이 들어올 수 있다
-
ex) 영상보다가 마우스 커서를 움직이면 영상을 보여주면서 커서 움직임도 같이 보여줘야한다
-
I/O에서 커서 움직임 event가 발생했기 때문에 지금 CPU가 하고 있는 일을 잠시 멈추고 event를 처리해야한다
-
따라서 Interrupt는 CPU의 fetch, execute sequence를 중간에 멈추게 하고 event를 처리하고 돌아가는 과정을 제공한다
-
동기 event
- ex) printf -> system call WRITE
-
비동 event
- cpu가 모름 ex) IO 마우스 움직임

- Interrupt Handler는 커서 움직임, 클릭 등의 I/O event에 해당하는 handler가 있다 / 부팅시 handler에 IRQ 번호 부여
- OS에서 관리하는 Handler 코드로 해당 handler로 jump한다
Interrupt 활용
- 프로그램 수행중 하드 I/O에 쓰기 명령을 내렸다
- 하드는 CPU에 비해 매우 느리기 때문에 CPU는 하드 작업이 끝날 때까지 다음 명령어을 실행 못하고 계속 기다려야한다 -> 프로그램 전체 속도가 매우 느려진다
- 하드가 작업 완료하면 CPU에게 Interrupt를 보내도록 설계한다면?
- CPU는 하드에 IO 명령을 내린 뒤 아얘 다른 일을 하다가 하드가 interrupt를 보내오면 IO 작업 뒤의 일을 이어서한다
Interrupt Cycle

- CPU 입장에서 Interrupt가 왔는지 알아야한다
- Fetch -> Execute -> Interrupt check (추가!) -> Interrupt Handler로 jump
- Interrupts Disabled/Enabled?
- PSW 레지스터의 Interrupt Enable/Disable로 세팅
- 절대로 중단되어서는 안되는 작업중이면 interrupt check 넘기고 fetch로
Interrupt Processing

-
IO 장치의 controller가 interrupt 발생
-
cpu는 execution 후 interrupt check
-
interrupt있으면 cpu가 achknowledgment 시그널 보냄
-
현재 작업 상태 (register 값) 보존하기
- PSW와 PC를 스택에 push
-
PC는 interrupt handler 코드의 위치로 설정
-
나머지 register를 다 저장
-
interrupt handler 코드 실행
-
보존해 놓은 register 값들로 설정
-
보존해 놓은 PSW, PC 값들로 설정하여 돌아오기
Save Memory and Register

Y= Interrupt Handler 코드가 시작되는 주소
L= Interrupt Handler 명령어 갯수
Interrupt 직전 (save)
- stack pointer는 현재 상태를 저장할 stack의 top을 가르킨다
- stack top T에 가서 general register M-1개 값 저장하고 PC+1 (N+1)을 저장한다
- 새로운 stack top은 T-M이 된다
- 그 다음 PC에 Y (Interrupt Handler 코드가 시작되는 주소)를 저장한다
Interrupt 실행후 (restore)
- PC가 Y+L이 된 상태다
- stack top T-M에 가면 돌아가야할 주소값 N+1이 있고 이를 PC에 저장하고 pop
- 그 밑에 저장해둔 나머지 register 값들을 다 설정하고 pop
- 새로운 stack top은 다시 T이다
Short I/O Wait
I/O Without Interrupt

- 1) 유저 프로그램 실행중
- WRITE) OS에서 하드 IO를 편리하고 안전하게 하기위해 제공하는 system call 실행
- 4) System call 실행하고 하드에 실제 IO 작업 명령
- 5) IO 끝나면 System call 마무리 작업
- WRITE) 종료
- 2) 유저 프로그램 이어서 실행
4번에서 하드가 실제 IO 작업 하는 동안 CPU는 idle 상태이다.. Interrupt로 CPU 일 시키자!
I/O With Interrupt

- 4번과 5번을 나누어 하드가 실제 IO 작업 하는 동안 CPU가 다음 instruction 수행할 수 있게 한다
- 하드 IO가 끝나면 Interrupt을 발생시켜 Interrupt Handler에서 IO 마무리 작업 5)를 실행한다
- 따라서 CPU는 더 이상 놀지 않는다
I/O가 너무 오래걸러서 2a , 2b가 끝나도 interrupt가 안온다면..?
Long I/O Wait

- I/O가 오래걸려 Interrupt가 2번 이후에 발생한 케이스다
- 하드에 I/O 명령이 여러개 왔을때 I/O 처리 순서가 바뀌면 원칙적으로 안된다
- 따라서 첫번째 명령이 안끝났으면 두번째 명령을 받아서는 안된다
- System call을 계속 대기하다가 (CPU idle 감수) interrupt가 오고 handler가 종료되면 실행한다
Interrupt는 만병통치약이 아니다!
Multiprogramming for Long I/O Wait
- 앞에 보낸 IO 때문에 CPU가 기다려야한다면 기존 프로그램을 벗어나서 다른 프로그램을 수행하면 CPU는 계속 일할 수 있다
- 따라서 CPU가 실행하는 프로그램은 여러개다 / Multitasking
여러개의 프로그램이 동시에 수행되면 누굴 먼저 실행되야하나? CPU Scheduling