Computer Science/운영체제

[운영체제] 04. Threads & Concurrency

lumana 2024. 6. 18. 23:54

 

 

스레드란 무엇인가?

웹 서버를 예시로 들어 설명할게요!

  • 웹 서버(Web server)
    • 웹 페이지를 제공하는 컴퓨터 프로그램

  • 웹 서버한 번에 많은 클라이언트를 서비스해야 합니다.
  • 웹 서버가 입출력(I/O) 작업을 수행하면?
    • 블록될 것입니다.
    • 다른 클라이언트의 요청을 처리할 수 없습니다.

  • 동시 서비스(concurrent service)를 위해 많은 서버 프로세스가 필요합니다.
    • 메모리 공간 낭비.
    • 프로세스를 생성하는 동안 delay 발생.

  • 스레드(Thread)가 필요합니다.
    • Code, data, and resources를 공유할 수 있습니다.
    • Register values and stacks은 공유할 수 없습니다.

 

Thread

  • CPU utilization의 기본 단위
  • 각 프로세스는 여러 스레드를 포함할 수 있습니다.

모든 프로세스의 스레드가 다음을 공유합니다.

  • code, data, heap
  • open files
  • signal handlers
  • working environment (현재 디렉터리, 사용자 ID 등)

 스레드는 고유의 것을 가집니다. (공유하지 않는 것)

  • stack
  • register
  • thread ID

Single and Multi-threaded processes

 

스레드 vs 프로세스

  • fork를 사용한  프로세스 생성은 비용이 많이 듭니다.
    • time & memory
  • 스레드는 많은 메모리나 시작 시간(startup time)이 필요하지 않습니다.
    • 때로는 lightweight process라고 합니다.

  • 응답성(Responsiveness)
    • 프로세스의 일부가 블록되더라도 계속 실행할 수 있습니다.
    • 예: 웹 서버는 한 스레드에서 다른 웹 클라이언트를 서비스하면서 다른 스레드에서 파일을 로드할 수 있습니다.
  • 리소스 공유(Resource Sharing)
    • 메모리와 리소스를 공유할 수 있습니다.
  • 경제성(Economy)
    • 프로세스 생성 및 context switching에 대한 오버헤드가 낮습니다.
  • 다중 프로세서 아키텍처(MP Architectures)의 활용
    • 다중 프로세서 아키텍처에서의 병렬성(Parallelism)이 증가합니다.

Multicore Programming(멀티코어 프로그래밍)

  • 멀티코어(multicore) 또는 멀티프로세서(multiprocessor) 시스템은 프로그래머에게 압박을 줍니다. 도전 과제는 다음과 같습니다:
    • Dividing activities
    • Balance
    • Data splitting
    • Data dependency
    • Testing and debugging
  • 병렬성(Parallelism)은 시스템이 동시에 둘 이상의 작업을 수행할 수 있음을 의미합니다.
  • 동시성(Concurrency)은 진행 중인 하나 이상의 작업을 지원합니다.
    • 단일 프로세서/코어에서 스케줄러가 동시성을 제공합니다.
  • 단일 코어 시스템에서 동시 실행(Concurrent execution)

  • 멀티코어 시스템에서 병렬성(Parallelism)

 

User threads vs. Kernel thread

User thread

  • 사용자 수준의 쓰레드 라이브러리(user-level threads library)에서 지원됩니다.
    • POSIX pthreads
    • Win32 threads
    • Java threads

Kernel thread

  • 운영 체제에 의해 직접 지원되고 관리됩니다.
    • Windows XP/2000
    • Solaris
    • Linux
    • Mac OS X

Linux threads

  • 쓰레드를 생성하기 위해 clone() system call이 사용됩니다.
  • Linux는 프로세스와 쓰레드를 구분하지 않습니다.

clone 플래그 세트는 부모와 자식 간의 공유 정도를 결정합니다.

  • 예시 1: clone(COLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND, 0)
    • 쓰레드에 가깝습니다.
  • 예시 2: clone(CLONE_SIGHAND, 0)
    • 프로세스에 가깝습니다.
flag meaning
CLONE_FS 파일 시스템 정보가 공유됩니다.
CLONE_VM 동일한 메모리 공간이 공유됩니다.
CLONE_SIGHAND 시그널 핸들러가 공유됩니다.
CLONE_FILES 열린 파일들이 공유됩니다.

 

clone(CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND, 0)