İşletim Sistemleri. Dr. Binnur Kurt Omega Eğitim ve Danışmanlık İşletim Sistemleri

Benzer belgeler
İşletim Sistemleri. Dr. Binnur Kurt Omega Eğitim ve Danışmanlık İşletim Sistemleri

Alıştırmalar 2 - Dağıtık Sistemler. Alıştırma 2. Prof. Dr. Th. Letschert Çeviri: Turgay Akbaş FB MNI 16. Mai 2013

C++ Giriş Ders 1 MSGSU Fizik Bölümü Ferhat ÖZOK Kullanılacak kaynak: Published by Juan Soulié

İşletim Sistemleri. Dr. Binnur Kurt Omega Eğitim ve Danışmanlık İşletim Sistemleri

BMS-302 İleri Web Programlama. İş Parçacığı (Thread) ve Soket (Socket) Programlama

Multicore/Multithread Programlama

Prosesler Arası Haberleşme ve Senkronizasyon

BİL132 Bilgisayar Programlama II

Yigin & Kuyruk {\} /\ Suhap SAHIN Onur GÖK

Dağıtık Sistemler CS5001

ve Senkronizasyon Senkronizasyon Eş Zamanlılık Sorunlar Sorunlar Çözüm Örnek

BĠLGĠSAYAR PROGRAMLAMA II C++ Programlamaya GiriĢ Published by Juan Soulié

Bire-bir Sahiplik İlişkisi ile İlgili Sorular:

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

Ağ Sunucusu Programlaması. Bora Güngören Portakal Teknoloji

BMÜ-112 ALGORİTMA VE PROGRAMLAMA-II LABORATUARI DENEY-2 FÖYÜ

Dağıtık Sistemler CS5001

Dağıtık Sistemler CS5001

İşletim Sistemleri-II

İÇİNDEKİLER. İşletim Sistemleri

işlemler bittikten sonra dosyaların kapatılması uygun olacaktır. Bunun için, fclose(fin);

Görsel Programlama. Temel Veri Tipleri, Değişkenler, Operatörler, Akış Kontrolü, Sınıflar, Metotlar, Paketler ve JavaDoc

Nesneye yönelik: Javada herşey bir nesnedir. Java nesne yönelimli olduğu için kolayca geliştirilebilir.

İş Parçacıkları Thread(s)

Nesne tabanlı programlama nesneleri kullanan programlamayı içerir. Bir nesne farklı olarak tanımlanabilen gerçek dünyadaki bir varlıktır.

C# Yazım Kuralları ERCİYES. Ü. BİLGİSAYAR M. COMPUTER PROGRAMMING II 1 FEHİM KÖYLÜ

BİL-141 Bilgisayar Programlama I (Java)

BMT 101 Algoritma ve Programlama I 5. Hafta. Yük. Müh. Köksal Gündoğdu 1

Bir c sınıfının doğal sıralaması ile tutarlı olması (be consistent with equals) demek, c sınıfı içindeki her e1 ve e2 nesnesi için

KUYRUKLAR QUEUES. Doç. Dr. Aybars UĞUR

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

Programlama Dili Prensipleri. Lab Notları 1

CharArrayReader. Kılgıladığı Arayüzler: Bildirimi: Değişkenleri (fields): java.io.reader Sınıfından Kalıtsal Gelen Değişken:

İŞ PARÇACIKLARI (THREADS)

NESNEYE YÖNELİK PROGRAMLAMA C++ a Giriş

TEMPLATES. Binnur Kurt Bilgisayar Mühendisliği Bölümü İstanbul Teknik Üniversitesi. C++ ile Nesneye Dayalı Programlama 1

Nesne Yönelimli Programlama

Progress Barlı, FTP Dosya Upload Appleti

D İ Z İ L E R A R R A Y S

Dizi ( Array ) ve Dizgi ( String )

Arayüz soyut metotların oluşturduğu bir koleksyondur. Bir sınıf arayüzü çalıştırırken arayüzün sahip olduğu soyut metotları da miras alır.

// hataları işaret eden referans

RSA ANAHTAR DAĞITIMI VE RSA İLE DİJİTAL İMZA OLUŞTURMA

BİL-141 Bilgisayar Programlama I (Java)


Soru 1: Fahrenheit cinsinden verilen sıcaklığı Kelvin'e çeviren bir program yazınız. Aşağıdaki dönüşüm formülünü kullanabilirsiniz:

Yığıtın en üstündeki öğeyi değer olarak alır; ama onu yığıttan almaz, yerinde bırakır.

CSSigner, Cybersoft firması tarafından geliştirilmiş açık kaynak kodlu e-imza yazılım kütüphanesidir.

İşletim Sistemleri. Dr. Binnur Kurt Omega Eğitim ve Danışmanlık İşletim Sistemleri

Yazılım Kodlama ve İ simlendirme Standartları v1.0

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

AHMET YESEVİ ÜNİVERSİTESİ BİLİŞİM SİSTEMLERİ VE MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ LİSANS DÖNEM ÖDEVİ

/*int sayi1, sayi2,toplam=0;

Java da Program Denetimi ve Operatörler. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 2 1

Proses. Prosesler 2. İşletim Sistemleri

MAT214 BİLGİSAYAR PROGRAMLAMA II DERSİ Ders 12: Grafik Kullanıcı Arayüzü (Graphical User Interface-GUI)

3.Hafta. . Kontrol Deyimleri/İfadeler

BBS515 Nesneye Yönelik Programlama. Ders 2 Zümra Kavafoğlu

İşletim Sistemleri. Dr. Binnur Kurt Omega Eğitim ve Danışmanlık İşletim Sistemleri

Soket IPC (bağlantı doğrultusunda olan istemci and sunucu operasyonları) Sunucu. İstemci. socket() Bir soket yarat. bind()

Bölüm 8. Ayrık Küme. Olcay Taner Yıldız. O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, / 16

Bölüm 2 - C ile Programlamaya Giriş

BMH-303 Nesneye Yönelik Programlama

abstract Sınıflar 1 Sınıf sınıf1 new class Ama aşağıdaki şekilde referans alınabilir;

Bölüm 6. Karma. Olcay Taner Yıldız. O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, / 31

ByteArrayOutputStream

Merge (Bireşim) Algoritmayı önce bir örnek üzerinde açıklayalım.

İçerik. Temel Kavramlar. Nesne Nedir? 1. Nesne : Örnek. Nesne Nedir? 2. Geçen hafta: Bu hafta: BBS-515 Nesneye Yönelik Programlama

BMÜ-101 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ LABORATUARI

Java da İşleçler, Ders #3 (4 Kasım 2009)

Temel Kavramlar BBS-515 Nesneye Yönelik Programlama

Operatörlere İşlev Yükleme

C de Detaylı Üs Alma Programı. C# Dilinde Metot Tanımlama ve Yazdırma

Class PriorityQueue. Class PriorityQueue<E> java.lang.object java.util.abstractcollection<e> java.util.abstractqueue<e> java.util.

BMÜ-111 ALGORİTMA VE PROGRAMLAMA AKIŞ KONTROLÜ YRD. DOÇ. DR. İLHAN AYDIN

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

Interface Comparator. Kılgılayan sınıf: Collator. Bildirimi: public interface Comparator

Programlama Dilleri III 1

C++ ile Nesneye Dayalı Programlama

Liskov Substitution Principle (LSP) Liskov un Yerine Gecme Prensibi KurumsalJava.com

Nesne İşaretçileri. Binnur Kurt Bilgisayar Mühendisliği Bölümü İstanbul Teknik Üniversitesi. Sınıf Yapısı. Kalıtım Çok Şekillilik

İçerik. Java da İşleçler, İşleçler. Aritmetik İşleçler - 1. Aritmetik İşleçler - 2. Geçen ders: Bu ders: BS-515 Nesneye Yönelik Programlama

10/17/2007 Nesneye Yonelik Programlama 3.1

Akış Konrol Mekanizmaları

JAVA ile DAĞITIK PROGRAMLAMA

C# Console Uygulamaları ifelse Yapıları 2

JAVA DA GİRİŞ/ÇIKIŞ İŞLEMLERİ. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 9 1

PROSESLER. Proses. Proses

Lab7 DOĞU AKDENİZ ÜNİVERSİTESİ BİLGİSAYAR VE TEKNOLOJİ YÜKSEKOKULU BİLGİSAYAR PROGRAMCILIĞI. BTEP212 Java. Uygulama1: package javaapplication58;

İsimler ve Kapsam. 24 Şubat Programlama Dilleri - Pamukkale Üniversitesi 1

GÜZ DÖNEMİ AKT105 BİLGİSAYAR PROGRAMLAMA DERSİ 9. UYGULAMA

İŞLETİM SİSTEMLERİ (POSIX THREADS v1)

Bölüm 24. Java Ağ Uygulamaları 24.1 Java Appletleri. Bir Applet in Yaşam Döngüsü:

KOCAELİ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ

Diziler. Yrd.Doç.Dr.Bülent ÇOBANOĞLU

Operator Aşırı Yükleme (Operator OverLoading)

AHMET YESEVİ ÜNİVERSİTESİ BİLİŞİM SİSTEMLERİ VE MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ LİSANS DÖNEM ÖDEVİ

Binnur Kurt İstanbul Teknik Üniversitesi Bilgisayar MühendisliM

OPERATÖRLER Alıştırmalar

Transkript:

İşletim Sistemleri Dr. Binnur Kurt binnur.kurt@gmail.com Omega Eğitim ve Danışmanlık http://www.omegaegitim.com 1 S a y f a

İÇİNDEKİLER 1. İşletim Sistemi 2. Kabuk 3. Prosesler 4. İplikler 5. İplikler Arası Eş Zamanlama 6. Prosesler Arası İletişim 7. İş Sıralama 8. 9. Bellek Yönetimi 10. Dosya Sistemi 11. Soket Haberleşme 2 S a y f a

BÖLÜM 8 Bölümün Amacı Bölüm sonunda aşağıdaki konular öğrenilmiş olacaktır: Semafor o POSIX Semafor o C++11 de Semafor Kullanımı o Java Platformunda Semafor Kullanımı 3 S a y f a

8.1 Giriş 6. bölümde prosesler arası iletişim şekillerini inceledik. Bu bölümde ise prosesler arası kaynak paylaşımı ve eş zamanlama çözümü için kullanılan semafor çözümünü inceleyeceğiz. Semafor programlama 6. bölümde incelediğimiz IPC alt yapısını kullanır ve benzer bir arayüze sahiptir. Bu bölümde önce POSIX tabanlı semafor yapısı incelenecektir. Daha sonra sırasıyla C++11 de ve Java platformunda semafor çözümleri çalışılacaktır. 8.2 POSIX Semafor Birden fazla kaynağı prosesler arasında paylaştırmak gerektiğinde semafor çözümü kullanılır. He proses ihtiyaç duyduğu kaynak kadar kaynak için istekte bulunur. Semafor tamsayı değer saklayan bir nesne olarak düşünülebilir. Bu tamsayının başlangıç değeri kaynak sayısıdır. Semafor üzerinde temel olarak iki tür işlem tanımlıdır: İhtiyaç duyulan kaynak sayısı kadar semaforun değerini azaltmak Kaynakları geri verirken semaforun değerini arttırmak Üç farklı kaynağın bulunduğu ve her bir kaynaktan sırayla 3, 5 ve 10 adet bulunduğu durum için bir POSIX semaforu semget ve semctl çağrılarını kullanarak aşağıdaki şekilde yaratıyoruz: #define NUM_SEMS_IN_GROUP 3 #define RESOURCE1 0 #define RESOURCE2 1 #define RESOURCE3 2 int semid; int numresource1 = 3; int numresource2 = 5; int numresource3 = 10; semid = semget( IPC_PRIVATE, NUM_SEMS_IN_GROUP, IPC_CREAT 0600 ); semctl(semid, RESOURCE1, SETVAL, &numresource1); semctl(semid, RESOURCE2, SETVAL, &numresource2); semctl(semid, RESOURCE3, SETVAL, &numresource3); Bu üç farklı kaynaktan sırayla 2, 3 ve 1 adet kaynak almak için semop çağrısını kullanıyoruz: struct sembuf ops[num_sems_in_group]; ops[0].sem_num = RESOURCE1; ops[0].sem_op = 2; ops[1].sem_num = RESOURCE2; ops[1].sem_op = 3; ops[2].sem_num = RESOURCE3; ops[2].sem_op = 1; 4 S a y f a

ops[0].sem_flg = ops[1].sem_flg = ops[2].sem_flg = WAIT; semop(semid, ops, NUM_SEMS_IN_GROUP); Şimdi daha karmaşık bir problemi çözelim. Ev taşıma hizmeti veren bir firmanın 5 aracı, 12 taşıyıcısı ve 1000 TL ye kadar sigortalanacak taşıma kapasitesi olsun. Kendisine gelen farklı taşıma istekleri için bu kaynakları paylaşımını semafor kullanarak çözelim: Kod 8.1: #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <pthread.h> #include <stdlib.h> #include <stdio.h> #include "utils.h" #define NUM_THREADS 10 #define TIME_BTWN_NEW_THREADS 0.5 #define RUNTIME_RANGE 5.0 #define NUM_SEMS_IN_GROUP 3 #define TRUCK_SEM 0 #define MOVER_SEM 1 #define INSUR_SEM 2 #define NUM_TRUCKS 5 #define NUM_MOVERS 12 #define AMT_INSUR 1000 #define WAIT 0 #define STRING_SIZE 80 #define FALSE 0 #define TRUE (!FALSE) #define STDOUT_FD 1 struct job { int numtrucks; int nummovers; int amtinsurance; jobtable[] = { { 4, 5, 250, { 1, 2, 500, { 3, 5, 1000, { 2, 8, 250, ; int numjobs = sizeof (jobtable) / sizeof (struct job); int semid; extern int errno; void *threadmain(void *); main() { pthread_t threads[num_threads]; 5 S a y f a

int numtrucks = NUM_TRUCKS; int nummovers = NUM_MOVERS; int amtinsur = AMT_INSUR; int count; if ((semid = semget(ipc_private, NUM_SEMS_IN_GROUP, IPC_CREAT 0600)) == -1) { perror("semget"); exit(errno); if ((semctl(semid, TRUCK_SEM, SETVAL, &numtrucks)) (semctl(semid, MOVER_SEM, SETVAL, &nummovers)) (semctl(semid, INSUR_SEM, SETVAL, &amtinsur))) { perror("error initializing semaphores"); goto cleanup; srand48(time(null)); for (count = 0; count < NUM_THREADS; count++) { if (pthread_create(&threads[count], NULL, threadmain, (void *) (count % numjobs))) { perror("error starting reader threads"); goto cleanup; fractsleep(time_btwn_new_threads); for (count = 0; count < NUM_THREADS; count++) { pthread_join(threads[count], (void **) NULL); cleanup: if (semctl(semid, 0, IPC_RMID, NULL)) { perror("semctl IPC_RMID:"); void *threadmain(void * arg) { int jobnum = (int) arg; char string[string_size]; sprintf(string, "Job # %d requesting %d trucks, %d people, $%d000 insurance...\n", jobnum, jobtable[jobnum].numtrucks, jobtable[jobnum].nummovers, jobtable[jobnum].amtinsurance); printwithtime(string); if (reserve(semid, jobtable[jobnum])) { perror("reserve"); return (NULL); sprintf(string, 6 S a y f a

"Job # %d got %d trucks, %d people, %d000 insurance and is running...\n", jobnum, jobtable[jobnum].numtrucks, jobtable[jobnum].nummovers, jobtable[jobnum].amtinsurance); printwithtime(string); fractsleep(drand48() * RUNTIME_RANGE); sprintf(string, "Job # %d done; returning %d trucks, %d people, %d000 insurance...\n", jobnum, jobtable[jobnum].numtrucks, jobtable[jobnum].nummovers, jobtable[jobnum].amtinsurance); printwithtime(string); if (release(semid, jobtable[jobnum])) { perror("release"); int release(int semid, struct job thisjob) { return (playwithsemaphores( semid, thisjob.numtrucks, thisjob.nummovers, thisjob.amtinsurance)); int reserve(int semid, struct job thisjob) { return (playwithsemaphores( semid, -thisjob.numtrucks, -thisjob.nummovers, -thisjob.amtinsurance)); int playwithsemaphores(int semid, int numtrucks, int nummovers, int amtinsurance) { struct sembuf ops[num_sems_in_group]; ops[0].sem_num = TRUCK_SEM; ops[0].sem_op = numtrucks; ops[1].sem_num = MOVER_SEM; ops[1].sem_op = nummovers; ops[2].sem_num = INSUR_SEM; ops[2].sem_op = amtinsurance; ops[0].sem_flg = ops[1].sem_flg = ops[2].sem_flg = WAIT; return (semop(semid, ops, NUM_SEMS_IN_GROUP)); 8.2 C++11 de Semafor Kullanımı C++11 de iplik programlama ve eş zamanlama ile ilgili hazır çözümler gelmiş olsa da semafor çözümünü içermez. Ancak semafor mekanizmasını mutex sınıfını kullanarak gerçekleştirebiliriz: class semaphore { bool hasresource(initializer_list<int> values){ int i=0; for (auto & value : values) if(resources[i++]<value) return false; cerr << "Obtained the resources!" << endl ; return true; 7 S a y f a

public: semaphore(initializer_list<int> inits) { int i=0; for (auto & init : inits) resources.push_back(init); void release(initializer_list<int> values){ unique_lock<mutex> lck(mtx); int i=0; for (auto & value : values) resources[i++] += value; cv.notify_one(); void acquire(initializer_list<int> values){ unique_lock<mutex> lck(mtx); while(!hasresource(values)){ cv.wait(lck); int i=0; for (auto & value : values) resources[i++] -= value; mutex mtx; condition_variable cv; vector<int> resources; ; POSIX semaforları kullanarak çözdüğümüz problemi şimdi yukarıda oluşturduğumuz semaphore sınıfını kullanarak çözmeye çalışalım: int jobs[][3] = { { 4, 5, 250, { 1, 2, 500, { 3, 5, 1000, { 2, 8, 250, ; int main(){ semaphore sem({5, 12, 1000); vector<thread> tasks; auto run= [&sem] (int i,int job[3] ) { sem.acquire({job[0],job[1],job[2]); sem.release({job[0],job[1],job[2]); ; int i=0; for (auto &job : jobs){ tasks.push_back({thread(run,i,job)); ++i; for (auto& task: tasks) task.join(); return 0; 8 S a y f a

8.3 Java Platformunda Semafor Kullanımı Java da semafor programlama için Java SE 5 ile gelen java.util.concurrent paketinde yer alan Semaphore sınıfını kullanıyoruz. Semaphore sınıfını kullanarak semaforu yaratırken kaynak sayısını veriyoruz. Semaphore sınıfında kaynak almak için acquire ve alınan kaynağı geri vermek için release metodları bulunuyor. acquire metodu eğer yeterli sayıda kaynak yok ise, çağrıyı yapan ipliği, diğer iplikler release metodu ile yeterli sayıda kaynak bırakıncaya kadar bir kuyrukta bloke eder. Yukarıda, önce POSIX semaforlarını, daha sonra C++11 kullanarak çözdüğümüz problemi, bu kez Java daki Semaphore sınıfını kullanarak tekrar çözelim: import java.util.arrays; import java.util.concurrent.semaphore; import java.util.concurrent.locks.condition; import java.util.concurrent.locks.reentrantlock; public class TransportationProblem { static int jobs[][] = { { 4, 5, 250, { 1, 2, 500, { 3, 5, 1000, { 2, 8, 250 ; public static void main(string[] args) throws InterruptedException { Thread[] tasks = new Thread[jobs.length]; MultiResource mr = new MultiResource(5, 12, 1000); for (int i = 0; i < tasks.length; ++i) { tasks[i] = new Thread(new Task(mr, jobs[i]), Arrays.toString(jobs[i])); for (Thread task : tasks) task.start(); for (Thread task : tasks) task.join(); class Task implements Runnable { int[] job; MultiResource mr; public Task(MultiResource mr, int[] job) { this.mr = mr; this.job = job; @Override public void run() { try { mr.acquire(job); + " is using the resource " + Arrays.toString(job) + "..."); mr.release(job); + " has relased the resource " + Arrays.toString(job) + "!"); catch (InterruptedException e) { e.printstacktrace(); 9 S a y f a

class MultiResource { private volatile Semaphore[] semaphores; public MultiResource(int... permits) { System.err.println("Initializing the semaphores with permits " + Arrays.toString(permits)); semaphores = new Semaphore[permits.length]; for (int i = 0; i < semaphores.length; ++i) { semaphores[i] = new Semaphore(permits[i], true); public void acquire(int... permits) throws InterruptedException { + " is acquiring the resources " + Arrays.toString(permits)); for (int i = 0; i < permits.length; ++i) { + " acquired the resource(" + (i + 1) + ") " + permits[i]); semaphores[i].acquire(permits[i]); + " acquired the resources " + Arrays.toString(permits) + "...finally!"); public void release(int... permits) throws InterruptedException { + " is releasing " + Arrays.toString(permits) + "..."); for (int i = 0; i < permits.length; ++i) { semaphores[i].release(permits[i]); + " is releasing " + Arrays.toString(permits) + "...done."); 10 S a y f a