ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1067)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (180)
      • Unreal (69)
      • Unity (100)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • c#
  • 알고리즘
  • 프로그래머스
  • 백준
  • 파이썬
  • 티스토리챌린지
  • 배열
  • C++
  • 유니티
  • 오블완
  • 언리얼
  • SQL
  • 함수
  • C
  • Unity
  • 포인터
  • 클래스
  • 그래픽스
  • 문자열
  • string

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

CS/OS & 하드웨어

스레드 안전(Thread-Safety)란?

2023. 7. 27. 15:58

멀티 스레드 프로그래밍

  • 멀티스레드 프로그래밍은 하나의 프로세스에서 여러 개의 스레드를 만들어 자원의 생성과 관리의 중복을 최소화하는 것이다.
  • 장점
    • 멀티 프로세스에 비해 메모리 자원소모가 줄어든다.
    • Heap 영역을 통해서 스레드 간의 통신이 가능하기 때문에 프로세스 간의 통신이 간단해진다.
    • 스레드의 컨텍스트 스위칭은 프로세스의 컨텍스트 스위칭보다 훨씬 빠르다.
  • 단점
    • 힙 영역에 있는 자원을 사용할 때 동기화를 해야한다.
    • 동기화를 위해서 락을 과도하게 사용하면 성능 저하가 발생할 수도 있다.
    • 하나의 스레드가 비정상적으로 동작하면 다른 스레드도 영향을 받아 종료하게 될 수도 있다.

스레드 안전

  • 스레드 안전(Thread-Satety)란 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없는 것을 말한다.
  • 하나의 함수가 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 스레드에서의 함수의 수행 결과가 옳바르게 나오는 것을 말한다.
  • Thread-sate하다라는 의미는 두 개 이상의 스레드가 race condition에 들어가거나 같은 객체에 동시에 접근해도 연산 결과는 정합성이 보장될 수 있게 메모리 가시성이 확보된 상태이다.

스레드 안전의 여부 판단 방법

1. 전역 변수나 힙, 파일과 같이 여러 스레드가 동시에 접근할 수 있는 자원을 사용하는가?
2. 핸들과 포인터를 통한 데이터의 간접 접근이 가능한가?
3. 부수 효과를 가져오는 코드가 있는가?

스레드 안전을 지키기 위한 4가지 방법

  • Mutual Exclusion (상호 배제)
  • Atomic Operation (원자 연산)
  • Thread-Local Storage (쓰레드 지역 저장소)
  • Re-Entrancy (재진입성)

1) Mutual Exclusion( 상호 배제 )

  • 공유 자원에 하나의 Thread만 접근할 수 있도록 세마포어 / 뮤텍스로 락을 통제하는 방법이다.
  • 일반적으로 많이 사용하는 방법이다.
  • 적용 예시
    • Python은 Thread Safe하게 메모리를 관리하지 않아 GIL(Global Interpreter Lock)을 통해 Thread Safe를 보장한다.
    • Python에서 threading.lock이 있는데 threading.lock을 acqurie하면 해당 쓰레드만 공유 데이터에 접근할 수 있고 lock을 release해야만 다른 쓰레드에서 공유 데이터에 접근할 수 있다.

2) Atomic Operation (원자 연산)

  • 공유 자원에 접근할 때는 원자 연산을 이용하거나 원자적으로 정의된 접근 방법을 사용함으로써 상호 배제를 구현할 수 있다.
  • Atomic
    • 공유 자원 변경에 필요한 연산을 원자적으로 분리한 뒤에 실제로 데이터의 변경이 이루어지는 시점에 Lock을 걸고, 데이터를 변경하는 시간 동안 다른 쓰레드의 접근이 불가능하도록 하는 방법이다.
  • 적용 예시
    • a += b의 경우 먼저 +연산을 한 뒤에 = 연산을 함으로, 원자적이라고 볼 수 없다.

3) Thread-Local Storage (스레드 지역 저장소)

  • 공유 자원의 사용을 최대한 줄이고 각가의 쓰레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막는 방법이다.
  • 일반적으로 공유 상태를 피할 수 없을 때 사용하는 방식이며, 전역 변수 사용을 자제하라는 뜻으로 생각하면 된다.

4) Re-entrancy (재진입성)

  • 쓰레드 호출과 상관 없이 프로그램에 문제가 없도록 작성하는 방법이다.
  • 어떤 함수가 한 스레드에 의해 호출되어 실행 중이라면 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 옳바르게 주어져야 한다.
  • 쓰레드끼리 독립적으로 동작할 수 있도록 코드를 작성하는 것으로 생각하면 된다.
저작자표시 (새창열림)

'CS > OS & 하드웨어' 카테고리의 다른 글

Swapping 스와핑 ( page in, page out )  (0) 2023.08.24
CPU 스케줄링(Scheduling) 알고리즘 정리 및 요약 | FCFS, SJF, Round Robin  (0) 2023.07.29
시스템 구조와 프로그램 실행 2  (0) 2023.03.24
시스템 구조와 프로그램 실행 1  (0) 2023.03.19
PCB(Process Control Block)란?  (0) 2022.12.28
    'CS/OS & 하드웨어' 카테고리의 다른 글
    • Swapping 스와핑 ( page in, page out )
    • CPU 스케줄링(Scheduling) 알고리즘 정리 및 요약 | FCFS, SJF, Round Robin
    • 시스템 구조와 프로그램 실행 2
    • 시스템 구조와 프로그램 실행 1
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바