기본 콘텐츠로 건너뛰기

Blocking Method와 ThreadPool

Blocking Method

 블로킹 메서드는 다른 쓰레드로 제어권을 양도 하지 않고, 할당된 Task가 완료될 때까지 제어권을 넘겨주지 않으려 할 때 사용 하는 메서드 이다.

 Java에서 대표적인 블로킹 메소드는 InputStream 클래스의 read()와 ServerSocket 클래스의 accept()가 있다.

단점

  - 블로킹 메서드의 단점 중 하나는 무한 대기에 빠질 수 있다는 점이다. 이로 인해 대기중인 다른 쓰레드가 살행되지 않는 경우가 생길 수 있다.

Blocking I/O

  - java에서  블로킹 소켓은 ServerSocket, Socket 두 가지 클래스를 사용한다. 
  - 클라이언트 연결 요청시 서버는 accept하고 클라이언트와 연결된 소켓을 새로 생성하는데 이 때 해당 메서드가 완료되기 전까지 스레드에 블로킹이 된다. 
  - 클라이언트가 연결된 소켓으로 서버에 데이터 전송시 서버는 read를 호출하고 다 읽을 때 까지 스레드가 블로킹 된다. 
blocking io model에 대한 이미지 검색결과

병렬처리 문제

  - 데이터 입출력에서 스레드의 블로킹이 발생해 동시에 여러 클라이언트에 대한 처리가 불가하다.
  - 이를 해결위해 연결된 클라이언트 별로 각자 쓰레드를 할당하는 방법이 있다.
  - 클라이언트 접속요청 오면 서버는 새로운 스레드를 하나 생성하고 클라이언트에게 I/O 처리를 넘겨준다.
  - 동시 요청은 해결되었으나, 동시 접속으로 인한 스레드 생성, 할당, 제거하는 시간이 길어진다.
  - 또한 계속되는 스레드 생성은 힙 메모리의 부족을 야기할 수 있다.

스레드 풀(Thread Pool)

   - 스레드 증가로인한 메모리 부족을 피하기 위해 일정개수의 스레드를 풀에 미리 생성한다.
  - 클라이언트 요청이 들어오면 일단 작업 큐에 들어가게하고, 스레드 풀에서 스레드를 할당 받는다.
  - 스레드풀 사용시 스레드 생성, 제거에 대한 오버해드가 사라지고 동시접속을 처리할 수있다.
  - Java 에서는 java.util.concurrent.Executors에서 스레드 풀을 제공한다.
    1) newFixedThreadPool
      - parameter로 주어진 스레드 개수만큼 스레드를 생성하고, 애플리케이션 종료까지 유지한다.
    2) newChachedThreadPool
      - 처리할 작업이 많아지면 스레드를 증가하여 생성한다.
      - 놀고있는 스레드가 많다면 해당 스레드를 종료한다.
      - 스레드 개수를 유동적으로 조절. But 스레드가 많아지면 메모리 부족이 발생할 수도 있다.
    3) newSingleThreadExecutor
      - 스레드를 하나만 생성해 스레드가 비정상적으로 종료되면 하나의 스레드를 다시 생성한다.
    4) newSheduledThreadPool
      - 스레드와 관련된 작업을 특정 시간 이후에 실행되거나 주기적으로 작업을 실행할 수 있는 스레드 풀을 생성한다.

댓글

이 블로그의 인기 게시물

[스프링부트2.0 낚시게시판] 01. 프로젝트 생성 및 환경을 세팅해 보자

첫번째. 이클립스에서 프로젝트를 생성해 보자. 빠밤! 1. 이클립스 실행하고 프로젝트 생성하기  - 이클립스 실행 후 File -> New -> Spring Starter Project클릭 ( 부트는 Spring Starter Project로!! )        해당 프로젝트 설정을 본인의 입맛에 맞게? 해주자. 처음엔 저와 똑같이 하는게 삽질(?)의 노고를 덜 수 있으니 저 같은 초보 개발자 분들이나 이제 막 공부를 시작 하셧다면 위와 가이 설정 하는걸 추천.  - New Spring Starter Project Dependencies    - Spring Boot Version : 2.0.2    - Core : DevTools, Security, Lombok 클릭    - Web : web  클릭    - SQL : JPA, H2 클릭    - template Engines : Mstache   --> 타임리프(요즘 회사에서 많이 쓴다고해서)   - 그다음 다음 -> Finish 클릭하게 되면 Maven에 관한 프로젝트가 생성된다.   처음엔 메이븐 디펜던시부분을 받느라 시간이 걸릴수 있다. 프로젝트 구조는 스프링과 별반 차이가 없어 보인다 프로젝트 구조 관련해선 조만간 포스팅 해봐야 겠다. (요즘 책 읽을 시간도 없어서...😂) 두번째. 실행을 해보자.  스프링 부트2.0의 특징은 자체적으로 톰켓이 내장 되어 있어 따로 톰켓을 설정하는 부분이 없어서 아주 매우 편안하게 되었다.    - 실행은 src/main/java 밑에 com.fishing.board 패키지 밑에 FishBoardApplication.java 오른쪽 클릭 후...

[SpringBoot] Spring Data JPA를 알아보자 [2탄 엔티티를 다루기]

이번 시간에는 엔티티 클래스 설계서 부터 테스트까지 진행해 보도록 하겠다. 1. 엔티티 클래스 설계   - JPA는 자동으로 테이블을 생성하는 기능을 가질 수 있다. 다음 2가지 방법이 있다.     1) SQL을 이용해 테이블을 먼저 생성하고 엔티티 클래스를 만드는 방법     2) JPA를 이용해 클래스만 설계하고 자동으로 테이블을 생성하는 방법   - 이중에서 2)번 방법을 알아보자.   - JPA 엔티티 클래스를 생성하는 작업은 다음 과정을 거친다     1) 클래스 설계     2) 각종 애너테이션을 이용해 제약 조건 추가 설정     3) 엔티티 간 연관관계 설정 1.1 엔티티 클래스 설계    package com . example . sutdy . domain ; import lombok.Getter ; import lombok.Setter ; import lombok.ToString ; import java.sql.Timestamp ; @Getter @Setter @ToString public class Board { private Long bno; private String title; private String writer; private String content; private Timestamp regdate; private Timestamp updatedate; }   - 위와 같이 일반적인 방법으로 클래스를 만들어 봤다. 다음 JPA 어노테이션에 관해 알아보고 붙여보자 1.1.2 JPA 어노테이션   - @Id : 각 엔티티를 구별할수 있도록 식별 ID부과.(일종의 primary key로 보면된다). 모든 엔티티에 반드시 지정하자.   - @Column : 인스턴스 ...

[Java] JVM에 대해 알아보자

이번 시간엔는 JVM에 대해 전반적으로 알아보려 한다. 자바 코드를 작성하는 일에 JVM이 뭐 구지 중요한가 의심이 가지만, 성능 튜닝이나 더 아름다운 코드를 작성하기 위해 어느 정도 이해가 필요한것 같다. JVM을 알아보면서 추가적으로 필요한 개념을 더 설명하려한다. 자 그럼 시작 해보자. <JVM 그림> <Runtime Data Access> JVM - 자바의 특징 중 Write once, run everywhere가 있다. JVM이 OS와 프로그램의 매개체 역할을 하고, 애플리케이션은 JVM 위에서 동작하도록 설계 되었다. - 작성된 자바프로그램의 바이트 코드를 실행할 수 있는 주체이다. - 스택기반의 가상머신이다. - 가비지 컬렉션을 실행한다. (가비지컬렉터 이용) - Java 애플리케이션은 플랫폼에 독립적이다. 하지만 JVM은 플랫폼에 종속적이다. 각 플랫폼(OS)마다 다르게 구현되어야 한다. JVM 구조 JVM의 내부 구조를 큰 형태로 보면 클래스 로더 서브시스템, 런타임 데이터 영역 (Runtime Data Area) 그리고 실행엔진(Execution Engine)으로 나눌 수 있다. Class Loader : JVM 내로 class를 로드하고 Link를 통해 적절히 배치하는 일련의 작업을 수행하는 모듈. Runtime시 동적으로 수행된다. 클래스를 분석하는 과정에서 리플렉션 기법을 사용해 컴파일 된 클래스의 내부를 분석한다. Execution Engine : class loader를 통해 JVM 내의 런타임 데이터 영역에 배치된 바이트 코드는 실행 엔진에 의해 실행된다. 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어 실행한다. Garbage Collector : 가비지 컬렉터를 통해 자동화된 메모리 관리 기능을 제공한다. Garbage Collector는 Garbage Collection을 수행하는 모듈 쓰레드를 말한다....