안녕하세요!
게임개발자가 되기위해 공부하고있는 구구입니다.
오늘은 C#의 쓰레드에 대해 알아보도록 하겠습니다.
- 프로그램
- 실행되기를 기다리는 코드(명령어)의 집합
- 보조기억장치(HDD, SSD)에 존재
- 프로세스
- 현재 실행중인 프로그램
- 스케줄링 : 생성 > 준비 > 실행 > 대기 . . . > 종료
- 멀티태스킹(스케줄링 과정에서 어떠한 프로그램이 대기상태일때 다른 프로그램을 실행하고 이러한 과정의 연속)
- 프로세스는 프로그램에 사용되는 데이터, 메모리, 스레드 등으로 구성
- 실행 중
- 보조 기억장치에 있던 프로그램이 메모리(RAM)에 적재되어 있고 프로세서가 실행 or 실행 예정인 상태
- 프로세서
- 하드웨어관점 : CPU(중앙연산처리장치)
- 소프트웨어관점 : 인터프리터, 컴파일러, 어셈블러 등을 총칭
인터프리터 : 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경
컴파일러 : 특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로 옮기는 언어 번역 프로그램
어셈블러 : 어셈블리어를 기계어 형태의 오브젝트 코드로 해석해 주는 컴퓨터 언어 번역 프로그램
- 쓰레드(Thread)
- 프로세스 내에서 실제로 작업을 수행하는 주체
- OS가 CPU 시간을 할당하는 기본단위
- 모든 프로세스는 하나 이상의 스레드로 구성
- 메인 쓰레드 : 윈도우가 프로세스 생성할때 기본적으로 한개의 스레드 생성
(이후 컴파일된 코드를 메인쓰레드가 순차적으로 처리)
- 쓰레드 문맥 : CPU의 명령어 실행과 관련된 정보 보관
- Thread 생성
1. 매개변수가 없는 ThreadStart delegate
- Thread _thread = new Thread(RunThread);
- // RunTread는 매개변수가 없는 함수
2. 매개변수가 int형인 경우 -> 람다식 이용
- Thread _thread2 = new Thread(() => RunThread(1));
3. 매개변수가 있는 ParameterizedThreadStart(object obj);
- Thread thread2 = new Thread(new ParameterizedThreadStart(RunThreadObject));
- //RunThreadObject는 매개변수가 object형인 함수
우선 RunThread라는 함수를 매게변수를 달리해서 총 3개를 만듭니다.
함수 속 내용은 대부분 똑같은데 Stopwatch.StartNew()라는 Stopwatch클래스의 StartNew라는 함수를 사용합니다.
Stopwatch 인스턴스를 초기화하고 경과 시간 속성을 0으로 설정한 다음 경과 시간 측정을 시작합니다.
이 Stopwatch를 사용하게 위해서 using System.Diagnostics;를 추가하였습니다.
Thread 클래스의 인스턴스를 생성하는데 이때 파라미터로 delegate를 받는 생성자를 통해서 생성합니다.
그리고 마지막에는 파라미터로 ParameterizedThreadStart(object obj)를 받는데 ParameterizedThreadStart도 delegate이기 때문에 object형을 파라미터로 받는 함수 콜했습니다.
진짜 Thread가 아닌 단순히 함수를 call해서 보게되면 우리가 생각하는 것 대로 순차적으로
RunThread();
RunThread(1);
RunThread(2);
의 순서대로 함수가 call이 됩니다.
하지만 Thread 클래스를 통해 사용하는 Thread의 경우
각각의 Thread가 실행되고나서는 CPU가 알아서 CPU시간이 할당되는 시간 외에 대기시간에 다른 Thread들이 병렬로 실행됩니다.
오늘은 여기까지 하도록 하겠습니다.
댓글