프로세스(Process)와 스레드(Thread)
우리가 사용하는 운영체제는 스레드로 이루어진 프로세스들로 이루어져 있다.
프로세스(Process)란?
운영체제에서 할당하는 작업의 단위이다. 우리가 유튜브 뮤직을 들으며 인터넷 서핑을 하는 행위가
여러 프로세스를 동시에 실행하는 것이다.
프로세스 간에는 메모리 등의 자원을 공유하지 않는 등 서로 영향을 끼치지 않는다.
스레드(Thread)란?
프로세스 내에서 실행되는 흐름의 단위이다. 하나의 프로세스는 스레드를 여러 개 가질 수 있다.
스레드들은 부모 프로세스의 자원을 공유한다. 즉, 같은 메모리에 접근할 수 있다.
한 프로세스에서 여러 스레드가 자원을 공유하고 있기 때문에 잘못 구현하면 다른 스레드에도 치명적인 영향을 미쳐 전체적으로 프로세스가 오작동 하도록 만들 수 있으므로 잘 다루어야 한다.
쓰레드(Thread)들의 집합을 그림으로 표현을 하였다. 이것은 멀티스레드를 나타낸 그림이며
동기와 비동기를 먼저 설명 후, 싱글스레드와 멀티스레드의 설명은 아래에서 하겠다.
쓰레드 위에서 특정 작업(Task)들을 하는 모습.
작업 각각의 작업량이 적으면 위처럼 하나의 스레드에서 모두 처리해도 별로 상관이 없다.
하지만 이렇게 작업 하나하나의 작업량이 많은데 하나의 스레드에 모두 집어넣으면 굉장히 소요시간이 늦어진다.
따라서 작업을 다른 스레드로 보내 분산처리를 할 수 있다.
동기(Synchronous)란?
특정 메서드를 호출한 이후, 메서드가 완료될 때 까지 코드 실행이 차단됨.
예시 : 길을 걸어가다가 멈춰서서 휴대폰을 확인하고 다시 걷는다.
스레드의 그림으로 설명을 다시 해보면,
1. 작업을 다른 스레드로 보냄.
2. 쓰레드2의 Task1의 일이 모두 끝나면, 다시 메인쓰레드(쓰레드1)로 돌아가 Task2의 일을 시작한다.
여기서 Task1이 시작될 때 다른 스레드에서 작업을 하지 못하게 Block을 하고 Task1이 끝날 때 까지 기다린다.
비동기(Asynchronous)란?
메서드를 호출한 이후 해당 메서드가 완료되기를 기다리지 않고 다음 코드를 실행하는 것
예시 : 길을 걸어가면서 휴대폰을 본다.
마찬가지로 스레드들의 그림으로 설명을 다시 해보면,
1. 작업을 다른 스레드로 보냄.
2. 원래 Task1이 있던 자리에 다음 작업이 자리를 차지함.
그리고 여기서 스레드2의 Task1이 끝날 때 까지 기다리지 않고, 메인스레드(스레드1)의 Task2의 작업을 시작한다.
즉, 비동기 개념은 작업을 다른 곳으로 보내고 보낸 작업이 언제 끝나든지 관여하지 않고 자기 할 일을 하는 것이다.
간단 정리
비동기(Async) - 작업을 다른 스레드에서 하도록 시킨 후, 그 작업이 끝나는 것을 "기다리지 않고" 다음 일을 진행한다.
동기(Sync) - 작업을 다른 스레드에서 하도록 시킨 후, 그 작업이 끝나는 것을 "기다렸다가" 끝이 나면 다음 일을 진행한다.
싱글스레드/멀티스레드
싱글스레드 - 하나의 스레드로 동작하는 것
멀티스레드 - 여러개의 스레드로 동작하는 것
즉, 우리가 위에서 봤던 비동기와 동기의 예시는 모두 비동기식 멀티 스레드, 동기식 멀티 스레드의 예시 였던것이다.
총 정리를 하자면, 경우의 수가 총 4가지가 있다.
- 동기식 싱글 스레드 - 하나의 스레드로 동작하며 작업을 순차적으로 진행함
- 비동기식 싱글 스레드 - 하나의 스레드로 동작하지만 작업을 비동기식으로 진행함
- 동기식 멀티 스레드 - 위에서 설명
- 비동기식 멀티 스레드 - 위에서 설명
식당으로 예시를 들어보면,
1. 동기식 싱글 스레드
본점에서 음식을 주문 -> 조리 완료 -> 다음 주문받음
2. 비동기식 싱글 스레드
본점에서 음식을 주문 -> 조리 및 주문받기 -> 조리가 빠른 순서대로 제공
3. 동기식 멀티 스레드
본점, 1호점, 2호점 중 한곳에서 음식을 주문 -> 조리 완료 -> 다음 주문받음
4. 비동기식 멀티 스레드
본점, 1호점, 2호점 중 한 곳에서 음식을 주문 -> 조리 및 주문받기 -> 조리가 빠른 순서대로 제공
'C# 기초' 카테고리의 다른 글
[C#] delegate(델리게이트)와 event(이벤트) (0) | 2023.11.08 |
---|---|
[C#] async와 await 키워드 그리고 코루틴(Coroutine)과의 차이 (0) | 2023.10.31 |
[C#] dynamic과 default 키워드 (1) | 2023.10.30 |
[C#] sealed class (상속 금지)와 partial class (0) | 2023.10.25 |
[C#] 상속 - 인터페이스(interface) (0) | 2023.10.25 |