CS_스레드2,비동기

이경환·2023년 3월 13일

CS

목록 보기
4/6
post-thumbnail

학습 계획

java 비동기 프로그램을 만들어보자. 단 스레드를 하나만 사용하고 CompletableFuture 를사용해 구현하자.
그전에 필요한 내용을 공부하자. 동기vs비동기 , 블로킹,논블로킹, 멀티프로그래밍, 비동기 프로그래밍 용어 정리를 확실히하자.

동기 프로그래밍, 비동기 프로그래밍

비동기 프로그래밍과 멀티 스레딩 프로그래밍 뭐가 다른가?? 일단은 동기와 비동기를 구분 짓자.

  • 동시성(Concurrency) vs 병렬성(Parallelism)

    • 동시적 하나의 프로세서가 cpu를 스케쥴링 되면서 한줄로 서있는 프로세스를 번갈아 가면서(컨텍스트 스위칭) 작업을 한다. 그렇기 때문에 동시에 여러
      작업을 하는것은 아니다 그렇게 보일뿐.
    • 병렬성은 실제로 동시에 여러 작업이 처리되는 것, 멀티 코어에서 멀티 쓰레드(Multi thread)를 동작시키는 방식이다.
  • 동기(synchronous) vs 비동기(asynchronous)

    • 동기는 결과가 주어질때까지 아무것도 못하고 대기한다.
    • 비동기는 서로의 작업에 영향을 받지 않는다. 별도의 작업 시작 종료를 가진다. 보통 멀티 스레드에서 작동.
  • 동기 프로그래밍은 코드가 작성한 순서대로 실행된다. 호출되는 함수의 작업 완료 여부를 신경쓴다.

  • 비동기 프로그래밍

    • 여러 일이 동시에 발생 할 수 있다. 즉 여러 작업을 독립적으로 실행 할 수 있다.
    • 실행의 흐름을 막지 않는다.
    • 쉽게 말하면 코드가 한줄 한줄 순서대로 진행 되는것이아니다. ex) 배달부가 그릇을 수거하기 위해 손님이 다 먹을때까지 기다려야 하는것은 아니다.
      다음 배달을 진행하고 있으면된다.
    • 비동기식 프로그래밍에서 중요한것은 call back 함수이다. 함수가 진행될 때 결과 값이나 진행하다 다시 돌아가야할 때 이것을 알게 하는 함수가
      callback함수.

블로킹, 논 블로킹

  • 블로킹은 A 함수가 B 함수를 호출하면, 제어권을 A가 호출한 B 함수에 넘겨준다. 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이
    끝날 때까지 기다렸다가 자신의 작업을 시작하는 것

  • 논블로킹은 A함수가 B함수를 호출해도 제어권은 그대로 자신이 가지고 있는다. 다른 주체의 작업에 관련없이 자신의 작업을 하는 것

  • 결론 적으로 동기,비동기와 같이 생각하자 ex) 동기 + 블로킹, 비동기+ 논 블로킹 등

참고자료: https://velog.io/@nittre/%EB%B8%94%EB%A1%9C%ED%82%B9-Vs.-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%8F%99%EA%B8%B0-Vs.-%EB%B9%84%EB%8F%99%EA%B8%B0

멀티 스레드 프로그래밍 , 비동기 프로그래밍의 차이는?

  • 비동기 프로그래밍(asynchronou programming)은 여러 작업을 하는 하나의 방법론 적인것이다. 멀티 프로그래밍은 이 비동기 프로그램의 한 종류이다. 비동기 프로그래밍은 결국 단일,멑티 스레드 모두에서 적용 할 수 있다.

  • 비동기 프로그래밍의 방법

    • 스레드를 여러개 만든다 -> 멀티 스레드

      • 스레드를 여러개 만들때 발생하는 많은 컨텍스트 스위칭 비용.
      • 여러 스레드가 자원을 공유해서 발생하는 레이스 컨디션.
    • non -block i/o 논 블로킹 i/0라고 봐도무방 싱글 스레드여도 비동기 프로그래밍이 가능.

    • 결론 적으로 두가지 방법을 통해 좋은 성능을 내는 비동기 프로그래밍을 할 수 있다.

    • 메세지 큐를 이용해 동기 프로그램에서 생길 수 있는 오류를 예방 할 수있다.

참고자료:https://jayhyun-hwang.github.io/2021/09/02/The-Difference-Between-Asynchronous-And-Multi-Threading/

동기화

  • 여러 프로세스/스레드가 동시에 같은 데이터를 조작할때 타이밍,순서에 따라 결과가 달라진다. 이것을 경쟁조건(Race condition) 이라한다.

  • 실행해도 공유 데이터의 일관성을 유지하는것 이것을 동기화(Synchronizaion)라고한다.

  • 공유데이터의 일관성을 보장하기 위해 하나의 프로세스/스레드가 진입해서 실행 가능한 영역을 임계영역(Critical section)이라 부른다.

  • 임계영역 문제 해결책

    • mutual exclusion(상호배제)
      특정 프로세스가 공유자원을 사용하고 있을 경우, 다른 프로세스가 해당 공유 자원을 사용하지 못하게 제어하는 기법
    • progress(진행)
    • bounded waiting(한정된 대기)
  • 스레드 세이프(Thread Safe)

    • 멀티 스레드 프로그래밍에서, 어떤 공유 자원에 여러 쓰레드가 동시에 접근해도, 프로그램 실행에 문제가 없는 상태를 의미한다.
  • 동기화(Synchronization) 기법

    • 뮤텍스(Mutex)
      공유자원을 사용하는 스레드가 있을때, 다른 스레드가 공유자원에 접근하지 못하도록 Blocking 후 대기 큐로 보낸다.
    • 세마포어(Semaphore)
  • 교착 상태 Dead-Lock

동기 작업 함수 호출, 비동기 작업 함수 호출

이벤트 처리

  • 콜백(Callback) : 이벤트가 발생하면 특정 메소드를 호출해 알려준다. (1개) 일반적인 호출관계 아닌 피호줄자(callee)자가 호출자를(caller)를
    호출 이벤트를 발생시켜 이에 대한 처리를 해달라는 요청을 할 때 사용.
  • 리스너(Listener) : 이벤트가 발생하면 연결된 리스너(핸들러)들에게 이벤트를 전달한다 (n개)

참고자료: https://www.crocus.co.kr/1533

Timer class

참고자료: https://sangwoo0727.github.io/java/JAVA-36_timertask/

CompletableFuture

스레드와,스레드풀

자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행된다. 쓰레드가 없다면 자바 애플리케이션 실행이 불가능하다.
스레드는 한번에 한가지 일밖에 하지못해 동시 처리가 필요하면 쓰레드를 추가로 생성해야 한다.-> 멀티 스레드

하지만 요청시마다 스레드스를 생산할 경우 비용이 너무 비싸다. 스레드의 교체는 컨텍스트 스위칭 비용이 발생한다. 그렇기 때문에 개발자는 스레드 풀이라는 스레드를 보관하는 상자를 만들어 관리해야한다.

쓰레드가 필요하면, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용한다. 사용을 종료하면 쓰레드 풀에 해당 쓰레드를 반납한다.

하지만 스레드 관리는 매우 어렵고 WAS가 이것을 관리해준다. 즉 개발자는 멀티 스레드 환경을 생각할 필요가없다. 스프링을 사용하면서 멀티 스레드의 문제에서 다소 편안한 것은 WAS가 싱글톤 객체(서블릿, 스프링 빈) 을 사용하면서 처리해 주기 때문이고, 개발자는 만약 성능을 튜닝할시 스레드풀의 MAX숫자를 설정해 줄 수있다.

참고자료

profile
개선하는 개발자, 이경환입니다

0개의 댓글