2009-09-22 20 views
7

Çok iş parçacıklı kodumu çalıştırdığımda, sistem (linux) bazen iş parçacıklarını bir işlemciden diğerine taşır. İşlemcilerim olduğu kadar çok iş parçacığım olduğu için önbellekleri iyi bir neden olmadan geçersiz kılıyor ve izleme faaliyetlerimi karıştırıyor.Işleyicilere işlenen konuları bağlama

İş parçacıklarını işlemcilere nasıl bağlayacağınızı biliyor musunuz ve bir sistem bunu neden yapıyor?

+1

not ... – Ben

+0

Toplama tek bir işlemcide iş ve çalışma olmadan diğer işlemci bırakarak daha iyi güç tasarrufu verebilir. – sambowry

+0

@sambowry: Bir 24 işlemcisinin makinede çalıştırmak, ben 24 arasında sadece 1 çekirdek kullanmak ve daha uzun 24 süre içinde makineyi yetişmek için enerji oldukça kaybı olacağını:/ – Ben

cevap

16

sched_setaffinity (this is Linux-specific) kullanın.

Neden zamanlayıcı bir zamanlayıcıyı farklı işlemciler arasında değiştirebilir? Eh, iş parçanızın en son işlemci 1'de çalıştığını ve şu anda tekrar yürütme için programlanmasını beklediğini hayal edin. Bu arada, işlemci 1'de farklı bir iş parçacığı çalışıyor, ancak işlemci 2 ücretsizdir. Bu durumda, programlayıcının iş parçacığınızı işlemciye dönüştürmesi mantıklıdır. Ancak, karmaşık bir zamanlayıcı, işlemciler arasında bir iş parçacığının gerekenden fazla "zıplamasını" önler.

+0

Ben zamanlayıcı bu eğer önlemek için beklenir orada işlemcilerden daha az iş parçacığıdır ... – Ben

+1

Bu doğru ... Sorunuzda "işlemcilerden çok daha fazla iş parçacığı" bulunduğunu söylediniz - bunun diğer yoldan mı olması gerekiyordu? Ben işlemciler –

+0

Öyle kolay değil: Kendi OS yazdım sürece, "işlemciler daha az iş parçacığı" yoktur. Sistemdeki diğer şeyler sürekli olarak zaman çizelgeleri alır ve bu, iş parçacıklarınızın bir kısmının veya tamamının descheduled olmasına neden olabilir. Yeniden planlandığı zaman, en son çalıştırdıkları çekirdek kullanılabilir veya olmayabilir. – Ben

8

Bunu bash'dan yapabilirsiniz. this sorusunda tanıdığım harika bir taskset komutu var (ayrıca programlayıcıların orada nasıl çalışması gerektiğine dair değerli tartışmalar da bulabilirsiniz). Komut, bir işlemin bir pidini alır ve bunu belirli işlemciye/işlemcilere bağlar.

taskset -c 0 -p PID 

bu parçacığı ile ilgisi var ne işlemci (çekirdek) 0 numaralı

için PID ile işlem bağlanır? Her iş parçacığına, "tid" olarak da bilinen pid ile aynı haklara sahip bir tanımlayıcı atanır. gettid syscall ile alabilirsiniz. Ya da, örneğin top programında H tuşlarına basarak izleyebilirsiniz (bazı işlemler farklı pids'lerle görünüşte eşit sayıda girişe bölünür - bunlar iş parçacıklarıdır). Bir "do_not_migrate" diş nitelik de çalışacak

İlgili konular