ตัวอย่างคอนกรีต
ฉันต้องการเพิ่มตัวอย่างจริงของโลกและเชื่อมต่อพวกเขาเข้ากับโลกวิศวกรรมซอฟต์แวร์ ก่อนอื่นให้พิจารณาสิ่งที่ฉันหวังว่าจะตรงกับคำจำกัดความที่ใช้งานง่ายของคุณของ "ซิงโครนัส": การกระพริบของหิ่งห้อยภายใต้สถานการณ์บางอย่าง ประการที่สองพิจารณาการถ่ายทอดการแข่งขันกีฬาโอลิมปิก 4x100 ของผู้หญิงการแข่งขัน ประการที่สามพิจารณาว่า Trope เก่าจากภาพยนตร์ทหาร: "ผู้ชายซิงโครไนซ์นาฬิกาของคุณ!"
ทีนี้ลองคิดดูว่าเกิดอะไรขึ้น ขอเริ่มต้นด้วยการสังเกตว่าทุกสิ่งเหล่านี้เป็นกระบวนการหรือหน่วยงานที่ยื่นออกมาในเวลาที่ ไม่เหมาะสมที่จะพูดว่าชามนั้น "ซิงโครนัส" และหินก็คือ "async" ประการที่สองจะใช้เวลาสองถึงเต้นจังหวะแทงโก้ คุณไม่สามารถพูดได้ว่า "นักวิ่งกำลังซิงค์กัน" ซิงค์กับอะไร สุดท้ายในการสั่งซื้อสำหรับสองกระบวนการที่จะทำบางสิ่งบางอย่างในเวลาเดียวกันจนกว่าพวกเขาจะมีความถี่เดียวกันที่แน่นอนและเฟสหนึ่งหรือทั้งสองของพวกเขาต้องรอ
การวิเคราะห์
เมื่อคำจำกัดความของพจนานุกรมระบุว่าทั้งสองหน่วยงานในการซิงค์ "เกิดขึ้นหรือมีอยู่ในเวลาเดียวกัน" ซึ่งสอดคล้องอย่างมากกับแนวคิดของแสงจากหิ่งห้อย โชคไม่ดีที่การพูดว่าแสงกำลัง "ซิงค์กัน" เป็นวิธีที่สะเพร่าในการบอกว่ากระบวนการแสงหิ่งห้อยประสานกัน
ดังนั้นหิ่งห้อยจะเป็นวิธีการอย่างไรซึ่งน่าจะไม่มี Apple SmartWatch และ NTP ที่จะแนะนำพวกเขาจัดการกับแฟลชด้านหลังของพวกเขาในเวลาเดียวกันได้หรือไม่ มันค่อนข้างง่ายถ้าพวกเขามีวิธีตั้งจังหวะที่สอดคล้องกันและสามารถทำการปรับเปลี่ยนเล็กน้อย พวกเขาเพียงแค่กะพริบและถ้ามีคนมากขึ้นหลังจากที่พวกเขาแฟลชพวกเขาช้าลง (เพิ่มความล่าช้า) ในขณะที่ถ้าแฟลชมากขึ้นก่อนที่พวกเขาพวกเขาเร็วขึ้น (ลดความล่าช้า) ดังนั้นพวกเขาจึงสามารถใช้กระบวนการป้อนกลับอย่างง่ายเพื่อให้ได้จังหวะและเฟสเดียวกันเป็นหลัก สังเกตที่สำคัญที่นี่เป็นที่จะต้องทราบว่าพวกเขาบรรลุลื่นโดยรอช่วงเวลาที่เหมาะสมที่จะแฟลช
การแข่งขัน 4x100 นั้นน่าสนใจเพราะคุณเห็นจังหวะเวลาของกระบวนการทั้งสองแบบ: นักวิ่งภายในทีมได้รับการซิงโครไนซ์ในขณะที่นักวิ่งในทีมที่แตกต่างกันคือ "async" รองชนะเลิศอันดับที่สองในการถ่ายทอดจะต้องรอจนกว่าจะมีการวิ่งครั้งแรกที่เข้ามาในโซนการโอน Hand-off เป็นเหตุการณ์ซิงโครนัสระหว่างนักวิ่งสองคน อย่างไรก็ตามนักวิ่งในเลนที่แตกต่างกันไม่สนใจสิ่งที่เกิดขึ้นในเลนอื่นและแน่นอนที่สุดจะไม่ช้าลงและทำการซิงก์ด้วยมือ ช่องทางของนักวิ่งแต่ละเส้นทางนั้นไม่ตรงกันพร้อมกับการเคารพซึ่งกันและกัน อีกครั้งเราจะเห็นว่าการซิงโครไนซ์ทำให้เกิดการรอขณะที่อะซิงโครนัสไม่
ในที่สุดทหารใน บริษัท (ทหารทีมไฟไหม้ ฯลฯ ) จะต้องประสานนาฬิกาของพวกเขาเพื่อให้พวกเขาสามารถโจมตีศัตรูในเวลาเดียวกัน อาจเป็นได้ว่าทหารบางคนมาถึงตำแหน่งของพวกเขาต่อหน้าคนอื่นหรือมีโอกาสยิงข้าศึกในไม่ช้า แต่โดยทั่วไปแล้วการโจมตีพร้อมกันจะมีประสิทธิภาพมากกว่าการโจมตีแบบจับจดเพราะองค์ประกอบของความประหลาดใจ ดังนั้นเพื่อให้บรรลุถึงความสอดคล้องกันทหารจำนวนมากต้องรอเวลาที่กำหนดเพื่อทำหน้าที่
การกำหนดคุณสมบัติ
เหตุใดจึงต้องให้ความสำคัญกับการรอคอย ก็เพราะการรอคอยเป็นคุณสมบัติที่กำหนดซึ่งแยกความแตกต่างจากกระบวนการแบบอะซิงโครนัส หากคุณมีสองกระบวนการที่คุณไม่รู้อะไรเลยโดยค่าเริ่มต้นคุณควรถือว่าพวกเขาเป็นแบบอะซิงโครนัส ตัวอย่างเช่นการส่งมอบแพคเกจและการขับรถพยาบาลโดยมักจะไม่ตรงกัน เพื่อที่จะแสดงให้เห็นว่าทั้งสองกระบวนการในความเป็นจริงตรงกันคุณจะต้องพบกับช่วงเวลาที่พิเศษมากในเวลา: จุดประสาน
คนขับรถนำส่งพัสดุและรถพยาบาลพาคนไปโรงพยาบาลมักจะไม่แบ่งปันคะแนนใด ๆ ในเวลาที่เราระบุว่าเป็น "จุดประสาน" ในทางกลับกันหิ่งห้อยที่กระพริบพร้อมเพรียงจะมีจุดซิงค์ทุกครั้งที่พวกมันวิ่งนักวิ่งรีเลย์จะมีจุดประสานทุกครั้งที่พวกเขาส่งกระบองและทหารจะมีจุดประสานเมื่อพวกเขาเริ่มโจมตี หากคุณสามารถระบุหนึ่งหรือมากกว่าหนึ่งจุดซิงค์แล้วกระบวนการที่มีการทำข้อมูลให้ตรงกัน สิ่งนี้ควรเข้าใจได้ง่ายเพราะ "syn-" เป็นความหมายของคำนำหน้าภาษากรีก "กับ" หรือ "ร่วมกัน" และ "โครโน" เป็นรากภาษากรีกสำหรับ "เวลา" "ซิงโครไนซ์" หมายถึง "ในเวลาเดียวกัน"
ขอบเขต
โปรดทราบว่า "การซิงโครไนซ์" ไม่จำเป็นต้องใช้กับอายุการใช้งานทั้งกระบวนการอย่างใดอย่างหนึ่งหรือทั้งสองอย่าง ฉันขอยืนยันว่าจะใช้กับ "เวลารอคอยและรวมถึงจุดประสานเท่านั้น" ดังนั้นกระบวนการสองกระบวนการอาจทำงานแบบอะซิงโครนัสจนกว่าจะถึงสถานะที่พวกเขาต้องการในการสื่อสารจากนั้นพวกเขาจะซิงโครไนซ์แลกเปลี่ยนข้อมูลและหลังจากนั้นดำเนินการแบบอะซิงโครนัสต่อไป ตัวอย่างง่ายๆคือการพบปะผู้คนสำหรับดื่มกาแฟ เห็นได้ชัดว่าการประชุมเป็นจุดประสาน (หรือหลายจุด) และความจริงที่ว่าคนสองคนมาถึงจุดนั้นแสดงให้เห็นถึงการประสาน อย่างไรก็ตามเราจะไม่บอกว่าเพราะคนสองคนพบกันเพื่อดื่มกาแฟชีวิตมนุษย์สองคนนี้คือ "ทำข้อมูลให้ตรงกัน" อาจเป็นเพียงช่วงเวลาเดียวในชีวิตที่พวกเขาพบกันและทุกสิ่งทุกอย่างที่พวกเขาทำนั้นเป็นอิสระจากกัน
มันไม่ใช่กรณีที่พบโดยบังเอิญแสดงให้เห็นถึงการประสาน หากคนแปลกหน้าสองคนผ่านกันบนถนนความจริงที่ว่าพวกเขาอยู่ในสถานที่เฉพาะในบางครั้งไม่ได้พิสูจน์ซิงโครไนซ์ ความจริงที่ว่าไม่มีใครนั่งอยู่บนม้านั่งรอรถเมล์และอีกคนหนึ่งเดินผ่านไปมา กระบวนการจะซิงโครนัสก็ต่อเมื่อตรงตามวัตถุประสงค์เท่านั้น
การเชื่อมต่อซอฟต์แวร์
ทีนี้ลองนึกถึงงานพื้นฐานที่สำคัญในซอฟต์แวร์: การอ่านจากไฟล์ อย่างที่คุณคงทราบกันดีว่าพื้นที่เก็บข้อมูลขนาดใหญ่มักจะช้ากว่าแคชหรือหน่วยความจำหลักเป็นพัน ๆ ล้านครั้ง ด้วยเหตุนี้ระบบปฏิบัติการและไลบรารี่ภาษาการเขียนโปรแกรมจึงเสนอการดำเนินการทั้ง I และ O แบบซิงโครนัสและอะซิงโครนัส ตอนนี้แม้ว่าโปรแกรมของคุณจะมีเธรดเดียวคุณควรคิดว่าระบบปฏิบัติการนั้นเป็น "กระบวนการที่แยกต่างหาก" สำหรับวัตถุประสงค์ของการสนทนานี้
ซิงค์
เมื่อคุณสร้าง "I / O อ่านแบบซิงโครนัส" เธรดของคุณต้องรอจนกว่าข้อมูลจะพร้อมใช้งาน ณ จุดนั้นจะดำเนินต่อไป นี่เป็นเหมือนนักวิ่งผลัดที่ส่งกระบองออกไปยังนักวิ่งคนต่อไป แต่ลองนึกภาพว่านักวิ่งที่มีนักวิ่งเพียงสองคนเท่านั้นที่วิ่งไปตามทางได้และนักวิ่งคนที่สองก็กลับไปเป็นคนแรก
ในกรณีนี้เธรดโปรแกรมและกระบวนการ OS I / O ของคุณจะไม่ "เกิดขึ้น (ดำเนินการ) ในเวลาเดียวกัน" ดังนั้นจึงเป็นเรื่องแปลกที่จะกล่าวว่ากระบวนการเหล่านี้เป็น "ทำข้อมูลให้ตรงกัน" แต่นั่นเป็นวิธีที่ผิดในการดู! นั่นคือการพูดว่า: "นักวิ่งในทีมรีเลย์ไม่ทำงานในเวลาเดียวกันดังนั้นพวกเขาจึงไม่ได้ซิงโครไนซ์" ในความเป็นจริงทั้งสองคำผิด! นักวิ่งในทีมรีเลย์ทำและต้องวิ่งในเวลาเดียวกัน แต่ในช่วงเวลาที่เฉพาะเจาะจงมาก: มือของกระบอง ในความเป็นจริงมันเป็นเพียงช่วงเวลาพิเศษนี้ในระหว่างการแข่งขันที่ทำให้เราเชื่อว่าทีมถ่ายทอดจะต้องเริ่มต้นด้วย! ถ้าเราดูคำขอ I / O และการตอบสนองเป็น "กระบอง"
ในทางตรงกันข้ามถ้าเราคิดถึงบางสิ่งเช่น Finite Element Analysis ในซูเปอร์คอมพิวเตอร์เราจะเห็นว่ากระบวนการหลายพันกระบวนการต้องทำงานในขั้นตอนล็อคเพื่ออัปเดตสถานะระดับโลกขนาดใหญ่ แม้ว่าบางโหนดจะทำงานให้เสร็จสิ้นตามระยะเวลาที่กำหนดไว้ก่อนที่โหนดอื่น ๆ จะต้องรอจนกว่าขั้นตอนเวลาจะเสร็จสิ้นเพราะผลลัพธ์แพร่กระจายไปยังเพื่อนบ้านผ่านพื้นที่ การประสานแบบนี้เหมือนหิ่งห้อย: นักแสดงทุกคนปฏิบัติงานประเภทเดียวกัน
ความหลากหลายของกระบวนการ
ด้วยเหตุนี้เราสามารถคิดค้นคำศัพท์สองสามคำเพื่อช่วยให้เราเห็นว่ามีสามสิ่งที่เกิดขึ้น: "ซิงโครนัสที่เป็นเนื้อเดียวกัน", "ซิงโครนัสที่ต่างกัน" และ "การซิงโครไนซ์ตามลำดับ" ดังนั้นเมื่อนักแสดงปฏิบัติภารกิจเดียวกันพร้อมกัน (FEA หิ่งห้อย) พวกเขาจะ "เป็นเนื้อเดียวกัน" เมื่อพวกเขาปฏิบัติภารกิจที่แตกต่างกันพร้อมกัน (ทหารที่วิ่งเทียบกับการคลานและว่ายน้ำไปยังจุดหมายปลายทางฟิสิกส์กับเสียงและหัวข้อ AI ในเกม) พวกเขาเป็น "ต่างกัน" เมื่อพวกเขากำลังทำงานหนึ่งครั้งพวกเขาจะ "เรียงตามลำดับ" (นักวิ่งรีเลย์บล็อก I / O) พวกเขาอาจดูแตกต่างกันมาก แต่พวกเขาแบ่งปันคุณสมบัติที่สำคัญอย่างหนึ่ง: นักแสดงทุกประเภทแสดงการรอเพื่อให้แน่ใจว่าทุกคนมาถึงจุดประสานในเวลาเดียวกัน ในระหว่างจุดการซิงโครไนซ์หรือ "การดำเนินการเดียวกัน" ไม่เกี่ยวข้องกับคุณสมบัติของการซิงโครไนซ์
ไปป์ไลน์เรนเดอร์ใน GPU นั้นจะซิงโครนัสเพราะพวกมันทั้งหมดจะต้องทำเฟรมให้เสร็จและเริ่มเฟรมใหม่ด้วยกัน พวกเขาเป็นเนื้อเดียวกันเพราะพวกเขากำลังทำงานประเภทเดียวกันและพวกเขาทั้งหมดทำงานด้วยกัน แต่การวนรอบเกมหลักของเซิร์ฟเวอร์และเธรด I / O ที่บล็อกซึ่งประมวลผลอินพุตระยะไกลนั้นต่างกันเพราะพวกเขาทำงานแตกต่างกันมากและเธรด I / O บางตัวจะไม่ทำอะไรเลยเพราะไม่ใช่ทั้งหมด การเชื่อมต่อที่ใช้ ถึงกระนั้นก็ตามพวกมันจะถูกซิงโครไนซ์เพราะพวกเขาจะต้องแชร์สถานะเป็นอะตอม (ผู้เล่นจะต้องไม่เห็นการอัพเดทเกมในโลกบางส่วน
async
ตอนนี้ให้ลองอ่าน "async I / O" เมื่อโปรแกรมของคุณส่งคำขอไปยังระบบปฏิบัติการเพื่ออ่านบิตของข้อมูลจากการจัดเก็บการเรียกร้องผลตอบแทนทันที ลองละเว้นการโทรกลับและมุ่งเน้นการสำรวจ โดยทั่วไปช่วงเวลาที่ข้อมูลพร้อมใช้งานกับโปรแกรมของคุณไม่ตรงกับจุดพิเศษใด ๆ ในเวลาที่เกี่ยวข้องกับเธรดโปรแกรมของคุณ หากโปรแกรมของคุณไม่รอข้อมูลอย่างชัดเจนเธรดจะไม่ทราบว่าเกิดขึ้นเมื่อใด มันจะค้นพบว่าข้อมูลกำลังรอในครั้งต่อไปที่ตรวจสอบ
ไม่มีเวลาประชุมพิเศษที่ระบบปฏิบัติการและเธรดโปรแกรมตกลงส่งข้อมูล พวกมันเหมือนเรือสองลำแล่นผ่านในเวลากลางคืน อะซิงโครนัสเป็นลักษณะของการขาดงานนี้. แน่นอนเธรดโปรแกรมมักจะจบลงด้วยการรอการดำเนินการ I / O หลังจากทั้งหมด แต่ก็ไม่จำเป็นต้อง สามารถทำการคำนวณอื่น ๆ ได้อย่างมีความสุขในขณะที่การดึงข้อมูล I / O เกิดขึ้นและตรวจสอบในภายหลังเมื่อมีเวลาว่าง แน่นอนว่าเมื่อระบบปฏิบัติการดึงข้อมูลเสร็จแล้วก็ไม่ได้รอคอยเช่นกัน มันแค่ทำให้ข้อมูลบางแห่งสะดวกและดำเนินธุรกิจต่อไป ในกรณีนี้มันเหมือนโปรแกรมส่งกระบองออกไปยังระบบปฏิบัติการและระบบปฏิบัติการรอบต่อมาวางกระบองลงบนพื้นพร้อมกับข้อมูลและเดินออกจากแทร็ค โปรแกรมอาจหรือไม่รอรอบรับ hand-off
ความเท่าเทียม
เมื่อเราทำเครื่องหมายฟังก์ชั่นเป็น "async" ในซอฟแวร์ก็มักจะหมายความว่าเราต้องการความเท่าเทียม แต่จำไว้ว่าความเท่าเทียมไม่ได้หมายความเรียบลื่น หิ่งห้อยเป็นตัวอย่างที่ดีเพราะมันแสดงพฤติกรรมแบบซิงโครนัสและแบบอะซิงโครนัสด้วยเช่นกัน ในขณะที่แมลงวันส่วนใหญ่พุ่งออกมาพร้อม ๆ กันหลายคนก็ไม่สอดคล้องกับส่วนที่เหลือของกลุ่ม แมลงวันอาจจะได้รับการแสดงไปพร้อม ๆ กันแต่พวกเขาก็ไม่ได้ทำข้อมูลให้ตรงกันทั้งหมด
ตอนนี้เมื่อเราทำเครื่องหมายรหัสว่า "async" มันดูตลกเพราะมันหมายความว่าส่วนที่เหลือของรหัสที่ไม่ได้ทำเครื่องหมายคือ "ซิงค์" มันหมายความว่ายังไง? เราไม่ได้ยืนยันว่า "การซิงโครไนซ์" ต้องการแทงโก้สองอันใช่ไหม แต่ถ้าเรากำลังพูดถึงการรันโค้ดในเธรดเดียว? ในกรณีนี้เราจำเป็นต้องย้อนกลับไปและคิดเกี่ยวกับโปรแกรมเป็นลำดับของสถานะและช่วงการเปลี่ยนภาพระหว่างสถานะเหล่านั้น คำสั่งในโปรแกรมทำให้เกิดการเปลี่ยนสถานะ เราสามารถคิดว่ามันเป็น "กระบวนการไมโคร" ที่เริ่มต้นและหยุดด้วยคำสั่ง จุดลำดับที่กำหนดโดยภาษานั้นอันที่จริงแล้วเป็นจุดประสานของ "กระบวนการไมโคร" เหล่านี้ และด้วยเหตุนี้เราสามารถดูเธรดเดี่ยว
ความสมบูรณ์ของภาษาการเขียนโปรแกรมรับประกันได้ว่าสถานะการอัพเดตจะไม่รบกวนการทำงานของคำสั่งและจุดลำดับกำหนดขอบเขตที่คอมไพเลอร์ไม่ได้รับอนุญาตให้ทำการปรับให้เหมาะสมที่สังเกตได้ ตัวอย่างเช่นลำดับของการประเมินผลของการแสดงออกในคำสั่งอาจไม่ได้กำหนดหรือไม่เน้นการให้เสรีภาพคอมไพเลอร์เพื่อเพิ่มประสิทธิภาพของคำสั่งในหลากหลายวิธี แต่เมื่อถึงเวลาที่คำสั่งถัดไปจะเริ่มขึ้นโปรแกรมควรอยู่ในสถานะที่กำหนดไว้อย่างชัดเจนหากตัว PL นั้นเป็นเสียง
ถึงตอนนี้มันควรจะชัดเจนว่าเราหมายถึงอะไรโดย "async" หมายความว่าสัญญาโดยนัยของการซิงโครไนซ์ภายในบล็อกของรหัสได้รับการยกเว้นสำหรับบล็อก async ได้รับอนุญาตให้อัปเดตสถานะของโปรแกรมอย่างอิสระโดยไม่มีการรับรองความปลอดภัยตามปกติโดยนัยโดยรูปแบบการคำนวณแบบเรียงตามลำดับ แน่นอนนี่หมายความว่าเราต้องใช้ความระมัดระวังเป็นพิเศษซึ่งเราจะไม่ทำลายสถานะของโปรแกรมด้วยความไม่ลงรอยกัน ซึ่งมักจะหมายความว่าเราแนะนำการซิงโครนัสจำกัดอย่างชัดเจนเพื่อประสานงานกับบล็อก async โปรดทราบว่านี่หมายความว่าบล็อก async สามารถเป็นได้ทั้งแบบอะซิงโครนัสและซิงโครนัสในเวลาที่ต่างกัน! แต่การจำได้ว่าการซิงโครไนซ์เพียงบ่งบอกถึงการมีอยู่ของจุดซิงค์เราไม่ควรมีปัญหาในการยอมรับความคิดนี้