Dec
17
2016

Laporan PLC

Concurrency

Dalam concurrent program, beberapa aliran operasi dapat mengeksekusi secara bersamaan. Setiap aliran operasi mengeksekusi karena akan di program sekuensial kecuali fakta bahwa aliran dapat berkomunikasi dan mengganggu satu sama lain. Setiap urutan seperti instruksi disebut thread. Untuk alasan ini, program sekuensial sering disebut program single-threaded. Ketika program multi-threaded mengeksekusi, operasi di berbagai benang naannya disisipkan dalam subjek agar tak terduga untuk kendala yang dikenakan oleh operasi sinkronisasi eksplisit yang mungkin tertanam dalam kode. Operasi untuk setiap aliran secara ketat memerintahkan, tetapi interleaving operasi dari koleksi stream adalah belum ditentukan dan tergantung pada liku-liku dari pelaksanaan khusus dari program ini. Satu aliran dapat berjalan sangat cepat sementara yang lain tidak berjalan sama sekali. Dengan tidak adanya jaminan keadilan (dibahas di bawah), thread yang diberikan bisa kelaparan kecuali hanya “ runnable ” benang.

Sebuah benang runnable kecuali mengeksekusi operasi yang membutuhkan sinkronisasi khusus yang menunggu sampai kondisi tertentu terjadi. Jika lebih dari satu thread yang runnable, semua tapi satu thread mungkin kelaparan (tidak membuat kemajuan karena tidak ada operasi yang sedang dijalankan) kecuali bahasa membuat jaminan keadilan. Sebuah jaminan keadilan menyatakan bahwa operasi berikutnya di thread runnable akhirnya akan mengeksekusi. Java spesifikasi bahasa saat ini tidak memberikan jaminan keadilan tetapi kebanyakan Java Virtual Machines menjamin keadilan.

Threads dapat berkomunikasi satu sama lain dalam berbagai cara yang akan kita bahas secara rinci nanti dalam bagian ini. Bahasa pemrograman Java terutama bergantung pada variabel bersama untuk mendukung komunikasi antara proses, tetapi juga mendukung mekanisme signaling eksplisit.

Secara umum, menulis program bersamaan sangat sulit karena banyaknya kemungkinan interleavings operasi antara benang berarti eksekusi program adalah non-deterministik. Untuk alasan ini, bug Program mungkin sulit untuk mereproduksi. Selain itu, kompleksitas diperkenalkan oleh beberapa thread dan interaksi potensi mereka membuat program lebih sulit untuk menganalisis dan alasan tentang. Untungnya, banyak program konkuren termasuk sebagian besar aplikasi GUI mengikuti pola desain bergaya yang mengontrol kompleksitas yang mendasari.

Untuk menunjukkan beberapa masalah halus yang timbul dengan pemrograman jenis ini, pertimbangkan contoh berikut. Kami memiliki dua benang, A dan B, yang keduanya memiliki akses ke ct variabel. Misalkan, awalnya, ct adalah 0, tetapi ada tempat di kedua A dan B di mana ct bertambah.

A B
ct++; ct++;

Untuk increment x variabel, (i) nilai v dari x harus diambil dari memori, (ii) nilai baru v ‘berdasarkan v, dan (iii) v’ harus disimpan dalam lokasi memori yang dialokasikan untuk variabel x. Ini adalah tiga tindakan yang terpisah, dan tidak ada jaminan bahwa tidak ada thread lain akan mengakses variabel sampai ketiga dilakukan. Jadi itu mungkin, misalnya, bahwa urutan operasi dari kedua benang terjadi sebagai berikut:

fetches ct = 0
B fetches ct = 0
A computes the value ct++ = 1
A stores the value 1 in ct
B computes new value ct++ = 1
B stores the value 1 in ct

Dengan urutan ini dari operasi, nilai akhir untuk ct adalah 1. Tapi dalam susunan lain yang mungkin (misalnya, jika A melakukan semua tindakan yang pertama), nilai akhir akan 2.

Sebuah strategi sederhana untuk mencegah bentuk gangguan (sering disebut kondisi lomba) adalah untuk membuat seluruh akses / memodifikasi siklus / toko untuk memperbarui variabel bersama atom, meskipun fakta bahwa siklus dilakukan dengan menggunakan beberapa instruksi mesin. operasi atom muncul untuk mengeksekusi sebagai instruksi mesin tunggal karena semua benang lainnya dipaksa untuk berhenti mengeksekusi sementara operasi atom mengeksekusi. Akibatnya, tidak mungkin bagi thread lain untuk mengamati nilai variabel diperbarui ketika operasi sedang berlangsung. Sebuah blok kode yang memerlukan eksekusi atom disebut bagian kritis. Beberapa bahasa pemrograman yang mendukung concurrency mencakup mulai / kurung akhir untuk melampirkan bagian kritis.

Mekanisme bagian kritis bekerja dengan baik dalam konteks menjalankan program multi-threaded pada komputer dengan prosesor tunggal (uniprocessor a) karena mengurangi untuk memastikan bahwa bagian kritis tidak interruptible (memungkinkan thread lain untuk menjalankan). Tetapi canggung dan tidak efisien pada multiprosesor karena memaksa semua prosesor tapi untuk menghentikan eksekusi selama bagian kritis. (Mesin virtual yang ada mengobati operasi baru yang memaksa pengumpulan sampah sebagai bagian kritis.

Mekanisme yang lebih baik untuk mencegah gangguan dalam program bersamaan yang dapat dijalankan pada Multiprocessors mengunci objek data. Ketika sebuah objek data dikunci oleh thread, tidak ada thread lain dapat mengakses atau memodifikasi data objek sampai benang penguncian rilis itu. Pada intinya, penguncian melemaskan konsep pelaksanaan atom sehingga relatif terhadap objek tertentu. Threads dapat terus menjalankan sampai mereka mencoba untuk mengakses objek terkunci.

Java bergantung pada objek penguncian untuk mencegah interferensi. Sebuah objek dapat dikunci selama pemanggilan metode hanya dengan awalan metode deklarasi dengan pekerjaan disinkronkan. Misalnya, untuk menentukan metode selisih disinkronkan, kita akan menulis:

 

synchronized void inc() { ct++; }

 

Kita juga dapat mendeklarasikan metode statis harus disinkronkan, yang mengunci obyek kelas (yang berisi semua variabel statis kelas) daripada contoh objek.

Fitur yang tidak biasa dari mekanisme kunci Java adalah fakta bahwa mengunci sebuah objek hanya menghambat pelaksanaan operasi yang dinyatakan sebagai disinkronisasi. Metode yang tidak dinyatakan sebagai disinkronisasi akan dijalankan bahkan ketika objek terkunci! Ada argumen yang kuat untuk kemampuan ini: mendukung definisi kelas yang partisi operasi dalam dua kelompok: mereka yang membutuhkan sinkronisasi dan mereka yang tidak. Tetapi juga mengundang bug sinkronisasi halus jika pengubah disinkronkan secara tidak sengaja dihilangkan dari satu definisi metode.

Tentu saja, concurrency hanya muncul di Jawa ketika sebuah program menggunakan lebih dari satu thread. Untuk mendukung terciptanya eksplisit thread baru, Java termasuk built-in kelas Thread abstrak, yang memiliki metode abstrak run (). Kita bisa membuat thread baru dengan (i) mendefinisikan memperluas Thread kelas yang mendefinisikan metode run (), (ii) membangun contoh baru dari kelas ini, dan (iii) memanggil metode start () pada contoh baru ini. Awal () metode benar-benar menciptakan thread baru sesuai dengan objek penerima (Thread) dan memanggil run () metode benang itu, sebanyak metode main () dipanggil di kelas akar ketika Anda menjalankan Java Virtual Machine . Sebagai contoh,

 

class Foo extends Thread {

// must have

public void run() {

}

}

 

Ketika konstruktor untuk Foo disebut, semua perhitungan untuk alokasi objek dan konstruktor doa dilakukan di thread saat ini; thread baru tidak diciptakan sampai metode start () dipanggil untuk Thread () objek. Untuk membuat dan memulai Foo thread baru, thread saat hanya dapat mengeksekusi kode

Thread t = new Foo();

t.start();

Atau, thread saat ini dapat menjalankan run () method dari t objek Thread hanya dengan melakukan operasi

t.run()

dari pada

t.start()

Asumsikan bahwa Foo baru benang t telah dibuat dan mulai. Di beberapa titik dalam pelaksanaan benang asli (sekarang berjalan bersamaan dengan benang t) dapat menunggu benang t untuk mengakhiri dengan menjalankan metode:

t.join();

// waits for the thread object to terminate.

Jadi kita bisa melihat hubungan dari dua benang kontrol sebagai berikut:

main

|

t.start

|\

| \

| |

| /

|/

t.join

|

|

Sinkronisasi beberapa thread tidak dikenakan beberapa overhead. Sebagai contoh, perhatikan kode Java berikut:

class PCount extends Thread {

 

// ** fields ***

static int sharedCtr = 0;

static final int cntPerIteration = 100000;

static final int noOfIterations = 10;

 

int id;

 

// ** constructors **

PCount(int i) { id = i; }

 

// ** methods **

void inc() {

sharedCtr++;

}

public void run() {

for (int i = 0; i < cntPerIteration; i++) inc();

System.out.println(“Iteration #” + id +

” has completed; sharedCtr = ” + sharedCtr);

}

 

public static void main(String[] args)

throws InterruptedException {

Thread[] tPool = new Thread[noOfIterations];

for (int j = 0; j < noOfIterations; j++) {

tPool[j] = new PCount(j);

}

for (int j = 0; j < noOfIterations; j++) {

tPool[j].start();

}

for (int j = 0; j < noOfIterations; j++) {

tPool[j].join();

}

System.out.println(“Computation complete.  sharedCtr = ”

+ sharedCtr);

}

}

Dalam setiap iterasi, utama menciptakan thread baru. Setelah itu, semua akan disinkronisasi dan nilai akhir ditentukan.

penghitung tidak terkunci dalam contoh ini, dan update mungkin akan hilang karena masalah yang dijelaskan di atas. Kemungkinan dengan yang memperbarui kerugian dapat terjadi bervariasi tergantung pada jumlah benang. Sebagai contoh, dalam tes yang saya berlari beberapa bulan yang lalu

  • untuk 1 million iterations, the program 65
  • untuk 100,000 iterations, the program lost none.

Rupanya, bahkan dengan 100.000 benang, setiap iterasi terjadi dalam waktu slice tunggal.

Sinkronisasi benang perbaikan masalah update hilang, tapi itu benar-benar memperlambat program turun; bahkan untuk 100.000 iterasi.

Dalam modern yang model event-handling seperti di Jawa dan DrScheme, kami memiliki event handler tunggal yang mengeksekusi acara serial. Protokol ini menghemat overhead sinkronisasi dan menghilangkan potensi deadlock.

 

Object Oriented Programming

Objek dunia nyata berbagi dua karakteristik: mereka semua memiliki bagian dan perilaku. Anjing memiliki bagian (nama, warna, berkembang biak, lapar) dan perilaku (menggonggong, mengambil, mengibaskan ekor). Sepeda juga memiliki bagian (gigi saat ini, saat pedal irama, kecepatan arus) dan perilaku (mengubah gigi, mengubah pedal irama, menerapkan rem). Mengidentifikasi bagian dan perilaku untuk objek dunia nyata adalah cara yang bagus untuk mulai berpikir dalam hal pemrograman berorientasi objek.

 

Luangkan waktu sebentar sekarang untuk mengamati benda dunia nyata yang berada di daerah Anda. Pastikan untuk menuliskan pengamatan Anda. Seperti yang Anda lakukan, Anda akan melihat bahwa benda dunia nyata bervariasi dalam kompleksitas; lampu desktop Anda mungkin hanya memiliki dua kemungkinan bagian (on dan off) dan dua kemungkinan perilaku (menghidupkan, mematikan), tetapi radio desktop Anda mungkin memiliki bagian tambahan (on, off, volume saat ini, stasiun saat ini) dan perilaku (hidupkan , matikan, meningkatkan volume, mengurangi volume, mencari, memindai, dan lagu). Anda juga mungkin melihat bahwa beberapa benda, pada gilirannya, akan juga berisi objek lain. pengamatan dunia nyata ini semua diterjemahkan ke dalam dunia pemrograman berorientasi objek.

 

Software objek secara konseptual mirip dengan benda dunia nyata: mereka juga terdiri dari perilaku bagian dan terkait. Sebuah objek menyimpan bagian dalam bidang (variabel dalam beberapa bahasa pemrograman) dan mengekspos perilakunya melalui metode (fungsi dalam beberapa bahasa pemrograman). Metode beroperasi pada keadaan internal suatu objek dan berfungsi sebagai mekanisme utama untuk komunikasi “object-to-object. Menyembunyikan keadaan internal dan mengharuskan semua interaksi yang akan dilakukan melalui metode obyek dikenal sebagai enkapsulasi Data – prinsip dasar pemrograman berorientasi objek.

Pertimbangkan sepeda, misalnya:

Sebuah sepeda dimodelkan sebagai objek perangkat lunak.

Dengan menghubungkan bagian (kecepatan saat ini, saat pedal irama, dan gigi saat ini) dan menyediakan metode untuk mengubah negara itu, objek tetap mengendalikan bagaimana dunia luar diperbolehkan untuk menggunakannya. Misalnya, jika sepeda hanya memiliki 6 gigi, metode untuk mengubah gigi bisa menolak setiap nilai yang kurang dari 1 atau lebih besar dari 6.

Bundling kode ke objek perangkat lunak individu menyediakan sejumlah manfaat, termasuk:

  1. Modularity: Kode sumber untuk suatu benda dapat ditulis dan dipelihara secara independen dari kode sumber untuk benda-benda lain. Setelah dibuat, sebuah objek dapat dengan mudah melewati sekitar di dalam sistem.
  2. Informasi-bersembunyi: Dengan berinteraksi hanya dengan metode obyek, rincian implementasi internal tetap tersembunyi dari dunia luar.
  3. Kode digunakan kembali: Jika suatu benda sudah ada (mungkin ditulis oleh pengembang perangkat lunak lain), Anda dapat menggunakan objek yang dalam program Anda. Hal ini memungkinkan spesialis untuk melaksanakan / test / debug kompleks, benda tugas-spesifik, yang kemudian dapat percaya untuk menjalankan kode Anda sendiri.
  4. Pluggability dan debugging kemudahan: Jika objek tertentu ternyata bermasalah, Anda hanya dapat menghapusnya dari aplikasi Anda dan pasang di objek yang berbeda sebagai penggantinya. Hal ini analog dengan memperbaiki masalah mekanis di dunia nyata. Jika baut istirahat, Anda menggantinya, tidak seluruh mesin.

Subprogram

  1. Pengertian fungsi subprogram

Fungsi adalah sekumpulan perintah operasi program yang dapat menerima argumen input dan dapat memberikan hasil output yang dapat berupa nilai ataupun sebuah hasil operasi. Hasil akhir fungsi akan berupa sebuah nilai balik (return). Nama fungsi yang didefinisikan sendiri oleh pemrogram tidak boleh sama dengan nama build-in function pada compiler C.

  1. Kegunaan fungsi atau subprogram

Fungsi digunakan agar pemrogram dapat menghindari penulisan bagian program (kode) berulang-ulang, dapat menyusun kode program agar terlihat lebih rapi dan kemudahan dalam debugging program. Dengan dipecah menjadi beberapa fungsi maka pembuatan program menjadi lebih mudah karena kesalahan-kesalahan yang terjadi terlokalisir dalam masing-masing fungsi.

Juga organisasi program menjadi lebih baik karena tugas dari fungsi utama main() menjadi sangat sederhana yaitu melakukan pemanggilan dari fungsi-fungsi ini mengikuti urutan yang dikehendaki. Masing-masing fungsi melakukan tugasnya, setelah selesai lalu kembali ke main(). Pemecahan program menjadi fungsi-fungsi ini dikenal sebagai modular programming atau pemrograman terstruktur.

  1. Sifat-sifat Fungsi 

Fungsi-fungsi dalam C pada umumnya mempunyai sifat-sifat sebagai berikut:

· Masing-masing fungsi mempunyai nama, aturan penamaan fungsi sama seperti penamaan variabel.     Nama fungsi ini diikuti sepasang tanda kurung untuk membedakan fungsi dengan variabel. Dalam       tanda kurung ini dapat berisi argumen-argumen fungsi tersebut.

Jika fungsi ini tidak memerlukan argumen maka dalam tanda kurung ini tidak berisi apa-apa. Jika       fungsi memerlukan argumen maka argumen-argumennya dapat berupa variabel-variabel                     dari berbagai tipe, antara argumen yang satu dengan argumen yang lain dipisahkan dengan koma.

· Badan dari masing-masing fungsi, harus dimulai dengan tanda kurung { dan diakhiri dengan tanda     kurung }. Badan dari fungsi ini berisi deklarasi variabel-variabel dan penyataan-pernyataan.

  1. Macam-macam Fungsi 

Fungsi secara umum akan dibagi menjadi dua yaitu fungsi yang tidak memiliki keluaran formal (void function) dan fungsi yang memiliki keluaran formal (non void). Void function ini pengertiannya sama dengan prosedur di bahasa pemrograman Pascal.

Bahasa pemrograman C memperbolehkan pemanggilan fungsi oleh kode program yang ditulis sebelum fungsi yang dipanggil di buat. Sebelum digunakan, sebuah fungsi sebaiknya dideklarasikan terlebih dahulu.

Deklarasi fungsi atau istilah dalam bahasa C/C++ disebut juga dengan prototype. Prototype diletakkan di bagian awal program untuk memberitahukan compiler bagaimana fungsi diambil dan seperti apa tipe data yang dihasilkan.

Deklarasi fungsi secara umum adalah sebagai berikut:

  1. Hal yang harus di perhatikan dalam fungsi

Hal-hal yang perlu diperhatikan dalam penggunaan fungsi :
Ø Jika tipe data fungsi tidak disebutkan, maka akan dianggap sebagai fungsi dengan nilai keluaran         bertipe integer.
Ø Untuk fungsi yang memiliki keluaran bertipe bukan integer, maka diperlukan pendefinisian                 penentu tipe fungsi.

Ø Untuk fungsi yang tidak mempunyai nilai keluaran maka dimasukkan ke dalam tipe void.
Ø Pernyataan yang diberikan untuk memberikan nilai akhir fungsi berupa pernyataan return.

Cara mendeklarasikan dan mendefinisikan fungsi :

Pemanggilan fungsi diatas dapat langsung dituliskan dengan garis(); . Jika fungsi digunakan hanya untuk menampilkan suatu output, maka fungsi tersebut dapat digolongkan sebagai fungsi yang tidak mengembalikan nilai.

Fungsi yang mengembalikan nilai. Untuk mengembalikan nilai sebuah fungsi menggunakan kata kunci return diikuti nilai yang akan dikembalikan.

Fungsi yang didefinisikan terdiri atas dua bagian, yaitu judul (header) dan isi (body). Judul dari sebuah fungsi terdiri dari tipe return (float), nama fungsi (hasil) dan list parameter ( int a, int b).
Jadi, judul untuk fungsi hasil adalah : float hasil (int a, int b).

Written by bluedidi97 in: Uncategorized |

No Comments »

RSS feed for comments on this post. TrackBack URL


Leave a Reply

Powered by WordPress. Theme: TheBuckmaker. Zinsen, Streaming Audio