본문 바로가기
KraftonJungle2기/Today I Learned

[TIL] Thread 개념 정리

by SooooooooS 2023. 5. 25.
728x90

1. 아침 문제 풀이

1. 26069번 - 붙임성 좋은 총총이

import sys

N = int(sys.stdin.readline())

dance = {'ChongChong' : 1}
for _ in range(N) :
    a, b = sys.stdin.readline().split()
    # 두 사람 중 한 사람만 춤을 추고 있는 경우를 나눠 dance 목록에 저장
    if a in dance and b not in dance:
        dance[b] = 1
    elif a not in dance and b in dance :
        dance[a] = 1

print(len(dance))

가볍게 Dictionary를 이용해 푼 문제

 


2. Thread

어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위
프로세스의 context 내에서 돌아가는 논리흐름

< 참고 > https://ko.wikipedia.org/wiki/스레드_(컴퓨팅)
  • 하나의 프로세스에 여러 개의 스레드가 돌아갈 수 있다.
    • 하나 이상의 실행 지점을 가지고 있다.
    • 독립적으로 불러 들여지고 실행될 수 있는 여러 개의 PC값을 가진다.
  • 커널에 의해서 자동으로 스케줄된다.
  • 고유의 정수 스레드 Id(TID), 스택, 스택 포인터, PC, 범용 레지스터 등으로 구성
  • 한 개의 프로세스 내에서 돌고 있는 모든 스레드는 이 프로세스의 전체 가상 주소 공유
    • 코드 영역, 데이터 영역, 운영체제 자원 공유
    • 동일한 값에 접근 가능하다.
  • 하나의 프로세스에 연계된 스레드들은 피어들의 풀을 구성하고 독립적으로 다른 스레드에 의해서 생성

스레드 문맥 전환
기본 스레드 구조

 


1. Thread Pool

작업 처리에 사용되는 스레드를 제한된 개수만큼 정해 놓고 작업 큐(Queue)에 들어오는 작업들을 하나씩 스레드가 맡아 처리하는 것
즉, 이는 관리 프로그램에 의해 동시 실행을 위해 작업이 할당되기를 기다리는 여러 스레드 유지
작업을 기다리는 스레드들의 집합이라고 할 수 있다.

https://en.wikipedia.org/wiki/Thread_pool

  • 프로그램 성능 저하 방지
    • 스레드를 생성/수거하는데 따른 부담은 프로그램의 전체적인 성능을 저하
  • 다수의 사용자 요청을 처리
    • 병목현상이 발생하는 I/O 작업, 데이터베이스 작업에서 주로 사용
    • 스레드가 아무리 빨리 생성되더라도 시스템 스케줄러에 의해 우선순위를 할당받아야 한다.

< 참고 >

🔗 https://velog.io/@hyunmoo0_0/스레드풀Thread-pool

🔗 https://velog.io/@haero_kim/Java-Thread-Pool-개념과-동작원리


2. multi thread

하나의 응용프로그램을 여러 개의 스레드로 구성하고, 각 스레드로 하여금 하나의 작업을 처리

< 참고 > https://ko.wikipedia.org/wiki/멀티스레딩

다중 스레드

  •  장점
    • 멀티 프로세스보다 적은 메모리 공간 차지 - 공유하는 부분이 존재하므로
    • 문맥전환(Context Switch)이 빠르다
      • Thread Control Block(TCB) : 스레드 제어 블럭
    • 공유 자원이 존재하여 통신 부담이 적다
    • 하나의 스레드가 일시 봉쇄되어도 다른 스레드는 수행을 계속 할 수 있으므로 사용자 응답성이 증가한다.
  • 단점
    • 스레드간 자원을 공유하기 때문에 하나의 스레드만 오류로 종료되어도 전체 스레드가 종료될 수 있다.
    • 동기화 문제 : 동일한 자원을 동시에 접근하는 작업을 실행

우리가 예상한대로 실행되면 올바른 값이 나온다.

실제로 두 스레드가 있을 때 어떤 스레드가 먼저 실행될지는 보장이 되지 않는다.

동시에 i 값에 접근을 했을 경우 원하는 값을 얻을 수 없다.

❗️경쟁 조건(race condition)❗️

둘 이상의 입력 또는 조작의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태

위의 이미지와 같이 스레드의 실행 조건에 따라 결과가 다르게 나올 수 있는 문제


3. 경쟁조건 해소하기

1. Lock(하드웨서 기반)

    : 공유 자원에 접근하는 프로세스는 Lock을 획득하고, 수행 후 접근을 빠져나올 때, Lock을 반납

2. Semaphores(소프트웨어 기반)

두 개의 원자적 함수로 조작되는 정수 변수
원자적이므로 한 프로세스(또는 스레드)에서 세마포어 값을 변경하는 동안 다른 프로세스가 동시에 이 값을 변경해서는 안 된다.
식사하는 철학자들 문제를 해결하는 고전적인 방법

< 참고 > https://ko.wikipedia.org/wiki/세마포어
  • counting semaphore : 가용 자원의 개수로 초기화되어 자원을 사용할 때마다 세마포가 감소하고 방출하면 세마포는 증가
  • binary semaphore : 세마포어 값으로 0 또는 1을 가져 한 개의 스레드만 접근할 수 있다.

❗️교착상태(Deadlock)❗️

프로세스(스레드)가 자원을 얻지 못해 다음 처리를 하지 못하는 상태
 시스템적으로 한정된 자원을 여러 곳에서 사용하려고 할 때 발생

교착 상태 예시

 

< 참고 >

🔗 https://student513.tistory.com/74

🔗 https://jwprogramming.tistory.com/12

728x90