[C#] Thread(스레드) < 더 추가할 예정 >

JanMatny·2024년 10월 17일
0

C#

목록 보기
2/15

운영체제와 프로세스

운영 체제

운영체제(OS, Operating System)는 컴퓨터 시스템의 자원들을 효율적으로 관리하며,
사용자가 컴퓨터를 편리하고, 효과적으로 사용할 수 있도록 환경을 제공하는
여러 프로그램의 모임이다.

운영체제는 컴퓨터 사용자와 컴퓨터 하드웨어 간의 인터페이스로서 동작하는
시스템 소프트웨어 의 일종으로, 다른 응용 프로그램이 유용한 작업을 할 수 있도록
환경을 제공한다.

대표적인 컴퓨터 운영체제

  • Windows(윈도우)
  • 리눅스(Linux)
  • 유닉스(Unix)

프로세스

운영체제 안에서 실행되는 프로그램으로 데이터 및 코드가
메모리에 적재되어 동작하는 것

  • 프로세스는 반드시 하나 이상의 Thread(스레드) 로 구성되어진다.
  • 윈도우에 실행되는 모든 프로그램을 프로세스라고 한다.

    스레드를 한개만 사용하는 것을 Single Thread(싱글 스레드)라고 하고
    여러 개의 스레드를 사용하는 것을 Multi Thread(멀티 스레드)라고 한다.


Thread(스레드)란?

운영체제가 CPU에 시간을 할당하는 기본단위
운영체제가 명령어를 실행하기 위한 스케줄링 단위

Multi Thread(멀티 스레드)의 장점

  • 동시에 여러 작업을 할 수 있다.

    싱글 스레드가 한 가지의 작업을 수행하는 과정에서 그 과정 중에서는 프로그램이 멈춘 것처럼 보일 것이다.
    멀티 스레드일 경우 한 가지의 작업을 수행하는 과정 중에서
    여러 가지 기능을 추가해줄 수 있다.

  • 데이터 공유가 쉽다.
    ( 프로그램끼리 데이터 공유를 위해서는 소켓 등 번거로운 구조가 필요하다. )
  • 메모리를 절약할 수 있다.

    스레드는 이미 프로세스 안에 생성되는 것이기에 새로운 프로세스를 생성하는 것보다
    훨씬 더 적은 메모리를 사용할 수 있다.

Multi Thread(멀티 스레드)의 단점

  • 구현이 복잡하다.
  • 소프트웨어 안전성이 떨어진다.

    프로세스 안에 있는 스레드에서 문제가 생길 경우 프로그램이 멈추게 된다.
    여러 스레드 중에서 하나라도 문제가 있으면
    프로그램이 멈추게 되어서 안전성이 떨어진다.

  • 성능이 저하된다.

Thread 용어

스레드를 골라서 cpu한테 어떠한 작업을 실행시키도록 명령.

컨텍스트 스위칭(Context switching) / 문맥교환 : CPU가 현재 실행 중인 스레드의 상태를 저장하고, 다음으로 실행할 스레드 상태를 불러와서 실행하는 과정

레이스 컨디션(Race Conditions) : 두개 이상의 스레드가 공유된 자원에 동시에 접근하려고 할 때 발생하는 문제

동기화 이슈(Synchronization Issues): 레이스 컨디션을 방지하기 위해 lock을 사용해서 공유 자원을 동기화하는 방식

데드락(Deadlock) : 스레드가 다른 스레드가 가진 락을 기다리고 있을 때, 데드락 발생


Thread 구현

Thread 기능을 사용하기 위해서는 using Threading; 선언이 필요하다.
자동적으로 유니티는 내부에 스레드가 있다[게임로직 스레드(Thread)]

Thread 기능

  • Thread.Sleep() : 현재 실행 중인 스레드를 지정한 시간 (밀리초) 만큼 일시적으로 중지

ThreadState(스레드 상태)

스레드 상태표 1 설명

  • Unstarted : 스레드 생성 후 Start() 메서드가 실행되기 전 상태
  • Running : 스레드가 시작하여 동작 중인 상태

스레드 상태표 2 설명

  • Suspended : 스레드 일시 중단 상태, Thread.Resume() 메서드 호출까지 대기

스레드 상태표 3 설명

  • WaitSleepJoin : 스레드 일시 중단 상태, 특종 조건까지만 대기 스레드 일시 중단 상태, 특종 조건까지만 대기
  • Monitor.Wait() : 현재 스레드를 대기 상태로 만들고 모니터를 해제
    • 특정 조건이 충족할 때까지 대기
  • Monitor.Pulse() : 대기 중인 스레드 중 하나를 깨움
    • 조건이 변경되었음을 알린다.
  • Monitor.PulseAll() : 대기 중인 모든 스레드를 깨움
    • 모든 대기 스레드에게 조건 변경을 알린다.

스레드 상태표 4 설명

  • Thread.Abort() : 메서드 실행 순간 조금 더 처리할 작업을 실행한 후 종료한다.
    [ ! ] 이것은 강제 종료이기에 위험할 수도 있다. 조심할 것.

스레드 상태표 5 설명
포그라운드 스레드(Foreground Thread)

  • 포그라운드 스레드는 프로세스 수명에 영향을 끼친다.
    • 진행중 중간에 죽어버리면 모든 포그라운드 스레드가 중간에 종료된다. [ 해당 프로세스가 꺼지게 된다. ]
  • 중간에 포그라운드 스레드가 다 종료되버리면 백그라운드 스레드와 상관 없이 프로그램이 종료된다.

    백그라운드 스레드(Background Thread)
  • 백그라운드 스레드는 몇개가 됬건 멈춰도 프로세스 수명에는 영향이 없다.
    • 포그라운드 스레드만 돌아가면 상관 X

[!] 유니티에서 게임 로직을 적용하기 위해선 스레드 대신에 일반적으로 코루틴을 이용한다.

profile
코딩 공부용 벨로그

0개의 댓글