본문 바로가기
컴퓨터공학/운영체제

OS 4. Threads& Concurrency

by Jinger 2023. 4. 5.

서론

 3장에서 소개한 프로세스 모델은 한 프로세스가 하나의 제어 스레드로 프로그램을 실행한다고 가정하였다. 그러나 거의 모든 현대 운영체제는 한 프로세스가 다중 스레드를 포함하는 특성을 제공한다. 다중 CPU를 제공하는 최신 다중 코어 시스템에서 스레드 사용을 통한 병렬 처리의 기회를 식별하는 것이 점차 중요해진다.


스레드 개념(Thread concept)

 스레드(Thread)는 CPU 이용의 기본 단위이다. 스레드는 스레드 ID, 프로그램 카운터(PC), 레지스터 집합, 그리고 스택으로 구성된다. 스레드는 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션, 그리고 열린 파일이나 같은 운영체제 자원들을 공유한다. 전통적인 프로세스는 하나의 제어 스레드를 가지고 있다. 만약 프로세스가 다수의 제어 스레드를 가지면 프로세스는 동시에 하나 이상의 작업을 수행할 수 있다. 하나의 응용 프로그램이 여러 개의 비슷한 작업을 수행할 필요가 있는 상황들이 있다. 그 예로 웹서버가 있다.

웹 서버(Web server)

 웹서버는 웹 페이지를 전달하는 컴퓨터 프로그램으로 한 번에 많은 클라이언트를 서비스해야 한다. 하나의 웹 서버는 여러 개의 클라이언트들이 병행하게 접근할 수 있다. 만약 웹 서버가 단일 스레드 프로세스로 작동한다면, 자신의 단일 프로세스로 한 번에 하나의 클라이언트만 서비스할 수 있게 되어 클라이언트는 자신의 요구가 서비스되기까지 매우 긴 시간을 기다려야 한다.

 해결책으로 서버가 요청을 받아들이는 하나의 프로세스로 동작하게 하는 것이다. 즉, 서버에게 서비스 요청이 들어오면, 프로세스는 그 요청을 수행할 별도의 프로세스를 생성하는 것이다. 하지만 이와 같은 방식으로 프로세스를 생성하는 것은 스레드가 대중하되기 전에는 매우 보편적이었다. 프로세스 생성 작업은 매우 많은 시간을 소비하고 많은 자원(메모리 공간 낭비)을 필요로 하는 일이다. 하지만 새 프로세스가 해야 할 일이 기존 프로세스가 하는 일과 동일하다면 왜 이 많은 오버헤드를 감수해야 할까? 대부분은 그렇게 하는 것보다는 프로세스 안에 여러 스레드를 만들어 나가는 것이 더 효율적이다. 웹 서버가 다중 스레드화 되면, 서버 클라이언트의 요청은 listen 하는 별로의 스레드를 생성한다. 요청이 들어오면 다른 프로세스를 생성하는 것이 아니라, 요청을 서비스할 새로운 스레드를 생성하고 추가적인 요청을 listen 하기 위한 작업을 재개한다. 그리고 이 스레드들은 서로 코드, 데이터 및 리소스를 공유할 수 있지만 레지스터 값과 스택은 공유할 수 없다.

단일 및 다중 스레드 프로세스


Threads vs. processes

 fork를 사용하여 새로운 프로세스를 생성하는 것은 비용(시간과 메모리)이 많이 든다. 즉, 스레드에는 많은 메모리나 시작 시간이 필요하지 않는다. 그래서 스레드를 경량 프로세스(lightweight process)라고 한다.

다중 스레드 프로그래밍의 장점

  1. 응답성(Responsiveness): 대화형 응용을 다중 스레드화하면 응용 프로그램의 일부분이 봉쇄되거나, 응용 프로그램이 긴 작업을 수행하더라도 프로그램의 수행이 계속되는 것을 허용함으로써, 사용자에 대한 응답성을 증가시킨다. E.g. 파일이 다른 스레드에서 로드되는 동안 웹 서버는 한 스레드에서 다른 웹 클라이언트를 위해 서비스할 수 있습니다.
  2. 자원 공유(Resource Sharing): 메모리와 리소스를 공유할 수 있다. 코드와 데이터 공유의 이점은 한 응용 프로그램이 같은 주소 공간 내에 여러 개의 다른 작업을 하는 스레드를 가질 수 있다.
  3. 경제성(Economy): 스레드는 자신이 속한 프로세스의 자원들을 공유하기 때문에, 프로세스 생성 및 문맥 교환에 대한 오버헤드가 낮다.
  4. 규모 적응성(Scalabilty): 다중 스레드의 이점은 다중 처리기 구조에서 더욱 증가할 수 있다. 다중 처리기 구조에서는 각각의 스레드가 다른 처리기에서 병렬로 수행될 수 있기 때문이다. 이는 시스템이 확장될 가능성이 있는 경우 유용하다. 즉, 시스템의 규모가 증가하더라도 성능을 유지하거나 향상하는 데 유용하다.

   + MP 아키텍처 활용(Utilization of MP Architectures): 다중 프로세서 아키텍처에서 다중 스레드 프로그래밍을 사용하여 프로세서의 사용률을 최대화하는 것을 의미한다. 다중 스레드 프로그래밍을 사용하면 여러 개의 스레드가 서로 다른 프로세서에서 병렬로 실행될 수 있으므로, 시스템의 전체 프로세서 사용률을 높일 수 있다. 

다중 코어 프로그래밍(Multicore Programming)

 프로그래머에게 부담을 주는 멀티코어 또는 멀티프로세서 시스템은 다음과 같은 과제를 안고 있다.

  • 나누기 활동(Dividing activities)
  • 균형(Balance)
  • 데이터 분할(Data splitting)
  • 데이터 종속성(Data dependency)
  • 테스트 및 디버깅(Testing and debugging)

병행성과 병렬성의 차이점

 병행성(Concurrency)은 모든 작업이 진행되게 하여 둘 이상의 작업을 지원한다. 병렬성(Parallelism)은 둘 이상의 작업을 동시에 수행할 수 있다. 따라서 병렬성 없이 병행성을 가질 수 있다. 다중 처리기 및 다중 코어 아키텍처가 출현하기 전에 대부분의 컴퓨터 시스템에는 단일 프로세서만 있었으며 CPU 스케줄러 프로세스 간에 빠르게 전환해 각 프로세스가 진행되도록 하여 병렬성의 환상을 제공하였다. 이러한 단일 프로세스는 병행하게 실행되었지만 병렬로 실행되지 않았다.

단일 코어 시스템에서 병행 실행(Concurrent execution on single-core system):

다중 코어 시스템의 병렬성(Parallelism on a multi-core system):


다중 스레드 모델

User threads vs. kernel threads

  • 사용자 스레드(User thread)는 사용자 수준 스레드 라이브러리에서 지원된다. E.g. POSIX pthreads, Win32 threads, Java threads
  • 커널 스레드(Kernel thread)는 운영 체제에서 직접 지원하고 관리한다. E.g. Windows XP/2000, Solaris, Linux, Mac OS X

Linux’s threads

 리눅스 스레드는 clone() 시스템 호출은 스레드 생성에 사용된다. Linux에서는 프로세스와 스레드를 구분하지 않는다. 클론의 플래그 집합은 부모와 자식 간의 공유 정도를 결정한다.
예 1. clone(CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND, 0): 스레드에 근접
예 2. clone(CLONE_SIGHAND, 0): 프로세스에 근접

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


핵심

  • 스레드는 CPU 사용률의 기본 단위이다.
  • 각 프로세스는 많은 스레드를 포함할 수 있다.
  • 프로세스의 모든 스레드는 코드, 데이터, 열린 파일, 신호 처리기 등을 공유하지만 스레드 ID, 스택 및 레지스터는 공유하지 않는다.
  • 스레드는 응답성, 자원 공유, 경제성 및 MP 아키텍처 활용을 제공한다.
  • Linux는 프로세스와 스레드를 구분하지 않는다.
반응형

'컴퓨터공학 > 운영체제' 카테고리의 다른 글

OS 6. 동기화 도구(Synchronization Tools)  (0) 2023.04.06
OS 5. CPU 스케줄링  (0) 2023.04.06
OS 3. 프로세스 관리  (0) 2023.04.04
OS 2.운영 체제 구조  (0) 2023.04.03
OS 1.기본개념  (0) 2023.04.02

댓글