Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2 - 포케 #10

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
.obsidian/
.DS_Store
50 changes: 48 additions & 2 deletions JAVA/fromitive.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
**Java 코드는 어떤 과정으로 실행되는가?**
* `.java` 파일을 `javac` 명령어로 컴파일 하여 `.class`파일로 만든다.
* `.java` 파일을 `javac` 명령어로 컴파일 하여 `.class`파일로 만든다.
* `.class`파일을 `java` 명령어로 실행한다. 내부엔 `.class` 안의 바이트 코드는 JVM 실행 엔진이 해석하여 코드를 실행한다.
* 자주 실행하는 명령어는 실행엔진 안의 JIT가 코드를 실행하고, 나머지는 인터프리터가 해석한 후 실행한다.

Expand Down Expand Up @@ -44,6 +44,9 @@ Shenandoah(셰넌도어) GC: 모던 GC.. 초저지연을 목표로 둠 G1과 유
* 구현체가 존재하지 않기 때문?
* 추상 클래스는 일부분이 구현되어 있고 나머지는 상속 받아 구현해야 함

* 추상 클래스: 타입 추상화 (사람, 동물)
* 인터페이스: 행위 추상화 (동물 밥을먹는다)

**SOLID**
* 단일 책임 원칙
* 개방 폐쇄의 원칙: 구조는 닫혀있고 확장에는 열려있어야 한다.
Expand All @@ -64,4 +67,47 @@ Shenandoah(셰넌도어) GC: 모던 GC.. 초저지연을 목표로 둠 G1과 유

### References

https://medium.com/nerd-for-tech/java-virtual-machine-jvm-architecture-87b5bdd47403
https://medium.com/nerd-for-tech/java-virtual-machine-jvm-architecture-87b5bdd47403



[운영체제]




[Spring]

Spring vs Springboot

Spring에서의 IOC

DI

Bean이 뭐냐

스프링 Bean의 생명 주기

스프링 Bean Scope

@Component vs @Bean

그럼 @Bean은 항상 @Component 가 붙은 클래스 내에서만 사용해야 하는가?

Spring Web MVC 구조

Servlet

Servlet Container

Spring Web MVC의 Servlet 활용

프론트 컨트롤러 패턴?

Servlet Filter vs Spring Interceptor

Filter는 어떻게 Bean으로 등록되나?

AOP와 프록시

Tomcat의 구성요소
78 changes: 77 additions & 1 deletion OS/fromitive.md
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@
* 우선순위가 높을 수록 빨리 실행됨

* short-term : CPU가 다음 실행할 프로세스를 선정하는 것 , 스케쥴링이 자주 일어남
* mid-term: swap메모리에 있는 중단된 프로세스가 메인 메모리로 불러올 때 사용하는 스케쥴링.
* mid-term: swap메모리에 있는 중단된 프로세스가 메인 메모리로 불러올 때 사용하는 스케쥴링. 그 반대인가?
* long-term: job-pool에 프로세스를 실행하는 상태로 변환하기 위해 사용하는 스케쥴링
* https://blogs.oracle.com/linux/post/task-priority

Expand Down Expand Up @@ -142,4 +142,80 @@
* 점유 대기
* 비선점
* 순환대기
* 자원 할당 자체를 피하는 방법 : 뱅커스알고리즘 ㄱㄱ


---
## 2주차
#### 메모리 주소 바인딩
논리적 주소를 물리적 주소로 변환해주는 걸 말함

#### Swapping

주기억장치의 용량이 가득찰 경우 보조기억장치 공간을 이용하여 실행중인 프로세스를 관리하는 방법이다. 두가지로 구분된다.
* swap-in : 주기억장치에서 보조기억장치로 프로세스 정보가 이동하는 것
* swap-out : 보조기억장치에서 주기억장치로 프로세스 정보가 이동하는 것

##### 스와핑 과정
주기억장치에는 있지만 현재 실행하고 있지 않은 프로세스를 선택한 뒤 보조기억장치로 이동시키고, 보조기억장치에선 실행될 프로세스를 로드하여 실행하는 것을 반복한다.

#### 메모리 단편화

주기억장치의 메모리 공간이 할당 되거나 해제 되면서 사용 가능한 공간들이 쪼개지는 현상. 이 현상으로 인해 총 사용가능한 메모리 용량이 충분해도 프로그램을 실행할 수 없는 현상이 발생함

단편화에는 2가지 종류가 있음
* 내부 단편화: 메모리 할당 단위가 실행에 필요한 프로세스 메모리보다 클 때 발생하는 빈공간
* 외부 단편화: 자주 일어나는 스와핑으로 인해 불 연속적인 빈공간이 발생하여 프로세스를 올리지 못하는 현상

#### 페이징

메모리 단편화를 해결하기 위한 방법 중 하나. 메모리를 일정 단위(페이지)로 나눈 후 페이징 테이블에 프로세스 논리 주소와 물리 주소를 매핑하여 외부 단편화를 해결한다. 그러나 페이지 단위보다 작은 프로세스가 실행될 경우 여전히 내부 단편화는 발생할 수 있다.

#### 세그멘테이션

세그맨테이션은 메모리를 일정 단위로 나누는 것이 아닌 base와 limit정보를 바탕으로 메모리 공간을 할당하는 방식을 의미함 base와 limit정보는 세그멘테이션 테이블에서 관리하고 각 프로세스는 고정된 페이지 와 달리 크기가 서로 다른 메모리 공간을 여러 공간에 흩어져 저장하게 됨. 내부 단편화 문제는 해결할 수 있지만 외부 단편화 문제가 남아있음

#### 세그멘테이션-페이징 혼합

세그맨테이션의 외부 단편화 문제와 페이징의 내부 단편화 문제를 해결하기위해 세그맨테이션 내부에서 일정한 크기의 테이블을 나뉘어 관리하기도 함. 이 경우에는 메모리 바인딩 과정에서 세그맨테이션의 base 주소를 얻은 후 몇 번째 페이지에 있는지까지 계산하는 방식으로 메모리에 있는 데이터를 접근한다고 한다.

#### 가상 메모리

주기억장치의공간보다 더 큰 크기의 데이터를 불러오기 위해 가상 메모리 기법을 사용함.
각 프로세스는 실제 물리주소에 접근하지 않고 가상 메모리 주소에 접근함.
가상 메모리 공간에 접근하기 때문에 프로세스끼리 메모리 주소가 충돌 날 걱정은 없음.
가상 메모리는 일정한 단위 크기의 페이지(page)로 나뉘어저 있다고 함.
운영체제는 MMU이 관리하고 있는 페이지 테이블을 이용하여 각 페이지가 어느 프레임(물리 주소의 단위)에 위치되어있는지 확인할 수 있음

#### Page Fault(페이지 부재)

가상메모리를 이용해 운영하는 프로세스가 필요한 페이지를 불러올 때 해당 페이지가 존재하지 않아 발생할 수 있는 문제. 페이지 부재가 발생 시 페이지 교체 알고리즘에 따라 필요한 페이지를 불러오고 해당 데이터를 읽음. 당연히 필요한 페이지가 존재하지 않으니 교체할때까지 실행중인 프로세스는 멈춰있음.

#### 페이지 교체

페이지를 교체할 때 사용하는 방식임
FIFO : 가장 먼저 들어온 페이지 교체 - 페이지가 오래되었다는 이유만으로 교체될 수 있음
LRU : 가장 오랫동안 사용되지 않은 페이지 교체 - 사용되지 않은 시간을 재야하는 단점 존재
LFU : 가장 적게 사용된 페이지 교체 - 빈도수가 불규칙적인 페이지가 비효율적으로 남을 수 있음
Second Chance : FIFO에 참조 비트를 추가하여 참조되지 않은 페이지만 교체하는 알고리즘 : 참조비트로 인해 오버헤드가 발생할 수 있음
NRU, MFU

#### Thrashing

CPU가 프로세스 실행 보다 페이지 부제를 처리하는 데 시간을 많이 쏟는 걸 의미함

#### 파일 시스템

데이터를 저장하고 관리하는 방식을 의미함 FAT, NTFS, ext3, ext4

#### 디스크 블록 할당 방법
* 연속 할당 : 디스크를 쓰는 순서대로 할당하는 방법
* 연결 할당 : 연속 할당의 문제점인 단편화 문제를 해결하기 위해 다음 읽어야 할 디스크 주소를 기록함
* 인덱스 할당 : 디스크 앞에 색인 정보(index)를 저장하여 빠르게 접근하는 방식

#### 캐시의 지역성
* 시간 지역성 : 자주 사용하는 캐시 데이터는 자주 사용됨
* 공간 지역성 : 배열과 같은 연속된 데이터 중 한 곳을 참조할 경우 주변의 다른 데이터들도 자주 참조될 확률이 높아지는 것을 의미 / 특정 데이터를 포함하는 묶음 데이터를 추가로 로드하여 성능을 최적화 할 수 있음
* 순차적 지역성 : 순차적으로 탐색할 확률이 높은 데이터를 한 번에 올려서 캐싱할 수 있음
#### 캐싱 라인
캐싱의 효율을 높이기 위해 캐시 메모리에 한 번에 불러올 데이터의 최소 단위 : 32 bit에서 128bit라고 한다.
103 changes: 103 additions & 0 deletions Spring/fromitive.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
### Spring vs Springboot

공통점 둘 다 프레임워크라서 개발 규격이 정해져 있음
스프링 : 비즈니스 로직을 처리하는 것을 집중하는 데 도와주는 프레임워크
스프링부트 : 톰켓과 같은 WAS가 내장되어 있어 빠르게 웹 어플리케이션을 만들어줄 수 있도록 도와주는 프레임워크

### Spring에서의 IOC

스프링 컨테이너가 Inversion of Control로서 객체의 생명주기를 스프링이 관리하는 것을 이야기 함. IoC가 있기에 개발자는 환경에 구애받지 않고 비즈니스로직에 집중할 수 있게 됨

> [INFO]
> 스프링 컨테이너란, 스프링 어플리케이션 실행에 필요한 설정과 객체들을 탐색한 후 관리해주는 주체라고 생각하면됨

#### DI

스프링 컨테이너가 객체가 필요한 의존성을 자동으로 주입하여 추상화에 의존하는 코드를 생성할 수 있게 도와줌

#### Bean이 뭐냐

스프링이 관리하는 객체를 Bean이라고 함

#### 스프링 Bean의 생명 주기

1. 객체 생성
2. 의존성 주입
3. 빈 사용
4. 빈 소멸

#### 스프링 Bean Scope

- **singleton**: 한 번만 생성되어 애플리케이션 전체에서 공유됨.
- **prototype**: 요청마다 새로운 인스턴스를 생성함.
- **request**: HTTP 요청마다 새로운 인스턴스를 생성함 (웹 전용).
- **session**: HTTP 세션마다 새로운 인스턴스를 생성함 (웹 전용).
- **application**: 애플리케이션 전반에 걸쳐 공유됨.
- **websocket**: 웹소켓 연결마다 새로운 인스턴스를 생성함.


#### @Component vs @Bean

class에 붙일 수 있는게 Component, method에 붙일 수 있는게 Bean이며

스프링 컨테이너가 ComponentScan 할때 먼저 스캔되어지는게 Component임
Bean은 주로 Configuration어노테이션이 붙여진 클래스 안에 있는 메서드에 붙임으로써 어플리케이션 환경을 설정할때 사용

#### 그럼 @Bean은 항상 @Component 가 붙은 클래스 내에서만 사용해야 하는가?

Component가 붙은 하위 클래스인 @Controller, @Service, @Configuration에서도 사용 가능

#### Spring Web MVC 구조

Model : 비즈니스 로직을 처리하는핵심 데이터
View: 사용자에게 보여지는 화면 랜더링
Controller: 사용자가 보낸 요청 처리 모델 업데이트 View 호출

각 역할들이 나뉘어져 있어서 유지보수가 용이하다.



### Servlet

Java에서 Http Request를 처리하고 Http Response를 생성해주는 표준 기술
### Servlet Container

웹 Servlet을 생성 실행해주는 주체. 이 주체엔 WAS 혹은 Web서버 그 자체가 될 수 있음

### 프론트 컨트롤러 패턴?

모든 Http요청을 한 곳(스프링이면 DispatcherServlet)에서 처리하고 응답하는 것을 이야기함.

FrontController -> *Controllers

- 클라이언트가 `/example/hello`로 요청을 보냅니다.
- `DispatcherServlet`이 이 요청을 수신합니다.
- `DispatcherServlet`은 `HandlerMapping`을 통해 요청을 처리할 컨트롤러 메서드를 찾습니다.
- `HandlerAdapter`가 해당 컨트롤러 메서드를 호출하여 요청을 처리하고 `ModelAndView`를 반환합니다.
- `DispatcherServlet`은 `ViewResolver`를 사용해 뷰 이름에 맞는 뷰 파일을 찾습니다.
- 최종 뷰를 렌더링하여 클라이언트에게 응답을 반환합니다.

#### Servlet Filter vs Spring Interceptor

Filter : DispatcherServlet에 도달하기 전, 후에 처리됨. 예외 발생 시 ControllerAdvice를 사용할 수 없음
Interceptor: DispatcherServlet에 도달한 후 Controller 처리 전, 후 View랜더링 전에 특정 작업을 수행할 수 있음

#### Filter는 어떻게 Bean으로 등록되나?

1. `@Component` 어노테이션을 붙이고, Filter를 구현하면 됨
2. @Bean으로 FilterRegistrationBean를 이용해서 등록해도 됨 이 경우에는, 필터의 순서 url 지정이 가능해짐


#### AOP와 프록시

비즈니스 로직과 전, 후 처리 로직을 분리하는 기법. 스프링에선 3가지 구성요소로 이루어짐

Aspect : 공통적으로 처리할 수 있는 로직을 정의하는 어노테이션
Advice : Aspect가 처리할 시점을 정의합니다. 메서드 처리 전, 후 리턴하기 전, 예외 발생 후 등등을 정의할 수 있음
Pointcut : 적용할 비즈니스 로직을 선별하는 곳입니다.

AOP를 사용하기 위해 Proxy 패턴을 사용할 수 있음

Proxy는 실제 비즈니스 로직을 처리하기 전이나 후 처리할 수 있게하는 디자인 패턴임. 서비스 인터페이스를 비즈니스 객체, 프록시 객체로 분리하고 프록시 객체가 비즈니스 객체를 구성하도록 만들면 비즈니스 로직 처리 전, 후에 원하는 작업을 수행할 수 있음

### Tomcat의 구성요소