개발자는 기록이 답이다

패스트캠퍼스 환급챌린지 2일차 미션 (2월 2일) : Spring Webflux 완전 정복 : 코루틴부터 리액티브 MSA 프로젝트까지 강의 후기 본문

패스트캠퍼스

패스트캠퍼스 환급챌린지 2일차 미션 (2월 2일) : Spring Webflux 완전 정복 : 코루틴부터 리액티브 MSA 프로젝트까지 강의 후기

slow-walker 2024. 2. 2. 23:37

 

 

 

1. 함수 호출 모델(함수를 호출하는 관점)

  동기 비동기
Blocking Java IO x
Non-Blocking Java NIO
(File IO는 non-blocking 불가능)
Java AIO(Java NIO2)

 

  • Java IO는 동기 블로킹만 지원한다.
    • caller가 IO요청을 하는 동안 아무것도 하지못하고, 응답이 돌아왔을때 caller가 직접 처리하는 구조
  • Java NIO는 동기 논블로킹에 해당한다.
    • 대신 File IO는 non-blocking이 불가능하고 동기블로킹으로 동작한다

 

2. I/O모델(내부적으로 어플리케이션이 커널을 호출하는 IO관점)

  동기 비동기
Blocking Java IO x
Non-Blocking Java NIO, Java AIO x

 

 

3. Java IO

  • Java 1.0에서 처음 도입
  • 파일과 네트워크에 데이터를 읽고 쓸 수 있는 API 제공
  • byte단위로 읽고 쓸 수 있는 stream(InputStream과 OutputStream)
  • 자바 API의 모든 동작들은 blocking으로 동작

 

4. InputStream

public abstract class InputStream implements Closeable {
	 public abstract int read() throws IOException;
	 public void close() throws IOException {}
 	...
 }

 

  • Closable 구현. 명시적으로 close하거나 try-with-resources 사용 가능
  • read : stream으로 데이터를 읽고, 읽은 값을 하나씩 반환. -1이라면 끝에 도달했다는 것을 의미
  • close : stream을 닫고 더 이상 데이터를 읽지 않는다.
  • 어떤 source로 부터 데이터를 읽을지에 따라 다양한 구현체 존재
    • FileInputStream :  파일로 부터 데이터를 읽어들임
    • ByteArrayInputStream : 바이트 배열로 구성된 데이터를 읽어들임
    • BufferedInputStream : 버퍼로 부터 ㄷ[이터를 읽어들임

https://www.cis.upenn.edu/~bcpierce/courses/629/papers/Java-tutorial/java/io/overview.html

 

 

5. ByteArrayInputStream

Java Tutorial : Java IO (ByteArrayInputStream)

 

  • byte array로 부터 값을 읽을 수 있다
  • byte array는 JVM 메모리 안에 있는 값이라 메모리가 source가 된다

 

6. FileInputStream

  • file로부터 byte단위로 값을 읽을 수 있다
  • File 객체나 path를 통해서 FileInputStream을 열 수 있다
  • application에서 Blocking이 일어난다.
    • 파일로부터 데이터를 읽어들이는 동안 아무것도 하지 못한다.

 

7. BufferedInutStream

  • 다른 inputStream과 조합해서 사용
  • 임시 저장공강인 buffer를 사용
  • 한번 read를 호출할때 buffer 사이즈만큼 미리 조회
  • 그 이후 read를 호출할때 미리 저장한 buffer데이터 반환
    • 버퍼는 한번에 데이터를 가져오는 역할을 하는데, read메소드 하나만 호출하더라도 버퍼에서는 미리 버퍼 사이즈만큼 file에 요청해서 read를 해온 후에 저장을 해두고, 다음에 read메소드가 호출되면 file까지 가지 않고 버퍼로부터 값을 반환한다.

8. serverSocket accept

  • serverSocket을 open하여 외부 요청을 수신
  • bind, accept를 통해서 serverSocket open을 준비

9. SocketInputStream

 

SocketInputStream은 public이 아니기 때문에 직접 접근이 불가능

socket.getInputStream으로만 접근 가능

blocking이 발생한다

 

 

10. Java IO의 한계

  • 동기 blocking으로 동작
    • caller 즉, 어플리케이션이 IO관련 작업을 하는동안 본인의 일을 할 수없고, 결과가 돌아올때까지 listen하고 직접 처리함
  • 커널 버퍼에 직접 접근 불가
    • 메모리가 JVM상에서도 존재하지만 커널상에서도 존재한다
  • 따라서 메모리 copy가 발생

 

1) 커널 버퍼에 직접 접근 불가

  • hardward에서 값을 읽어오면, disk controller가 DMA를 통해서 커널 버퍼에 해당 값을 복사
    • 커널 버퍼로 저장하는 과정에는 별도의 CPU가 필요없이 disk controller 자체만으로 처리할 수 있어서 성능상 이점이 있음
  • 커널 버퍼에서 jvm버퍼로 복사
    • Java IO에서는 위에서 읽어온 버퍼를 직접 접근할수 없음
    • 그래서 커널 버퍼를 한번 더 jvm 메모리로 옮겨야 한다
    • 이 과정에서 cpu자원 소모
  • jvm버퍼, jvm메모리에 있기 때문에 gc대상이 되고 이는 또한 gc를 하면서 cpu자원을 소모

2) 동기 blocking으로 동작

 

  • application이 read를 호출하면, kernel이 응답을 돌려줄때 까지, 아무것도 할 수 없다
  • I/O요청이 발생할때마다 스레드를 새로 할당하면, 쓰레드를 생성 및 관리하는 비용과 컨텍스트 스위칭으로 인한 cpu자원 소모

 

 

참고링크 : https://ramj2ee.blogspot.com/2016/08/java-tutorial-java-io_26.html

 

Java Tutorial : Java IO (ByteArrayInputStream)

ramram43210,J2EE,Java,java tutorial,java tutorial for beginners,java tutorial for beginners with examples,java programming,java programming tutorial,java video tutorials,java basics,java basic tutorial,java basics for beginners,java basic concepts,java bas

ramj2ee.blogspot.com

 

 

 

 


 

※ 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다. https://bit.ly/48sS29N