본문 바로가기

Study/Today I Learn

[TIL] 2019.04.11 - Computer Science

폰 노이만 구조 (Von Neumann Architecture)

CPU 와 한개의 메모리를 사용하여 처리하는 현대의 범용 컴퓨터 구조 모델
CPU 와 메모리를 이어주는 통로를 BUS 라고 한다.
수행할 프로그램을 기억장치에 저장시켜두고, 명령어들을 순서대로 가져와서 CPU 에서 이를 실행한다.

cpu와 연결된 메모리에는 명령용 메모리데이터용 버스 가 있고 BUS 라는 데이터 통로로 CPU 와 통신한다.
CPU는 산술 논리 장치 (ALU)제어 장치(CU) 가 있고 산술 논리 장치는 사칙 연산논리 연산을 하고, 제어 장치는 명령어를 해독하고 실행하는 역할을 한다.

하버드 구조

하버드 구조는 명령용 버스와 데이터용 버스가 분환되어 있는 구조이다.

폰노이만과 달리 제어장치가 memory와 통신할수 있는 버스가 두개 있다. 그래서 컴퓨터가 명령을 메모리에서 읽는 동시에 데이터를 메모리로 부터 읽는 것이 가능해 졌다.

프로세스 메모리 구조

Code 영역

프로그램이 기계어로 저장되는 영역, TEXT 영역이라고도 부른다.

Data 영역

DATA + BSS 영역을 합쳐서 Data 영역이라고 한다. DATA 는 초기화된 변수, BSS는 초기화 되지 않은 변수가 들어간다.
전역 변수나 Static 변수가 담긴다.

Heap 영역

동적할당 하는 공간으로 참조타입이 저장되는 공간, 낮은 주소에서 높은 주소로 쌓임

Stack 영역

지역변수, 매개변수, 리턴값 등의 데이터를 저장. 함수의 시작과 동시에 생성이 되었다가 함수가 종료시 반환한다. 높은 주소에서 낮은 주소로 쌓임

Code, Data 영역은 컴파일시 크기가 결정되고, Heap, Stack 영역은 Run time(실행) 크기가 결정된다. 그리고 Heap 과 Stack 은 둘 사이의 공간을 서로 공존하면서 사용한다.

memory.js

const underAddress = (address, l) => (address < l) ? true : false

class Memory {
    constructor() {
        this.memory =  new Uint16Array(131072)
        this.programCounter = 0
    }

    peek(address) {
        if(!underAddress(address, 131072)) throw Error("Out of range exception")
        return this.memory[address]
    }

    locate(program) {
        let programLength = program.length
        if(this.programCounter + programLength > 65535) throw Error("Exceeded memory!")
        for(let i = 0; i < programLength; i++) {
            this.memory[this.programCounter] = program[i]
            this.programCounter++
        }
    }

    fetch(pc) {
        if(pc > 65536) throw Error("Out of range exception")
        return this.memory[pc]
    }

    load(address) {
        if(!underAddress(address, 65536)) throw Error("Out of range exception")
        return this.memory[address + 65536]
    }

    store(address, data) {
        if(!underAddress(address, 65536)) throw Error("Out of range exception")        
        this.memory[address + 65536] = data
    }
}

module.exports = {
    memory: Memory
}

출처

https://codingisgame.tistory.com/7
http://www.ktword.co.kr/abbr_view.php?m_temp1=3609
http://blog.naver.com/PostView.nhn?blogId=itperson&logNo=220821884483&categoryNo=50&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=postView