Post

[TIL]스레드? 동기? 비동기???

발생한 ISSUE 및 해결 방법

ISSUE1. 싱글 스레드가 어떻게 비동기를 하지??

문제상황

  • webclient는 HTTP 클라이언트이다. 비동기, 동기기능 모두 지원한다.
  • webclient는 single thread인데 비동기를 어떻게 처리할까? 에서 출발했다.

해결방법

  • 싱글 : 하나, 스레드 : 컴퓨터 프로세스 내에서 실행되는 작업 단위
  • 그럼 싱글스레드는 하나의 스레드 하나의 작업만 처리되는데 어떻게 비동기를 하는지 궁금했다
  • 일단 싱글스레드, 멀티스레드란 뭘까?
    • 싱글 스레드는 위에서 정의했고 그럼 멀티스레드는 무엇일까
    • 멀티 == 여러개다. 그럼 멀티스레드는 여러 개의 스레드가 하나의 작업환경을 처리하며 리소스를 공유하는 것이다.
    • 하나의 환경에서 몇개의 스레드가 하나의 작업환경을 진행하는지에 따라 나눈것이라 생각하면 된다.
    • 🎈카페를 작업환경, 바리스타를 스레드로 한다면
      • 하나의 바리스타가 카페에서 일하면 이건 싱글스레드
      • 여러 명의 바리스타가 카페에서 일하면 이건 멀티스레드
    • 크롬의 탭(프로세스)에서 유튜브보면서(스레드1), 파일다운받기(스레드2)인 것이다.
    • 다시 말하자면 싱글스레드는 메인스레드 하나가 작업을 바꿔가면서 하는것이고, 멀티스레드는 메인 스레드를 두고 추가적인 스레드들이 병렬적으로 컨텍스트 스위칭하면서 작업을 수행해서 동시에 작업이 진행되는 것처럼 보이는것!(이는 병렬성이긴함)

👩‍💻깨달은점

  • 그럼 무조건 멀티스레드가 좋은게 아닌가? 생각이 들었다.
    • 컨텍스트 스위칭에도 비용이 많이 든다. 그리고 멀티스레드는 하나의 자원을 공유하기 때문에 공유하는 자원의 동기화에 신경을 써야한다. 만약에 하나의 스레드가 공유자원의 값을 바꿨다면?? 바꾸는 도중에 다른 스레드로 바껴서 그 자원에 접근한다면? 그 공유자원의 값은 무결성이 보장되지 않는다…. 그래서 동시에 같이 접근하지 못하도록 제어해줘야한다.
  • 그럼 싱글스레드만 쓴다면???
    • 처리해야할 데이터의 양이 방대한데 일꾼이 한명이면? 처리하는 시간이 오래걸릴것이다. 알바생을 늘려서 일을 빨리 처리해야한다 이때 멀티스레드를 처리하는게 좋다!
  • 그리고 멀티스레드는 막연하게 메인스레드가 여러 개라고 생각했는데 메인스레드 하나를 두고 밑에 다수의 보조스레드가 메인스레드의 일을 동시에 하는 것이었다.
  • 그럼 메인 스레드가 주인이고 보조 스레드들은 알바니까 카페의 원두같은걸 공유해서 일하기…로 생각하면 될것같다.

ISSUE2. 그럼 동기 비동기는 뭔데

문제상황

  • 그럼 webclient에서 지원하는 동기//비동기의 차이는 뭘까…

해결방법

  • 동기는 내가 하나의 일을 다 끝날때까지 다른 일은 못하고 끝날때 까지 기다려야한다.
  • 비동기는 내가 일하고있어도 다른 일도 할 수 있는 것이다.
  • 그럼 순차적인 순서의 차이라고 생각하면 될까?
  • A,B,C 일이 있고 동기로 처리한다면 A-B-C, 비동기로 처리한다면 그냥 끝나는 일 순서가 랜덤적으로 정해질 것이다.
  • 그럼 또 궁금한 점이 동기/비동기하면 맨날 나오는 용어인 블락/논블락은 뭘까…
  • 다른 애가 일하고있을때 나도 일 할 수 있느냐 없느냐차이 인것같다.

👩‍💻깨달은점

  • 동기는 너 끝났어? 나 이제 할게(순서지켜)
  • 비동기는 너 끝나든 말든 난 한다.(순서안지켜)
  • 블락은 다른애가 일하면 난 일 안해
  • 논블락은 다른애 일하면 나도 일해.
  • 동기/비동기는 작업 완료 여부를 확인하는가 안하는가
  • 블락/논블락은 다른 작업과 상관없이 실행안하는가 하는가!
This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.