Fork and Join Framework Buğra Güneş
Fork and Join Framework Result solve(Problem problem) { if (problem Küçük mü ?) Sorunu Hemen Çöz! else { Problemi parçalara ayır fork alt görevlere ayırma problemi çöz join alt görevleri birleştir Sonuç }
Fork and Join Framework Fork-Join bir problemi küçük parçalara bölerek, onları paralel olarak eş zamanlı çözmek ve çözümü nihayetinde birleştirerek sonuca ulaşma yaklaşımı baz alınrak geliştirilmiş framework(çatı)'tür. Öncesinde JDK 5 içindede mevcut olan bu yapı , JDK 7'de de yerini almıştır.
Fork and Join Framework ForkJoin Framework’ü Java 7 standart kütüphanelerinin parçasıdır. Bilgisayarınızda kullanabilmeniz için JDK7’ nin ve uygun bir IDE’nin kurulu olması yeterli olacaktır.
Fork and Join Framework Framework'ün gerçek anlamda performanslı çalışması için yüksek sayıda (onlarca) işlemci ile işlem yapılıyor olması gereklidir. Multi-core(çok çekirdek) sistemler için dizayn edilmiştir. Genel olarak, 4 çekirdek ve üzeri sistemlerde performans olarak kısmen göze çarpabilir bu ise yapılacak işe göre değişkenlik gösterir.
Fork and Join Framework
Fork and Join Framework Aşağıdaki 4 yapı Fork and Join Framework’ü için önem taşımaktadır. ForkJoinPool RecursiveTask ForkJoinTask RecursiveAction
Fork and Join Framework Fork Join Pool :Framework’ün ana sınıfıdır, görevleri çalıştıran sorumlu birim fork join pool sınıfıdır. Fork Join Task: ForkJoinPool içinde soyut bir sınıftan(java.util.concurrent) türemiş task olarak çalışır. Birden çok sayıda yeni tasklar oluşturmakiçin fork() vejoin.fork() metodlarını kullanır.
Fork and Join Framework fork() metodu daha küçük parçaya ayrılan yeni işi kuyruğa ekler. Her thread'in kendi kuyruğu var, ancak gerekirse diğer thread'ler iş çalma (work stealing) yapabilirler. compute() metodu daha küçük parçaya ayrılan yeni işi kuyruğa eklemeden mevcut thread ile çalıştırır. join() metodu kuyruktaki çalıştırılan işin bitmesini bekler.
Fork and Join Framework if (problem Küçük mü ?) Hemen Çöz! else { Alt Görevlere böl Görevleri işlet SONUÇLARIN TAMAMLANMASINI BEKLE }
Fork and Join Framework RecursiveAction:Görevlerinizin bir sonuç dönmesi gerekmiyorsa recursive action alt sınıfını kullanabilirsiniz. RecursiveTask:Görevleriniz bir sonuç dönmesi gerekiyorsa recursive task alt sınıfını kullanabilirsiniz.Örneğin Fibonacci sayıları hesaplanırken , her görev bi sonraki göreve değer aktarmalıdır.Bu hesaplamada recursivetask kullanılır.
Fork and Join Framework ForkJoinPool fjpool = new ForkJoinPool(); for (int i = 0; i < iterations; i++) { RecursiveAction task = new RandomFillAction(array, 0, array.length); long start = System.currentTimeMillis(); fjpool.invoke(task);
Fork and Join Framework class RandomFillAction extends RecursiveAction { if (high - low > splitSize) { // task büyükse parçala int mid = (low + high) >>> 1; invokeAll(asList(new RandomFillAction(array, low, mid), new RandomFillAction(array, mid, high))); } else { Random random = new Random(); for (int i = low; i < high; i++) { array[i] = random.nextInt(10000);
Fork and Join Framework Fork Join Framework’ü kullanılmaksızın elde edilen çıktılar Sequential processing time: 1360 ms Sequential processing time: 1362 ms Sequential processing time: 1338 ms Sequential processing time: 1346 ms Sequential processing time: 1304 ms Sequential processing time: 1296 ms Sequential processing time: 1309 ms Sequential processing time: 1343 ms Sequential processing time: 1351 ms Sequential processing time: 1359 ms Number of processor available: 4
Fork and Join Framework Fork Join Framework’ü kullanılarak elde edilen çıktılar Parallel processing time: 445 ms Parallel processing time: 398 ms Parallel processing time: 370 ms Parallel processing time: 366 ms Parallel processing time: 378 ms Parallel processing time: 365 ms Parallel processing time: 363 ms Parallel processing time: 367 ms
Fork and Join Framework
Fork and Join Framework
Fork and Join Framework Uygulamalar
Fork and Join Framework Teşekkürler