SORU
20 Kasım 2008, PERŞEMBE


Nasıl iş parçacığı içeriği havai geçiş tahmin etmek?

Gerçek zamanlı tarihler ile dişli uygulama performansını geliştirmeye çalışıyorum. Windows Mobile ve C / C yazılmış üzerinde çalışıyor . İplik anahtarlama yüksek frekanslı maddi yükü neden, ama ikisi de bunu doğrulamak veya çürütmek olabileceği konusunda şüphelerim var. Herkesin bildiği gibi, kanıt eksikliği karşısında bir kanıt değil :).

Böylece benim soru iki yönlüdür:

  • Eğer varsa, nerede iş parçacığı içeriği değiştirme maliyeti herhangi bir gerçek Ölçümler bulabilirim?

  • Zaman test uygulama yazılı harcamadan, yollar iplik havai mevcut uygulamada anahtarlama tahmin etmek ne?

  • Herkes belirli bir konu için içerik anahtarları / kapama) sayısını bulmak için bir yol biliyor mu?

CEVAP
20 Kasım 2008, PERŞEMBE


Bu yükü bir yerlerde varolan herhangi bir platform için web üzerinde bulabilirsiniz şüpheliyim. Sadece çok sayıda farklı platformlar var. Yükü iki faktöre bağlıdır:

  • CPU, gerekli işlemleri daha kolay veya farklı CPU türleri ölüme neden olabilir
  • Sistem çekirdeği, çekirdekleri farklı olarak her bir anahtar üzerinde farklı işlemleri gerçekleştirmek zorunda kalacak

Diğer faktörler anahtarı nasıl gerçekleştiğine vardır. Bir geçiş yeri zaman alabilir

  1. konu zaman kuantum hepsini kullandı. Bir iş parçacığı başlatıldığında, sıradaki kim karar verecek çekirdek kontrol döndürmesi önce zaman belirli bir miktar için çalışabilir.

  2. konu değişsin. Bu başka bir iş parçacığı CPU zamana ihtiyacı olur ve daha yüksek bir önceliğe sahiptir. E. g. fare/klavye girişini işleme konu böyle bir konu olabilir. İplik ne olursa olsunsahibiCPU şu anda, ne zaman kullanıcı türleri bir tıklama ya da bir şey istemiyor beklemek kadar geçerli iş parçacığı zaman kuantum kullanılmıştır, tamamen, görmek istiyor sistem tepki hemen. Bu nedenle bazı sistemlerde geçerli iş parçacığı derhal durdurun ve daha yüksek önceliğe sahip başka bir iş parçacığı için kontrol döner.

  3. konu biraz çalışmasını engellemek, ya da sadece uyku deniyor çünkü CPU zamanı artık ihtiyacı yok() (veya benzer) çalışan durdurmak için.

Bu 3 senaryo teoride farklı iplik geçiş süreleri olabilir. E. g. Ben beklemediğin bir son için yavaş, yana bir ara uyku() anlamına gelir CPU iade için çekirdek ve çekirdek ihtiyaçlarına Kur uyandırma çağrısı yapar emin iplik uyandı sonra da bir süre talep uyku, sonra gereken konu dışına planlama süreci, ve bir kez iplik uyandı, add gereken konu yeniden planlama süreci. Tüm bunlar, Holiday Inn Paris, biraz zaman alacak. Uyku-çağrı gerçek başka bir konuya geçmek için gereken süre daha uzun olabilir.

Eğer emin olmak istiyorsanız, kriter gerekir bence. Sorun genellikle ya iş parçacığı veya onlardan uyumu kullanarak eşitlemek gerekir uyutmak için var. Ya/Anahtarcı uyumu uyku bağlıyor kendisini bir yük. Bu kriter bu giderleri de yer alacak demektir. Güçlü bir profiler kalmadan, daha sonra zor bir zaman gerçek geçiş için nasıl kullanıldığını ve dışlama-çağrı ne demek. Gerçek hayat senaryosunda öte yandan, konuları ya da Uyku veya kilitler ile de senkronize olacak. Tamamen bağlam ölçen bir kriter herhangi bir gerçek hayat senaryosu model olmadığı sürece bir defa sentetik bir kriter geçin. Kriterler çok daha "gerçekçi eğer gerçek hayatta baz" senaryoları. Ne için kullanacaksın benim GPU söyleyen bir GPU kriter teoride ise bu sonuç asla gerçek hayat 3 boyutlu bir uygulama elde edilebilir ise 2 milyar çokgenler ikinci bir kolu olabilir mi? O kadar çok gerçek hayat 3 boyutlu bir uygulama GPU bir ikinci ele sahip olabileceğini görmek ilginç olurdu, değil mi?

Ne yazık ki Windows programlama hakkında hiçbir şey bilmiyorum. Beni ağlatıyor Windows üzerinde C# ama C/C, Java ya da belki Windows için bir uygulama yazabilirim. Sadece bazı kaynak POSIX için kod verebilirim.

#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <pthread.h>
#include <sys/time.h>

uint32_t COUNTER;
pthread_mutex_t LOCK;
pthread_mutex_t START;
pthread_cond_t CONDITION;

void * threads (
    void * unused
) {
    // Wait till we may fire away
    pthread_mutex_lock(&START);
    pthread_mutex_unlock(&START);

    pthread_mutex_lock(&LOCK);
    // If I'm not the first thread, the other thread is already waiting on
    // the condition, thus Ihave to wake it up first, otherwise we'll deadlock
    if (COUNTER > 0) {
    	pthread_cond_signal(&CONDITION);
    }
    for (;;) {
    	COUNTER  ;
    	pthread_cond_wait(&CONDITION, &LOCK);
    	// Always wake up the other thread before processing. The other
    	// thread will not be able to do anything as long as I don't go
    	// back to sleep first.
    	pthread_cond_signal(&CONDITION);
    }
    phthread_mutex_unlock(&LOCK);
}

int64_t timeInMS ()
{
    struct timeval t;

    gettimeofday(&t, NULL);
    return (
    	(int64_t)t.tv_sec * 1000  
    	(int64_t)t.tv_usec / 1000
    );
}


int main (
    int argc,
    char ** argv
) {
    int64_t start;
    pthread_t t1;
    pthread_t t2;
    int64_t myTime;

    pthread_mutex_init(&LOCK, NULL);
    pthread_mutex_init(&START, NULL);	
    pthread_cond_init(&CONDITION, NULL);

    pthread_mutex_lock(&START);
    COUNTER = 0;
    pthread_create(&t1, NULL, threads, NULL);
    pthread_create(&t2, NULL, threads, NULL);
    pthread_detach(t1);
    pthread_detach(t2);
    // Get start time and fire away
    myTime = timeInMS();
    pthread_mutex_unlock(&START);
    // Wait for about a second
    sleep(1);
    // Stop both threads
    pthread_mutex_lock(&LOCK);
    // Find out how much time has really passed. sleep won't guarantee me that
    // I sleep exactly one second, I might sleep longer since even after being
    // woken up, it can take some time before I gain back CPU time. Further
    // some more time might have passed before I obtained the lock!
    myTime = timeInMS() - myTime;
    // Correct the number of thread switches accordingly
    COUNTER = (uint32_t)(((uint64_t)COUNTER * 1000) / myTime);
    printf("Number of thread switches in about one second was %u\n", COUNTER);
    return 0;
}

Çıktı

Number of thread switches in about one second was 108406

100'000 ve koşullu bekler kilitleme sahip olmamıza rağmen çok kötü değil bu. Birçok iplik anahtarları mümkün olduğu gibi, en az iki kere tüm bu şeyler olmadan tahmin ediyorum bir saniye.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Sam Kear

    Sam Kear

    14 Temmuz 2007
  • sk8ingis4me

    sk8ingis4me

    16 Mart 2006
  • TheRightTire

    TheRightTire

    14 EKİM 2009