1.개요(Overview)

-응용체제는 다중 프로세스를 포함하는 특성을 제공한다. 

-스레드는 CPU 이용의 기본 단위이다.

-스레드는 스레드 ID, 프로그램  카운터, 레지스터 집합, 그리고 스택으로 구성된다.

-스레드는 같은 프로세스에 속한 다른 스레드와 운영체제 자원들을 공유한다. 

-밑의 그림은 단일 스레드 프로세스와 다중 스레드 프로세스의 차이점을 보여주고 있다.

Abraham Silberschatz , Peter B. Galvin, Greg Gagne Operating System Concepts 지음 | 조유근, 고건, 김영찬, 박민규 옮김 | 홍릉과학출판사 | 2013년 02월 15일 출간, p.170



1-1.동기(Motivation)

-스레드가 대중화되기 전에는 요청마다 별개의 프로세스를 생성하는 것이 보편적이었다. 예를 들어, 웹 서버에 여러 클라이언트가 서비스 요청을 하면 서버는 그 요청을 실행할 프로세스를 생성했다. 하지만 프로세스 생성 작업은 매우 많은 시간을 소비하고 많은 자원을 필요로 한다. 하지만 새 프로세스가 할 일이 기존 프로세스가 하는 일과 동일하다면 프로세스 안에 여러 스레드를 만들어 나가는 것이 더 효율적이다. 


1-2.장점(Benefits)

a.응답성(responsiveness): 사용자에 대한 응답성을 증가시킨다. 

b.자원 공유(resource sharing): 프로세스는 공유 메모리 또는 메시지 전달 기법을 통해서만 자원을 공유할 수 있다. 그러나 스레드는 자동적으로 그들이 속한 프로세스의 자원들과 메모리를 공유한다. 

c.경제성(economy): 프로세스보다 메로리와 자워 할당하는 비용이 적다. 

d.규모 가변성(scalability): 다중 처리기 구조에서 각각의 스레드가 다른 처리기에서 병렬로 처리 가능


1-3.다중코어 프로그래밍

-다중코어 시스템에서 프로그래밍 시 생각해야 할 이슈

a.작업 나누기 b.균형 c.데이터 분석 d.데이터 종속성 e.시험 및 디버깅


2.다중 스레드 모델(Multithreading Models)

-스레드는 사용자 수준에서 제공되는 사용자 스레드와 커널 수준에서 제공되는 커널 스레드가 있다. 

이 두 스레드는 일반적으로 3가지 방법으로 제공된다. 


2-1.다대일 모델(Many-to-One Model)

-효율적이긴 하지만 한 스레드가 봉쇄형 시스템 호출을 할 경우 전체 프로세스가 봉쇄된다.

Abraham Silberschatz , Peter B. Galvin, Greg Gagne Operating System Concepts 지음 | 조유근, 고건, 김영찬, 박민규 옮김 | 홍릉과학출판사 | 2013년 02월 15일 출간, p.174


2-2.일-대-일 모델(One-to-One Model)

-다대일 모델보다 더 많은 병렬성을 제공한다. 

-단점은 사용자 수준 스레드 생성시 그에 따른 커널 스레드를 생성해야 한다는 점이다.

Abraham Silberschatz , Peter B. Galvin, Greg Gagne Operating System Concepts 지음 | 조유근, 고건, 김영찬, 박민규 옮김 | 홍릉과학출판사 | 2013년 02월 15일 출간, p.174


2-3.다-대-다 모델(Many-to-Many Model)

-다대일 모델은 한번에 하나의 스레드만이 커널에 의해 스케줄되기 때문에 진정한 동시성을 획득할 수 없다. 

-일대일 모델은 개발자가 한 응용내에 너무 많은 스레드를 생성하지 않도록 주의해야한다. 

-다대다 모델은 위의 2가지 문제점을 어느 정도 해결했다. 

Abraham Silberschatz , Peter B. Galvin, Greg Gagne Operating System Concepts 지음 | 조유근, 고건, 김영찬, 박민규 옮김 | 홍릉과학출판사 | 2013년 02월 15일 출간, p.175



3.스레드 라이브러리(Threads Library)

-스레드 라이브러리는 프로그래머에게 스레드를 생성하고 관리하기 위한 API를 제공한다. 

-스레드 라이브러리를 구현하는 데에는 주된 두 가지 방법이 있다. 

a.커널의 지원 없이 완전히 사용자 공간에서만 라이브러리를 제공

b.운영체제에 의해 지원되는 커널 수준 라이브러리를 구현하는 것이다. 

-현재 a.POSIX Pthreads b.win32 c.JAVA의 세종류 라이브러리가 주로 사용된다. 이 중에서 JAVA 스레드 라이브러리를 이용한 기본적인 스레드 생성에 대한 내용만 정리해 보았다. 


3-1.JAVA(JAVA Threads)

-스레드는 JAVA 프로그램의 프로그램 실행의 근본적인 모델이고 JAVA 언어와 API는 스레드의 생성과 관리를 지원하는 풍부한 특성을 제공한다. 모든 JAVA 프로그램은 적어도 하나의 단일 제어 스레드를 포함하고 있다. 

-JAVA프로그램에서 스레드를 생성하는 기법에는 두 가지가 있다. 

a.Thread 클래스로부터 파생된 새로운 클래스를 생성하고 Thread 클래스의 run()메서드를 무효화(Override)하는 것이다. 

b.Runnable 인터페이스를 구현하는 클래스를 정의하는 것이다. 

Runnable 인터페이스는 다음과 같이 구현한다. 

public interface Runnable

{    

public abstract void run();

}

run() 메서드를 구현하면 별도의 스레드로서 실행된다.

-Thread 객체를 생성하는 것은 구체적으로 말하면 새로운 스레드를 생성하는 것은 아니다. 오히려, 새로운 스레드를 실제로 생성하는 것은 start()메서드이다. start메서드를 호출하면 다음과 같은 두가지 작업을 실행한다. 

a.메모리가 할당되고, JVM 내에 새로운 스레드가 초기화된다. 

b.run() 메서드를 호출하면 스레드가 JVM에 의해 실행대로 자격을 갖게 된다. (단, 절대 run()을 직접 호출하면 안된다. start()를 호출하면 start()가 run()을 대신 호출할 것이다.)

-Win32와 Pthreads에서는 공유 데이터가 단순히 전역 변수로 선언되기 때문에 스레드 간의 데이터 공유를 쉽게 할 수 있다. 그러나 JAVA는 객체 지향 언어이기 때문에 전역 변수의 개념을 제공하지 않는다. JAvA에서 스레드간 데이터 공유를 할려면 공유 객체에 대한 참조를 전달해야 한다. 

-부모 스레드가 더 이상 진행하기 전에 자식 스레드가 끝나기를 기다리기 위해 join()메서드를 사용한다. 


4.스레드와 관련된 문제들(Threading Issues)

-다중 스레드 프로그램에서 고려해야 할 몇몇 문제들을 논의한다. 


4-1.Fork() 및 Exec() 시스템 호출

-한 프로그램의 스레드가 fork()를 호출하면 새로운 프로세스는 모든 스레드를 복제해야 하는지 아니면 한 개의 스레드만 복제해야 하는지로 나뉜다. 

-exec()를 호출하면 exec()의 매개변수로 지정된 모든 스레드를 포함한 전체 프로세스를 대체시킨다. 

-즉, fork() 후 바로 exec()를 부른다면 exec()의 매개변수로 지정한 프로그램이 모든 것을 대체 할 것이기 때문에 호출한 스레드만 복사해주는 fork()가 적절하다. 그러나 fork() 후 exec() 하지 않으면 모든 스레드를 복제해야 한다. 


4-2.취소(Cancellation)

-스레드 취소는 스레드가 끝나기 전에 그것을 강제로 종료시키는 작업을 말한다. 

-취소하려는 or 취소되어야 하는 스레드를 목적 스레드(target thread)라고 부른다. 

-목적 스레드의 취소 방법은 두 가지 방식이 있다. 
    a.비동기식 취소(asynchronous Cancellation): 한 스레드가 목적 스레드를 즉시 강제종료

    b.지연 취소(deferred Cancellation): 목적 스레드가 주기적으로 자신이 강제종료 해야하는지를 검사한다. 

-스레드 취소는 할당된 자원들 때문에 신중해야한다. 


4-3.신호처리(Signal Handling)

-신호는 UNIX에서 프로세스에게 어떤 사건이 일어났음을 알려주기 위해 사용된다. 

-신호는 다음과 같은 형태로 전달된다. 

a.신호는 특정 사건이 일어나야 생성된다. 

b.신호가 생성되면 프로세스에게 전달된다.

c.신호가 전달되면 반드시 처리되어야 한다. 

-모든 신호는 둘 중 하나의 처리기에 의해 처리된다. 

a.디폴트 신호 처리기

b.사용자 정의 신호 처리기

-다중 스레드 프로그램에서 어느 스레드에게 신호를 전달하는가는 다음과 같은 선택이 존재한다. 

a.신호가 적용될 스레드에게 전달한다. 

b.모든 스레드에게 전달한다. 

c.몇몇 스레드들에게만 선택적으로 전달한다. 

d.특정 스레드가 모든 신호를 받도록 지정한다. 


4-4.스레드 풀(Thread pools)

-다중 스레드 서버의 문제점은 다음과 같다. 

a.서비스마다 스레드 생성에 소요되는 시간이 있다. 

b.동시에 가능한 최대 스레드 수의 한계를 정해야 한다. 

-이러한 문제 해결을 해주는 방법의 하나로 스레드 풀을 꼽을 수 있다.
-스레드 풀의 기본 골조는 일정한 수의 스레드를 만들어 두고 요청이 오면 할당하고 끝나면 반환하고 모자르면 기다리는 것이다. 

-스레드 풀의 장점

a.새 스레드를 만들기보다 기존 스레드로 서비스해 주는 것이 더 빠르다.

b.스레드 풀은 임의 시각에 존재할 스레드 개수에 제한을 둔다. 이러한 제한은 많은 수의 스레드를 병렬 처리할 수 없는 시스템에 도움이 된다. 


4-5.스레드별 데이터(Thred-Specific Data)

-한 프로세스에 속한 스레드들은 그 프로세스의 데이터를 모두 공유한다. 그러나 상황에 따라 각 스레드가 자신만 사용가능한 데이터를 가져야 할 필요도 있다. 그러한 데이터를 스레드별 데이터라 부른다. 


4-6.스케줄러 액티베이션(Scheduler Activations)

-스레드 라이브러리와 커널의 통신도 고려해야할 문제이다. 

-사용자 스레드 라이브러리와 커널 스레드 간의 통신 방법 중 하나는 스케줄러 액티베이션이란 방법이다.  

'IT > 운영체제' 카테고리의 다른 글

CPU스케줄링  (0) 2016.12.20
프로세스(process)  (0) 2016.11.24
운영체제(operating system)이란?  (0) 2016.11.23
운영체제 포스팅에 앞서...  (0) 2016.11.23

+ Recent posts