2015-12-25 4 views
5

Profesörümden çözmek için ilginç bir alıştırma var. Ama biraz yardıma ihtiyacım var, bu yüzden tatillerde sıkıcı olmaz.Çok iş parçacıklı bir yük dengeleyici oluşturmaya nasıl başlayabilirim?

egzersiz

  • 5 sensör bir saniyede 1 ölçüm noktası okur çok evreli bir yük dengeleyici, oluşturmaktır. (Bu nedenle her saniyede 5 değer).
  • Daha sonra bu değerler ile bazı "karmaşık" hesaplamalar yapın.
  • Ekrandaki hesaplamaların sonuçlarının yazdırılması. (maksimum değer veya 1-5 sensörünün ortalama değeri gibi, çok işlemcili)
  • Ek bir görev olarak, gelecekte her saniyede 500 algılayıcının okunduğundan emin olmak zorundayım. işi bırakma (yük dengeleme).

5 sanal sensörden ~ 400 ölçüm noktası olan bir csv textfile'ım var.

ben yapmak zorunda düşünüyorum Ne:

  1. bir diziye ölçüm noktaları Oku
  2. bazı matematik şeyler hesaplar dizisi
  3. Spawn her değeri için yeni iş parçacığı için iş parçacığı güvenli erişim sağlayın
  4. en fazla eşzamanlı çalışan iş parçacığı

Ben uyg çoklu kullanım için yeni bir maksimum değerini ayarlayın ns C# ama threadpool kullanmanın doğru yol olduğunu düşünüyorum. Şu anda bir kuyruk üzerinde çalışıyorum ve belki de uygulamayı bir işin içine yerleştirerek uygulamayı engelleyemiyorum.

Ne önerirsiniz?

+0

:-) Profesörüne için uygulama ayrıntılarını ele almak istiyoruz varsayalım gibi ben burada herhangi bir kod dahil etmedik

Not? – alexm

+0

evet, bu "tasarım" dır. Sensörlerin artmasıyla bir şekilde ölçeklenmeli, ancak işlemciyi öldürmemelidir .... –

+0

veya daha önemlisi: uygulamayı ve işlevini öldürmemelidir. –

cevap

3

çevre Burada birkaç bağımlılıkları vardır:

  • kullandığınız .NET sürümü nedir?
  • Hangi kullanıcı arayüzünü kullanıyorsunuz - masaüstü (WPF/WinForms) veya ASP.NET?

.NET 4.0 veya üstü ve bir masaüstü uygulaması olduğunu varsayalım. sensörler WPF veya Win uygulamada

okuma

, bir sensörden gelen verileri okumak için bir tek BackgroundWorker kullanmak. Saniyede 500 okuma önemsizdir - hatta 500,00 genellikle önemsizdir. BackgroundWorker türü özellikle masaüstü uygulamalarıyla etkileşimde bulunmak için tasarlanmıştır, örneğin iş parçacığı etkileşimleri hakkında endişelenmeden kullanıcı arabirimine teslim sonuçları. hesaplamaları

İşleme

Sonra "karmaşık" hesaplamalar işlemek gerekir. Bu, bu hesaplamaların ne kadar uzun ömürlü olduğuna bağlıdır. Eğer kısa ömürlü olduklarını varsayalım (her biri 1 saniyeden az), o zaman ben TaskScheduler'u kullanmayı düşünüyorum ve standart ThreadPool iyi olacaktır.Böylece, her bir hesaplama için bir Task oluşturur ve ardından TaskScheduler görevlerini iş parçacıklarına ayırmaya özen gösterir.

TaskScheduler'ın işi, daha ağır iş parçacıklarına hafif görevleri sıraya alarak ve iş yükünü makinedeki çekirdek sayısıyla en iyi şekilde dengelemek için ThreadPool'u yöneterek işi dengelemektir. Görevleri istediğiniz şekilde programlamak için override the default TaskScheduler'u bile kullanabilirsiniz.

threadpool işlenmesi gereken iş öğeleri bir FIFO kuyruğu olduğunu. .NET 4.0'da, ThreadPool iş kuyruğunu ConcurrentQueue koleksiyonuna uygun hale getirerek performansı artırdı.

görev verim ve verimlilik ölçme

Her iki CPU and memory usage ölçmek için PerformanceCounter kullanabilirsiniz. Bu, çekirdeklerin ve hafızanın verimli bir şekilde kullanılmakta olup olmadığına dair iyi bir fikir verecektir. Görev verimi, sadece görevlerin işlendiği ve sonuçların sunulduğu oranlara bakarak ölçülür. Bunu her sensör için bağımsız max, ortalama değerlerin hesaplanması için size niyetinde misiniz

+0

Merhaba, yardımlarınız için teşekkürler. onun bir konsept kanıtı, ne istersem onu ​​seçebilirim. Yani C# .net 4 winforms şu anda çalıştığım şey .... –

+0

Sanırım doğru bir şekilde açıklamıyordum ........ Saniyedeki okuma miktarı önemli değil, önemli olan her şey Sensör saniyede en az bir kez okunacaktır. saniyede bir kez tamam olur .... belki sistemi daha iyi görevler ile öldürmeden önce –

+0

Tüm sensörleri okumak ve UI'yi güncellemek, bu örnekte Backgroundworker'ı kullanarak tek bir iş parçacığı üzerinde yapılabilir. Sadece paralel (çok iş parçacıklı) bir şekilde yapılması gereken "karmaşık" işlemdir. – RoadWarrior