İleri ve kurumsal .net uzunca bir süre uğraştıktan sonra halen daha profesyonel olarak uğraştığım bir alan.Hele birde bu bilgileri takip ederek yazılım güvenliğine katkılarda bulunmak ayrı bir keyif.Ancak bugün sadece c# üzerinden anlatacağım.İyi çalışmalar...
Program çalışırken işlemci biten bir parçacıklı programdan sonra rastgele bşka bir parçacıklı koda geçer.Öncelik sırası normal olduğu için böyle bir standart izlenir.Bunun sebebi parçacıklı kodların birbirleriyle ilişkisi olmamasından kaynaklanır.
Parçacıklı programlarda zamanı ayarlamak ve değeri döndürmek için Thread.Priority özelliğini kullanırız.Highest,AboveNormal,Normal,BelowNormal,Lowest seçenekleri olan değerde normal seçeneği özgün belirtilmiş sabit bir seçenektir.Bu değerler enum türünde nitelendirilir.
Çok kompleks ve profesyonel bir projede akıl almaz etkiler esneklikler ve hız sağlayan bu özelliğin basit bir projede bile nekadar işe yaradığını iki farklı uygulama ile şimdi size sunacağım.
İlk olarak Thread.Priority özelliğini kullanmadan console de bir sayma projesi yaratalım.Hemen ardından Thread.Priority özelliğini kullanarak aynı projeyi tekrarlayalım.
using System;
using System.Threading;
class ThreadSchedule1App
{
public static void WorkerThreadMethod1()
{
Console.WriteLine("Worker thread started");
Console.WriteLine("Worker thread - counting slowly from 1 to 10");for (int i = 1; i < 11; i++)
{
for (int j = 0; j < 100; j++)
{
Console.Write(".");
int a;
a = 15;
}
Console.Write("{0}", i);
}
Console.WriteLine("Worker thread finished");
}
public static void WorkerThreadMethod2()
{
Console.WriteLine("Worker thread started");
Console.WriteLine("Worker thread - counting slowly from 11 to 20");for (int i = 11; i < 20; i++)
{
for (int j = 0; j < 100; j++)
{
Console.Write(".");
int a;
a = 15;
}
Console.Write("{0}", i);
}
Console.WriteLine("Worker thread finished");
}
public static void Main()
{
ThreadStart worker1 = new ThreadStart(WorkerThreadMethod1);
ThreadStart worker2 = new ThreadStart(WorkerThreadMethod2);
Console.WriteLine("Main - Creating worker threads");
Thread t1 = new Thread(worker1);
Thread t2 = new Thread(worker2);
t1.Start();
t2.Start();
}
}
Bunu çalıştıralım ve ekran çıktısına bakalım.

Şimdi aynı uygulamayı Thread.Priority methodunu kullanarak yapalım.
class ThreadSchedule2App
{
public static void WorkerThreadMethod1()
{
Console.WriteLine("Worker thread started");
Console.WriteLine("Worker thread - counting slowly from 1 to 10");
for (int i = 1; i < 11; i++)
{
for (int j = 0; j < 100; j++)
{
Console.Write(".");int a;
a = 15;
}
Console.Write("{0}", i);
}
Console.WriteLine("Worker thread finished");
}
public static void WorkerThreadMethod2()
{
Console.WriteLine("Worker thread started");
Console.WriteLine("Worker thread - counting slowly from 11 to 20");
for (int i = 11; i < 20; i++)
{
for (int j = 0; j < 100; j++)
{
Console.Write(".");int a;
a = 15;
}
Console.Write("{0}", i);
}
Console.WriteLine("Worker thread finished");
}
public static void Main()
{
ThreadStart worker1 = new ThreadStart(WorkerThreadMethod1);
ThreadStart worker2 = new ThreadStart(WorkerThreadMethod2);
Console.WriteLine("Main - Creating worker threads");
Thread t1 = new Thread(worker1);
Thread t2 = new Thread(worker2);
t1.Priority = ThreadPriority.Highest;t2.Priority =
ThreadPriority.Lowest;
t1.Start();
t2.Start();
}
}
Şimdi bunu çalıştırıyoruz.Ve ekran çıktısına bakıyoruz.

Şimdi ikisini kıyaslayalım.Ve özelliklerine bakalım;
İlk çıktıda gördüğünüz gibi her parçacık eşit sayıda işleme giriyor.Herhangibir öncelik yok.Ancak ikinci çıktıya baktığınız zaman ikinci parçacığın birinci parçacık bitene kadar hiç işleme girmediğini görürüz.Bunun sebebi en yüksek çnceliği ilk parçacığa vermemdir.Bunu daha konsept ve önemli bir projede uyguladığımızı düşünürsek çokdaha verimli ve hızlı bir program yazmış oluruz.
Not: Aynı öncelikte iki parçacık atadıysak eğerİki veya kaçtane parçacık ise bunlar eşit sayıya bölünür.İşlemcinin zamanlara eşit miktarda bölünür.Ancak bu işlem aynı kod düzeninde ard arda kullanılırsa yavaşlık ortaya çıkarabilir.Eşit miktarda kullandığımız bu algoritmik düzene.Birkez denemelik zamanlama yane round robin scheduling denir.
Burda kullandığımız zamanlama algoritması ile .net platformunun iç dünyasında dynamic boost değeri devreye girer.Tüm bu işlemler ile bir sayısal değer ortaya çıkar ve en yüksek değerli parçacık en yüksek önceliği takip eder.
Ve Son Söz : Bir parçacığı özel bir nedeniniz olmadıkça yüksek öncelikte tanımlamak programda dengesizlik yaratır.Zaten başındada söylediğim gibi konsept projelerde kullanılması elzemdir.Özel bir nedeniniz olmadıkça normal değer olması herzaman için en iyisidir.
Saygı ve Sevgilerimle.Sağlıcakla kalın...