타이탄의 도구들

동기와 비동기 관련 개념 정리 본문

Dev Tools/Computer Science

동기와 비동기 관련 개념 정리

Titan04 2022. 5. 25. 15:22
728x90

(1) 동기와 비동기, 블로킹과 논블로킹

[태스크(task)]

작업의 단위을 뜻하는 포괄적인 용어다 (프로세스, 스레드 등)

[동기식 처리 모델 (Synchronous processing model)]

동기식 처리 모델은 직렬적으로 태스크(task)를 수행한다.

즉, 태스크는 순차적으로 실행되며 어떤 작업이 수행 중이면

다음 작업은 대기하게 된다.

예를 들어 서버에서 데이터를 가져와서 화면에 표시하는 작업을 수행할 때,

서버에 데이터를 요청하고 데이터가 응답될 때까지

이후 태스크들은 블로킹(blocking, 작업 중단)된다.

동기란 작업의 결과를 기다리는것! (기다린다 = 블로킹상태)

[비동기식 처리 모델 (Asynchronous processing model 또는 Non-Blocking processing model)]

비동기식 처리 모델은 병렬적으로 태스크를 수행한다.

즉, 태스크가 종료되지 않은 상태라 하더라도 대기하지 않고 다음 태스크를 실행한다.

예를 들어 서버에서 데이터를 가져와서 화면에 표시하는 태스크를 수행할 때,

서버에 데이터를 요청한 이후 서버로부터 데이터가 응답될 때까지

다른 태스크들을 대기하지 않고(Non-Blocking) 즉시 다음 태스크를 수행한다.

이후 서버로부터 데이터가 응답되면 콜백 이벤트가 발생하고

이벤트 핸들러가 콜백으로부터 받은 응답(response)데이터를 가지고

수행할 태스크를 계속해 수행한다.

비동기란 작업의 결과를 기다리지 않는것! (기다리지 않는다 = 논블로킹상태)

<짐코딩님의 동기,비동기 설명>

https://www.youtube.com/watch?v=sN4E9_u7xQk

 

(2) 스레드, 프로세스, 멀티 스레드

[스레드]

 

하나의 프로그램이 돌아가고 있는 상태[프로세스]라고 하는데,

프로세스 내에서 실행되는 실행 흐름의 단위[스레드]라고 한다.

[멀티스레드]

 

한 프로세스 내에서도 여러개의 작업이 동시에 진행될 필요가 있는데,

(예를들어 브라우저라는 하나의 프로그램에서 파일 다운로드도 받고, 영상도 보는 등

하나의 프로그램에서 동시에 여러 작업을 하는 상황을 떠올려보면 됩니다.)

그것을 가능하게 해 주는 것이 멀티 스레드 환경이다.

[멀티 스레딩]이란 한 프로세스 내에 여러개의 스레드를 생성해

작업을 동시에 진행하는 것이다!

(3) 멀티 태스킹, 멀티 프로세싱, 멀티 스레딩

[멀티 태스킹]이란 두 가지 이상의 작업을 동시에 처리하는 것을 말한다.

 

예를 들어 워드로 문서작업을 하는 동시에 음악을 듣는 것은

OS가 프로세스마다 작업을 병렬로 처리하기에 가능하다.(멀티 프로세싱의 예)

그런데, 멀티 태스킹이 꼭 [멀티 프로세싱]를 말하는 것은 아니다.

한 프로세스 내에서 멀티 태스킹을 할 수 있도록 만들어진 프로세스

예를 들어 메신져 프로세스 같은 경우 채팅 기능을 제공하면서 동시에 파일 업로드 기능을 수행할 수 있다.

이처럼 한 프로세스에서 멀티 태스킹이 가능한 이유는

[멀티 스레딩] 덕분이다.

+ 스레드의 동시성과 병렬성

멀티 스레드는 [동시성( Concurrency )] 또는 [병렬성( Parallelism )]으로

실행된다.

[동시성]이란 멀티작업을 위해 1개의 코어로 스레드마다 돌아가면서 조금씩 실행하지만,

너무 빨라 사람의 눈에 보기에는 독립적으로 돌아가는 것처럼 보이는 것을 말하며

[병렬성]이란 스레드마다 각각의 독립적인 Core가 할당되어 독립적인 Core에서

작업이 이루어지는 것을 말한다.

코어의 수보다 스레드의 수가 작으면 각각의 코어로 병렬성이 보장되지만

스레드의 개수가 코어보다 많은 경우

스레드를 어떤 순서에 의해 동시적으로 실행할 것인가를 결정해 주어야 한다.

이것을 [스레드 스케줄링]이라 한다.

이런 스케쥴링 방식은

 

[우선순위( Priority ) 방식][순환 할당( Round-Robin ) 방식]으로 나누어진다.

[우선순위( Priority ) 방식]

우선순위가 높은 스레드가 실행을 더 많이 하도록 스케줄링하는 방법이다.

thread.setPriority(1) // 1 - 우선순위가 가장 낮음 , 10 - 가장 높음

thread .setPriority(Thread.MAX_PRIORITY); // 직관적 코드 MAX_PRIORITY, NORM_PRIORITY, MIN_PRIORITY

[순환 할당( Round-Robin ) 방식]

시간 할당량을 정해서 하나의 스레드를 정해진 시간만큼만 실행하는 방법이다.

해당 방식은 JVM안에서 이루어지기 때문에 개발자가 직접 제어할 수 없다.

출처 : https://honbabzone.com/java/java-thread/

<얄코님의 프로세스,스레드 설명>

https://www.youtube.com/watch?v=iks_Xb9DtTM

 

(4) 비동기와 멀티스레딩의 차이

<비동기와 멀티스레딩의 차이에 대한 stackoverflow글>

https://stackoverflow.com/questions/748175/asynchronous-vs-synchronous-execution-what-is-the-main-difference/748235#748235

*동기/비동기는 멀티 스레딩과 아무 관련이 없습니다.*

동기식 또는 동기화 됨은 "연결된" 또는 어떤 방식으로든 "종속적인"을 의미합니다. 즉, 두 개의 동기 작업은 서로를 인식해야 하며 한 작업은 다른 작업이 완료될 때까지 시작을 기다리는 것과 같이 다른 작업에 종속되는 방식으로 실행해야 합니다.

비동기식이란 완전히 독립적이며 어느 쪽도 시작이나 실행에서 어떤 식으로든 다른 쪽을 고려해서는 안 된다는 것을 의미합니다.

Synchronous/Asynchronous HAS NOTHING TO DO WITH MULTI-THREADING.

Synchronous or Synchronized means "connected", or "dependent" in some way. In other words, two synchronous tasks must be aware of one another, and one task must execute in some way that is dependent on the other, such as wait to start until the other task has completed.Asynchronous means they are totally independent and neither one must consider the other in any way, either in the initiation or in execution.

기술적으로 동기/비동기의 개념은 실제로 스레드와 관련이 없습니다 .

일반적으로 동일한 스레드에서 실행되는 비동기 작업을 찾는 것은 일반적이지 않지만 가능하며 별도의 스레드에서 동기적으로 실행되는 두 개 이상의 작업을 찾는 것이 일반적입니다

개념 동기/비동기의 여부는 다른 (첫 번째) 작업이 완료되기 전에 두 번째 또는 후속 작업을 시작할 수 있는지 여부 또는 대기해야 하는지 여부와 단독으로 관련 됩니다. 그게 다야.

Technically, the concept of synchronous/asynchronous really does not have anything to do with threads. Although, in general, it is unusual to find asynchronous tasks running on the same thread, it is possible, (see below for examples) and it is common to find two or more tasks executing synchronously on separate threads... No, the concept of synchronous/asynchronous has to do solely with whether or not a second or subsequent task can be initiated before the other (first) task has completed, or whether it must wait. That is all.

(5) 레트로핏을 통한 비동기 통신방법

1.레트로핏 내부적으로 백그라운드 스레드를 이용해

http통신을 비동기적으로 처리함

2. 그 후 Call.enqueue(Callback callback) 메서드를 통해 콜백을 받고 후처리를 함

후 처리 예) callback 내 onResponse 안에서 response를 받아

메인스레드에서 해줄 작업을 처리함

읽어주셔서 감사합니다 :)

728x90
Comments