SberTech â™Ĩ Open Source, concurrency dan operasi perbankan yang andal - analisis solusi untuk masalah dengan Joker 2018

Akhir pekan ini adalah Joker 2018 , itu menarik! Tapi konferensi itu kaya tidak hanya pidato. Semua perusahaan sponsor mencoba untuk menonjol dengan latar belakang "pesaing" dan kami tidak terkecuali.

Ada banyak hal menarik di stand Sberbank Technologies, tetapi saya ingin berbicara tentang apa yang kami perjuangkan. Tim pengembang Apache Ignite kami di SberTech menyiapkan tugas dan mengadakan undian di antara mereka yang berani menyelesaikannya.

Di bawah potongan, Anda akan menemukan tugas, analisis solusi dan kemampuan untuk membenarkan versi solusi Anda sendiri di komentar.



Celakalah pengemis


Petya dan Kolya melakukan satu fitur per hari di Apache Ignite .

Masha dengan cepat menguji setiap fitur dan mengembalikan komitmen yang mengandung kesalahan.
Setiap komit awal ketiga dari Petit dan kelima dari Kolya berisi kesalahan.
Petya menghabiskan 2 hari ekstra untuk memperbaiki kesalahan, Kolya 3, dan mereka melakukannya lagi
berkomitmen.

Berapa banyak fitur yang akan dikomunikasikan dalam 86 hari kerja jika Masha menyukai Petya,
dan dia memperhatikan kesalahannya hanya pada hari itu ketika hanya dia yang salah?

Solusi
Mulai dari hari ke-13, sebuah siklus terbentuk yang memungkinkan Petya memperbaiki hanya setiap kesalahan kedua.

Jawabannya
64 + 54 = 118;

Villaribo dan Villabaggio


Memproses bank yang tidak dapat diandalkan selama operasi pada sekelompok kunci blok akun
akun dalam urutan deklarasi mereka dalam operasi, yaitu dari kiri ke kanan.
Setiap jalan buntu diselesaikan secara manual oleh spesialis bank dan memakan waktu 10 kali lebih banyak.
waktu dari operasi normal.
Memproses bank yang andal selalu memblokir kunci naik, tetapi menghabiskan 2
kali lebih dari transaksi normal di bank yang tidak dapat diandalkan.
Kedua bank memiliki 10 akun, kunci akun adalah angka dari 1 hingga 10.
Pemrosesan masing-masing bank membutuhkan 12 operasi.
Operasi dilakukan secara paralel, dua sekaligus. Setiap operasi mempengaruhi hingga 3
akun:
- operasi No. 1 (akun: A, B, C), di mana A = i, B = A + 1, C = (A + B)% 10,
- operasi No. 2 (akun: D, E, F), di mana D = 11-i, E = D-1, F = (D + E)% 10,
saya bervariasi dari 1 hingga 6.
Eksekusi dari pasangan operasi berikutnya dimulai hanya setelah penyelesaian penuh
yang sebelumnya.
Kunci diblokir sesuai dengan kebijakan bank, satu di setiap operasi, mulai
dari nomor operasi 1.
Jika kunci sudah dikunci di salah satu operasi, tetapi diharuskan untuk melakukan yang lain,
lalu pertama operasi pertama selesai, lalu yang kedua berlanjut.
Eksekusi paksa dari sepasang operasi dalam mode sekuensial diharapkan terjadi 2 kali lebih lambat daripada secara paralel.
Bank mana dan berapa kali lebih cepat akan menyelesaikan operasi?

Petunjuk
Total:
- 6 iterasi,
- 12 operasi
- dalam semua operasi kecuali satu, masing-masing 3 kunci.

Solusi
Jika semua kunci berbeda, eksekusi paralel dimungkinkan.
Jika tidak, maka tidak, dan jalan buntu adalah mungkin.

Perhitungan
Sebuah bank yang tidak dapat diandalkan dihabiskan untuk transaksi "kebijaksanaan", 2 dalam kasus "kesulitan" dan sebanyak 10 dalam kasus kebuntuan.
Sebuah bank yang andal menghabiskan pada transaksi 2 "tindakan" dan 4 jika terjadi "kesulitan". Kebuntuan yang andal tidak ada.

Jawabannya
Lengkap pada saat bersamaan.

Risiko Repositori Publik


Serezha adalah seorang programmer yang sangat berpengalaman, sangat berjudi dan serakah tanpa batas.
Suatu ketika dia menemukan kode sumber tote favoritnya di github.
Berapakah taruhan minimum yang dapat dimenangkan Seryozha?

Daftar tote yang disederhanakan dilampirkan:

class Bid { //  int amount; boolean checked; boolean restricted; Bid(int amount) {this.amount = amount;} } ~~~ AtomicReference<Bid> ref = new AtomicReference<>(); volatile boolean winner = false; ~~~ Thread validator = new Thread(() -> { //  ! while (true) { Bid bid = ref.get(); if (bid == null) continue; if ((((bid.amount << 5) ^ 1_000_000) >>> 6) < (2 << 15)) bid.restricted = true; bid.checked = true; } }); Thread payer = new Thread(() -> { //  ! while (true) { Bid bid = ref.get(); if (bid == null) continue; if (bid.checked) { if (!bid.restricted) winner = true; // ! ref.set(null); } } }); ~~~ synchronized boolean makeMeRich(int amount){ //    ? if (winner) return false; //    -    ref.set(new Bid(amount)); while(ref.get() != null) sleep(1); return winner; //   "true" -     } 

Kiat # 1
- 131072?
- Tidak, keluar dari perangkap :)
Kiat # 2
Berapakah taruhan minimum yang dapat dimenangkan Seryozha?
Kiat # 3
 th1{ bid.restricted = true; bid.checked = true; } ... th2{ while (!bid.checked) { sleep(1); } assert bid.restricted; // 99.999% } 

Tidak ada jaminan visibilitas yang diharapkan secara intuitif.

Anda dapat menambahkannya sebagai berikut:

 volatile boolean checked; 

Kiat # 4
Berapakah taruhan minimum yang dapat dimenangkan Seryozha?
Solusi

Jawabannya
 java.lang.Integer#MIN_VALUE 

Namun, "0" dan bahkan "1" dianggap sebagai keputusan yang tepat.

Pemenang


Yang terbaik dari semuanya menyelesaikan masalah
- Evgeny Zubenko
- Alexander Novikov
- Andrey Golikov

Orang-orang mendapat ransel bermerek, kaos dan, tentu saja, buku.

Source: https://habr.com/ru/post/id426639/


All Articles