문제

그냥 궁금합니다. 실제로 함수 수면 ()는 어떻게 작동합니까 (Windows.h에서 선언)? 어쩌면 그 구현뿐만 아니라 다른 사람 일 수도 있습니다. 그 말은 - 어떻게 구현됩니까? 특정 시간 동안 코드를 "정지"하는 방법은 무엇입니까? 또한 Cin >>와 실제로는 궁금합니다 일하다. 그들은 정확히 무엇을합니까?

내가 계속 실행되는 것을 "차단"하는 방법을 아는 유일한 방법은 while 루프를 사용하는 것이지만, Stdin에서 읽을 수있는 방법을 호출 할 때 일어나는 일과 비교하여 엄청난 양의 처리 능력을 취하는 것을 고려하십시오 (그냥 비교하십시오. Stdin에서 읽은 시간 (True)에 대해, 나는 그들이하는 일이 아니라고 생각합니다.

도움이 되었습니까?

해결책

OS는 스케줄러라는 메커니즘을 사용하여 모든 스레드 또는 프로세스를 잘 관리하는 스레드 또는 프로세스를 잘 유지하는 데 잘 어울립니다.

초당 여러 번, 컴퓨터의 하드웨어 시계가 CPU를 방해하여 OS의 스케줄러가 활성화됩니다. 그런 다음 스케줄러는 실행하려는 모든 프로세스를보고 다음에 슬라이스 할 때 어떤 프로세스를 실행하는지 결정합니다.

결정에 다른 것들은 각 프로세스 상태와 이전의 시간에 따라 다릅니다. 따라서 현재 프로세스가 CPU를 크게 사용하여 다른 프로세스가 진행되는 것을 방지하면 현재 프로세스가 대기하고 다른 프로세스에서 스왑되어 일부 작업을 수행 할 수 있도록합니다.

그러나 더 자주, 대부분의 프로세스는 대기 상태에있을 것입니다. 예를 들어, 프로세스가 콘솔에서 입력을 기다리는 경우 OS는 프로세스 정보를보고 어떤 IO가 기다리고 있는지 확인할 수 있습니다. 해당 포트에서 프로세스 작업에 대한 데이터가 있는지 확인할 수 있습니다. 그렇게한다면 프로세스를 다시 시작할 수 있지만 데이터가 없으면 현재 Timeslice를 위해 해당 프로세스가 건너 뜁니다.

에 관해서 sleep(), 모든 프로세스는 OS에 잠시 기다려야한다는 것을 알릴 수 있습니다. 그런 다음 스케줄러는 하드웨어 인터럽트가 발생하기 전에 활성화됩니다 (이는 프로세스가 데이터를 읽을 준비가없는 스트림에서 블록 읽기를 수행하려고 할 때 발생합니다). OS는 프로세스의 내용을 기록합니다. 기다리고 있습니다. 수면을 위해, 프로세스는 알람이 꺼지기를 기다리고 있거나 타이머가 올라갈 때까지 다시 시작할 때마다 다시 산출 할 수 있습니다.

OS는 프로세스 수율 또는 내가 언급 한 하드웨어 타이머 인터럽트와 같은 실행 중 프로세스를 선점하게 한 후 프로세스 만 재개하기 때문에 sleep() 매우 정확하지 않으며 OS 또는 하드웨어에 얼마나 정확한 지에 따라 얼마나 정확하지만, 일반적으로 하나 이상의 밀리 초의 순서에 있습니다.

더 많은 정확도가 필요하거나 매우 짧은 대기가 필요한 경우 유일한 옵션은 언급 한 바쁜 루프 구조를 사용하는 것입니다.

다른 팁

운영 체제는 프로세스가 실행되는 방식을 스케줄링합니다 (프로세스가 실행 가능합니다. 순서대로 ...).Sleep() 아마도 커널을 말하는 시스템 호출을 발행 할 것입니다. 엑스 밀리 초”.

요컨대, Sleep ()는 OS에 프로세스/스레드를 잠시 무시하도록 지시합니다.

'CIN'은 수많은 과부하 작업자를 사용합니다. 일반적으로 오른쪽 비트 시프트 인 '>>'는 C ++의 거의 모든 유형의 오른쪽 피연산자에 대해 과부하됩니다. 콘솔에서 읽히고 입력을 제공 한 변수 유형으로 변환하는 각 기능에 별도의 기능이 제공됩니다. 예를 들어:

std::cin::operator>> (int &rhs);

그것은 실제 C ++가 아닙니다 - 나는 스트림과 함께 일하지 않았고 한동안 과부하를 일으키지 않았으므로 반환 유형이나 정확한 인수 순서를 기억하지 못합니다. 그럼에도 불구하고,이 기능은 정수 변수를 CIN >> 실행할 때 호출됩니다.

정확한 기본 구현은 운영 체제에 따라 다릅니다.

답은 운영 체제에 따라 다르지만 일반적으로 운영 체제는 다른 스레드에서 다른 스레드에서 다른 곳에서 실행되도록 일정을 잡거나 문자 그대로 할 일이 없으면 하드웨어 이벤트가 발생할 때까지 기다릴 수 있습니다. CPU는 인터럽트 핸들러라는 일부 코드로 이동하여 실행할 코드를 결정할 수 있습니다.

멀티 스레드 프로그램에서 스레드/프로세스를 차단하는보다 제어 된 방법을 찾고 있다면 세마포르, 뮤트, 크리티컬 인 및 이벤트를 살펴보십시오. 이들은 프로세스 또는 스레드를 차단하는 데 사용되는 모든 기술입니다 (CPU를 잠시 구조적으로로드하지 않고).

그들은 본질적으로 차단 된 스레드가 대기중인 대기/신호 관용구에서 벗어나고 다른 프로세스는 다시 시작하도록 지시합니다. 이 (적어도 Windows에서) 시간 초과가있을 수 있으므로 수면과 유사한 기능을 제공 할 수 있습니다 ().

낮은 수준에서 시스템은 "스케줄러"라는 루틴을 가지고있어 모든 실행중인 프로그램에서 CPU로 지침을 파견하여 실제로 실행합니다. 시스템은 "수면"및 "수면"과 같은 일치를 호출하여 스케줄러가 고정 된 시간 동안 해당 스레드 또는 프로세스를 무시하도록 지시하는 지침과 일치합니다.

C ++ 스트림의 경우 "CIN"은 실제 파일 핸들을 숨 깁니다 (Stdin 및 Stdout은 실제로 그러한 핸들입니다). 인터페이스이기 때문에 구현은 OS 특이적일 수 있지만 개념적으로 여전히 Printf 및 Scanf와 같은 작업을 수행하고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top