von Neumann vs Havard Architecture
- CPU 외부에서는 von Neumann architecture를 따르며 내부에선 Havard architecture
von Neumann architecture
- EDVAC 관련 보고서에서 등장하고, EDSAC에서 최초로 구현된 컴퓨터 구조
- stored program 방식으로도 불리며 data와 program이 동일한 공간에 저장되고 동일한 bus 사용
Harvard architecture
- Mark 1 컴퓨터가 채택한 방식으로 program과 data가 저장되는 memory와 bus가 분리된 것을 제외하면 von Neumann 구조와 매우 유사
- 분리된 memory와 bus를 통해 동시에 program과 data 접근이 가능하므로 von Neumann보다 빠른 성능이 가능하다는 장점
Function in the Programming
- Programming에서 function은 재사용성과 가독성을 위해 사용됨.
- 수학에서의 function은 입력과 출력 간의 mapping에 좀 더 초점을 두는 반면, programming에서의 function은 입력들을 받아 출력(return value)을 만들어내는 처리에 초점을 둠.
Programming에서의 Function
- SW에서 특정 동작을 수행하는 일정 code들의 모임을 의미
- 입력(parameter) 및 그에 따른 출력(return value)을 가지며 이들 사이에서 입력을 바탕으로 출력을 만들기 위한 처리부분으로 구성
- Programming에서 function은 입력이 없거나 출력이 없는 것도 가능함. (둘 다 없을 수도)
Function 종류
1. built-in
function
- Programming language 등이 기본적으로 제공하는 함수들을 가리킴.
- 파일 입출력 등과 같이 많은 경우에 공통적으로 필요한 다양한 함수들이 built-in function으로 제공됨.
2. custom
function
- 프로그래머가 built-in function을 기반으로 작성한 고유 함수들.
- 프로그래밍을 한다는 것은 많은 function을 만들어내는 작업을 포함하는 것
Function call을 instruction set으로 나누기
Example
# Python
def cube(x):
tmp=x**3
return tmp
a= cube(3)
cube
function을 실행한 다음 return되는 address를 계산해야 함.
- 이 과정에서 instruction을 사용하고
cube
함수를 호출하는 code가 차지하는 address도 감안해야 함.
- 따라서 반환 주소는 프로그램 시작(
100
)으로부터 5개의 명령어가 지난 다음이며 이를 200
에 저장함.
- 고정된 주소에 저장하기 때문에
recursive function call
(재귀함수호출)을 지원할 수 없음. (때문에 실제로 stack
이라는 data structure가 사용됨)
- 함수를 호출하면 함수가 실행되고 함수 안에 모든 code를 실행하고 나면
200
에 있는 값을 사용해 branch indirect(간접 분기)를 함.
- 그 결과는
200
에 105
가 들어가 있기에 105
임.
- Function call은 stack에 argument와 return address를 저장하기 때문에 추가적인 부하가 발생함
- 추가적인 부하를 없애기 위해 function을 사용하지 않을 경우 중복되는 code들일 너무 많아져 버그에 취약해지고 가독성을 잃게 되어 가급적 중복 처리는 function으로 만들어서 사용
재귀함수와 자료 구조에 대한 더 자세한 내용은 다음 url 참조
More about Recursive Call and Data Structure
Function call과 stack
- 프로그램이 수행될 때, function call이 이루어지면 function이 저장되어 있는 memory의 address로 PC가 가르킴에 따라 수행되는 주소의 branching이 이루어짐.
- function 수행이 끝나면 function call이 이루어진 다음 주소로 돌아와야 하기 때문에 해당 address가 저장되어야 함.
- 이 돌아올 address 및 function에서 사용할 local variables은 stack에 저장됨. 이와 같이 stack에 저장된 데이터들의 모음을
Stack Frame
이라고 함.
Stack Frame
에는 다음과 같은 데이터가 있음
- function으로 전달하는 parameter
- local variables
- 복귀 주소
Stack
- 자료구조의 하나로서
FILO
(First-In-Last-Out)로 동작함.
- Stack에 저장되는 데이터 단위를 element라 하며 새로운 element가 stack에 추가되는 것을 push, 현재 stack에서 element를 빼내는 동작을 pop이라 함.
- Stack을 class로 구현 시 push와 pop은 method로 구현됨.
- Function call, memory allocation 등에서 기본적으로 사용되기 때문에 대부분 CPU들은 instruction set에서 stack을 위한 instruction을 따로 제공함
- SW적으로는 expression evaluation이나 programming에서 curly brackets 등을 열고 닫았는지 등의 check에서도 자주 사용됨.
Interrupt and Polling
- CPU에게 어떤 event들이 발생했음을 알리고 이들을 처리하기 위해 제안된 두가지 방법
- event가 발생했을 때 CPU는 대개 어떤 process를 처리하고 있을 경우가 많음. 즉, CPU는 어떤 process를 처리하고 있는 도중이라도 특정 event들이 발생했는지 여부를 알 수 있어야 하고 이를 처리할 수 있어야 함.
Polling
- CPU는 일정시간 간격으로 현재 수행 중인 process를 잠시 멈추고 event들이 발생했는지를 점검함.
- 점검해야할 모든 event들을 주기적으로 체크하는 방식이기 때문에 점검해야 하는 event의 수가 많아질수록 CPU에 걸리는 부하가 커짐.
- 현재는
interrupt
방식이 더 많이 사용되며 실제로 HW적으로 구현된 interrupt system이 사용됨.
polling
은 SW적으로 구현하여 특정 처리 등을 할 때 사용함.
Interrupt
- event가 발생된 경우 해당 event와 관련된 device 등이 CPU에게 event가 발생되었다고 알려줌.
- 주변기기에서 발생한 interrupt의 처리과정을 예를 들어 살펴보면 다음과 같음
- 주변기기에서 CPU가 attention해야 하는 event 발생 시,
interrupt request(IRQ)
을 생성하여 CPU에게 보냄
- 이를 받은 CPU(or processor)는 현재 작업 수행의 상태를 저장하고 수행을 멈춤.
- 해당
interrupt
의 interrupt vector
를 참고하여 처리를 수행할 interrupt handler
(or interrupt service routine(ISR))를 호출
interrupt handler
는 해당 interrupt를 처리하는 작업을 수행. interrupt handler는 특정 interrupt에 해당하는 event 시 처리되어야 할 작업을 구현한 function 이라고 생각하면 됨.
- interrupt handler가 처리를 끝내면, processor는 중단시킨 작업을 다시 재개함.
Stack과 interrupt
- 현재 실행 중이었던 process 상태를 저장하고 interrupt handler가 종료되고 하면 돌아올 주소 등이 저장하기 위해 사용되는 자료구조가
stack
으로 오늘날 processor들은 이를 위한 stack을 hardware로 구현하고 있음.
- 이같은 상태 저장은 interrupt handler가 책임지고 수행
Interrupt vector
- Interrupt handler가 위치하고 있는 memory address등을 가지고 있음.
- 발생한 interrupt의 종류와 이를 처리할 interrupt handler의 memory address등을 가지고 있음.
Interrupt Mask, Priority and Timer
- 특정 interrupt를 켜고 끌 수 있으며 이에 대한 정보를 가지고 있는
mask
가 존재
- interrupt들은 우선순위(priority)를 가지며 높은 우선순위의 interrupt가 우선적으로 처리됨.
- interrupt 처리에 많은 시간을 줄 수 없으며 이같은 시간 제한을 위한
timer interrupt
도 존재함.
OS와 Signal handler system
- SW적 관점에서 OS는 hardware interrupt를 모방한 virtual or software interrupt system을 가지고 있음.
- User application에서 system call을 통해 Kernel mode로 동작을 요청할 때 software interrupt가 발생하며 이후 kernel mode가 되어 해당 처리가 완료된 이후 원래의 User application의 user mode로 돌아와 작업 재개
- UNIX에서 이같은 software interrupt를 주로 signal(or event)이라 부르며 해당 처리 방식을 signal mechanism이라 부름. (
Ctrl+C
도 대표적 signal)
자세한 내용은 다음 링크 참조 : More about Interrupt
References:
1) https://dsaint31.me/mkdocs_site/CE
2) https://dsaint31.tistory.com/entry/CE-Stack