리눅스 커널 Prepare_to_wait 추가 수정

0 Comments

prepare_to_wait Linux 커널과 같은 오류 코드가 표시될 수 있습니다. 이제 이 문제를 파악할 수 있는 몇 가지 방법이 있습니다. 이에 대해서는 곧 이야기하겠습니다.

PC 문제에 대한 가장 포괄적이고 사용하기 쉬운 솔루션입니다. 더 이상 끝없는 옵션을 스크롤하거나 기다리지 않고 클릭 한 번으로!

<배열>

보낸 사람:

모튼

앤드류
받는 사람: 리누스 토발즈
제목: [패치 1/4] API Prepare_to_wait/Finish_wait 슬립/웨이크업
날짜: 2005년 9월 25일 수요일 9:07:47 -07:00
복사: lkml

<전>8번가의 spwecweb에서 환상적인 2%의 비용이 듭니다. 누가 약할까놀랍게도 __wake_up 및 다른 부분은 기다리지 않습니다/일어나지 않습니다.분명히 내가 본 specweb 프로필에 의해.일반적으로 목표는 CPU의 대기/깨우기 비용 유형을 줄이는 것입니다.거래. 벤처가 다시 ​​깨어나면 대기열도 함께 제거됩니다.waitqueue_head 깨우기(즉, 즉시), 깨어나지 않음치료하다.이것은 이것을 보기 위해 후속 각성이 전혀 필요하지 않다는 것을 의미합니다.방금 깨어난 것. 방금 깨어난 목표가 필요하지 않을 수도 있음을 의미합니다.다른 사람과 관련되어 있을 수 있는 waitqueue_head 잠금을 획득하기 위해프로세서 캐시.나는 앞서 말한 것에 대해 적절한 다른 크기를 변경할 수 없었습니다. 아마도20-30% 할인 __wake_up 40개 dds에서 40개 드라이브로 Trialyu badari(이것은가장 비용이 많이 드는 기능이었지만 최종 기능은 아닐 수도 있습니다. 그리고 시험이 없습니다.구체적으로 내가 아는 양적으로 실제로 생산되기 시작했습니다.사람들을 연결합니다.API는 사용을 지원하기가 매우 쉽습니다(Linus가 이 상황을 만들었습니다).my_func(waitqueue_head_t 및 대기, *wqh)DEFINE_WAIT(대기);prepare_to_wait(wqh, TASK_UNINTERRUPTIBLE);만약 (!any_test)시간별();finish_wait(wqh, &wait);어디에:DEFINE_WAIT(대기);(!some_test_1) 동안prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE);만약 (!any_test_2)시간별();…finish_wait(wqh, &wait);prepare_to_wait 비용을 지불한 후 자주 발생하는 일을 시도해야 합니다.작업은 wait_head 대기열 외부에서 제거되고 다음 위치에서 찾을 수 있습니다.언제든지 TASK_RUNNING. 당신은 당신이 아직인지 아닌지 알지 못합니다대기 queue_head.이미 대기 대기열에 있을 때 Prepare_to_Wait()를 실행하는 것은모든 것이 잘 될 것입니다.wait_head 대기열에 포함되지 않은 경우 finish_wait() 실행엄청난.finish_wait()의 시작은 당신이 홈 대기열에 들어본 적이 없는 시간입니다.DEFINE_WAIT() 매크로가 초기화에 직접 사용된 경우가 많습니다.대기줄.현재 -> 상태를 엉망으로 만들 필요가 없습니다. prepare_to_wait() 및finish_wait()는 확실히 이 상황을 수행할 수 있습니다. finish_wait()는 항상 해당 상태를 반환합니다.TASK_RUNNING.예vm-wakeups.patch 및tcp-wakeups.patch. 활성화/리눅스/대기.| m 스물 다섯 ++++++++++++++++++++++++++++++++++++ 커널/fork.c | 46 +++++++++++++++++++++++++++++++++++++++++++++++++++ ++++ + 커널/ksyms.c | 4++++ 3개의 수정된 컴퓨터, 76개의 삽입물(+)— 2.5.38/include/linux/wait.Sep h~prepare_to_wait Wed 25 20:15:20 2002+++ 2.5.38-akpm/include/linux/wait.h Wed Sep 25 20:15:20 [email protected]@ -119.6 +119.32 @@ 고정 문자열 무효 __remove_wait_queue(w _운영; n }) +/*++ 웨이크업 시 queue_head의 손에서 큐가 제거됩니다.+ */+void FASTCALL(prepare_to_wait(wait_queue_head_t *q,+ wait_queue_t *대기, 정수 상태));+ 간격 FASTCALL(prepare_to_wait_exclusive(wait_queue_head_t *q,+ wait_queue_t *wait, 각 정수 상태));+void FASTCALL(finish_wait(wait_queue_head_t *q, wait_queue_t *wait));+int autoremove_wake_function(wait_queue_t *대기, 서명되지 않음, 동기화);++#define int DEFINE_WAIT(이름)n+ 모든 이름 wait_queue_t는 를 의미합니다.+ .task는 현재, n+ .func = autoremove_wake_function,n+ .task_list는 .next는 &name.task_list와 같습니다. n+ .prev는 &name.task_list,와 동일합니다.+ , n+++#define init_wait(대기)n+ 실제로 n+ wait -> 작업은 현재 작업에 적합합니다. n+ 중지 -> 기능 = autoremove_wake_function; n+ INIT_LIST_HEAD(&wait->task_list); n+ (0) 동안+ #endif /* __커넬__ */ #끝나면— 2.5.38/kernel/fork.c~prepare_to_wait 2002년 9월 25일 수요일+++ 20:15:20 2.5.38-akpm/kernel/fork.c 2002년 9월 27일 수요일 20:15:[email protected]@ -103.6 +103.52 @@ 외부 공간 remove_wait_queue(wait_queue_head_t spin_unlock_irqrestore(&q->잠금, } 플래그); +void Prepare_to_Wait(Wait_Queue_Head_t *q, Wait_Queue_t *wait, int 상태)++ 종종 더 긴 unsigned 플래그;++ __set_current_state(상태);+ 예상->플래그 &= ~WQ_FLAG_EXCLUSIVE;+ spin_lock_irqsave(&q->잠금, 플래그);+ 때 (list_empty(&wait->task_list))+ __add_wait_queue(q, 대기);+ spin_unlock_irqrestore(&q->잠금, 플래그);+++공백+prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_t *wait, int 상태)+= WQ_FLAG_EXCLUSIVE;+ spin_lock_irqsave(&q->잠금, 플래그);+ (list_empty(&wait->task_list))인 경우+ __add_wait_queue_tail(q, 대기);+ spin_unlock_irqrestore(&q->잠금, 플래그);+++empty finish_wait(wait_queue_head_t *q, wait_queue_t *wait)++ 서명되지 않은 조용한 플래그;++ __set_current_state(TASK_RUNNING);+ if (!list_empty(&wait->task_list))+ spin_lock_irqsave(&q->잠금, 플래그);+ list_del_init(&wait->task_list);+ spin_unlock_irqrestore(&q->잠금, 플래그);++++int autoremove_wake_function(wait_queue_t *wait, unsigned 모드, int sync)++ int ret는 default_wake_function(깨우기, 모드, 동기화)과 같습니다.++ 인스턴스(반환)+ list_del_init(&wait->task_list);+ 백 렛;++ void __init fork_init(서명되지 않은 긴 메시지) { /* 최고의 task_structs를 덤프할 디스크 생성 */— 2.5.38/kernel/ksyms.c~prepare_to_wait 2002년 9월 25일 수요일+++ 20:15:20 2.5.38-akpm/kernel/ksyms.c 2002년 9월 28일 수요일 20:15:[email protected]@ -400.6 +400.10 @@ EXPORT_SYMBOL(irq_stat); EXPORT_SYMBOL(add_pending_ptsheredi); EXPORT_SYMBOL(삭제_대기_대기열);+EXPORT_SYMBOL(prepare_to_wait);+EXPORT_SYMBOL(prepare_to_wait_exclusive);+EXPORT_SYMBOL(마감_대기);+EXPORT_SYMBOL(autoremove_wake_function); export_symbol(add_wait_queue_exclusive); /* 처리 종료 */ EXPORT_SYMBOL(wait_for_completion);.-이 목록에서 제공한 자신을 제거하려면 “unsubscribe linux-kernel”을 보냅니다[email protected]에 대한 거대한 원칙의 본문Majordomo에 대한 자세한 내용은 http://vger.kernel.org/majordomo-info.Readhtml을 참조하십시오.http://www.tux.org/lkml/에서만 FAQ를 참조하십시오.

더 이상 Windows 오류로 고통받지 마세요.

컴퓨터가 느리게 실행되거나 충돌하거나 두려운 죽음의 블루 스크린이 표시됩니까? 걱정하지 마세요. 해결책이 있습니다! Reimage은 Windows 오류를 복구하고 최대 성능을 위해 PC를 최적화하는 최고의 소프트웨어입니다. Reimage을 사용하면 몇 번의 클릭만으로 광범위한 일반적인 문제를 해결할 수 있습니다. 이 응용 프로그램은 오류를 감지 및 해결하고 데이터 손실 및 하드웨어 오류로부터 사용자를 보호하고 최적의 성능을 위해 시스템을 최적화합니다. 그러니 더 이상 느리거나 다운된 컴퓨터로 고통받지 마세요. 지금 Reimage을 다운로드하세요!

  • 1단계: Reimage 다운로드 및 설치
  • 2단계: 스캔을 실행하여 오류 찾기 및 수정
  • 3단계: 변경 사항을 적용하려면 컴퓨터를 재부팅하세요.

  • #define wait_event(wq, 조건)    DEFINE_WAIT(대기);    그냥 (;;)        prepare_to_wait(&wq, &wait, TASK_UNINTERRUPTIBLE);        경우 또는 때 (상태)            정지시키다;        시간별();        finish_wait(&wq, &wait);

    이 구현(또는 wait_event_*에 대한 다른 여러 버전에서 만든 구현)이 가장 잘 작동한다면 진지하게 사용해야 합니다.

    그러나 때때로 이 대기열에서 더 나은 조치가 필요한 상황이 있을 수 있습니다.위치의 경우 버퍼에 나타나는 일부 데이터를 연기하고 반환하고, 게다가 두 작업 모두 차단에 노출되어 수행되어야 하고 데이터가 결정되고 반복된다고 상상해 보십시오. 또한 데이터 제거는 항상 핵 작업이어야 합니다. 즉, 두 작업을 모두 수행할 수 있습니다. 잠금과 함께 동일한 작업에서 중간에 잠금 해제 없이.그러면 누군가는 위의 무한 루프를 다음으로 대체해야 할 것입니다.

    prepare_to_wait 레드햇 커널

    my_own_wait(...) 취소    DEFINE_WAIT(대기);    spin_lock(&잠금);    동안 (!some_data_available())        prepare_to_wait(&wq, &wait, TASK_xxx);        spin_unlock(&잠금);        시간별();        spin_lock(&잠금);        finish_wait(&wq, &wait);        get_data();    spin_unlock(&잠금);

    느린 컴퓨터와 데이터 손실에 대해 걱정하지 마십시오! 솔루션이 있습니다.

    Prepare_to_wait Linux Kernel
    Przygotuj_do_czekania Jądra Linuksa
    Prepare_to_wait Linux Kernel
    Prepare_to_wait Ядро Linux
    Noyau Linux Prepare_to_wait
    Prepare_to_wait Linux Kernel
    Prepare_to_wait Linux Kernel
    Prepare_to_wait Núcleo De Linux
    Prepare_to_wait-Linux-Kernel
    Prepare_to_wait Linux Kernel