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


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.