본문 바로가기

분류 전체보기75

[CS] CPU의 구조와 기능(2) CPU의 구조와 기능 명령어 파이프라이닝 CPU 성능은 컴퓨터 시스템의 프로그램 처리 시간에 직접 영향을 주기 때문에, 그 속도를 향상시키기 위하여 여러 가지 방벙들이 사용되고 있습니다. 그 중에서 가장 간단하면서도 분명한 효과를 얻을 수 있는 방법이 명령어 파이프라이닝(instruction pipelining) 입니다. 이것은 명령어를 실행하는데 사용되는 하드웨어를 여러 개의 독립적인 단계(stage)들로 분할하고, 그들로 하여금 동시에 서로 다른 명령어들을 처리하도록 함으로써 CPU의 성능을 높여주는 기술을 말합니다. 명령어 파이프라인은 분할되는 단계의 수가 많아질수록 처리 속도가 높아지는데, 최근에는 CPU의 속도를 더욱 높이기 위하여 여러 개의 명령어 파이프라인들을 설치하기도합니다. 2-단계 명령.. 2023. 8. 8.
[Java] JVM(Java Virtual Machine) JVM 자바(Java) 언어의 실행 환경인 JVM(Java Virtual Machine)은 자바 바이트코드를 실행하는 가상 컴퓨터입니다. JVM은 말 그대로 가상 기계, 즉 가상의 컴퓨터를 물리적 컴퓨터의 메모리 안에 하나 더 구축합니다. 가상이긴 하지만 새로운 가상 컴퓨터를 구축하다보니 더 많은 물리적 CPU 자원과 메모리를 소비하기 때문에 당시 프로그래밍 언어들과 속도를 비교했을 때는 많이 느렸습니다. 하지만 하드웨어의 발전, 하드웨어 구성 요소의 가격 하락, 최적화된 알고리즘으로 개발된 API와 JVM으로 인해 현재는 자바의 성능이 느린 것을 체감하기는 힘듭니다. 자바의 가상 세계는 현실 세계에서 컴퓨터의 물리적인 하드웨어와 운영체제 그리고 그 위에서 구동될 소프트웨어를 가지는 구조를 모방하여 구성.. 2023. 8. 7.
[Java] 런타임 데이터 영역(Runtime Data Area) Runtime Data Area Runtime Data Area는 OS로 부터 할당받은 JVM의 메모리 영역으로 자바 애플리케이션이 실행하는 동안 데이터를 저장하고 관리하는 영역입니다. Runtime Data Area는 총 5가지 영역으로 나뉘어져있으며 스레드 공유 여부에 따라 각 영역의 성격이 다릅니다. Method Area, Heap Area는 모든 스레드가 공유하는 영역이고, 나머지 Stack Area, PC Register, Native Method Stack은 각 스레드에 따라 생성되는 개별 영역입니다. 출처 Method Area ★ 확인 필요 ★ Method Area는 Class Area 또는 Static Area로도 불리며 모든 스레드가 공유하는 영역 중 하나로 클래스 로더에 의해 로드된 클.. 2023. 8. 6.
[Java] 실행 엔진(Execution Engine) Execution Engine Execution Engine은 바이트 코드를 읽고 실제로 실행하는 역활을 담당합니다. Runtime Data Areas에 있는 자바 바이트 코드를 읽고 운영체제에 맞게 기계어로 번경하여 해당하는 명령어(instruction) 단위로 실행합니다. Execution Engine은 위의 수행 과정에서 인터프리터와 JIT 컴파일러 두 가지 방식을 혼합하여 바이트 코드를 실행합니다. Interpreter 자바는 인터프리트, 컴파일 두 방식을 혼합하여 사용하는 하이브리드 모델입니다. 컴파일을 통해서 자바 바이트 코드를 생성하고 코드의 명령어를 인터프리터를 사용해 하나씩 읽어서 해석하고 바로 실행합니다. 이는 빠른 시작 속도와 동적인 실행 환경을 제공하지만 반복적으로 실행되는 코드의 .. 2023. 8. 5.
[Java] 클래스 로더 서브시스템(Class Loader SubSystem) Class Loader SubSystem 출처 클래스 로더(Class Loader SubSystem)는 자바 바이트 코드(.class)를 로드하고 JVM의 메모리 영역인 Runtime Data Areas로 동적 로딩하는 역활을 수행합니다. 클래스 로더는 필요에 따라 클래스 파일을 검색하고 로드하며, 로드된 클래스는 메모리 영역에 할당됩니다. 클래스를 로딩하는 과정은 3단계로 이루어집니다. 로드(Loading): 클래스 로딩은 먼저 해당 클래스 파일을 찾아서 메모리에 로드하는 과정입니다. 클래스 로더는 클래스 파일을 파일 시스템, JAR 파일, 네트워크 등에서 찾아옵니다. 링크(Linking): 로드된 클래스 파일의 바이트 코드는 아래 3단계의 링크 과정을 거쳐서 최종적으로 실행 가능한 형태로 변환됩니다... 2023. 8. 3.
[GoF] 템플릿 메소드 패턴(Template Method Pattern) Template Method Pattern 템플릿 메소드 패턴(Template Method Pattern)은 Gang of Four(GoF) 디자인 패턴 중 하나로 Design Patterns: Elements of Reusable Object-Oriented Software 책에서 소개 된 23가지 디자인 패턴 중 하나입니다. 템플릿 메소드 패턴은 행동 패턴으로써 특정 알고리즘을 사용하는 유사한 클래스들의 알고리즘의 구조를 정의하고, 하위 클래스에서는 구조를 변경하지 않고 특정 단계 메소드들을 구체화하여 해당 구조를 표현하기 위해서 사용됩니다. 이를 통해 클라이언트는 특정 알고리즘 구조(템플릿)를 변경하지 않고 구체 메소드를 확장하거나 재정의할 수 있는 유연성을 제공합니다. 또한 정의된 구조를 제외하고.. 2023. 8. 2.
[Java] String & StringBuilder & StringBuffer String String은 각각의 문자를 나열한 배열을 나타내는 객체입니다. Java에서 제공하는 Primitive Type(원시 타입)을 제외한 모든 나머지들은 객체로 구성되어 있으며 객체 생성은 생성자(construct)를 통해 이루어집니다. 하지만 String은 객체를 생성할 때 생성자를 사용하는 방법 외에도 바로 값을 할당하여 생성할 수 있는데 이를 문자열 리터럴(String Literal)이라 부릅니다. public static void main(String[] args) { String str1 = new String("a"); // 생성자 String str2 = "a"; // 문자열 리터럴 } String은 위와 같이 두가지 방법으로 객체를 생성할 수 있습니다. 첫번째 방법은 일반적으로 객.. 2023. 8. 1.
[GoF] 컴포지트 패턴(Composite Pattern) Composite Pattern 컴포지트 패턴(Composite Pattern)은 Gang of Four(GoF) 디자인 패턴 중 하나로 Design Patterns: Elements of Reusable Object-Oriented Software 책에서 소개 된 23가지 디자인 패턴 중 하나입니다. 컴포지트 패턴은 구조 패턴으로써 객체들을 트리 구조로 구성하는 방법을 제공하며 개별 객체와 복합 객체를 일관된 방식으로 다룰 수 있게 해주고, 객체 간의 전체-부분 계층을 표현할 수 있도록 합니다. 컴포지트 패턴의 주요 아이디어는 단일 객체와 복합 객체를 동일한 인터페이스로 다루기입니다. 이를 통해 클라이언트는 개별 객체와 복합 객체를 구별하지 않고 일관된 방식으로 즉, 클라이언트는 개별 객체든 복합 객체.. 2023. 7. 31.
[Spring] DL(Dependency Lookup) 의존성 조회(Dependency Lookup: DL)이란? 의존성 조회(Dependency Lookup: DL)은 제어의 역전(Inversion of Control: IoC) 원칙을 구현한 디자인 패턴 중 하나입니다. IoC 컨테이너가 객체 생성과 의존성 주입을 담당하는 의존성 주입(Dependency Injection: DI)과는 다르게 DL은 개발자가 필요한 시점에 의존성을 요청하여 컨테이너로부터 해당 의존성을 가져옵니다. DL은 컨택스트별 의존성 조회(Contextualized Dependency Lookup: CDL)를 사용하여 의존성을 조회하는데, 이는 결국 스프링에서 관리하는 컨택스트인 ApplicationContext를 기반으로 빈과 빈들의 의존성을 조회한다는 뜻입니다. 즉, 특정 설정 파일.. 2023. 7. 31.