본문 바로가기
개린이 이야기

직렬(Serial)과 동시(Concurrent)

by iOS 개린이 2022. 9. 22.

1. 직렬(Serial)

-Serial의 사전적인 의미에 "순차적인" 이 있다. 여기서 앞서 배웠던 동기 개념과 헷갈릴 수 있는데, 동기는 "요청에 대한 응답이 동시에 발생" 이라는 단일 작업에 대한 특성을 말하는 개념이다. 하지만 직렬은 단일 작업이 여러 개 있을 때 작업들을 순차적으로 하나씩 처리하는 것을 말한다.(SerialQueue는 한 번에 하나의 작업만 실행시킬 수 있음.)

-직렬 처리는 작업들을 분산 처리할 때 다른 한 개의 스레드에서만 처리하는 것을 말한다.

-작업 각각의 동기 처리, 비동기 처리하는 것은 상관이 없고, 순차적으로 하나씩 처리하는 것이 직렬 처리인 것이다. 

 

ex) a, b, c, d 4개의 작업이 있다.

 

a작업은 동기

b작업은 비동기

c작업은 동기

d작업은 동기

 

여기서 작업들을 직렬 처리한다면 과정은

1. a작업 시작하고 끝남

2. c작업 시작하고 끝남

3. d작업 시작하고 끝남

4. 비동기 작업인 b가 시작하고 끝남 

 

-왜 2번째 순서인 b작업이 제일 나중에 실행되냐면, SerialQueue는 한 번에 하나의 작업만 실행시킬 수 있기 때문에 모든 동기 작업들이 끝나고 마지막에 비동기 작업이 실행되는 것이다.

 

-개발할 때 우리가 사용하는 Main Queue가 SerialQueue이고, 우리가 작업을 동기적으로 처리(순서가 중요한 작업 처리) 해야 할 때 사용한다.

 

 

2. 동시(Concurrent)

-Concurrent의 사전적 의미는 "동시에 발생하는" 이다.

-동시도 직렬의 반대적인 개념으로 내 queue에 들어온 작업들을 동시에 실행시키겠다는 것이다. (한 번에 여러 개의 작업을 실행시킬 수 있음)

ex) a, b, c, d 4개의 작업이 있다.

 

a작업은 동기

b작업은 비동기

c작업은 동기

d작업은 동기

 

여기서 작업들을 Concurrent 처리한다면 과정은

1. a, b, c, d 모두 같이 시작

 

-동시처리를 해주었을 때 모두 같이 실행시킬 수 있지만,  왜 a, c, d 작업은 동기 처리가 안 되는지에 대해서 궁금증이 생길 수 있다.

이건 개인적으로 GCD가 몇 개의 스레드로 나누어서 작업을 처리할지 모르기 때문에 생기는 것이라고 생각한다. 

ex) GCD가 스레드를 한 개만 생성해서 작업을 진행했을 때 모두 동시에 처리하고 싶지만 단일 작업이 동기 처리 작업이기 때문에 어쩔 수 없이 기다려야 하는 것이다.

반대로 GCD가 스레드를 4개 생성해서 작업을 진행시켰다면 동기 처리 작업이든, 비동기 처리 작업이든 모두 동시에 발생하는 것이다.

 

-동시처리를 해주면 여러 스레드로 나누어서 효율적인 작업 처리가 가능하다. 그래서 프로그램의 성능과 반응성을 위해서 동시처리 방법을 알아야 한다.

 

 

 

참고: 

https://babbab2.tistory.com/64?category=831129

https://www.inflearn.com/course/sync-async-%EA%B0%9C%EB%85%90-%EC%9D%B4%ED%95%B4/unit/33682

https://velog.io/@sossont/%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0%EC%9D%98-%EC%B0%A8%EC%9D%B4

https://sujinnaljin.medium.com/ios-%EC%B0%A8%EA%B7%BC%EC%B0%A8%EA%B7%BC-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-gcd-4-a621eca0a1d2