Concurrency Programming - 동시성 프로그래밍
동시성 프로그래밍은 멀티 스레드 환경에서 여러가지 작업을 동시에 처리하는 기술을 말함.
-
동시성(Concurrency) 프로그래밍, 병렬(Parallelism) 프로그래밍은 어떻게 다르며, 우리가 주로 접할 iOS 환경에서는 무엇을 더 고려해봐야 할까?
- 동시성 프로그래밍 - 동시에 실행되는 것 같아 보이는 것, 싱글 코어에서 멀티 쓰레드를 동작 시키는 방식, 한번에 많은 것을 처리, 논리적. CPU가 여러작업을 동시에 처리하는 것. 동시성 프로그래밍은 병렬 프로그래밍과 달리 싱글 코어에서도 가능한 논리적인 개념. 물리적으로는 하나의 작업만 처리하는 환경에서(코어 한개) 논리적으로 여러 일을 동시에 처리하기 때문. 동시성 프로그래밍은 여러개의 스레드를 이용하여 동시에 여러작업을 처리. 1명의 쉐프가 동시에 파스타, 스테이크, 라자냐를 만드는 것과 같은데, 실제로는 여러가지 작업을 나열해두고 하나씩, 그리고 조금씩 번갈아가면서 작업을 처리하는것. 아주빠르게 Context Switching이 일어나고있음
- 병렬성 프로그래밍 - 실제로 동시에 여러작업이 처리되는 것, 멀티코어에서 멀티쓰레드를 동작시키는 방식, 한번에 많은 일을 처리, 물리적. 여러개의 CPU가 하나의 작업을 분담해서 처리. 아주 큰 영상 혹은 그래픽을 처리해야한다고 했을 때 여러개의 CPU가 이미지를 분할하여 담당한다면 좀더 작업을 빠르게 처리가능. 실제로 많은 연산이 필요한 그래픽 처리나 머신 러닝에서는 병렬프로그래밍이 적극적으로 사용. 예를 들어 3명의 쉐프가 있는 레스토랑에서 파스타 주문이 들어왔을 때, 누군가는 면을 삶고, 누군가는 파스타 소스를 만들고, 누군가는 플레이팅을 동시에 진행하는 것과 같음. 파스타만들기라는 하나의 작업을 여러개의 CPU가 분담해서 처리하는 것. 혼자서 작업을 처리하는 것보다 더 빠른 효율을 낼 가능성이 높음. 그렇기때문에 병렬프로그래밍은 물리적으로 CPU가 여러개 있을 때 가능. 싱글코어에서는 병렬프로그래밍 불가. 왜냐하면 병렬 프로그래밍은 실제로 동시에 작업을 처리하는 것이기 때문.
- 데이터 병렬성 - 처리해야 할 데이터를 나누고, 나누어진 데이터들을 병렬 처리하여 작업을 빠르게 수행하는 기법
- 작업 병렬성 - 서로 다른 작업을 병렬 처리하는 기법

-
동시성 프로그래밍, 병렬 프로그래밍, 동기(synchronous)와 비동기(asynchronous)의 개념은 어떤 상관관계를 가질까?
- 동기 방식 - 요청을 보낸후 응답(결과)을 받아야지만 다음 동작이 이루어지는 방식. 어떠한 일을 처리할 동안 다른프로그램은 정지. 실제 cpu가 느려지는 것은 아니지만 시스템의 전체적인 효율이 저하. 동기프로그래밍은 작업이 끝나기를 기다리는 것. 예를 들어 A라는 코드블럭을 동기로 처리했다면 A라는 코드의 실행이 완전히 끝이나야 다음 코드로 넘어가는 것.
- 비동기 프로그래밍 - 요청을 보낸 후 응답(결과)과는 상관없이 다음방식이 동작하는 방식. 결과가 주어지는데 시간이 걸리더라도 그 시간 동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할 수 있음. 비동기식은 비동기식 처리를 요청할 때 할일이 끝난 후 처리결과를 알려주는 콜백이라는 함수를 함께 알려줌. 비동기 프로그래밍은 작업이 끝나기를 기다리지 않고, 다음 코드블록을 바로 실행시키는 코드. A,B라는 작업이 나열되어있고 A를 비동기 처리해주었을 때 A를 기다리지 않고 바로 B작업을 시작.
- 동기와 비동기는 이렇게 작업이 끝나기를 기다리느냐 기다리지않느냐에 대해서 구분되는 개념. 이러한 개념의 차이는 실행종료 시점을 알수있는 가에 대한 차이로 이어짐. 동기로 처리되는 작업은 무조건 작업이 종료되길 기다리게 되니 작업이 종료된 후에 할일을 정해줄 수 있음. 하지만 비동기의 경우에는 언제 작업이 종료되는지를 알 수 없음. (화장실을 간 친구를 기다리지않으면 친구가 언제 화장실에서 나왔는 지 알수없듯)



-
애플이 동시성 프로그래밍 또는 병렬 프로그래밍을 지원하기 위해 사용하는 기술엔 무엇무엇이 있을까?
- Grand Central Dispatch (GCD) : 멀티 코어와 멀티 프로세싱 환경에서 최적화된 프로그래밍을 할 수 있도록 애플이 개발한 기술 (동시성), 코드로서 동기/비동기 처리만 해준다면 시스템이 알아서 스레드를 관리해주는 방식.
- Operation Queue (연산 대기열) : 비동기적으로 실행되어야 하는 작업을 객체 지향적인 방법으로 사용
-
프로그래밍에서 Thread는 무엇이고 iOS 환경에서 이를 다루기 위한 방법에는 무엇무엇이 있으며 그 차이는 무엇일까?
- 프로세서
- 프로세서는 컴퓨터 하드웨어 측면에서 프로그램을 수행하는 하드웨어 유닛. 대표적으로 중앙처리장치를 말하며 컴퓨터 한대가 여러 프로세서를 갖는다면 멀티프로세서라고 함.
- 코어
- 프로세서의 코어는 주요 연산회로인데, 싱글코어는 연산회로가 하나인것을 말하고 듀얼코어는 연산회로가 두개 내장되어있음을 말함
- 코어는 CPU의 핵심으로 CPU에서 실제로 일을 처리하는 녀석. 빠르고 효율적인 코어는 성능이 좋은 컴퓨터의 필요조건. 코어가 많다는 것은 작업을 처리할 녀석이 많다는 뜻.
- 코어는 한번에 한가지일만 처리 가능. 따라서 코어가 여러개라면 여러개의 일을 동시에 처리가능.
- 레스토랑에 쉐프가 있다면, 쉐프가 파스타를 만들고 고기를 굽고 동시에 요리를 하는 것은, 한번에 만드는 것처럼 보이는 것일뿐, 사실은 일을 짧은 단위로 나누어서 하나씩 번갈아가면서 요리를 하는것. 실제로 결국 한번에 한가지일을 하는 것. 코어 역시 같은 맥락. 다만 그 속도가 매우 빠를뿐. 코어가 여러개라는 말은 쉐프가 여러명인 것과 같음.
- 쉐프가 여러가지 작업을 시분할로 나누어 번갈아가며 처리하는 것을 동시성 프로그래밍이라고 함
- 프로그램과 프로세스
- 프로그램은 일반적으로 보조기억장치에 저장된 실행코드 즉, 생명이 없는 상태. (어떤작업을 위해 실행할 수 있는 파일)
- 프로세스는 프로그램을 구동하여 프로그램 자체와 프로그램의 상태가 메모리에서 실행되는 작업 단위를 말함.
- 동시에 여러개의 프로세스를 운용하는 것을 멀티태스킹이라 하며 이는 운영체제에서 담당
- 스레드
- 프로세스 내에서 실행되는 작업흐름의 단위를 말함. 보통 한 프로세스는 하나의 스레드를 갖고 있는데 프로세스의 환경에 따라 동시에 둘 이상의 스레드를 실행할 수 있음. 이러한 방식을 멀티스레딩이라고 함. 프로그램이 시작될때 동작하는 스레드를 메인스레드. 나중에 생성된 스레드를 서브스레드 또는 세컨더리 스레드 라고 함.
- 스레드는 하드웨어의 스레드와 소프트웨어에서의 스레드로 구분. 같은용어이지만 약간의 의미가 다름.
- 먼저 하드웨어에서의 스레드는 하이퍼스레딩 기술을 이용하여 하나의 코어로 2가지 작업을 동시에 수행할 수 있도록 하는 논리적인 코어. 1코어 2스레드라면 실제로 코어는 1개이지만 코어가 2개인것처럼 작업을 처리.
- 반면 소프트웨어에서의 스레드는 논리적인 스레드로 프로세스 내부에서의 작업 단위가 되는 가상의 스레드. 여기서 스레드는 프로그램의 작업을 처리하는 애들을 말함. 경우에 따라서 스레드는 하나일 수도, 여러개가 있을수도 있음. 하나의 스레드가 모든 작업을 처리하는 것보다 여러개의 스레드에 분산 시켜 작업을 처리하는 것이 효율적일 수 있음.
- 보통 한 프로세스당 한개의 스레드를 가진다고했는데, 그렇다면 프로세스에서 스레드를 늘려서 작업을 처리하는 이유는? 스레드가 코어인척 작업을 해서? 작업의 속도를 올리는 것인가?
-
동시성이 필요한 이유?
- 효율적으로 동작하는 소프트웨어 : 동시성 프로그래밍은 여러개의 스레드를 이용해서 일을 나누어 효율적인 작업 처리. 동시성프로그래밍을 하지않으면 모든일을 하나의 스레드에서 담당하게됨.
- 사용성, 반응성이 좋은 소프트웨어: 어떤 파일을 다운받을때 사용자가 아무런 동작을 할수없다면 매우 답답할듯. 이점은 사용자의 사용성과 반응성이 좋아진다로 귀결
-
스위프트로 동시성을 구현하는 방법은 GCD, Operation, async/await이 있음
DispatchQueue 1: Serial / Concurrent
dispatch : 보내다(파견하다)
queue : 대기열
dispatchqueue는 대기열에 보내다라는 뜻. GCD는 개발가자 작업만 정해주면 시스템이 알아서 스레드를 관리해줌. 우리는 DispatchQueue에 작업을 넘겨주기만 하면 알아서 동작. DispatchQueue는 GCD를 사용하기 위한 대기열로, GCD기술의 일부. 우리는 이 대기열들에 작업을 추가해주기만 하면 시스템은 알아서 스레드를 관리하여 작업을 처리하도록 도와줄 것. FIFO. 단, 2가지를 꼭 정해주어야함. 단일스레드를 사용할 것인가, 다중스레드를 사용할 것인가 (Serial,Concurrent) 그리고 동기로 작업을 처리할 것인가, 비동기로 작업을 처리할 것인가 (sync, async)
**# Process, Processor**
- Windows 운영체제는 32bit 버전, 64bit 버전, ARM 버전 등 다양한 버전이 존재합니다. 이 버전은 어떤 것을 의미하며 왜 이렇게 다양한 버전이 존재해야 할까요?
- 한번에 처리할수 있는 비트가 32, 64 (처리용량이 2배가 아닌 2의 32제곱 갯수) → 32bit에서는 4gb까지만 사용가능했음. 다양한
- 내 매킨토시의 프로세서는 무엇인가요?
- 애플이 새로 출시한 매킨토시 컴퓨터에서 iOS의 애플리케이션을 실행할 수 있는 이유는 무엇일까요?
- 이전의 매킨토시 컴퓨터에서는 불가능했던 이유는 무엇일까요?
- 현재는 arm명령어셋이 같기때문에 실행이 가능하지만 이전에는 인텔칩을 사용해서 명령어셋이 다르기때문에 실행이 불가능.
- 프로세서를 위한 프로세스 스케쥴링 방식에는 어떤 것이 있는지 간략히 알아봅시다.
- 운영체제 입장에서 다양한 프로세스를 스케쥴링하는 규칙을 만들어봅시다.
- 앞으로 iOS와 macOS는 통합될까요?