수면 실은 어떻게 작동합니까?


15

실 을 자면 실제로 무슨 일이 일어나고 있습니까?

스레드를 잠 자면 "현재 스레드가 지정된 시간 동안 일시 중지됩니다"라는 것을 알 수 있습니다. 그러나 어떻게 작동합니까?

에 따르면 내부적으로) (어떻게 Thread.sleep를 작품Thread.sleep를 정말 작업을 수행하는 방법? :

  • 수면 시간은 시스템에 따라 세분화됩니다.
  • 수면이 막히고있다
  • 스레드는 CPU를 떠나 실행을 중지합니다
  • 잠자는 동안 스레드가 CPU 시간을 소비하지 않습니다

나는 이것이 의미하는 바의 내부 및 기본 역학을 이해할 수 없습니다.

스레드 간 전환을 담당 하는 스케줄러 라는 것이 있음을 이해 합니다.

소스는 OS (또는 하드웨어에 따라 다름)에 따라 다르며 CPU가 다른 스레드로 전환하기 전에 일부 작업을 수행하기 위해 대부분의 스레드에 1ms-60ms 정도가 제공됩니다.

그러나 스레드가 잠 자면 (예 : 몇 초) 어떻게 다시 시작됩니까? 타이머가 어떻게 든 관련되어 있다고 생각합니다. 마더 보드의 시계입니까? CPU 클럭 속도와 관련이 있습니까?

그리고 타이머가 관련되어 있어도 CPU가 스레드에 다시주의를 기울여야 할 시점을 어떻게 알 수 있습니까? 스레드가 준비되어 있는지 지속적으로 확인하지 않아도됩니까? 효과적으로 폴링 하지 않으므로 CPU 시간 소비됩니까?

스레드 언어별로 휴면 상태입니까, 아니면 OS가 담당합니까? 아니면 CPU 관련입니까?

누군가 스케줄러와 같은 것들에 대한 기본 설명 과이 모든 과정에서 CPU가 무엇을하고 있는지 설명해 주시겠습니까?


2
휴면 스레드를 다시 깨우면 명령을 처리하는 CPU의 핵심 부분과 분리 된 하드웨어 구성 요소 인 인터럽트 클록에 의해 생성되는 시간이 지정된 인터럽트에 의해 다시 작동합니다. 이것은 폴링의 필요성을 피합니다. Quora에 대한이 설명은 다음 사항을 명확히 할 것입니다. quora.com/How-does-threading-work-at-CPU 수준
Doc Brown

1
대부분의 JVM은 실제로 멀티 스레딩을 구현 하지 않습니다 . 기본 운영 체제의 멀티 스레딩 기능 만 사용하면됩니다. 그것이 어떻게 작동하는지 정말로 알고 싶다면 운영 체제 디자인 주제에 관한 많은 책이 있습니다.
Solomon Slow

답변:


11

해당 프로그램 내의 코드보다 프로그램을 실행하는 데 훨씬 더 많은 관련이 있습니다.

다중 프로세스 OS에서 실행되는 모든 프로그램은 OS의 스케줄러 에 의해 제어 되며 스케줄러는 실행중인 프로세스, CPU주기가 사용 가능할 때 실행 대기중인 프로세스 및 심지어 그렇지 않은 프로세스를 나타내는 명시 적 테이블을 유지 관리합니다. 실행하려고합니다 (수면). 스케줄러는 일반적으로 우선 순위 및 실행 기록에 따라 짝수 크기의 시간 조각 을 프로세스에 할당합니다 . 궁극적으로이 루프는 일반적으로 메인 보드의 발진기에 의해 생성되는 하드웨어 인터럽트에 의해 구동됩니다.

슬리핑은 항상 실행될 언어 환경을 지원하기 때문에 프로그래밍 언어가 지원할 수있는 기능입니다. 정상적인 프로그램을 중단 할 수없는 자신을 단지 그것이 얼마나 스케줄러를 말할 수있는, 좋아 하고, 스케줄러는 그 소원을 만족 할 수있는 경우에도 항상 어떤 의무 수단 또는 것입니다 - 처리 할 수 있습니다. 랩탑이 닫혀서 최대 절전 모드로 전환되는 것을 생각하십시오. 메인 보드의 발진기는 계속 맥동하지만 스케줄러가 실행되고 있지 않기 때문에 우선 순위가 아무리 높아도 프로세스를 실행할 수 없습니다.


이것은 일반적으로 프로세스에는 적용되지만 스레드에 따라 항상 적용되는 것은 아니며 때로는 언어에 따라 다릅니다. 스레드는 OS와 독립적으로 구현 될 수 있으며 협력 적이거나 선제적일 수 있습니다. 예를 들어, Ruby에는 스레드 외에 "섬유"가 있습니다. 루비 섬유는 협력 적으로 예정되어 있습니다.
david25272

사실, 네이티브 스레드 만 이 이와 같이 작동합니다. 녹색 스레드는 바이트 컴파일 언어로 프로그램을 실행하는 VM에 의해 예약됩니다. 일반적으로 원시 스레드를 사용할 수 없거나 올바르게 스레드 안전하지 않은 코드를 실행할 때 사용됩니다 (VM은 때때로 다중 스레드 프로그램의 의미가 OS 스케줄러가 수행 할 수없는 방식으로 올바르게 유지되도록 보장 할 수 있음).
Kilian Foth

7

박사 브라운이 코멘트에 언급, 인터럽트 키,뿐 아니라 수면을위한 것입니다.

인터럽트는 프로세서가 수행중인 작업을 중지하고 코드를 실행해야한다는 하드웨어 신호입니다. 프로세서가주의를 기울여야하는 외부 장치 (예 : 디스크에서 데이터 읽기가 완료되었거나 키를 눌렀거나 마더 보드의 카운트 다운 타이머가 0에 도달 한 경우)를 트리거합니다.

인터럽트 처리 코드는 일반적으로 매우 작고 빠릅니다. 예를 들어, 디스크가 블록이 메모리에 복사되었다고 표시하면 OS는 해당 팩트를 "준비된 블록"목록에 기록한 다음 다른 작업으로 돌아갈 수 있습니다. CPU가 모든 시간을 인터럽트 처리 코드로 보내고 사용자 코드를 실행하지 않기를 원하지 않습니다.

반드시 작은 것은 아닌 인터럽트 구동 코드 중 하나 가 스케줄러입니다. 카운트 다운 타이머의 신호에 의해 트리거되며 시스템이 실행될 때마다 시스템 상태를 검사합니다. 여기에는 일반적으로 실행 준비가 된 프로세스 (예 : 대기중인 블록이 메모리에 도착했기 때문에)와 시간 조각을 소모 한 프로세스를 식별하는 것이 포함됩니다.

따라서 스레드 절전을 실행할 때 수행하는 작업은 OS에 (1) 타임 슬라이스를 포기하고 (2) 특정 시간이 경과 할 때까지 다시 깨워서는 안된다고 OS에 알리는 것입니다.

스케줄러가 실행될 때마다 스레드를보고 해당 시간이 경과 한 경우에만 "실행 준비"로 표시합니다. 이것은 일종의 폴링이지만 인터럽트에 의해 트리거되므로 "바쁜 루프"폴링이 아닙니다. 비싸지 않습니다. 일반적으로 한 번에 수천 개 정도의 스레드 만 실행됩니다.

이것은 또한 휴면 시간이 정확하지 않은 이유에 대한 아이디어를 제공해야합니다. 스레드를 실행할 준비가되면 아직 실행 중이고 시간 조각을 다 쓰지 않은 다른 스레드가있을 수 있습니다. 또는 실행할 준비가 된 우선 순위가 높은 스레드가있을 수 있습니다.


이것이 "현대"운영 체제의 작동 방식입니다. OS X 이전의 Windows 3 또는 Mac OS와 같은 이전 운영 체제에서는 프로세스가 운영 체제를 제어해야했습니다. 불행히도 프로그램이 루프에 걸리거나 교착 상태에 빠지면 제어권을 얻지 못할 수 있으며 전체 시스템이 중단됩니다.
david25272

@ david25272-1960 년대 선점 형 멀티 태스킹을 수행 한 시스템이 있었기 때문에 "이전"보다는 "단순"이라는 단어를 사용한다고 생각합니다. 그리고 협력적인 멀티 태스킹을 위해서는 활성 스레드가 프로세서 제어를 해제하기 위해 무언가를해야한다는 것이 사실이지만 (일반적으로 명시 적 수율이 아닌 차단 시스템 호출을 통해) 많은 범용 프로그래머가 있다고는 생각하지 않습니다. 오늘날 협동 스레딩 모델과 함께 OS를 사용하는 사람들.
kdgregory
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.