스레드(Threads)
5.1 개요
- 스레드(threads) : LWP( Light Weight Process)
- 전통적인 프로세스 : heavy Weight Process
- CPU이용의 기본 단위이다.
- 스레드는 스레드ID, 프로그램 카운터, 레지스터 집합, 스택으로 구성됨
- 같은 프로세스에 속한 다른 스레드와 코드, 데이터, 파일, 신호 등등의 운영체제 자원을 공유한다.
- 필요성 : 하나의 프로그램이 다양한 작업 실행을 요구 할때
ex) word processor, web browser, -> 다른 일
web server, -> 같은 일
RPC server, RMI server, kernel threads
-> 해결책 : multiple process -> 오버헤드가 크다
하나의 프로세스에 여러개 스레드 -> 효과적

5.2 장점(Benefits)
- 응답성(Responsiveness)
- 자원 공유(Resource Sharing)
- 경제성(Economy) - 스레드를 생성, Context Switching에서 Process복제보다 경제적
- 다중 처리기 구조의 활용(Utilization of multiprocessor architecture)
# 다중 처리기 구조에서는 각각의 스레드가 병렬로 처리될수 있다.
# 단일 처리기 구조에서는 병렬인것 같지만 실제로 한번에 하나의 스레드만 수행됨
5.3 사용자 및 커널 스레드(User and Kernel Thread)
- 스레드를 위한 지원은 사용자 스레드(user threads)를 위해서는 사용자 수준에서,
커널 스레드(kernel threads)를 위해서는 커널 수준에서 제공된다.
5.3.1 사용자 스레드(User Threads)
- 스레드 라이브러리에 의해 구현된다.
- 라이브러리는 커널의 지원 없이 유저 공간에서 스레드의 생성과, 스케줄링, 관리를 지원한다.
- 장점 : 생성과 관리가 빠르다.
- 단점 : 커널이 단일 스레드형 이라면 blocking system call을 수행하는 사용자 수준의 스레드는 다른 스레드가 있어도 프로세스 전체가 block된다.
- POSIX Pthreads, Java threads, Win32 threads
5.3.2 커널 스레드(Kernel Threads)
- 운영체제에 의해 직접 지원된다. (kernel이 지원해준다)
- 커널이 커널공간에서 스레드의 생성과, 스케줄링, 관리를 한다.
- 단점 : 생성과 관리가 느리다.
- 장점 : 스레드가 blocking system call을 수행하면 커널은 다른 스레드의 수행을 스케줄링 한다.
다중처리기환경에서는 스레드를 서로 다른 처리기에서 스케줄 할 수 있다.
- Windows XP/2000, Solaris, Linux, Tru64 UNIX(formerly digital UNIX), Mac OS X
5.4 다중 스레드 모델(Multithreading Models)
- 많은 시스템은 사용자스레드(User Threads)와 커널스레드(Kernel Threads)를 모두 지원한다.
- 다중 스레드 모델의 종료 -> (user threads)-to-(kernel threads)
# Many-to-One
# One-to-One
# Many-to-Many
5.4.1 Many-to-One 모델
- 많은 사용자 수준의 스레드를 하나의 커널 스레드로 맵한다.
- 장점 : 스레드관리는 사용자공간에서 행해진다. -> 효율적
- 단점 : 스레드가 blocking system call을 할 경우 전체가 block됨.
한번에 하나의 스레드만이 커널에 접근 -> 다중 스레드가 다중 처리기에서 작동 안됨.
- 커널스레드를 지원하지 않는 운영체제에서 사용된다.
- 커널은 스레드가 한 개인것 처럼 보임
- Solaris Green Threads, GNU Portable Thread

5.4.2 One-to-One 모델
- 사용자스레드를 각각 하나의 커널스레드에 맵한다.
- 장점 : 하나의 스레드가 blocking system call을 하더라도 다른 스레드가 작업 할 수 있다.
다중 처리기에서 다중 스레드가 병렬로 수행되는 것을 허용함.
- 단점 : 사용자스레드를 생성할 때 마다 커널스레드를 생성해야한다. ->성능저하 => 스레드 수 제한시킴
- Windows NT/XP/2000, Linux, Solaris 9 and later

5.4.3 Many-to-Many 모델
- 여러 개의 사용자 수준 스레드를 그보다 작거나 같은 수의 커널 스레드로 다중화(multiplex)한다.
- 개발자는 플요한 만큼 많은 사용자스레드를 생성하면 상응하는 커널스레드가 다중 처리기에서 병렬로 수행.
- 스레드가 blocking system call을 해도 다른 스레드로 스케줄 함.
- Window NT/2000, Solaris, IRIX, Digital UNIX

5.4.4. Two-Level 모델
- Many-to-Many의 변형이다.
- 사용자스레드가 커널스레드에 바인드 되는 것을 허용한다.
- 바인드된 스레드 : 사용자수준 스레드와 커널 스레드가 붙어서 스케줄링 되지 않고 계속 연결되어 있는 것

5.4.5 Threading Issues
- multithreaded 프로그램에서 fork()와 exec()시스템콜의 의미?
- fork()2가지 버전
# 모든 스레드 복제 -> fork - no exec
# 호출한 스레드만 복제 -> fork - exec
- exec()
단일 스레드 프로그램처럼 동작. -> 모든 스레드를 포함하는 프로세스로 대체 됨
5.4.6 Thread cancellation (스레드 해제(취소))
- 해제의 일반적인 목적 2가지
# 비동기 해제 : 타겟 스레드를 즉시 종료시킴
# 연기된 해제 : 타겟 스레드가 취소 되었는지 주기적으로 체크함
-> cancellation point는 안전한 해제를 위함이다.
5.4.7 Thread Pools -> 버퍼와 비슷??
- Muntithreaded server의 잠재적인 문제점
# 완료되면 버려질지도 모른다.
# 제한이 없는 스레드는 시스템자원을 다 써버릴 수도 있다.
- Thread Pool
# 프로세스가 시작하면 몇 개의 스레드를 pool에 만들어 놓는다.
# 서버가 요청을 받으면 스레드를 풀에서 깨운다
- 이점
# 요청을 받으면 새로 스레드를 만들 때 보다 약간 빠른 서비스를 해준다.
# 프로그램에서 허락한 스레드의 개수로 pool의 크기가 정해진다.
5.4.8 Thread Specific Data (??)
- 몇몇 상화에, 각 스레드가 자신의 많은 데이터의 복제를 할 지도 모를때-> thread specific data
- 프로세스에 스레드가 너무 많이 생기는 것을 조절하는 것이 없을 때 유용함.(thread pool사용시)
5.4.9 Scheduler Activations (스케줄러 활동시작)
- Many-to-Many모델에서 사용자스레드와 커널스레드 사이의 중간에 위치한다.
- user thread ---- LWP ---- kernel thread
M : 1 : 1
- CPU bound 프로그램은 1개의 LWP로도 충분함
- I/O bound 프로그램은 여러개의 LWP가 필요
- 커널이 스레드가 블록되는 등의 이벤트가 있을때 프로그램에게 알려준다. ->upcall

- LWP는 정확히 하나의 커널 스레드와 연결되어 있다.
- 커널 스레드는 LWP를 가지지 않고 동작하는 커널 스레드도 있다.(디스크요구서비스를 위한 스레드)
5.4 Pthreads
- POSIX의 스레드를 생성하고 동기화 하는 표준 API이다.
- Pthread library functions
# pthread_create()
# pthread_join() //스레드의 wait()같은것
# pthread_exit()
# pthread_attr_init()
5.5 Java Threads
- 언어 레벨에서 지원한다.
- 적어도 하나의 단일제어 스레드를 포함함
- 스레드생성
1. Thread class 상속
2. Runnable Interface 구현
- Java Thread States

참고 : Applied Operating System Concepts
작성 : satellite_k (http://blog.naver.com/satellite_k)
수정 : 2006.07.05 by 임헌정
http://www.4ellene.net

Comments List
醫
洹몃