Basic CS(6)

WorldWannyWeb.·2021년 7월 5일
0

CS

목록 보기
6/7
post-thumbnail

2021-07-04

이전 글에서 우리는 thread에 대해서 알아보았다. 잠깐, Thread를 remind해보자.

Thread는 간단히 말해 Process내에 실행되는 실행단위이며, Process에게 Resource(code,data,heap)를 공유받고, 따로 stack을 할당받는다. Process 하나에 포함된 Thread들은 공동의 목적을 달성하려고 병렬로 수행한다. 대부분 다중 Thread 운영체제를 사용하고 프로그램 하나를 여러 실행 단위로 쪼개어 실행한다는 측면에서 다중 처리(Multi Processing)와 의미가 비슷하지만 동일 process의 thread는 resource를 공유하므로 자원 생성과 관리의 중복성을 최소화하여 실행 능력을 향상시킬 수 있다. 그리고 각 thread는 kernel이 개입하지 않고도 독립적으로 실행할 수 있어 서버에서 많은 요청을 효과적으로 처리할 수 있다.

thread의 장점은 아래와 같다.

  • Responsiveness(응답성): multi-threaded program인 경우 일부가 block되도 나머지는 계속 실행
  • Resource Sharing(자원공유): 같은 process의 thread는 resouce를 공유
  • Economy(경제성): process마다 메모리와 자원을 할당하면 overhead가 발생하는데 thread를 사용하면 비용이저렴해지며 context switch가 용이

위와 같은 Thread는 운영체제에 따라서 다양하게 구현할 수 있는 Thread type이 있다. 오늘은 Thread Type에 대해 알아보자.

1. Thread Type

Thread Type은 크게 두가지로 나눌 수 있다. User-levelKernel-level로 나뉘는데 생성 주체가 누구냐에 따라 구분된다. User mode에서 구현이 가능하고 User가 라이브러리를 통해 만들고 관리하는 Thread가 User-level Thread이고, Kernel mode에서 구현이 가능하며 OS의 커널이 만들고 관리하는 Thread가 Kernel-level Thread이다. 여기서 잠시 User mode와 Kernel mode를 짚고 넘어가보자.


User Mode / Kernel Mode

Kernel에서 중요한 자원을 관리하기 때문에, 사용자가 그 중요한 자원에 접근하지 못하도록 모드를 2가지로 나누었다.

User Mode

  • 유저(사용자)가 접근할 수 있는 영역을 제한적으로 두고, 프로그램의 자원에 함부로 침범하지 못함.
  • 여기서 코드를 작성하고, 프로세스를 실행하는 등의 행동을 할 수 있음. 유저 어플리케이션 코드가 유저모드에서 실행된다고 볼 수 있다.

Kernel Mode

  • 모든 resource(드라이버, 메모리, CPU 등)에 접근, 명령가능.
  • 유저모드와는 비교가 안되게 컴퓨터 내부에서 모든 것을 할 수 있다.

User와 Kernel Mode의 흐름

Process가 실행되는 동안에 process는 수없이 유저모드와 커널모드를 왔다갔다 하면서 실행된다.

(유저모드 -> 커널모드 요청)
Process가 유저모드에서 실행되다가 특별한 요청이 필요할때 system call을 이용해서 커널에 요청.

(커널모드 -> 유저모드로 반환)
system call의 요청을 받은 커널이 그 요청에 대한 일을 하고 결과값을 system call의 리턴 값으로 전해준다.

예를 들어 아래 그림을 보며 프로세스가 실행되고있는 중에 라이브러리 함수를 호출했다고 가정해보자.

그렇게되면 라이브러리 내부에서 system call을 호출하면서 커널모드로 넘어가고 system call에 대한 입력값이 커널로 전달이 되고 해당 일을 완료하고 커널에서 return을 해주면서 유저모드로 돌아가게 된다.


저 두가지 모드에서 Kernel Mode에서 구현가능한 Kernel-level Thread가 무엇인지, User Mode에서 구현가능한 User-level Thread가 무엇인지 순서대로 알아보자.

먼저, Kernel-level Thread부터 알아보자.

1-1. Kernel-level Thread(커널 수준 Thread)


커널 스레드(kernel thread)는 간단히 말해 커널이 직접 생성하고 관리하는 thread이다. 동시성을 더 저렴하게 만들기 위해 process의 실행 측면을 thread로 분리하고 OS가 process와 thread를 관리한다. 모든 thread 작업은 kernel에서 구현되며 OS는 시스템의 모든 thread를 예약한다. OS 관리 thread를 커널 수준 스레드 또는 경량 프로세스(Ligth Weight Process)라고 한다.

커널은 스레드에 대해 알고 관리하므로 런타임 시스템(thread 라이브러리)이 필요하지 않습니다. 각 프로세스의 스레드 테이블 대신 커널에는 시스템의 모든 스레드를 추적하는 스레드 테이블이 있습니다. 또한 커널은 프로세스를 추적하기 위해 기존 프로세스 테이블을 유지합니다. 운영 체제 커널은 스레드를 만들고 관리하기위한 시스템 호출을 제공합니다.


LWP?

LWP를 잠시 짚고 넘어가자면,
LWP(Light Weight Process)는 PCB를 가지는 경량화된 Process를 말한다. OS에 따라 thread와 동일시 되기도 하며, kernel thread에 연결되어 user thread를 연결하는 형태로 되어 있다.


위 그림과 같은 형태로 LWP가 kernel thread와 user thread를 연결하며 이와 같은 경우를 사용하면 Kernel thread와 LWP가 1:1로 연결되어 있기 때문에 각 thread는 다른 CPU를 할당받을 수 있다.


1-2. User-level Thread(사용자 수준 Thread)

Kernel-level Thread는 할당 및 초기화 할 상태가 훨씬 적기 때문에 프로세스보다 동시성을 훨씬 저렴하게 만든다. 그러나 세분화 된 동시성의 경우에는 여전히 오버 헤드가 너무 많고 시스템 호출이 필요하다. 이상적으로는 스레드 작업이 빠르고 프로그래머, 언어, 런타임 등의 요구를 지원하기 위해 일반적이어야 한다. 이러한 세분화 된 동시성을 위해 빠르고 저렴한 User-level Thread가 필요하다.

User-level Thread는 사용자 영역의 쓰레드 라이브러리(TCB(thread 제어 블록)를 가지고 있다)로 구현한다. thread와 관련된 모든 행위를 사용자 영역에서 하므로 kernel이 thread의 존재를 알지 못한다. 여기서 쓰레드 라이브러리는 쓰레드의 생성과 종료, 쓰레드 간의 메시지 전달, 쓰레드의 스케줄링과 컨텍스트 등 정보를 보관한다.

2. Multi Thread Model

멀티 스레드 모델은 User thread와 Kernel thread가 어떠한 형태로 매핑되는지에 따라 구분하는 모델이다.

2-1. Many-to-one Model(다대일) / User-level Thread


하나의 커널 스레드에 여러개의 사용자 스레드가 매핑되는 형태이다.

장점

  • 라이브러리가 직접 thread를 스케줄링하고 작업에 필요한 정보를 처리하기 때문에 context switching이 필요 없다.
  • 필요한 값만 저장하고 복구시키기 때문에 커널 모드로의 전환이 없기 때문에 빠르고 overhead가 작다.

단점

  • System Call 등으로 인해 kernel thread가 중단 되면 모든 thread가 중단 된다(프로세스 자체가 중단) 즉, 하나의 프로세스가 block될 경우 모든 user thread가 block 상태가 된다.
    => 이는 스레드 정보가 커널 영역에 없기 때문에 커널이 프로세스 단위로 중단 시키기 때문이다.
  • 여러개의 CPU를 동시에 사용할 수 없다. (CPU 코어의 병렬성을 활용하기 힘듬)
  • 사용자 스레드에서는 커널이 제공하는 기능을 사용할 수 없다. (보호 기능 같은 것을 제공받지 못하므로 보안에도 취약할 수 있다.)

2-2. One-to-one(일대일) / Kernel Level Thread


kernel thread 하나에 user thread 하나가 매핑되는 형태이다. Linux, Window에서 이런 구조를 사용한다.

장점

  • multi-processor에 의해 여러개의 CPU를 사용할 수 있다. (CPU 병렬성 활용)
  • 하나의 thread가 중단되도 다른 thread는 작업을 계속할 수 있다.
  • kernel이 제공하는 기능을 사용하므로 보안에 강하고 안정적으로 동작한다.

단점

  • thread 생성 개수가 제한된다. (커널 스레드가 한정되어 있기 때문에)
  • 커널 모드로의 전환이 필요하고 context switching시 발생하는 overhead 때문에 느리다.
  • kernel thread 생성이 많아져 자원이 많이 소요된다.

2-3. Many-to-many(다대다) / 멀티 레벨 스레드(Multi Level Thread)


User Level Thread와 Kernel Level Thread는 서로 반대되는 장단점들을 가지고 있는데 이 두 모델의 장점을 활용하여 유연하게 동작하는 방식이다.

M to N 형태로 여러 개의 User thread가 여러 개의 Kernel thread로 매핑되는 형태의 모델이다. 빠르게 동작해야 하는 thread는 User-level thread로, 안정적으로 움직여야 하는 thread는 kernel-level thread로 동작하게 한다.

profile
와니완의 월드와이드와니웹🐥

0개의 댓글