Thread Scheduling

  • 컴퓨터의 여러 thread(작업들)가 CPU의 각 코어에서 언제 실행될지 결정하는 과정(참고로, 1개의 코어는 한번에 1개의 thread만 돌릴 수 있다. 단지, 매번 thread를 바꾸면서 실행해 동시에 많은 일을 하는 것처럼 보이는 것.)

  • 예를 들어, 게임을 하면서 음악을 들으면, 스케줄러가 게임 thread를 더 중요하게 생각하고 음악 스레드를 나중에 처리할 수 있다.

  • Thread의 우선순위(각 Thread마다 우선순위가 다르다)와 CPU 사용 상태를 고려해 thread를 배정한다.

Context Switching

  • Thread A가 CPU에서 실행 중일 때, Thread B로 바꾸려면 A의 상태(이런 Thread의 상태를 Context라 한다.)를 저장한다. 그런 다음, B의 상태를 불러와서 B가 실행을 이어간다
  • Context Switching이 자주 발생하면 시스템 성능이 떨어질 수 있다.

Time Slicing

  • Thread가 다음 Thread로 Context Switching 되기 사이의 time interval
  • 예를 들어, 게임 스레드가 1초 동안 실행되면, 그 다음 음악 스레드가 0.5초 동안 실행되고 다시 게임으로 돌아간다.
  • 시간 간격이 너무 짧으면 스레드가 자주 교체돼서 작업 효율이 떨어진다.

Thread Pool

  • 미리 여러 개의 thread를 만들어 두고 필요할 때마다 재사용하는 시스템.
  • 예를 들어, 웹 서버가 여러 명의 사용자가 동시에 접속할 때, thread pool에 있던 thread들이 재빠르게 각각의 요청을 처리한다.
  • 새로운 thread를 매번 만드는 것보다 성능이 훨씬 좋다.

Thread Safe

  • 여러 thread 가 동시에 같은 데이터를 사용해도 충돌 없이 안전하게 작동하는 코드
  • 예를 들어, 두 사람이 동시에 같은 파일에 글을 쓸 때, 서로의 글이 꼬여서 파일이 손상되지 않도록 관리하는 것이 중요하다.
  • 이를 위해 락(lock)과 같은 방법으로 thread를 동기화

Thread Safe하게 코드를 짠다는 것은?

  1. Lock, Mutex, Semaphore와 같은 동기화 도구들을 사용해서 여러 thread가 동시에 같은 자원에 접근하지 못하도록 해야 한다.
  2. Atomic 연산을 사용하여 특정 변수에 대한 연산이 중간에 다른 스레드로부터 방해받지 않도록 해야 합니다. Atomic 연산은 하나의 단일 단계로 이루어져, 중단 없이 안전하게 실행된다.
  3. 불변 상태 유지. 데이터를 변경할 필요가 없다면, 여러 스레드가 동시에 접근하더라도 문제가 없다.
  4. Thread 간 자원 공유를 최소화하는 것이 효과적입니다. Thread들이 각각 독립적으로 작업할 수 있도록 설계하고, 공유 자원이 필요한 부분을 최소화하면 충돌 위험을 줄일 수 있다.

Semaphore

  • 제한된 수의 thread만 자원에 접근할 수 있도록 관리하는 도구
  • 내부 Counter로 자원에 연결되어 있는 thread의 개수를 기록한다.
  • 예를 들어, 주차장에 3개의 자리가 있을 때, 3대의 차까지만 주차가능한 것처럼

Critical Section

  • 한 번에 오직 하나의 스레드만 특정 자원(예: 파일)에 접근할 수 있게 하는 code block 구역.
  • 예를 들어, 여러 스레드가 동시에 파일에 접근하면 파일이 손상될 수 있으므로, 먼저 접근한 스레드가 일을 끝낼 때까지 다른 스레드는 대기
  • Critical Section을 통해 race condition을 막을 수 있다.

Race Condition

  • 여러 스레드가 동시에 자원에 접근하면 실행 순서에 따라 결과가 달라질 수 있는 문제
  • 예를 들어, 두 사람이 동시에 은행 계좌에서 돈을 출금하면, 돈이 제대로 빠져나갔는지 꼬일 수 있음
  • 이를 방지하기 위해 자원에 접근하는 코드를 적절하게 보호해야 한다.

Session

  • 클라이언트와 서버가 연결된 상태를 말한다.
  • 예를 들어, 인터넷 쇼핑몰에서 사용자가 로그인해서 접속해 있는 동안, 세션이 유지되며 사용자의 정보가 연결된 상태로 저장
  • 세션은 일정 시간이 지나면 종료될 수 있으며, 서버에서 로그인 상태를 유지

Deadlock

  • 여러 스레드가 서로 자원을 기다리면서 멈춰버리는 상태
  • 예를 들어, 스레드 A가 자원 X를 사용 중인데 자원 Y가 필요하고, 스레드 B는 자원 Y를 사용 중인데 자원 X를 필요로 한다면 둘 다 멈추는 상황
  • 이를 방지하기 위해서는 자원을 요청하는 순서를 잘 관리해야 함

Spinlock

  • 자원이 사용 중일 때 다른 스레드가 자원을 기다리는 동안 계속해서 자원 사용을 시도하는 방식
  • 예를 들어, 자원이 잠깐만 필요할 때 스레드가 짧은 시간 동안 빠르게 시도하면서 기다림
  • 이 방식은 짧은 대기 시간에는 효과적이지만, 자원이 오래 걸리면 CPU를 낭비하게 된다.
profile
🏦KAIST EE | 🏦SNU AI(빅데이터 핀테크 전문가 과정) | 📙CryptoHipsters 저자

0개의 댓글