bestsource

"바쁜 기다림"과 "잠"의 절충점은 무엇입니까?

bestsource 2023. 9. 21. 20:41
반응형

"바쁜 기다림"과 "잠"의 절충점은 무엇입니까?

이것은 내 이전 질문의 확장입니다.

유닉스/리눅스 소켓의 차단 모드는 어떻게 작동합니까?

지금 인터넷에서 수집하는 것, 차단 호출을 호출하는 모든 프로세스는 스케줄러가 차단 해제 이유를 찾을 때까지 절전 모드로 전환됩니다.버퍼 빈 상태에서 버퍼가 꽉 찬 상태, 다른 조건에 이르기까지 원인이 다양할 수 있습니다.

하지만 그렇다면 이것이 실시간 애플리케이션이라고 할 수 있는 효율적인 방법이 될 수 있을까요?차단 해제 조건이 참일 때 프로세스가 차단 해제되지 않으므로 스케줄러가 CPU 슬라이스를 제공하고 차단 해제 조건이 둘 다 참입니다.

마치 응답성이 뛰어난 솔루션을 원하는 것처럼, "회전 잠금"이나 "바쁜 대기"가 올바른 방법이 아니라고 생각합니다. CPU 슬라이스가 낭비되고 시스템 전반에 걸쳐 응답성이 떨어지거나 응답성이 떨어질 수 있습니다.

누가 이 상반된 생각들을 지워줄 수 있나요?

스케줄러가 깨어날 때까지 잠을 자는 것이 정상적인/선호하는 일입니다.

스피닝(잠을 자지 않고 기다리는 대안적인 방법)은 덜 일반적이며 다음과 같은 효과가 있습니다.

  • CPU 사용 상태를 유지하고, 다른 스레드에서 CPU를 사용하지 못하도록 방지합니다(회전 스레드가 타임슬라이스를 끝내고 미리 설정되지 않는 한).

  • 기다리고 있는 일이 발생하는 바로 그 순간 회전을 멈출 수 있습니다(그 이벤트를 계속 확인하고 있고, 깨어나는 데 시간이 걸릴 필요가 없기 때문에, 이미 깨어 있기 때문입니다).

  • 절전 모드로 전환했다가 다시 해제하는 데 필요한 CPU 명령을 호출하지 않습니다.

지연 시간이 매우 짧을 경우(예: CPU 명령 100개를 실행하는 데 걸리는 시간만큼 지연 시간이 길 경우) 스피닝이 절전 모드로 전환하는 것보다 더 효율적일 수 있습니다(총 CPU 수가 적을 경우).

스핀 잠금은 CPU와 폴링된 리소스 경로를 태워 리소스 낭비를 계속하는 동시에 원하는 이벤트가 발생하지 않습니다.

차단 작업의 가장 중요한 차이점은 CPU 및 관련 리소스 경로를 제외하고 설치하는 것입니다.wait원하는 이벤트가 발생할 것으로 예상되는 리소스의 일부 형태입니다.

멀티태스킹 또는 멀티스레드/프로세서 환경(현재 오랜 기간 사용되는 일반적인 경우)에서는 원하는 이벤트가 도착하지 않은 상태에서 다른 작업을 수행할 수 있는 경우 CPU 및 리소스 액세스 경로를 태우면 처리 능력과 시간이 크게 낭비됩니다.

질문에서 언급하신 것처럼 하이퍼스레딩 시스템이 있는 경우 CPU 스레드를 슬라이스하는 세분화도가 매우 높다는 점에 유의해야 합니다.저는 또한 차단을 해제하기 전에 추가로 기다려야 했던 작은 시간을 보상하면서 차단을 해제하는 경향이 있는 모든 이벤트가 발생하는 데 충분한 시간이 걸릴 것이라는 것을 목을 내밀고 싶습니다.


생각합니다J-16 동안 및 데이터 공간을 하지 않는 spoint sleeping() .이렇게 되면 시스템이 리소스(예: 데이터/코드 캐시)를 포기하게 될 수 있으며, 블록이 해제되면 다시 채워져야 합니다.따라서 조건에 따라 블록은 더 많은 리소스 낭비를 초래할 수 있습니다.
이 또한 유효한 참고 사항이며 설계 및 구현 시 확인해야 합니다.
그러나 대부분의 상황에서는 대개 차단이 스핀락보다 낫습니다.

애플리케이션을 사용하는 경우, 짧은 시간 내에 조건을 충족시킬 수 있기 때문에 컨텍스트 전환이 CPU 사이클 몇 개를 먹는 것보다 더 많은 비용이 소요될 수 있습니다. 그러면 바쁜 대기 시간이 여러분에게 도움이 될 수 있습니다.

않으면 모드 또는 모드 CPU 를 을 할 수 있습니다.cond_wait()ing.

강제적인 컨텍스트 전환을 위해 생각할 수 있는 또 다른 시나리오는 다음과 같습니다.

while(condition)
    sleep(0);

우선, 여러분은 잘못된 생각을 가지고 있습니다.

통화 차단은 "바쁜 대기" 또는 "회전 잠금"이 아닙니다.호출을 차단하는 것은 슬립 가능합니다. 즉 CPU가 다른 작업에서 작동하므로 CPU가 낭비되지 않습니다.

통화 차단에 대한 질문에 대해

통화를 차단하는 것이 더 쉽습니다. 통화를 차단하는 것은 이해하기 쉽고, 개발하기 쉽고, 디버그하기도 쉽습니다.

하지만 그들은 자원 돼지입니다.스레드를 사용하지 않으면 다른 클라이언트가 차단되고 스레드를 사용하면 각 스레드가 메모리 및 기타 시스템 리소스를 차지합니다.메모리가 충분하더라도 스레드를 전환하면 캐시가 차가워지고 성능이 저하됩니다.

이것은 절충안입니다. 더 빠른 개발과 유지보수?확장성이 필요합니다.

다른 답변을 통해 충분한 설명이 제공되는 만큼 요점을 파악하도록 노력하겠습니다. 네, 이 모든 답변을 통해 배운다면 완성도 높은 그림이 나올 것 같습니다. ---

저에 따르면 시스템의 응답성 처리량 사이의 균형을 유지해야 합니다.

대응성 - 두 가지 관점에서 고려할 수 있음

  • 시스템 응답성 전반에 걸쳐.
  • 특정 또는 공정별 반응성

시스템의 대응성을 위해서는 통화를 차단하는 것이 최선의 방법이라고 생각합니다.차단 상태에서 차단 호출 시 준비 대기열에 있는 다른 프로세스에 CPU를 제공하기 때문입니다.

그리고 물론 특정 프로세스 또는 프로세스별 응답성에 대해서는 busy-wait/spin-lock 모델을 고려해야 합니다.

전반적인 시스템 응답성을 높이기 위해 스케줄러의 시간 슬라이스(미세 입자)를 줄일 수 없습니다. 상황에 맞는 스위치에서 CPU 리소스를 너무 많이 낭비하기 때문입니다.따라서 시스템의 처리량이 크게 감소할 것입니다.물론, 차단 모델은 차단된 호출이 CPU 슬라이스를 소비하지 않고 준비 대기열의 다른/다음 프로세스에 제공하기 때문에 시스템의 처리량을 증가시키는 것은 명백합니다.

제 생각에 가장 좋은 방법은 우선순위 기반 스케줄러를 구현하여 우선순위 기반 스케줄러를 구현함으로써 프로세스별 응답성을 염두에 두고 시스템을 설계하는 것입니다. 복잡성을 추가해도 문제가 없다면 우선순위 반전 문제에 대한 고려가 필요합니다. :)

//ASPI 원본 소스 코드 채택...

    DWORD startStopUnit (HANDLE handle, BOOL bLoEj, BOOL bStart)
    {
       DWORD  dwStatus;
       HANDLE heventSRB;
       SRB_ExecSCSICmd s;





    //here
       heventSRB = CreateEvent (NULL, TRUE, FALSE, NULL);

       memset (&s, 0, sizeof (s));

       s.SRB_Cmd = SC_EXEC_SCSI_CMD;
       s.SRB_HaID = 0;
       s.SRB_Target = 0;
       s.SRB_Lun = 0;
       s.SRB_Flags = SRB_EVENT_NOTIFY;
       s.SRB_SenseLen = SENSE_LEN;
       s.SRB_CDBLen = 6;
       s.SRB_PostProc = (LPVOID) heventSRB;
       s.CDBByte[0] = 0x1B;
       s.CDBByte[4] |= bLoEj ? 0x02 : 0x00;
       s.CDBByte[4] |= bStart ? 0x01 : 0x00;

       ResetEvent (heventSRB);
       dwStatus = SPTISendASPI32Command (handle,(LPSRB) & s);
       if (dwStatus == SS_PENDING)
         {
//and here, don´t know a better way to wait for something to finish without processor cicles
        WaitForSingleObject (heventSRB, DEFWAITLEN);
         }
       CloseHandle (heventSRB);

       if (s.SRB_Status != SS_COMP)
         {
    printf("Erro\n");
        return SS_ERR;
         }

       printf("nao Erro\n");
       return s.SRB_Status;
    }

언급URL : https://stackoverflow.com/questions/1107593/what-are-trade-offs-for-busy-wait-vs-sleep

반응형