Python의 동시성-스레드
일반적으로 실은 일반적으로면이나 실크 직물로 된 매우 가늘고 꼬인 끈이며 옷 재봉 등에 사용됩니다. 스레드라는 용어는 컴퓨터 프로그래밍 세계에서도 사용됩니다. 자, 옷 재봉에 사용되는 실과 컴퓨터 프로그래밍에 사용되는 실을 어떻게 연관시킬까요? 두 스레드가 수행하는 역할은 여기서 비슷합니다. 옷에서 실은 천을 함께 잡고 다른쪽에는 컴퓨터 프로그래밍에서 스레드가 컴퓨터 프로그램을 잡고 프로그램이 한 번에 여러 작업을 연속적으로 실행할 수 있도록합니다.
Thread운영 체제에서 가장 작은 실행 단위입니다. 그 자체로는 프로그램이 아니라 프로그램 내에서 실행됩니다. 즉, 스레드는 서로 독립적이지 않으며 다른 스레드와 코드 섹션, 데이터 섹션 등을 공유합니다. 이러한 스레드를 경량 프로세스라고도합니다.
스레드 상태
스레드의 기능을 심층적으로 이해하려면 스레드의 수명주기 또는 다른 스레드 상태에 대해 배워야합니다. 일반적으로 스레드는 다섯 가지 상태로 존재할 수 있습니다. 다른 상태는 다음과 같습니다.
새 스레드
새 스레드는 새 상태에서 수명주기를 시작합니다. 그러나이 단계에서는 아직 시작되지 않았으며 리소스가 할당되지 않았습니다. 그것은 단지 객체의 인스턴스라고 말할 수 있습니다.
실행 가능
새로 태어난 스레드가 시작되면 스레드가 실행 가능해집니다. 즉 실행 대기 중입니다. 이 상태에서는 모든 리소스가 있지만 여전히 작업 스케줄러가 실행되도록 예약하지 않았습니다.
달리는
이 상태에서 스레드는 작업을 진행하고 실행할 작업 스케줄러가 선택한 작업을 실행합니다. 이제 스레드는 dead 상태 또는 non-runnable / wait 상태가 될 수 있습니다.
비 실행 / 대기
이 상태에서 스레드는 일부 I / O 요청의 응답을 기다리거나 다른 스레드의 실행 완료를 기다리고 있기 때문에 일시 중지됩니다.
죽은
실행 가능한 스레드는 작업을 완료하거나 그렇지 않으면 종료 될 때 종료 됨 상태가됩니다.
다음 다이어그램은 스레드의 전체 수명주기를 보여줍니다.
실의 종류
이 섹션에서는 다양한 유형의 스레드를 살펴 보겠습니다. 유형은 아래에 설명되어 있습니다-
사용자 수준 스레드
사용자 관리 스레드입니다.
이 경우 스레드 관리 커널은 스레드의 존재를 인식하지 못합니다. 스레드 라이브러리에는 스레드 생성 및 삭제, 스레드 간 메시지 및 데이터 전달, 스레드 실행 예약 및 스레드 컨텍스트 저장 및 복원을위한 코드가 포함되어 있습니다. 응용 프로그램은 단일 스레드로 시작됩니다.
사용자 수준 스레드의 예는 다음과 같습니다.
- 자바 스레드
- POSIX 스레드
사용자 수준 스레드의 장점
다음은 사용자 수준 스레드의 다양한 장점입니다.
- 스레드 전환에는 커널 모드 권한이 필요하지 않습니다.
- 사용자 수준 스레드는 모든 운영 체제에서 실행할 수 있습니다.
- 스케줄링은 사용자 레벨 스레드에서 애플리케이션에 따라 다를 수 있습니다.
- 사용자 수준 스레드는 빠르게 만들고 관리 할 수 있습니다.
사용자 수준 스레드의 단점
다음은 사용자 수준 스레드의 다른 단점입니다.
- 일반적인 운영 체제에서 대부분의 시스템 호출은 차단됩니다.
- 다중 스레드 응용 프로그램은 다중 처리를 활용할 수 없습니다.
커널 수준 스레드
운영 체제 관리 스레드는 운영 체제 코어 인 커널에서 작동합니다.
이 경우 커널은 스레드 관리를 수행합니다. 응용 프로그램 영역에는 스레드 관리 코드가 없습니다. 커널 스레드는 운영 체제에서 직접 지원됩니다. 모든 응용 프로그램을 다중 스레드로 프로그래밍 할 수 있습니다. 응용 프로그램 내의 모든 스레드는 단일 프로세스 내에서 지원됩니다.
커널은 프로세스 전체 및 프로세스 내의 개별 스레드에 대한 컨텍스트 정보를 유지합니다. 커널에 의한 스케줄링은 스레드 기반으로 수행됩니다. Kernel은 Kernel 공간에서 스레드 생성, 스케줄링 및 관리를 수행합니다. 커널 스레드는 일반적으로 사용자 스레드보다 생성 및 관리 속도가 느립니다. 커널 수준 스레드의 예는 Windows, Solaris입니다.
커널 수준 스레드의 장점
다음은 커널 수준 스레드의 다양한 장점입니다.
커널은 여러 프로세스에서 동일한 프로세스의 여러 스레드를 동시에 예약 할 수 있습니다.
프로세스의 한 스레드가 차단되면 커널은 동일한 프로세스의 다른 스레드를 예약 할 수 있습니다.
커널 루틴 자체는 다중 스레드가 될 수 있습니다.
커널 수준 스레드의 단점
커널 스레드는 일반적으로 사용자 스레드보다 생성 및 관리 속도가 느립니다.
동일한 프로세스 내에서 한 스레드에서 다른 스레드로 제어를 전송하려면 모드를 커널로 전환해야합니다.
스레드 제어 블록-TCB
스레드 제어 블록 (TCB)은 주로 스레드에 대한 정보를 포함하는 운영 체제 커널의 데이터 구조로 정의 할 수 있습니다. TCB에 저장된 스레드 별 정보는 각 프로세스에 대한 몇 가지 중요한 정보를 강조합니다.
TCB에 포함 된 스레드와 관련된 다음 사항을 고려하십시오.
Thread identification − 모든 새 스레드에 할당 된 고유 한 스레드 ID (tid)입니다.
Thread state − 스레드의 상태 (Running, Runnable, Non-Running, Dead)와 관련된 정보를 포함합니다.
Program Counter (PC) − 스레드의 현재 프로그램 명령을 가리 킵니다.
Register set − 계산을 위해 할당 된 스레드의 레지스터 값을 포함합니다.
Stack Pointer− 프로세스에서 스레드의 스택을 가리 킵니다. 스레드 범위 아래의 지역 변수를 포함합니다.
Pointer to PCB − 해당 스레드를 생성 한 프로세스에 대한 포인터를 포함합니다.
프로세스와 스레드의 관계
멀티 스레딩에서 프로세스와 스레드는 컴퓨터가 한 번에 둘 이상의 작업을 수행 할 수 있도록하는 동일한 목표를 가진 매우 밀접하게 관련된 두 용어입니다. 프로세스는 하나 이상의 스레드를 포함 할 수 있지만 반대로 스레드는 프로세스를 포함 할 수 없습니다. 그러나 둘 다 두 가지 기본 실행 단위로 남아 있습니다. 일련의 명령을 실행하는 프로그램은 프로세스와 스레드를 모두 시작합니다.
다음 표는 프로세스와 스레드 간의 비교를 보여줍니다-
방법 | 실 |
---|---|
프로세스가 무겁거나 리소스 집약적입니다. | 스레드는 프로세스보다 적은 리소스를 사용하는 경량입니다. |
프로세스 전환에는 운영 체제와의 상호 작용이 필요합니다. | 스레드 전환은 운영 체제와 상호 작용할 필요가 없습니다. |
여러 처리 환경에서 각 프로세스는 동일한 코드를 실행하지만 자체 메모리 및 파일 리소스가 있습니다. | 모든 스레드는 동일한 열린 파일 세트, 하위 프로세스를 공유 할 수 있습니다. |
한 프로세스가 차단되면 첫 번째 프로세스가 차단 해제 될 때까지 다른 프로세스를 실행할 수 없습니다. | 한 스레드가 차단되고 대기하는 동안 동일한 작업의 두 번째 스레드가 실행될 수 있습니다. |
스레드를 사용하지 않는 여러 프로세스는 더 많은 리소스를 사용합니다. | 다중 스레드 프로세스는 더 적은 리소스를 사용합니다. |
여러 프로세스에서 각 프로세스는 다른 프로세스와 독립적으로 작동합니다. | 한 스레드는 다른 스레드의 데이터를 읽거나 쓰거나 변경할 수 있습니다. |
상위 프로세스에 변경 사항이 있으면 하위 프로세스에 영향을주지 않습니다. | 메인 스레드에 변경 사항이 있으면 해당 프로세스의 다른 스레드 동작에 영향을 미칠 수 있습니다. |
형제 프로세스와 통신하려면 프로세스가 프로세스 간 통신을 사용해야합니다. | 스레드는 해당 프로세스의 다른 스레드와 직접 통신 할 수 있습니다. |
멀티 스레딩의 개념
앞서 논의했듯이 멀티 스레딩은 CPU가 여러 스레드를 동시에 실행하여 운영 체제 사용을 관리하는 기능입니다. 멀티 스레딩의 주요 아이디어는 프로세스를 여러 스레드로 분할하여 병렬화를 달성하는 것입니다. 보다 간단한 방법으로 멀티 스레딩은 스레드 개념을 사용하여 멀티 태스킹을 달성하는 방법이라고 말할 수 있습니다.
멀티 스레딩의 개념은 다음 예제를 통해 이해할 수 있습니다.
예
프로세스를 실행하고 있다고 가정합니다. 프로세스는 무언가를 쓰기 위해 MS 워드를 여는 것일 수 있습니다. 이 과정에서 하나의 쓰레드는 오픈 MS 워드에 할당되고 다른 쓰레드는 쓰기를 필요로합니다. 이제 우리가 무언가를 편집하고 싶다면 편집 작업 등을 수행하기 위해 다른 스레드가 필요하다고 가정합니다.
다음 다이어그램은 메모리에 여러 스레드가 존재하는 방식을 이해하는 데 도움이됩니다.
위의 다이어그램에서 모든 스레드가 자체 레지스터 세트와 로컬 변수를 포함하는 하나의 프로세스 내에 둘 이상의 스레드가 존재할 수 있음을 알 수 있습니다. 그 외에는 프로세스의 모든 스레드가 전역 변수를 공유합니다.
멀티 스레딩의 장점
이제 멀티 스레딩의 몇 가지 장점을 살펴 보겠습니다. 장점은 다음과 같습니다-
Speed of communication − 멀티 스레딩은 각 코어 또는 프로세서가 개별 스레드를 동시에 처리하므로 계산 속도를 향상시킵니다.
Program remains responsive − 한 스레드가 입력을 대기하고 다른 스레드가 동시에 GUI를 실행하기 때문에 프로그램이 응답 성을 유지할 수 있습니다.
Access to global variables − 멀티 스레딩에서 특정 프로세스의 모든 스레드는 전역 변수에 액세스 할 수 있으며 전역 변수에 변경 사항이 있으면 다른 스레드에서도 볼 수 있습니다.
Utilization of resources − 각 프로그램에서 여러 스레드를 실행하면 CPU를 더 잘 사용할 수 있고 CPU의 유휴 시간이 줄어 듭니다.
Sharing of data − 프로그램 내의 스레드가 동일한 데이터를 공유 할 수 있으므로 각 스레드에 대한 추가 공간이 필요하지 않습니다.
멀티 스레딩의 단점
이제 멀티 스레딩의 몇 가지 단점을 살펴 보겠습니다. 단점은 다음과 같습니다-
Not suitable for single processor system − 멀티 스레딩은 멀티 프로세서 시스템의 성능에 비해 단일 프로세서 시스템의 계산 속도 측면에서 성능을 달성하기 어렵습니다.
Issue of security − 프로그램 내의 모든 스레드가 동일한 데이터를 공유한다는 것을 알고 있으므로 알 수없는 스레드가 데이터를 변경할 수 있으므로 항상 보안 문제가 있습니다.
Increase in complexity − 멀티 스레딩은 프로그램의 복잡성을 증가시키고 디버깅이 어려워집니다.
Lead to deadlock state − 멀티 스레딩은 프로그램이 교착 상태에 도달 할 수있는 잠재적 인 위험을 초래할 수 있습니다.
Synchronization required− 상호 배제를 피하기 위해 동기화가 필요합니다. 이것은 더 많은 메모리와 CPU 사용률로 이어집니다.