본 글은 요미들을 위한 설명입니다.
Thread 스레드
1. 간단한 개념
스레드는 운영체제에서 제대로 배우게 되는데, 프로세스 내의 작업 단위다. 일반적으로 하나의 프로세스는 한개의 스레드를 가지고 작업을 수행한다. 여러 개(멀티 스레드)일 수도 있다.
2. 커널 수준과 사용자 수준
커널수준과 사용자 수준이 있다. 대부분 일반적인 프로그래머가 사용하는건 사용자 수준 스레드이다.
커널 수준 : 하드웨어 수준? 으로 보면 쉽다. 커널 레벨에서 제어한다. 일반적으로 사용자가 하고싶다고 가능한 영역이 아니라는 것이다. 이 경우는 실제로 동시에 병렬적으로 수행이 가능하다.
Ex) 실제(real) 병렬성
Thread 1 ---------->
Thread 2 -------------->
ㄴ위의 예시를 보면 Thread 1과 2가 동시에 작업하는 부분이 있다. 실제로 동시에 작동이 가능하다.
커널 수준의 스레드를 사용해서 다중 스레드를 구현하면
이런 모양이 나온다. K스레드가 여러개 있다.
사용자 수준 (User level) : 어플리케이션에서 구현하고 관리한다. 커널 하나에 여러개가 위에 있다고 보면 된다.
Ex) 모조(pseudo) 병렬성
Thread 1 ----> ---->
Thread 2 ---> ---->
ㄴ이게 사용자 시점에서 봤을 때는 동시에 실행되는 것 같아보여도 프로세스가 스케줄링 하는대로 하나하나하나 돌아가면서 실행되는 방식이다.
아까 K스레드 하나에 여러개의 사용자 스레드가 있다.
다대다 스레드는 생략. 위의 개념을 이해하고 있다면 대충 보면 알게된다.
3.추가적으로 프로세스의 개념을 배워보자.
프로세서 : 간단하게 생각하자면 cpu라고 보면 된다. 하나의 프로그램을 수행하는 단위 ? 느낌이다.
프로세스 : 현재 실행중인 프로그램이고, 능동(active)적인 단위이다. 수동적(passive) 프로세스와는 다르다.
스레드를 위해 프로세스를 간단하게 설명하자면 cpu는 클럭 단위로 프로세스 연산을 수행한다(깊이 들어간다고 하면 꼭 그런 것만은 아니다. 멀티 프로세서와 같은 다중 처리기가 기본적으로 활성화 된 요즘, 하나의 프로세스를 여러개의 프로세서에서 실행하기 때문에(파이프 라이닝 :: 컴퓨터 구조 에서 자세하게 나온다. 스레드를 정말 완벽하게 이해하고자 한다면, 컴퓨터 구조와 운영체제를 확실하게 이해하고 배워야 한다.)
클럭단위로 수행되는 프로세스 P는 일반적으로 우리가 생각하는 프로그램(크롬, 각종 게임 등등)이 실제로 작동하기 위에서 프로세서 위에서 실행된다. 여기서는 크롬을 예로 들겠다.
크롬의 탭 단위는 하나하나가 프로세스이다. 즉 자원을 공유하지 않고(이것도 꼭 그런 것만은 아니지만 그렇다고 가정)
서로간의 독립된 메모리 영역을 지닌다. 프로세스 = 독립된 메모리 영역 이라고 보면 쉽다.
프로세서가 하나의 크롬 탭이면 스레드는 크롬 탭 하나의 여러가지 기능들 이다. 예를 들어보면 하나의 탭에서 페이지를 이동할 때 마다 웹 페이지 로딩, 자바 스크립트 실행, 렌더링이 병렬적으로 이루어지는데 프로세스 하나의 단위에서 여러개의 스레드가 일을 하는것이다.
스레드 예제코드
using System;
using System.Threading; //스레드 라이브러리 사용
class Program
{
public static void TestMethod()
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("1");
}
}
public static void Main()
{
Thread t = new Thread(TestMethod);
t.Start();
for (int i = 0; i < 100; i++)
{
Console.Write("2");
}
}
}
코드를 실행하면 11212112121 이런식으로 섞여서 출력된다.
위의 스레드 개념을 바탕으로
- 단일 스레드 — 동기
- 단일 스레드 — 비동기
- 멀티 스레드 — 동기
- 멀티 스레드 — 비동기
이 네가지 경우의 수가 만들어진다.
스레드의 개념을 확실히 알고 있다면, 동기 비동기 프로그래밍만 이해하면 저 네가지 경우가 전부 구분이 가능해진다.
동기(Synchronous)와 비동기(Asynchronous)는 어떤 작업을 수행할 때, 그 작업이 끝날 때까지 기다릴지, 아니면 다른 작업을 처리하면서 결과를 기다릴지를 나타내는 것입니다.
4.스레드 풀(ThreadPool)
프로세스에서 스레드를 만들었다 삭제하면 오버헤드가 발생한다. 따라서 일반적으로는 프로세스에 스레드 풀을 만들어
필요시 꺼내오고 작업이 끝날 시 스레드 풀에 되돌려 주는 방식으로 사용한다.
using System;
using System.Threading;
class Program
{
public static void Main()
{
ThreadPool.QueueUserWorkItem(TestThread);
ThreadPool.QueueUserWorkItem(TestThread,"Hi");
}
public static void TestThread(object arg)
{
Thread.Sleep(1000);
}
}
5.스레드 동기화 문제
하나의 스레드가 특정 자원을 점유했을 시 다른 스레드가 자원에 접근하려고 하면 문제가 생길 수 있다. 따라서 Mutex(Mutual Exclusion) , semaphore, Monitor 과 같은 기법으로 자원 접근을 막는 것이 필요하다. 스레드를 사용하기 전에 critical section or region 에 대해서 배우자. lock등의 키워드로 사용이 가능하다고 한다.
'프로그래밍 언어 > c#' 카테고리의 다른 글
C# 6.0 정리 (1) | 2023.04.24 |
---|---|
C# abstract class, Interface (0) | 2023.04.24 |
c# Reflection, Attribute (0) | 2023.04.23 |
c# 유니티에서 코루틴(Coroutine)이란 ? (0) | 2023.04.23 |
c# using문은 무엇인가 (0) | 2023.04.23 |