프로그래밍[Univ]/운영체제

[OS] Threads

Cloud Travel 2012. 4. 17. 16:29

* Threads

 - process를 만드는 것과 같이 여러개의 실행을 동시실행 하기 위한 방법

  (근본적으로 process를 만드는 것과는 다르다.)

 - 즉, 어떤 에플리케이션에서 여러개의 나눠진 Thread를 이용해 Multiple task를 구현하고 있다.

 - 프로세스를 생성하는 것과 다르게 가볍다.(코드가 단순해지고 효율이 증가한다)

    > 메모리 사용이 적고, Thread간 데이터를 주고 받는 것도 쉽다. 

 - 일반적으로 kernel은 multi-threaded방식을 사용한다.

    

   ※ 그림 중요!!


* Thread 사용으로 얻는 이득

 - 반응성이 빨라진다. (데이터에 access하거나 정보 교환이 편하다)

 - 쉽게 자원을 공유 할 수 있다. (같은 주소 공간을 사용한다)

 - 경제적이다.(빠르다. 손쉽게 할 수 있다. 적은 비용으로 생성 가능하다.)

 - scalability : 확정성이 쉽다.


* Multicore Programming 

 - Activity를 균형있게 나누고, 데이터를 나누고, 데이터간의 의존성을 고려하여 만들어야한다.

 - 테스팅과 디버깅이 힘들다.

   (프로그램 실행할때마다 CPU스케줄링에 따라서 값이 달라 질 수 있다.)

 - 이러한 문제를 포함하고 있어 multicore programming을 구현하기 힘들다.

 

* Multithreading models

 - Many-to-one

  > 많은 사용자 단계의 스레드를 하나의 커널에 연결한다.

 - One-to-one

  > 각각의 사용자 단계의 스레드가 하나의 커널과 맵핑된다.

  > 현재 보편화 되있으며 가장 많이 사용을 한다.

 - many-to-many

  > 많은 사용자 단계의 스레드가 여러개의 커널과 맵핑된다.

  > two-level model : mtm으로 연결을 하지만, 중요한 thread는 별도의 kernel을 주어 관리


* Thread library 

 - library로써 user space에서 구현하는 법과 kernel-level library를 사용해서 구현하는 방법으로 나뉜다.

 - POSIX Pthreads, Win32 threads, Java Threads로 나뉜다.(소스볼것)

  > Pthreads : User or kernel level

  > Win32 : kernel level

  > Java : depends on the host system


* Threading Issue

 - thread에서 프로세스 생성을 할시 어떻게 할 것인가?

  > 답은 정해지지 않는다. 만약 fork후에 exec로 thread를 변경하면 이는 완전히 다른 프로세스가 되기 때문에

     threads가 복제될 일이 없다. 하지만 thread가 단순히 fork되면 모두 복제될 필요가 존재하다.

 - Thread cancellation

  > Asynchronous cancellation : 해당 Thread를 순간적으로 죽인다.

                                              리소스 반납이 이뤄나지 않으며, 공유된 정보에 무언가를 writing할때 

                                              멈출 수도 있다.(Critical)

  > Deferred cancellation : 해당 Thread에게 사라질 것을 알려준다. Thread는 알아서 리소스를 반납하고 

                                      하던 일을 완료후 사라진다.

 - Signal handling

 - Thread Pools

  > Thread를 미리 여러개 생성해 둔 뒤에 thread 사용자가 올때 분배를 해주는 방식

  > 요청에 따라서 thread를 만드는 것보다 속도가 빠르다. 

  > 미리 생성한 thread양을 초과해서는 받기가 힘들다.

  > pool의 크기는 경험적인 선택이나 상황에 맞춰서 준비를 해둔다.