뜬금없이 5장부터 시작하는 이유는 "한 권으로 읽는 컴퓨터 구조와 프로그래밍"이라는 책으로 스터디를 진행하는데 5장 발표를 맡아서...나머지도 천천히 채워나가볼 계획이다.
주로 메모리와 관련한 구조 개선을 다룬다. 5장의 부제와 같이 "컴퓨터는 어떻게 프로그램과 메모리를 조직적으로 관리할까"에 대해 정리한다.
유일한 차이는 메모리의 배열이다.폰 노이만 구조는 메모리에서 동시에 명령어와 데이터를 가져올 수 없으며 병목 현상이 생길 수 있다는 점이 단점이며 하버드 구조는 버스가 더 필요하다는 것이 단점이다.
현대에서는 CPU 외부적으로는 폰 노이만 구조를 내부적으로는 하버드 구조를 사용한다. 이는 가상 MMU에서 다시 한번 설명한다.
아래의 용어들의 정의가 완전하진 않다(원래). 느낌적으로 받아들이자.
Microprocessor : Memory와 I/O가 프로세서 코어와 같은 패키지에 들어 있지 않는 processor. 범용 컴퓨터에 있는 cpu.
Microcomputer : 같이 들어 있는 processor. 아두이노 같은 것.
SOC(System On Chip) : 좀 더 복잡한 Microcomputer. wifi 회로 등 더 복잡한 장치가 들어있고 핸드폰에 있는 칩들이 포함된다.
FPGA(Field Programmable Gate Array) : 사용자가 customizing할 수 있는 SOC.
우리는 4장에서 Program counter라는 것을 배웠다. PC는 다음으로 실행할 명령어의 주소를 저장하는 레지스터입니다. 이는 일반적으로 1씩 증가한다. 하지만 함수가 호출되고 끝나면, 다음 실행해야할 명령어의 주소를 알아야한다. 이를 Stack register에 저장하고 함수가 종료되면 그곳으로 돌아간다.
하지만 Recursive한 함수라면!? 함수가 또 다른 함수를 호출한다면?
Stack register 하나로는 감당할 수 없다. 그래서 우리는 memory에 Stack 영역을 할당해서 사용한다. 재귀의 예시를 생각해보았을 때 알 수 있듯이 LIFO(Last In, First Out) 구조이다.
Stack에 데이터를 넣으려는데 가득 차 있으면 Stack overflow, 빼려는데 비어있으면 Stack underflow
참고로 Stack 영역은 함수 호출에만 쓰이는 것은 아니고 local variable 등도 이곳에서 관리된다.
컴퓨터는 multiprocess, I/O가 끝났을 때, 마우스로 프로그램을 껐을 때 등등의 상황을 위해 interrupt라는 것이 필요하다. interrupt란 cpu가 처리하던 process를 멈추고 다른 process를 처리하도록 하는 일이다.
Process의 state를 저장하고 switching하는 Context switching이라는 것이 필요하다. 또한 어떤 process를 먼저 처리할지에 대한 scheduling과 timer도 필요하다. 이것들이 모두 OS가 하는 일이다.
메모리의 주소를 어떻게 저장하는지 알아보자. Absolute addressing(절대 주소 지정)은 명령어 주소가 특정 메모리 주소를 가리킨다는 뜻이고 만약 이를 사용할 시에 1000번지에서 실행되도록 만들어진 프로그램을 2000번지에서 읽어들이면 제대로 실행되지 않음을 뜻한다. 이는 매우 비효율적이다.
인덱스 레지스터를 추가해 해결할 수 있다. 인덱스 레지스터는 다음과 같이 사용된다.
유효 주소 = 인덱스 레지스터 값 + 명령어에 있는 주소
또 다른 방법은 Relative addressing을 사용하는 것이다. relative addressing은 명령어의 주소를 기준으로 하는 상대적인 주소로 해석한다. 이를 통해 프로그램을 메모리의 원하는 위치로 자유롭게 relocate할 수 있게 된다.
메모리에는 여러 프로그램의 메모리가 뒤썩여 있다. 서로의 메모리를 침범하거나 심지어 OS의 메모리를 건든다면 참사가 따로 없다. 이를 관리하기 위해 메모리 관리 장치가 있다. cpu는 가상 메모리를 기준으로 mmu에 요청하면 mmu가 이를 실제 메모리 주소로 변환한다. 권한이 없는 메모리에 접근하면 Page fault가 난다.
MMU 덕분에 폰 노이만 구조의 시스템도 명령어 메모리와 데이터 메모리를 분리해 제공할 수 있게 됐다.
가상 메모리는 메모리 관리 기법이다. 실제로 이용 가능한 메모리를 추상화하여 사용자들에게 실제보다 훨씬 큰 메모리로 보이게 만드는 것을 말한다.
위에서 말했듯이 mmu는 cpu가 요청한 "virtual address"를 physical address로 변환해서 반환해주어야 한다.
가상 메모리로 인해 얻을 수 있는 이점
사실 이렇게 모든 Page 정보를 page table에 저장하면 낭비이기 때문에 Hierarchy page table을 사용한다. 사용중인 페이지만 페이지 테이블에 할당한다.