English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

სტუმარი
1 / ?
უკან გაკვეთილებზე

როგორ ყალიბდება შეჯაჭვულობა

ორი ქვესისტემა იწყებს სიცოცხლეს დამოუკიდებელ მოდულებად. დროთა განმავლობაში თითოეული აგროვებს ველს საერთო ღმერთ-ობიექტზე: გლობალურ კონფიგურაციის სტრუქტურაზე, სინგლტონ მენეჯერზე ან სტატიკურ კლასზე. თითოეული დამატება: სწორია იზოლირებულად. შეწყვილება: უხილავია მცირე მასშტაბის ტესტირებაში.

შეჯაჭვულობის შაბლონი: სისტემა A და B იზიარებენ გლობალურ მდგომარეობას სნეპშოტის ან ინტერფეისის გარეშე

სამი სუბსტრატი, სადაც ეს გამაგრდა:

VLC მედია პლეერი. აუდიო, ვიდეო და პლეილისტი იზიარებენ ერთ საკეტს, რომელიც იცავს გლობალურ პლეერის მდგომარეობას. დროის ნიშნულზე გადასვლის მოთხოვნა იძენს საკეტს, ცვლის დაკვრის პოზიციას და ასუფთავებს აუდიო ბუფერს. ვიდეო ქვესისტემა, იგივე საკეტის მოლოდინში, ჩერდება. პლეილისტის ქვესისტემა, ასევე მოლოდინში, ვერ ახერხებს წინასწარ ჩატვირთვას. შედეგი: სამი დამოუკიდებელი ქვესისტემა სერიალიზებულია ერთი მდგომარეობის ობიექტის მეშვეობით. შესრულების ღირებულება: O(N) საკეტის კონტენცია, სადაც N = ქვესისტემების რაოდენობა, ყველა პროპორციულია ოპერაციის ლატენტობისა.

Redis event loop. AOF fsync (დისკზე ჩაწერა), რეპლიკაცია (ქსელური ჩაწერა) და ბრძანების შესრულება (CPU) იზიარებენ ერთნაკადიან event loop-ს. თითოეული: სწორია იზოლირებულად. ნელი fsync აჩერებს ბრძანების შესრულებას. რეპლიკაციის დაყოვნება იზრდება ჩაწერის დატვირთვის ქვეშ. დაკავშირების წერტილი: ერთი შესრულების კონტექსტი, რომელსაც იზიარებენ სხვადასხვა ლატენტური პროფილის მქონე ოპერაციები.

LevelDB VersionSet. ჩაწერის გზა (memtable flush) და ფონური compaction იზიარებენ VersionSet-ის lock-ს. Compaction-ის ამოცანა აკავებს lock-ს ათობით მილიწამით. ჩაწერის გზა იჭედება. ორივე ოპერაცია: აუცილებელია. დაკავშირება: სტრუქტურული, არა დროითი.

კრიტიკული განსხვავება

Intertangle-ს აქვს სტრუქტურული დაკავშირება, არა დროითი პრობლემა. Race condition: ორი thread იზიარებს მდგომარეობას სინქრონიზაციის გარეშე. გამოსწორება: mutex-ის დამატება.

Intertangle: ორი ქვესისტემა დიზაინით იზიარებს მდგომარეობას. Mutex-ის დამატება არ ასწორებს დაკავშირებას; ის უბრალოდ სერიალიზებს წვდომას. ქვესისტემები მაინც იზიარებენ მდგომარეობას. ბოთლის კისერი უფრო ვიწროვდება.

VLC Intertangle-ში mutex-ის დამატება პრობლემას აუარესებს: ახლა აუდიო, ვიდეო და playlist ელოდებიან ერთ lock-ს. სტრუქტურული გამოსწორება: თითოეულ ქვესისტემას მიეცეს საკუთარი მდგომარეობა. Phase snapshot: გაყინეთ საერთო მდგომარეობის სნეპშოტი phase-ის საზღვარზე, თითოეულ ქვესისტემას მიეცით საშუალება წაიკითხოს სნეპშოტი დამოუკიდებლად, ჩაწერები გაერთიანდეს ბოლოს.

სტრუქტურული vs დროითი

Intertangle-ის ძირითადი დიაგნოსტიკური კითხვა: mutex-ის დამატება გამოასწორებს თუ გააუარესებს მას?

რასის პირობა: მუტექსის დამატება ასწორებს მას. სწორი წვდომის თანმიმდევრობა აღმოფხვრის დაზიანებას.

ინტერტენგლი: მუტექსის დამატება სერიალიზებს წვდომას, მაგრამ ინარჩუნებს სტრუქტურულ კავშირს. ქვესისტემები მაინც იზიარებენ მდგომარეობას. დატვირთვის ქვეშ ისინი მაინც ბლოკავენ ერთმანეთს. ბოთლის კისერი ვიწროვდება.

აღწერეთ, როგორ შეიძლება ორი ქვესისტემა გახდეს ინტერტენგლი. რა ხდის ამას სტრუქტურულს და არა უბრალოდ რასის პირობას?

როგორ აღმოვაჩინოთ ინტერტენგლი

სამი გამოვლენის სიგნალი:

1. გაზიარებული ცვლადი ველები ქვესისტემებს შორის. ღმერთი-ობიექტი ველებით, რომლებსაც ერთზე მეტი ქვესისტემა კითხულობს და წერს. თუ ერთი ქვესისტემის ველზე წვდომის მოხსნა არღვევს მეორე ქვესისტემას, ისინი იზიარებენ მდგომარეობას.

2. ერთი mutex, რომელიც იცავს ურთიერთდაუკავშირებელ ოპერაციებს. ერთი საკეტი, რომელიც იცავს აუდიოს გამოტანას, ვიდეოს დეკოდირებას და პლეილისტის მიღებას ერთდროულად: სამი ქვესისტემა სხვადასხვა ლატენტურობის პროფილით, რომლებიც ერთმანეთს ელოდებიან. სუნი: ურთიერთდაუკავშირებელი ოპერაციები ერთი და იგივე საკეტის სახელის ქვეშ.

3. შესრულების რეგრესია დატვირთვის დამატებისას. ოპერაცია A-ს ლატენტურობა იზრდება, როდესაც ოპერაცია B ერთდროულად მუშაობს, მიუხედავად იმისა, რომ A და B დამოუკიდებლად გამოიყურებიან. ისინი დამოუკიდებლები არ არიან: ისინი იზიარებენ მდგომარეობას.

ფაზა-სნეპშოტის გამოსწორება

ფაზა-სნეპშოტის შაბლონი:

# წინ: ქვესისტემები კითხულობენ და წერენ გაზიარებულ მდგომარეობას პირდაპირ
class GameWorld:
position = {}  # shared mutable
velocity = {}  # shared mutable

def physics_tick(world):
for entity in world.entities:
world.position[entity] += world.velocity[entity]  # writes shared state mid-loop
# AFTER: snapshot frozen before phase; writes go to next_state buffer
def physics_tick(world):
snapshot = world.freeze()  # immutable view
next_state = {}
for entity in snapshot.entities:
next_state[entity] = snapshot.position[entity] + snapshot.velocity[entity]
world.merge(next_state)  # atomic merge at phase boundary

ყველა ქვესისტემა კითხულობს სნეპშოტს. არცერთი ქვესისტემა არ წერს მასში. ჩაწერები გროვდება ბუფერში და ატომურად ერწყმის ფაზის საზღვარზე. ქვესისტემები ახლა დამოუკიდებლად მუშაობენ: არანაირი ლოქის კონტენცია, არანაირი დალაგების დამოკიდებულება, არანაირი დამალული კავშირი.

გამოიყენე გამოსწორება

გუნდი იტყობინება დეფექტის შესახებ: მათი თამაშის ძრავის ანიმაციის სისტემა და კოლიზიის სისტემა ორივე წერს საერთო ენტიტის ტრანსფორმის ობიექტში. როდესაც ორივე ერთსა და იმავე ტიკში მუშაობს, კოლიზიის შედეგები დამოკიდებულია იმაზე, გაუშვა თუ არა ანიმაცია პირველად. მიუტექსის დამატებამ გამოასწორა დალაგება, მაგრამ ახლა ანიმაცია ჩერდება, როდესაც კოლიზია ასრულებს ფართო-ფაზის სკანირებას.

დაასახელეთ დეფექტის კლასი. ახსენით, რატომ არ იყო მიუტექსის დამატება გამოსწორება. აღწერეთ სტრუქტურული გამოსწორება.