-
CPU (Central Processing Unit): 프로그램을 실행하는 것이 목표
-
기계어(Machine Language)라고 불리는 매우 간단한 유형의 언어로 작성된 명령을 수행
-
프로그램을 실행할 때 해당 프로그램은 컴퓨터의 main memory에 저장된다.
-
이러한 memory에는 프로그램에서 사용하거나 처리하는 데이터를 저장할 수 있다.
-
Fetch and Execute Cycle
-
CPU가 메인 메모리에 일련의 기계어 명령어로 저장된 프로그램을 실행
-
메모리에서 명령어를 반복적으로 읽거나 가져온(fetching) 다음 해당 명령어를 실행함으로써 수행된다.
-
위의 과정을 반복하는 것을 Fetch and Execute Cycle이라고 한다.
-
-
ALU (Arithmetic Logic Unit)
-
덧셈과 뺄셈과 같은 연산을 수행하는 프로세서의 일부
-
-
Legister
-
단일 숫자를 저장할 수 있는 작은 메모리 장치
-
-
PC(Program Counter)
-
CPU가 실행해야 하는 다음 명령어의 메모리 주소를 저장
-
-
A hard disk or solid state drive
-
A keyboard and mouse
-
A monitor and printer
-
An audio output device
-
A network interface
-
A scanner
-
CPU는 위의 모든 장치들과 통신하고 제어해야한다.
-
아래의 사진과 같이 장치를 버스에 연결하여 구성한다.
-
위의 방식에서 CPU가 데이터가 들어온 것을 확인하는 방법은 무엇일까?
-
Polling 기법의 단점을 보완하기 위해 나온 기법
-
비효율성을 피하기 위해 주로 사용된다.
-
다른 장치가 CPU에게 보내는 신호
-
다음과 같은 과정으로 CPU는 Interrupt를 처리한다.
-
컴퓨터 키보드를 누르면 키보드 인터럽트가 CPU로 전송
-
CPU는 수행 중인 작업을 중단
-
사용자가 누른 키를 읽고 처리한 다음 원래 수행 중이던 작업으로 돌아감
-
-
이를 통해 CPU가 `asynchronous events(비동기 이벤트)`를 처리할 수 있음
-
고급 언어 프로그램을 실행 가능한 기계 언어 프로그램으로 변환
-
다른 유형의 컴퓨터에서 실행하려면 다른 컴파일러를 사용하여 적절한 기계어로 변환해야함.
-
이러한 불편한 과정을 해결하기 위해 자바에서는 JVM을 사용함
-
자바 소스 코드를 작성한다.
-
자바 소스 파일을 컴파일한다 (javac Main.java)
-
자바 컴파일러는 컴파일이 완성되면 클래스 파일 (Byte Code)를 생성한다.
-
컴파일된 Byte Code를 JVM의 Class Loader에게 전달
-
클래스 로더는 동적로딩을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역, 즉 JVM의 메모리에 올린다.
-
실행 엔진은 JVM의 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행, 이 때 실행 엔진은 두 가지 방식으로 변경
-
컴파일러: 바이트 코드 전체가 컴파일된 바이너리 코드를 실행
-
인터프리터: 바이트 코드 명령어를 하나씩 읽고 해석하고 실행
-
JIT Compiler : 특정 부분이 여러번 실행이 되는 프로그램의 특성을 이용한 컴파일러