<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="tr">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">Saydam Artıklı C ¸alıştırma İçin Vekil Tasarım Örüntüsü Kullanımı</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author role="corresp">
							<persName><forename type="first">Dindar</forename><surname>Öz</surname></persName>
							<email>dindar.oz@yasar.edu.tr</email>
							<affiliation key="aff0">
								<orgName type="department">Yazılım Mühendisligi Bölümü</orgName>
								<orgName type="institution">Yaşar Üniversitesi</orgName>
								<address>
									<settlement>İzmir</settlement>
									<country>Türkiye</country>
								</address>
							</affiliation>
							<affiliation key="aff3">
								<orgName type="department">Software Engineering Department</orgName>
								<orgName type="institution">Yaşar University</orgName>
								<address>
									<settlement>İzmir</settlement>
									<country key="TR">Turkey</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Sinan</forename><surname>Öz</surname></persName>
							<affiliation key="aff1">
								<orgName type="institution">MovieStarPlanet ApS</orgName>
								<address>
									<settlement>Kopenhag</settlement>
									<region>Danimarka</region>
								</address>
							</affiliation>
							<affiliation key="aff4">
								<orgName type="institution">MovieStarPlanet ApS</orgName>
								<address>
									<settlement>Copenhagen</settlement>
									<country key="DK">Denmark</country>
								</address>
							</affiliation>
							<affiliation key="aff0">
								<orgName type="department">Yazılım Mühendisligi Bölümü</orgName>
								<orgName type="institution">Yaşar Üniversitesi</orgName>
								<address>
									<settlement>İzmir</settlement>
									<country>Türkiye</country>
								</address>
							</affiliation>
							<affiliation key="aff3">
								<orgName type="department">Software Engineering Department</orgName>
								<orgName type="institution">Yaşar University</orgName>
								<address>
									<settlement>İzmir</settlement>
									<country key="TR">Turkey</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Işıl</forename><surname>Öz</surname></persName>
							<affiliation key="aff2">
								<orgName type="department">Bilgisayar Mühendisligi Bölümü</orgName>
								<orgName type="institution">İzmir Yüksek Teknoloji Enstitüsü</orgName>
								<address>
									<settlement>İzmir</settlement>
									<country>Türkiye</country>
								</address>
							</affiliation>
							<affiliation key="aff5">
								<orgName type="department">Computer Engineering Department</orgName>
								<orgName type="institution">İzmir Institute of Technology</orgName>
								<address>
									<settlement>İzmir</settlement>
									<country key="TR">Turkey</country>
								</address>
							</affiliation>
							<affiliation key="aff1">
								<orgName type="institution">MovieStarPlanet ApS</orgName>
								<address>
									<settlement>Kopenhag</settlement>
									<region>Danimarka</region>
								</address>
							</affiliation>
							<affiliation key="aff2">
								<orgName type="department">Bilgisayar Mühendisligi Bölümü</orgName>
								<orgName type="institution">İzmir Yüksek Teknoloji Enstitüsü</orgName>
								<address>
									<settlement>İzmir</settlement>
									<country>Türkiye</country>
								</address>
							</affiliation>
							<affiliation key="aff4">
								<orgName type="institution">MovieStarPlanet ApS</orgName>
								<address>
									<settlement>Copenhagen</settlement>
									<country key="DK">Denmark</country>
								</address>
							</affiliation>
							<affiliation key="aff5">
								<orgName type="department">Computer Engineering Department</orgName>
								<orgName type="institution">İzmir Institute of Technology</orgName>
								<address>
									<settlement>İzmir</settlement>
									<country key="TR">Turkey</country>
								</address>
							</affiliation>
						</author>
						<title level="a" type="main">Saydam Artıklı C ¸alıştırma İçin Vekil Tasarım Örüntüsü Kullanımı</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">B3EFE849EA18F3B4ACFF8C03900A0D88</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-24T12:43+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<textClass>
				<keywords>
					<term>Nesneye yönelik programlama</term>
					<term>Vekil tasarım örüntüsü</term>
					<term>Artıklı çalıştırma Object-oriented programming</term>
					<term>Proxy design pattern</term>
					<term>Redundant execution</term>
				</keywords>
			</textClass>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>Bu çalışmada, nesneye yönelik programların güvenilir bir şekilde çalıştırılması için saydam bir model önermekteyiz. Geçici donanım hatalarına karşı istenen seviyede güvenilirligi saglayabilmek amacıyla artıklı (redundant) program çalıştırması için genel bir nesneye yönelik programlama aracı tasarladık. Bunun için yazılım sistemlerini esnek ve kolay sürdürülebilir yapabilmek için oluşturulmuş ve yaygınca kullanılan GoF tasarım örüntülerinden biri olan vekil tasarım örüntüsünü kullandık. Vekil tasarım örüntüsü, var olan bir nesneye erişirken ona yeni fonksiyonellikler eklemeye yarayan saydam bir düzenek ve kontrollü bir erişim saglamaktadır. Java programlama dilindeki dinamik vekil ve annotation araçlarını birleştirerek, artıklı çalıştırma ve çogunluk oylaması için genel, saydam ve yapılandırılabilir bir araç olan RedundantCaller 'ı sunmaktayız. Aracımız, herhangi bir nesneyi alır ve özgün kullanıcı koduna en az miktarda degişiklik gerektirerek nesnenin metotlarını farklı iş parçacıklarında çoklu miktarda çalıştıran ve arka planda çogunluk oylaması yapan bir dinamik vekil yaratır. annotationlar sayesinde, kullanıcılar artıklı çalıştırmayı metot seviyesinde yapılandırabilirler. Deneylerimiz göstermektedir ki; aracımız herhangi bir nesneye yönelik program için çok iş parçacıklı çalıştırma sayesinde makul bir performans düşüşüyle kayda deger bir güvenilirlik seviyesi saglamaktadır.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="tr">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1">Giriş</head><p>Bilgisayarlar ve üzerinde çalışan yazılımlar gün geçtikçe hayatın her alanında yer alırken, bilgisayarların güvenilir çalışması önem kazanmaktadır. Askeri operasyonlar, saglık, uzay araştırmaları, finansal işlemler gibi bazı uygulama alanlarında bu sistemlerin işleyişlerinde meydana gelebilecek en küçük bir hatanın bile kabul edilemez sonuçları olabilmektedir. Bu anlamda bilgisayar sistemlerini daha güvenilir kılabilmek için uygulanabilecek yöntemler bilgisayar mühendisliginin önemli araştırma alanlarından biri olmuştur <ref type="bibr" target="#b0">[1]</ref>. Artıklı sistemler bu yöntemlerin başlıcaları arasındadır <ref type="bibr" target="#b1">[2,</ref><ref type="bibr" target="#b2">3]</ref>. Sistemin ya da sistemin işleyişinin gerekenden fazla şekilde çoklanması temeline dayanan bu yöntem, donanımsal ya da yazılımsal olarak uygulanabilmektedir. Donanımsal artıklı sistemler, çoklanan donanım bileşeninin arıza yapması ve hatalı çalışması ihtimaline karşı uygulanmaktadır. Bu sistemlerde önlem alınmaya çalışılan hata kalıcı hatalardır. Bir takım donanım hataları ise geçici olarak adlandırılmakta ve sadece belirli bir zamanda oluşup daha sonra kaybolmaktadır. Bu hatalara karşı sıklıkla maliyeti daha az olan artıklı yürütme yöntemi kullanılmaktadır. Bu yöntem temelde, yapılmak istenen işlemin birden fazla defa yapılıp elde edilen sonuçların oy çoklugu prensibine göre oylanarak işlemin beklenen sonucu olarak kabul edilmesidir. Yöntemin ana fikri, aynı geçici hatanın arka arkaya ve aynı hatalı sonucu vererek oluşması ihtimalinin ihmal edilebilir düzeyde olmasıdır. Özellikle artıklı ve çoklu iş parçacıklı (redundant multithreading) yöntemler, hataların farklı çekirdeklerde çalışan kopyalarda eş zamanlı gerçekleşme ihtimalinin daha da düşük olması sebebiyle yüksek hata toleransı saglamakta, paralel çalıştırma sayesinde artıklı çalıştırmanın performans üzerindeki olumsuz etkisinin önüne geçilmektedir <ref type="bibr" target="#b4">[5,</ref><ref type="bibr" target="#b5">6]</ref>.</p><p>Artıklı yürütme yönteminin uygulanması uygulama seviyesinde yer alabilmekte ve yazılım geliştiricilere önemli bir miktarda gerçekleme yükü dogurmaktadır. Artıklı çalıştırılacak bütün işlemlerin bu şekilde gerçeklenmesi ve gerekli oylama işlemlerinin kodlanması gerekmektedir. Bu çalışmada, bu gerçekleme yükünü ortadan kaldıracak genel, yeniden kullanılır bir programlama aracı geliştirmeyi hedefledik. Bu amaçla nesneye yönelik bir programlama ortamında GoF (Gang of Four) tasarım örüntülerinden <ref type="bibr" target="#b9">[10]</ref> biri olan vekil tasarım örüntüsünü kullanarak söz konusu gerçekleme yükünün herhangi bir nesne için otomatik ve saydam olarak yapıldıgı, RedundantCaller (artıklı çalıştırıcı) adını verdigimiz bir programlama aracı (sınıf) tasarladık.</p><p>Bölüm 2'de bu alandaki ilgili çalışmalar üzerinden kısaca geçilmekte ve bu bölümü vekil tasarım örüntüsünün özetlendigi Bölüm 3 izlemektedir. Redundant-Caller aracımızın işleyişinin yeraldıgı Bölüm 4'ün ardından aracın neden oldugu performans düşüşü ve güvenilirlik artışının incelendigi deneysel çalışmaların bulundugu Bölüm 5 gelmektedir. Bölüm 6 ile makale sonlanmaktadır.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2">İlgili C ¸alışmalar</head><p>Literatürde yazılım tabanlı artıklı çalıştırma için çok sayıda çalışma mevcuttur. Bu bölümde bu konulardaki çalışmalara yer verilmiştir.</p><p>SRMT (Software-based Redundant Multi-Threading) <ref type="bibr" target="#b6">[7]</ref>, verilen program kodunu iki iş parçacıgına çoklayarak hata tespiti saglamaktadır. Paralel çalışan iş parçacıkları, komutların sonuçlarını karşılaştırarak uyuşmazlık durumunda hata durumu oldugunu tespit etmektedir. Komut seviyesinde sonuç kontrolü saglandıgından performansa etkisi oldukça fazladır, o yüzden bunu iyileştirmek için farklı iş parçacıklarının iletişimini saglayan optimizasyonlar da önerilmiştir. Detaylı bir derleyici ve yürütme sistemi gerçeklemesi içeren bu sistem, sadece hata tespiti saglamakta olup hata toleransı seviyesinin yeniden yapılandırılmasına imkan vermemektedir.</p><p>RedThreads <ref type="bibr" target="#b7">[8]</ref>, C/C++ programları için artıklı çok iş parçacıklı çalıştırma saglayan bir arayüz saglamaktadır. Yazılım geliştirici, arayüz tarafından tanımlanan direktiflerle (directives) programın hangi parçasının, hangi seviyede (kaç iş parçacıgıyla) artıklı çalışacagını belirtebilmektedir. C ¸alışmada hem derleyici, hem de yürütme sistemi gerçeklemesi yapılmış, kullanıcının belirledigi özelliklere göre artıklı çalıştırma saglanmıştır. Kullanım kolaylıgı açısından Re-dundantCaller aracımıza benzemekle birlikte C/C++ programlarına yönelik olması ve çok fazla gerçekleme gerektirmesi yönleriyle bizim çalışmamızdan farklılık göstermektedir.</p><p>Chen ve Chen <ref type="bibr" target="#b8">[9]</ref> yazılım tabanlı artıklı çalıştırma için bir programlama modeli önermişlerdir. C ¸alışmalarındaki programlama modeli, hata toleransını gerçeklemek için çok iş parçacıklı teknikleri kullanmaktadır. Hata düzeltmeyi de çogunluk oylamasıyla gerçekleştirmektedir. Ayrıca sistemin cevap vermedigi hata durumları için watchdog zamanlayıcısı kullanılmaktadır. Yazılım geliştiricinin, yazılımın gerekli yerlerine müdahale etmesi ve programlama modelinin sundugu fonksiyonları eklemesi gerekmektedir. Yazılım geliştiriciye saydam bir araç olarak sunulan RedundantCaller aracını kullanmak için, hata toleransı eklenmek istenen yazılımda neredeyse hiçbir degişiklik yapılmasına gerek duyulmamaktadır.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3">Vekil Tasarım Örüntüsü</head><p>Tasarım örüntüleri nesneye yönelik programlamada çok karşılaşılan tasarım problemlerine çözüm olarak sunulmuş yeniden kullanılır, esnek, ve dogrulanmış çözüm önerileridir <ref type="bibr" target="#b9">[10]</ref>. Vekil tasarım örüntüsü Eric Gamma ve arkadaşlarının önerdigi 23 iyi bilinen tasarım örüntüsünden biridir ve şu iki temel probleme çözüm sunmayı hedeflemektedir:</p><p>-Nesneye erişimi kontrol altına almak -Nesneye saydam bir şekilde yeni işlevler kazandırmak S ¸ekil 1. Vekil tasarım örüntüsünün UML sınıf şeması <ref type="bibr" target="#b9">[10]</ref>.</p><p>Temelde hedef olarak seçilen sınıf ile aynı arayüze sahip bir vekil sınıfının tanımlanması ve vekil sınıfın hedef sınıfı içinde bulundurması (composition) fikrine dayanır. Hedef sınıf kullanıcıları bu sınıfa vekil sınıf üzerinden erişim saglarlar. S ¸ekil 1'de vekil tasarım örüntüsünün UML (Unified Modeling Language) sınıf şeması görüntülenmektedir. Vekil tasarım örüntüsü farklı gerçekleme senaryoları ile yazılım geliştirme alanlarında uygulanmaktadır <ref type="bibr" target="#b10">[11,</ref><ref type="bibr" target="#b11">12]</ref>.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4">Vekil Tasarım Örüntüsü Temelli Hata Toleransı</head><p>Bu çalışmamızda vekil tasarım örüntüsü temelli RedundantCaller ismini verdigimiz saydam bir artıklı çalıştırma aracı geliştirdik (https://github.com/isil-oz/RedundantCaller). Bunu yaparken Java programlama dilindeki dinamik vekil (dynamic proxy) mekanizmasını kullandık. Bu mekanizma bir arayüz (interface) ile erişilen herhangi bir sınıfa çalıştırma zamanında otomatik olarak bir vekil sınıf oluşturmak için kullanılmaktadır. RedundantCaller, verilen herhangi bir sınıfın nesnesi için bu sınıfın metotlarını artıklı bir şekilde çalıştıracak vekil nesneyi otomatik olarak oluşturur ve geliştirici bu vekil nesneyi kullanarak gerçeklemek istedigi kodu yazar. RedundantCaller hedef nesnenin artıklı çalıştırılacak bir metodu çagrıldıgında öncelikle o nesnenin artıklı çagırma sayısınca klonunu üretir. Bu işlem Redun-dantCaller kullanımının getirdigi bir gereksinim olmayıp çagrılan metot nesne üzerinde degişiklik yapıyor ise sonraki metotların tutarlı ve dogru çalışması için gereklidir ve artıklı çalıştırma işleminin dogası geregi yapılmaktadır. Daha sonra, artıklı çalıştırma çok iş parçacıklı (multithreaded) olarak yapılandırılmış ise oluşturulan hedef nesne klonlarını içeren birer iş parçacıgı üretilir ve Java programlama dilinde eşzamanlı çalıştırma (concurrent execution) için yaygınca kullanılan Fork-Join mekanizması ile bu iş parçacıkları paralel olarak çalıştırılır. Tek iş parçacıklı yapılandırma senaryosunda ise bu işlem bir döngü içerisinde klon nesnelerin metotlarının arka arkaya çalıştırılması şeklinde gerçekleştirilir. Her iki senaryoda da artıklı çalıştırma neticesinde elde edilen sonuçlar çogunluk oylaması yöntemi ile oylanır ve kazanan sonuç işlemin beklenen sonucu olarak döndürülür. Burada özetlenen bütün bu işlemler geliştiricinin herhangi bir gerçekleme yapmasını gerektirmeden RedundantCaller nesnesi tarafından saydam bir şekilde gerçekleştirilir. RedundantCaller sınıfında yukarıda özetlenen işleri gerçekleştiren kod parçacıgı Kod 1'de listelenmektedir.</p><p>Ayrıca geliştirici, vekil nesne ile erişmek istedigi nesnenin arayüz tanımında artıklı çalıştırmak istedigi metotları ve bunların artıklı çalıştırma parametrelerini belirleyebilir. Metot bazında yapabildigi bu yapılandırma imkanı için yine Java programlama dilindeki annotation mekanizması kullanılmıştır. Artıklı çalıştırma yapılandırma parametreleri ihtiyaca göre kolayca arttırılabilmekle beraber bu çalışmada şu parametrelere yer verilmiştir:</p><p>-votecount : Tamsayı. Metodun kaç defa çalıştırılacagını belirtir.</p><p>-multithreaded : true/false. Artıklı çalıştırma işleminin çok iş parçacıklı çalıştırılıp çalıştırılmayacagını belirtir.  RedundantCaller aracımızın kullanım örnegi S ¸ekil 2'de bir nesne üzerinde gösterilmektedir. Örnekte kullanılmak istenen sınıf Matrix sınıfı ve bu sınıfa erişim için tanımlanan arayüz IMatrix arayüzüdür. Bu arayüz içinde tanımlanan tüm metotlar için artıklı çalıştırma imkanı saglanacaktır. Metotlar için belirtilen annotation aracılıgıyla da artıklı çalıştırma yapılandırılabilmektedir. Redundant-Caller sınıfı, Matrix sınıfına vekillik yapmaktadır. Yazılım geliştirici, istedigi artıklılık seviyesine göre annotationların degerlerini belirleyebilmektedir. Ayrıca Artıklı C ¸alışma kutusundaki nesne oluşturma (createObject) satırını yazarak vekil nesne üzerinden yeni nesne oluşturmaktadır. S ¸ekildeki örnekte transpose metodu için tanımlanan @RedundantCall(voteCount = 3, multithreaded = true) annotation'ı ile, transpose metodunu 3 iş parçacıgıyla artıklı olarak çalıştırmak istedigimiz belirtilmiştir. plus metodu için tanımlanmış olan @Re-dundantCall(voteCount = 5, multithreaded = false) annotation'ıyla ise 5 artıklı çalıştırmanın tek bir iş parçacıgıyla gerçekleştirilmesi istenmiştir.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5">Deneysel C ¸alışma</head><p>RedundantCaller aracının nesneye yönelik uygulamaların performans ve güvenilirlik üzerindeki etkilerini gözlemlemek için gerçekleştirdigimiz deneyler bu bölümde yer almaktadır.</p><p>Deneylerimizi temel lineer cebir işlemleri içeren bir paket olan JAMA kütüphanesini kullanarak gerçekleştirdik <ref type="bibr" target="#b12">[13]</ref>. JAMA, Matrix ana sınıfı altında farklı operasyonlar sunmaktadır. Bu kütüphanenin kullanımı, hata hassasiyeti ve hata toleransı çalışmalarında <ref type="bibr" target="#b13">[14,</ref><ref type="bibr" target="#b14">15]</ref> sıklıkla kullanılan matris hesaplamaları içerdiginden çalışmamız için oldukça uygun olmuştur. Deneylerimizde 1000x1000 boyutunda rastgele degerlere sahip matrisler üreterek Tablo 1'de listelenen temel 31 operasyonu kullandık. Artıklı çalıştırmanın çok iş parçacıklı versiyonlarını çalıştırabilmek için Intel Xeon E5-2680 temelli çok çekirdekli mimaride deneylerimizi çalıştırdık.</p><p>Öncelikle RedundantCaller 'ın performansa olan etkisini gözlemleyebilmek için deneyler gerçekleştirdik. Bu deneylerde matris operasyonlarının artıklı çalıştırma olmadan tamamlandıgı zamanı, ve artıklı çalıştırmanın tek iş parçacıklı, 3 iş parçacıklı ve 5 iş parçacıklı versiyonlarının tamamlandıgı zamanları ölçtük. C ¸alıştırmalar arasındaki eşitsizliklerden kaynaklanabilecek olası yanıltıcı sonuçlardan etkilenmemek için her bir operasyonu 20 defa çalıştırıp en yüksek olan bir degeri dışarıda tutarak ortalamalarını hesapladık, ve her bir operasyonun her bir versiyon için çalıştırma zamanını belirledik. Operasyonlar farklı çalıştırma zamanlarına sahip oldugundan ve hepsini tek bir şekilde göstermek zor oldugundan operasyonları çalıştırma zamanlarına göre üç gruba ayırarak farklı şekillerde performans sonuçlarını raporladık. S ¸ekil 3 çok kısa çalıştırma zamanına (normal çalıştırma zamanı 5 saniyeden düşük) sahip operasyonlara ait sonuçları gösterirken, S ¸ekil 5 uzun süreli operasyonlara ait farklı konfigürasyonlar için operasyonların çalıştırma zamanlarını göstermektedir. Bu şekillerde performans sonuçları verilen farklı konfigürasyonlar ve açıklamaları ayrıca Tablo 2'de verilmiştir.</p><p>S ¸ekil 3'te görüldügü gibi çalıştırma zamanı küçük olan operasyonlar için artıklı çalıştırma maliyeti oransal olarak çok yüksekken, tek iş parçacıklı (RCSingle) ve üç iş parçacıklı (RC3Thread) üç artıklı çalıştırma konfigürasyonları ben- figürasyonları için işlem seviyesinde zaman ölçümleri yaptık. S ¸ekil 4, normal çalışması 3-4 saniye süren arrayLeftDivide operasyonunun çalıştırma zamanının hangi işlemlerde geçtigini göstermektedir. Diger operasyonlar için de benzer durumlar söz konusudur. Öte yandan, S ¸ekil 5'te görüldügü gibi normal çalışması 1000-10000 saniye süren bir uygulama için artıklı çalıştırmanın fazladan çalıştırma haricindeki işlemleri görece çok kısa oldugundan, artıklı çalıştırmanın toplam maliyeti oldukça düşük olmaktadır. Tek iş parçacıklı konfigürasyonda (RCSingle), üç artıklı çalıştırma tek bir iş parçacıgı tarafından arka arkaya yapıldıgı için onun performansı en kötüyken; paralel konfigürasyonlarda (RC3Thread ve RC5Thread) üç-beş iş parçacıgı, artıklı çalıştırmaları farklı çekirdeklerde eş zamanlı olarak gerçekleştirdiginden toplam çalıştırma zamanları ciddi artış göstermemektedir. Uzun hesaplamalarda fazladan çalıştırma haricindeki işlemlerin maliyeti görünmemekte ve asıl büyük hesaplama iş parçacıklarına yaptırıldıgı için maliyet gizli kalmış olmaktadır.</p><p>RedundantCaller 'ın performansının yanı sıra hata kapsamını gözlemleyebilmek için hata enjeksiyonu deneyleri gerçekleştirdik. Bunun için deneylerde kullandıgımız Matrix sınıfı için operasyon seviyesinde belirli bir ihtimalle hesaplama hata durumları oluşturduk, normal çalıştırmanın ve artıklı çalıştırmanın hesapladıgı degerin hesaplaması gereken degere eşit olup olmadıgını kontrol ederek sessiz veri bozulumu (silent data corruption) durumlarını tespit etmeye çalıştık. Hata enjeksiyonu deneyleri uzun zaman aldıgından nispeten kısa çalıştırma zamanlarına sahip transpose, norm1, norm2, ve uminus operasyonlarına hata enjeksiyonu yaptık. RedundantCaller aracı açısından farklılık oluşturmadıgı için bu operasyon alt kümesinin yeterli oldugunu düşünmekteyiz. Her bir operasyon için 1000 farklı çalıştırma yaparak normal çalıştırmanın ve artıklı çalıştırmanın hatalı hesaplama durumlarını gözlemlemeye çalıştık. İlk olarak literatürde de olası hata oranı olarak tespit edilen 0,001 degeriyle hata enjeksiyon testleri çalıştırdık. Bu hata degeriyle normal çalıştırma için 0,002 (4000 çalıştırmada 8 hatalı veri hesaplama) veri bozulumu oranı gözlemlerken üç artıklı çalıştırmada herhangi bir veri bozulması ile karşılaşmadık. Hata oranını 0,01, 0,1, 0,2 gibi daha az gerçekçi degerlere degiştirdigimizde normal çalıştırmanın veri bozulumu oranı artış gösterirken, üç artıklı çalıştırmada veri bozulumu oranı sıfırda kalarak %100 hata kapsamı gözlemlenmiştir. Hata analizi deneylerimiz, çogunluk oylaması temelli hata toleransı sistemlerindeki beklenen hata kapsamı seviyesini dogrulamıştır. Deney sonuçlarımız, aracımızın tanımlanan hata modelindeki hata kapsamı performansını göstermektedir.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6">Sonuç</head><p>Bilgisayarların ve üzerinde yürütülen yazılımların hatasız ve güvenilir çalışması, çogu zaman performans ve maliyet gibi diger birçok kriterin önüne geçmekte ve bilgi sistemlerinin tasarım kararlarında önemli bir rol oynamaktadır. Geliştiriciler yazılımları oluştururken çözmek istedikleri orjinal problemin yanı sıra, yazılımın daha güvenilir olması için almaları gereken tedbirleri de göz önünde bulundurmak durumundadırlar. C ¸ogu kez bu tedbirler yüksek miktarda ilave kod karmaşıklıgı ve/veya performans yükü dogurmaktadır.</p><p>Bu çalışmada nesne yönelimli programlamada yaygınca kullanılan vekil tasarım örüntüsünü kullanarak geliştiricilere güvenilir yazılım mekanizmalarından biri olan artıklı çalıştırma teknigini esnek, saydam ve otomatik bir şekilde sunan bir geliştirme aracı oluşturduk. Vekil tasarım örüntüsünün diger kullanım alanlarının yanında bu alanda da etkin bir çözüm olarak kullanılabilecegini göstermiş olduk. Java programlama dilinin sundugu dinamik vekil ve annotation dil ögelerini kullanarak tasarladıgımız aracı genel ve kolayca yapılandırılabilir bir şekilde gerçekledik. Yine Java'da yaygınca kullanılan fork-join sistemi ile artıklı çalıştırma işinin istege baglı olarak çok iş parçacıklı olarak yapılmasını sagladık.</p><p>Örnek bir Java kütüphanesi ile gerçekleştirdigimiz deneylerde paralel çalıştırmanın sagladıgı fayda ile aracımızın küçük bir performans kaybı ile önemli oranlarda güvenilirlik artışı sagladıgını gösterdik. Yine deneyler için oluşturdugumuz test kodunda RedundantCaller kullanımının mevcut kodu min-imum miktarda degiştirdigini ve geliştiriciye ihmal edilebilir miktarda bir ilave iş yükü getirdigini gözlemledik. Ayrıca önerdigimiz aracın benzer programlama ögelerinin (dynamic proxy, annotation) desteklendigi diger nesneye yönelik programlama dillerinde (C#, C++ vb.) de kolaylıkla gerçeklenebilecegini düşünmekteyiz.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="7">Teşekkür</head><p>Bu çalışmada kullanılan hesaplama kaynakları Ulusal Yüksek Başarımlı Hesaplama Merkezi'nin (UHeM), 1005202018 numaralı destegiyle, saglanmıştır.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Kaynaklar</head></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>2 .</head><label>2</label><figDesc>Her bir nesnenin metodunu paralel olarak çalıştırmak için paralel işler oluşturulur: Task t1 = m1.transpose Task t2 = m2.transpose Task t3 = m3.transpose Paralel olarak artıklı çalıştırma gerçekleştirilir: sonuc1 = t1.invoke sonuc2= t2.invoke sonuc3 = t3.invoke Çoğunluk oylaması: RedundantCaller 'ın kullanımı.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head>Tablo 1 .Tablo 2 .S ¸ekil 4 .</head><label>124</label><figDesc>Deneylerimizde kullandıgımız matris operasyonları. Operasyon Adı Operasyon arrayLeftDivide Soldan bölme (C = A.\B) arrayLeftDivideEquals Soldan bölüp kendine eşitleme (A = A.\B) arrayRightDivide Sagdan bölme (C = A./B) arrayRightDivideEquals Sagdan bölüp kendine eşitleme (A = A./B) arrayTimes C ¸arpma (C = A.*B) arrayTimesEquals C ¸arpıp kendine eşitleme (A = A.*B) chol Cholesky ayrıştırma cond Matris durumu det Matris determinant eig Özdeger ayrıştırma inverse Ters lu LU ayrıştırma minus C ¸ıkartma (C = A -B) minusEquals C ¸ıkartıp kendine eşitleme (A = A -B) norm1 1 norm (En büyük sütun toplamı) norm2 2 norm (En büyük tekil deger) normF Frobenius norm (Elemanların karelerinin toplamının karakökü) normInf Sonsuz norm (En büyük satır toplamı) plus Toplam (C = A + B) plusEquals Toplayıp kendine eşitleme (A = A + B) qr QR ayrıştırma rank Matris rank solve A*X = B çözümü solveTranspose X*A = B ve ayrıca A'*X' = B' çözümü svd Tekil deger ayrıştırma times s Skalar ile çarpım (C = s*A) times m Lineer cebirsel matris çarpımı (A * B) timesEquals Skalar ile çarpıp kendine eşitleme (A = s*A) trace 512, 1024, 2048 transpose Matris trace (Diyagonal elemanların toplamı) uminus Negatifini alma (-A) Karşılaştırma yaptıgımız konfigürasyonlar. Konfigürasyon Adı Konfigürasyon NonRC Normal çalıştırma (Artıklı çalıştırma yok) RCSingle Tek iş parçacıklı, üç artıklı çalıştırma RC3Thread Üç iş parçacıklı, üç artıklı çalıştırma RC5Thread Beş iş parçacıklı, beş artıklı çalıştırma S ¸ekil 3. Farklı artıklı çalıştırma konfigürasyonları için çalıştırma zamanları (kısa süreli operasyonlar için).zer sonuçlar vermektedir. Bu durumlarda beş iş parçacıklı, beş artıklı çalıştırma (RC5Thread) konfigürasyonunun maliyeti 10-20 kata kadar çıkmaktadır. Bu gruptaki operasyonların çalıştırma zamanlarının çok kısa olmasından dolayı; artıklı çalıştırmadaki nesnelerin klonlanması, çogunluk oylaması gibi fazladan çalıştırma haricindeki işlemlerin zamanının normal çalıştırma zamanının çok fazla üstüne çıkmasına sebep olmaktadır. Özellikle paralel versiyonlarda iş parçacıklarının yaratılması ve yönetilmesi işlerinin de eklenmesiyle çalıştırma zamanları göreceli olarak çok artmaktadır. Örnegin, çalıştırılması 2 saniye süren bir operasyonu üç iş parçacıklı, üç artıklı çalıştırma ile çalıştırdıgımızı düşünelim. Bir iş parçacıgı yaratma işlemi 0,5 saniye sürüyorsa, sadece iş parçacıgı yaratma işleminin eklenmesiyle operasyonun çalıştırma zamanı yaklaşık 2 katına çıkmaktadır. Bu durumu gözlemleyebilmek için artıklı çalıştırma kon-Farklı artıklı çalıştırma konfigürasyonları için arrayLeftDivide operasyonunun çalıştırma zamanının dagılımı. S ¸ekil 5. Farklı artıklı çalıştırma konfigürasyonları için çalıştırma zamanları (uzun süreli operasyonlar için).</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0"><head></head><label></label><figDesc></figDesc><graphic coords="9,134.77,115.80,379.72,172.83" type="bitmap" /></figure>
		</body>
		<back>
			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<monogr>
		<author>
			<persName><forename type="first">C</forename><forename type="middle">Mani</forename><surname>Israel Koren</surname></persName>
		</author>
		<author>
			<persName><surname>Krishna</surname></persName>
		</author>
		<title level="m">Fault-Tolerant Systems</title>
				<imprint>
			<publisher>Morgan Kaufmann</publisher>
			<date type="published" when="2007">2007</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">August: Swift: Software implemented fault tolerance</title>
		<author>
			<persName><forename type="first">George</forename><forename type="middle">A</forename><surname>Reis</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Jonathan</forename><surname>Chang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Neil</forename><surname>Vachharajani</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Ram</forename><surname>Rangan</surname></persName>
		</author>
		<author>
			<persName><forename type="first">I</forename><surname>David</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">International Symposium on Code Generation and Optimization</title>
				<imprint>
			<date type="published" when="2005">2005</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<analytic>
		<title level="a" type="main">Design and evaluation of hybrid fault-detection systems</title>
		<author>
			<persName><forename type="first">George</forename><forename type="middle">A</forename><surname>Reis</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Jonathan</forename><surname>Chang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Neil</forename><surname>Vachharajani</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Ram</forename><surname>Rangan</surname></persName>
		</author>
		<author>
			<persName><forename type="first">David</forename><forename type="middle">I</forename><surname>August</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Shubhendu</surname></persName>
		</author>
		<author>
			<persName><surname>Mukherjee</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">International symposium on Computer Architecture (ISCA)</title>
				<imprint>
			<date type="published" when="2005">2005</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<analytic>
		<title level="a" type="main">Connors: Plr: A software approach to transient fault tolerance for multicore architectures</title>
		<author>
			<persName><forename type="first">Alex</forename><surname>Shye</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Joseph</forename><surname>Blomstedt</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Tipp</forename><surname>Moseley</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Vijay</forename><forename type="middle">Janapa</forename><surname>Reddi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Daniel</forename><forename type="middle">A</forename></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">IEEE Transactions on Dependable and Secure Computing</title>
		<imprint>
			<biblScope unit="volume">6</biblScope>
			<biblScope unit="issue">2</biblScope>
			<biblScope unit="page" from="135" to="148" />
			<date type="published" when="2009">2009</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">Detailed design and evaluation of redundant multi-threading alternatives</title>
		<author>
			<persName><forename type="first">S</forename><forename type="middle">S</forename><surname>Mukherjee</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Kontz</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><forename type="middle">K</forename><surname>Reinhardt</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">International Symposium on Computer Architecture (ISCA)</title>
				<imprint>
			<date type="published" when="2002">2002</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<analytic>
		<title level="a" type="main">Transient-fault recovery for chip multiprocessors</title>
		<author>
			<persName><forename type="first">M</forename><surname>Gomaa</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Scarbrough</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><forename type="middle">N</forename><surname>Vijaykumar</surname></persName>
		</author>
		<author>
			<persName><forename type="first">I</forename><surname>Pomeranz</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">International Symposium on Computer Architecture (ISCA)</title>
				<imprint>
			<date type="published" when="2003">2003</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<analytic>
		<title level="a" type="main">Compiler-Managed Softwarebased Redundant Multi-Threading for Transient Fault Detection</title>
		<author>
			<persName><forename type="first">Cheng</forename><surname>Wang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Youfeng</forename><surname>Ho Seop Kim</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Victor</forename><surname>Wu</surname></persName>
		</author>
		<author>
			<persName><surname>Ying</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">International Symposium on Code Generation and Optimization</title>
				<imprint>
			<publisher>CGO</publisher>
			<date type="published" when="2007">2007</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">RedThreads: An Interface for Application-Level Fault Detection/Correction Through Adaptive Redundant Multithreading</title>
		<author>
			<persName><forename type="first">Saurabh</forename><surname>Hukerikar</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Keita</forename><surname>Teranishi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Pedro</forename><forename type="middle">C</forename><surname>Diniz</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Robert</forename><forename type="middle">F</forename><surname>Lucas</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">International Journal of Parallel Programming</title>
		<imprint>
			<biblScope unit="volume">46</biblScope>
			<biblScope unit="page" from="225" to="251" />
			<date type="published" when="2018">2018</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b8">
	<analytic>
		<title level="a" type="main">A Software-Based Redundant Execution Programming Model for Transient Fault Detection and Correction</title>
		<author>
			<persName><forename type="first">Yi-Shen</forename><surname>Chen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Peng-Sheng</forename><surname>Chen</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">45th International Conference on Parallel Processing Workshops (ICPPW)</title>
				<imprint>
			<date type="published" when="2016">2016</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b9">
	<monogr>
		<author>
			<persName><forename type="first">Erich</forename><surname>Gamma</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Richard</forename><surname>Helm</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Ralph</forename><surname>Johnson</surname></persName>
		</author>
		<author>
			<persName><forename type="first">John</forename><surname>Vlissides</surname></persName>
		</author>
		<title level="m">Design Patterns:Elements of Reusable Object-Oriented Software</title>
				<imprint>
			<publisher>Addison-Wesley</publisher>
			<date type="published" when="1994">1994</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<analytic>
		<title level="a" type="main">A Proxy Design Pattern to Support Real-Time Distributed Control System Benchmarking</title>
		<author>
			<persName><forename type="first">K</forename><surname>Soundararajan</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><forename type="middle">W</forename><surname>Brennan</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Holonic and Multi-Agent Systems for Manufacturing</title>
				<imprint>
			<publisher>HoloMAS</publisher>
			<date type="published" when="2005">2005</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b11">
	<analytic>
		<title level="a" type="main">Design patterns for real-time distributed control system benchmarking</title>
		<author>
			<persName><forename type="first">K</forename><surname>Soundararajan</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><forename type="middle">W</forename><surname>Brennan</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Robotics and Computer-Integrated Manufacturing</title>
		<imprint>
			<biblScope unit="volume">24</biblScope>
			<biblScope unit="issue">5</biblScope>
			<biblScope unit="page" from="606" to="615" />
			<date type="published" when="2008">2008</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b12">
	<monogr>
		<ptr target="https://math.nist.gov/javanumerics/jama/" />
		<title level="m">JAMA Homepage</title>
				<imprint>
			<date type="published" when="2018-06-11">11 June 2018</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b13">
	<analytic>
		<title level="a" type="main">Soft Error Vulnerability of Iterative Linear Algebra Methods</title>
		<author>
			<persName><forename type="first">Greg</forename><surname>Bronevetsky</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Bronis</surname></persName>
		</author>
		<author>
			<persName><surname>De Supinski</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">International conference on Supercomputing (ICS)</title>
				<imprint>
			<date type="published" when="2008">2008</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b14">
	<analytic>
		<title level="a" type="main">Analyzing the soft error resilience of linear solvers on multicore multiprocessors</title>
		<author>
			<persName><forename type="first">Konrad</forename><surname>Malkowski</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Padma</forename><surname>Raghavan</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Mahmut</forename><surname>Kandemir</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">International Symposium on Parallel and Distributed Processing</title>
				<imprint>
			<publisher>IPDPS</publisher>
			<date type="published" when="2010">2010</date>
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
