먼저, 동기와 비동기에 들어가기에 앞서 대체 헷갈릴 수 있는 단어들의 종류를 적고 시작하겠습니다.
동기 (Synchronity) : "같은시간"에는 1개의 작업만 처리할 수 있다.
비동기 (Asynchronous) : "같은시간"에 여러개의 작업을 처리할 수 있다.
동시성 (Concurrency) : 병렬과 병행을 모두 포함하여 사용됨. (모호함)
병렬성 (Concurrency) : A작업과 B작업이 "다른시간"에 번갈아가며 동작하며, "같은시간"에 실행되는 것처럼 보이게 할 수 있음.
병행성 (Parallelism) : A작업과 B작업이 "같은시간"에 같이 실행될 수 있음.
순차적 (Sequential) : 작업이 들어오면 해당 작업이 끝날 때 까지 다른 작업을 진행할 수 없음.
제가 "동기와 비동기" 로 블로그를 찾아보았을 때, 이런 정의를 본적이 있습니다.
- 동기는 말 그대로 동시에 일어난다는 뜻입니다. - 비동기는 말 그대로 동시에 일어나지 않는다를 의미합니다. |
해당 글의 내용을 전부 읽었을 때, 그 설명이 틀리지는 않았다는 것을 알 수 있었습니다.
근데 뭔가 느낌이 좋지 않았습니다. 왜???? 내용을 전부 읽지 않는다면, 저 표현은 엄청난 오해(의도와 정말 극단적으로 반대되는 해석) 를 살 수 있을 것 같기 때문입니다.
왜 오해를 사는지 살펴보겠습니다.
병렬(Concurrency) 은 A 작업과 B 작업이 실행되는 것이 동시(Concurrency) 에 일어나는 것처럼 보이지만, 실제로는 순차적으로 진행됩니다. (ex.멀티쓰레드)
병행(Parallelism) 은 A 작업과 B작업이 실행되는 것이 동시(Concurrency) 에 일어납니다. (ex. 멀티프로세스)
동시성(Concurrency)은 이러한 두 상황을 통틀어서 말하는 경우가 많습니다.
자, 그럼 위에 정의로 가볼까요?
"동기(Synchronity)는 말 그대로 동시(Concurrency)에 일어난다는 뜻입니다."
- 동기는 마치 병행을 말하는 것 같네요. 포괄적으로 본다해도, 병렬을 말하는 것 같아요.
"비동기(Asynchronous)는 말 그대로 동시(Concurrency)에 일어나지 않는다를 의미합니다"
- 위에서 말한 동시가 병행을 말한것이라면, 이건 병렬을 말한거겠네요. 아니면, 위에서 말한 동시가 병행,병렬을 말한거면 이 친구는 그 어디에도 속할 수 없네요. 음.. 순차적 (Sequential) 이 된다는 것일까요?
어떤 해석이든 둘다 문제가 있습니다.
좌측은 동기(Synchronity) 의 진행과정을 표현했으며, 우측은 비동기(Asynchronous) 의 진행과정을 표현했습니다.
(빨,노,초 작업은 각각 필요한 데이터 수신을 의미한다고 하겠습니다.)
아~ 그럼 동기는 순차(Sequential) 이고, 비동기는 동시(Concurrency) 인가요?
아닙니다. 다른 그림을 또 볼까요?
좌측은 동기(Synchronity) 의 진행과정을 표현했으며, 우측은 비동기(Asynchronous) 의 진행과정을 표현했습니다.
(빨강은 UI 그리기, 노랑과 초록은 필요한 데이터 수신을 의미한다고 하겠습니다.)
정리하자면,
1. 동기(Synchronity) 는 작업중에 다른 작업이 들어오면 해당 작업을 멈추고, 다른 작업을 진행합니다. 다른 작업을 끝낸 후에 하지못한 작업을 마무리하죠. 즉, 동시간대에는 1개의 Task 만을 수행합니다.
ex. UI 를 그리는 작업을 하는 중에 데이터를 받아오는 작업을 진행하면, UI 그리는 작업을 중지하고, 데이터 받아오는 작업을 진행한 후에 UI 그리는 작업을 다시 진행합니다.
로딩화면(빙글빙글) -> 로딩화면정지(stop) -> 데이터수신
2. 비동기(Asynchronous) 는 작업중에 다른 작업이 들어오면 해당 작업을 멈추는 것이아니라, 동시(Concurrency)적으로 진행합니다.
멀티프로세스에서 비동기를 진행하면 병행이 될것이고, 단일프로세스에서 비동기를 진행하면 병렬로 처리할 것입니다. 즉, 동시간대에 여러개의 Task 를 수행합니다.
ex. UI를 그리는 작업을 하는 중에 데이터를 받아오는 작업을 시작하면, 동시(Concurrency)적으로 진행합니다.
로딩화면(빙글빙글)0.1초 -> 데이터수신0.1초 -> 로딩화면(빙글빙글)0.1초 -> 데이터수신0.1초 ->..데이터수신완료
- 동기는 말 그대로 동시에 일어난다는 뜻입니다. - 비동기는 말 그대로 동시에 일어나지 않는다를 의미합니다. |
이 표현이 왜 오해를 살 수 있는지 아실 것 같나요?
해당 표현은 마치, 동기의 작업방식을 비동기처럼 작성했고, 비동기의 작업방식을 순차적인것으로 오해할 수 있습니다.
실제 동작과 정말 극단적으로 반대되는 결과가 나올 수 있다는 거겠죠?
동기로 프로그래밍 했을 때 장점과 단점
<장점>
단일 Task 를 빠르게 처리할 수 있다.
<단점>
1. UI 를 그리는 작업중에 데이터수신이 발생하면 UI 가 멈춘것처럼 보이는 결과가 나오는데, GUI 프로그램에서는 치명적인 단점으로 다가온다.
2. 공유자원에 대한 문제가 발생한다.
비동기로 프로그래밍 했을 때 장점과 단점
<장점>
여러개의 Task 를 동시에 처리할 수 있다.
GUI 프로그래밍에서 UI 가 멈춘것처럼 보이는 결과를 방지한다.
<단점>
병행이 아니라, 병렬인 경우 각 Task 처리에 대한 속도가 느려진다.
역시 공유자원에 대한 문제가 발생한다.
+ 동기화(synchronization)
서로 다른 Task 가 공유자원을 사용하는 경우 하나의 자원의 일관성이 깨질 수 있습니다.
그에 따라 공유자원을 사용할 때는 일관성이 깨지지 않도록 해야합니다.
이러한 작업을 동기화 작업이라고 하며, 이 과정은 결코 쉽지 않습니다.
오늘의 결론
자신이 만들고자 하는 프로그램이 동기or비동기 중 어느 것으로 가야하는지 잘 생각하여 결정하고,
동기화처리를 해주어야 하는 공유자원이 있는지에 대해서도 신경을 써주어야합니다.
static 변수는 많은 단점이 있지만, 그 중 공유자원으로 사용되면서 이같은 문제를 발생시킬 수 있습니다.
static 변수가 아니더라도, 공유자원으로 사용되면서 이같은 문제를 발생시킬 수 있습니다.
'BackUp (관리중지) > CS 학습' 카테고리의 다른 글
GC ( Garbage Collection ) (0) | 2021.04.28 |
---|---|
동시성 이슈 (0) | 2021.04.27 |
쓰레드(Thread) / 프로세스(Process) (0) | 2021.04.27 |
HTTP (HyperText Transfer Protocol) (0) | 2021.04.26 |
자료구조(Data Structure) (0) | 2021.04.26 |