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

프로세스와 쓰레드, 동기와 비동기

by iOS 개린이 2022. 9. 21.

동기와 비동기 개념을 알기 전에 먼저 스레드와 프로세스가 무엇인지 파악하는 것이 좋다.

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://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://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)