티스토리 뷰

동시성 프로그래밍 에 필요한 개념들

멀티 스레드 환경에서 여러가지 작업을 동시에 처리하는 기술을 말한다.

동시성 프로그래밍이란 영어로 Concurrency Programming 라고 한다.

지금껏 나는 코드는 한줄, 한줄 순서대로 실행되는것으로 알고 코드를 작성해왔다.

동시성 프로그래밍을 이용해 동시에 여러가지작업을 하는것처럼 보이게 할수있다.

예를 들면 자주사용하는 음악재생 어플을 예시로 들어보자.
노래를 재생시켜두고 음악재생 어플에서 다른 뷰를 띄워주거나 동시에 다른 작업들을 하기도한다.

동시성 프로그래밍은 이를 가능하게 하는것이다.

코어

코어는 CPU 의 핵심으로 CPU 에서 실제로 일을 처리하는 녀석이다.

코어는 한번에 한가지 일만 할수있으며 코어가 여러개라면 여러개의 일을 동시에 처리할수 있다.

하지만 싱글 코어라도 동시성 프로그래밍을 통해 동시에 여러가지 작업들이 가능하다.

여러가지 일들을 쪼금씩 나누어 번갈아가며 처리하고 있기때문이다.

그렇기 때문에 우리의 눈에는 동시에 여러가지 작업을 하고있는것처럼 보일뿐이다.

코어가 많다고 해서 무조건 빠른것은 아니다.
코어가 여러개지만 코어하나만 일을하고있다거나 등등 이유가있을수 있다.

하지만 코어가 많으면 코어가 적을떄보다 빠를수있는 가능성이 높다고 할수있다.

스레드

스레드는 2가지로 구분된다.

1. 하드웨어 스레드
하드웨어의 스레드는 하이퍼스레딩 기술을 이용하여 하나의 코어로 2가지 작업을 동시에 수행할 수 있도록 하는 논리적인 코어 라고 할수 있다.

1코어 2스레드 라면 실제로 코어는 1개지만 코어가2개 인것처럼 작업을 처리하게된다.

2. 소프트웨어 스레드
소프트웨어 에서의 스레드는 논리적인 스레드 라고 하며 프로세스 내부에서의 작업 단위가 되는 가상의 스레드 이다.

경우에 따라 스레드는 하나일수도 여러개(멀티 스레드)일수도 있다.

하나의 스레드가 모든 작업을 처리하는것 보다 여러개의 스레드로 분산시켜 작업을 처리하는것이 효율적일수 있다.

병렬 프로그래밍

여러개의 코어가 하나의 작업을 분담해서 처리하는것
그래픽처리, 머신러닝에서 많이 사용함.

예시를 들어보자면 3명의 쉐프(3개의 코어)가있는 레스토랑에서 파스타 주문이 들어왔을때, 누구는 면을 삶고, 누구는 파스타소스를 만들고, 누구는 플레이팅을 동시에 진행하는것과 같다.

파스타 만들기라는 하나의 작업을 여러개의 CPU 가 분담하여 처리하는것.

동시성 프로그래밍

하나의 CPU 가 작업을 동시에 처리하는것 처럼 보이게 하는것.

병렬 프로그래밍, 싱글코어 모두 가능한 개념이다.

위의 예시를 인용하자면 1명의 쉐프(1개의 코어)가 있는 레스토랑에서 파스타, 스테이크, 라자냐 를 만드는것과 같다.
여러가지 작업을 나열해두고 하나씩 번갈아가며 작업을 처리하는것이며 번갈아가며 작업하는 속도가 빠르기때문에 동시에 작업하는것 처럼 보여진다.

직렬성 프로그래밍(Serial)

동시성 프로그래밍과 반대되는 개념.
동시성 프로그래밍은 다중 스레드를 활용하지만 직렬성 프로그래밍은 하나의 스레드 에서만 작업을 하는것이다.

동시에 작업을 처리하지 못하고 순서대로 작업을 처리 해야한다.

동기(Synchronous)

동기 프로그래밍은 작업이 끝나기를 기다리는것이다.
예를들어 A라는 코드 블록을 동기로 처리했다면 A라는 코드의 실행이 완전히 끝이나야 다음 코드로 넘어가는 것 이다.

비동기(Asynchronous)

동기 프로그래밍과는 반대로 작업이 끝날때까지 기다리지 않고 다음 코드 블록을 실행 시키는 코드를 말한다.

A, B 라는 작업이 나열되어있을때 A를 비동기 처리해주게되면 A작업이 끝날때까지 기다리지 않고 바로 B 작업을 시작하게된다.

동기(Synchronous)와 비동기(Asynchronous)의 차이

동기와 비동기는 작업이 끝나기를 기다리냐, 기다리지 않느냐 로 구분되는 개념이다.

개념의 차이는 실행 종료시점을 알 수 있는가 에 대한 차이로 이어진다.

동기로 처리되는 작업은 무조건 작업이 종료되길 기다리므로 작업이 종료된 후에 할 일을 정해줄수있다.
하지만 비동기의 경우 언제 작업이 종료되는지 알수 없다.

동시성: Serial 이냐, Concurrent 이냐 는 스레드가 단일 스레드 인지 다중 스레드인지 구분하는것
동기/비동기: 스레드의 수와는 무관하게 작업이 끝나기를 기다리냐, 기다리지 않느냐의 구분이다.

Serial 에서 비동기로 처리할수도있고 동기로 처리할수도 있다.
Concurrent 에서도 비동기로 처리할수 있고 동기로 처리할수 있다.

동시성 프로그래밍은 왜 필요한가??

1. 효율적으로 동작하는 소프트웨어
동시성 프로그래밍을 사용하게되면 여러개의 스레드를 이용해 일을 나누어 효율적으로 작업 처리를 할 수 있게 한다.
동시성 프로그래밍을 하지 않으면 모든일을 하나의 스레드에서 담당하게된다.

2. 사용성, 반응성이 좋은 소프트웨어
위의 설명에서 효율적으로 동작한다는 것은 사용성, 반응성이 좋아진다로 연결된다.
동시성 프로그래밍을 통해 사용자들에게 보다 나은 사용성을 제공할 수 있다.

예를 들면 어떤 파일을 다운 받을때 사용자가 아무런 동작을 할 수 없다면 어떨까?? 또 서버로부터 정보를 받아오는 동안 앱이 동작하지 않는다면 어떨까?? 이러한 것들을 해결할수 있는것이 동시성 프로그래밍이다.

'iOS > Swift-Memo' 카테고리의 다른 글

sync, async 사용법  (0) 2022.04.29
GCD(Grand Central Dispatch)란?  (0) 2022.04.29
Swift Lint 란?, Swift Lint 적용방법  (0) 2022.04.29
Static Dispatch, Dynamic Dispatch  (0) 2022.04.29
MetaType, self 와 Self  (0) 2022.04.29
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함