동기와 비동기 개념을 알기 전에 먼저 스레드와 프로세스가 무엇인지 파악하는 것이 좋다.
1. 프로세스(Process)
-프로세스란 "운영체제(OS)로부터 시스템 자원을 할당받는 작업의 단위" 이다.
-프로세스는 프로그램과 비슷한 개념으로 오해하기도 하는데 구분해보면 다르다. 프로그램이란 "어떤 문제를 해결하기 위해서 그 처리방법과 순서를 기술하여 컴퓨터에 주어지는 일련의 명령문 집합체" 이다.
-프로세스는 프로그램이 운영체제로부터 메모리 공간을 할당받아 실행 중인 것으로 "메모리에 올라와 실행되고 있는 프로그램의 인스턴스" 라고 볼 수 있다.
ex) 알람 어플
알람 어플을 사용할 때 5초 후에 울리는 알람을 맞춘다.
1. 알람 시간을 조정하는 동작 프로세스
2. 알람이 울리기까지 시간을 계산하는 프로세스
3. 시간이 일치할 때 알람이 울리는 프로세스
이렇게 알람이라는 하나의 프로그램에서 일어나는 여러 동작들이 존재한다.
동작들을 하나의 프로세스에서 모두 처리할 수도 있고, 여러 개의 프로세스를 생성해서 동작들을 분담하여 처리할 수도 있다.
-프로세스는 code, data, stack, heap이라는 독립된 메모리 영역을 각자 할당받는다. 그렇기 때문에 프로세스끼리는 서로 접근할 수 없고, 접근하기 위해서는 프로세스 간 통신(IPC)을 사용해야 한다. ex) 파일이나 소켓 등과 같은 통신방법
2. 스레드(Thread)
-스레드란 "프로세스 실행 단위", "프로세스 내에서 동작되는 여러 실행의 흐름" 이다.
-스레드는 프로세스 내에서 실행되는 단위이기 때문에 메모리 영역을 독립적으로 할당받지 못한다.
-하지만 프로세스 내에 메모리 영역 중 code, data, heap영역은 공유하고, stack 영역은 독립적으로 할당받을 수 있다.
이유는 stack 영역은 LIFO(Last In, First Out : 가장 처음에 들어온 요청은 마지막에 처리하고, 가장 최근에 요청된 것을 먼저 처리하는) 형식이라서 stack이 쌓이면 프로세스가 섞인 채로 나와서 흐름에 방해를 주기 때문이라고 한다.
-스레드가 독립적으로 stack영역은 할당받을 수 있기 때문에 스레드끼리 stack영역은 서로 접근할 수 없고(독립적으로 할당 받기 때문), 서로의 heap 영역은 공유하며 서로 읽고, 쓰며, 자원에 접근할 수 있다. ex) A스레드에서 프로세스 자원을 변경했을 때 B스레드에서 변경 결과를 볼 수 있다.
-하나의 프로그램에서 스레드를 여러 개로 구성하여 각 스레드마다 작업을 분산처리할 수 있도록 하는 멀티 스레드도 있다.
1. 동기(Synchronous)
-동기란 "동시에 발생하는"이라는 뜻을 가지고 있다. 하지만 개발에서 동기라는 개념은 작업의 "요청"과 "응답"이 동시에 발생한다는 뜻으로 볼 수 있다. 요청과 응답이 동시에 발생하기 때문에 작업 요청에 대한 응답이 오기 전까지 새로운 작업을 시작할 수 없다.
-동기는 설계가 간단하고 직관적이라는 장점을 가지고 있지만, 요청에 대한 응답이 오기까지 대기해야 해서 모든 작업이 마무리되는 시간이 비동기에 비해서 길다.
ex) a, b, c, d라는 4개의 작업을 처리해야 할 때
-a의 소요시간: 1분
-b의 소요시간: 2분
-c의 소요시간: 3분
-d의 소요시간: 4분
작업이 동기적으로 이루어질 때 a가 끝나고 b가 시작되고 b가 끝나야 c가 시작되고 ~ d가 마무리되는 방식이기 때문에 작업이 모두 마무리되는 시간은 총 1 + 2 + 3 + 4 = 10분이다.
2. 비동기(Asynchronous)
-비동기는 "동시에 발생하지 않는"이라는 뜻을 가지고 있다. 개발에서 비동기는 작업의 요청과 응답이 동시에 발생하지 않는다는 개념으로 동기와 반대되는 뜻으로 이해할 수 있다. 작업의 요청과 응답이 동시에 발생하지 않기 때문에 작업 요청에 대한 응답이 오지 않아도 새로운 작업들을 시작할 수 있다. 즉, 비동기는 여러 작업들을 동시에 실행시킬 수 있다.
-비동기는 작업 요청에 대한 응답 시간을 파악하기 위해서 보통 callback함수로 받아온다.
-비동기는 자원을 효율적으로 사용할 수 있고, 작업의 총 마무리 시간이 상대적으로 짧다는 장점이 있지만, 설계가 복잡하다.
ex) a, b, c, d라는 4개의 작업을 처리해야 할 때
-a의 소요시간: 1분
-b의 소요시간: 2분
-c의 소요시간: 3분
-d의 소요시간: 4분
작업이 비동기적으로 이루어질 때 a, b, c, d 작업 모두 같이 실행되기 때문에 작업 소요시간이 가장 긴 d작업이 끝나는 4분이 작업이 모두 마무리되는 시간이다.
참고
https://babbab2.tistory.com/64
https://velog.io/@ryalya/iOS-CS-Study-Process-Thread
https://babbab2.tistory.com/63
[OS] 프로세스와 스레드의 차이 - Heee's Development Blog (gmlwjd9405.github.io)
'개린이 이야기' 카테고리의 다른 글
GCD(Grand Central Dispatch)와 DispatchQueue에 관하여 (1) | 2022.09.23 |
---|---|
직렬(Serial)과 동시(Concurrent) (0) | 2022.09.22 |
객체지향프로그래밍(OOP) (0) | 2022.09.20 |
AppDelegate와 Scene Delegate에 관하여 (0) | 2022.09.20 |
요리도감 프로젝트를 진행하면서 느낀점 (2) | 2022.09.19 |