ทำความเข้าใจกับระดับของการคำนวณ


9

ขออภัยสำหรับคำถามที่สับสนของฉัน ฉันกำลังมองหาตัวชี้บางอย่าง

ถึงตอนนี้ฉันทำงานกับ Java และ Python เป็นส่วนใหญ่บนเลเยอร์แอปพลิเคชันและฉันมีความเข้าใจที่ไม่ชัดเจนเกี่ยวกับระบบปฏิบัติการและฮาร์ดแวร์ ฉันต้องการที่จะเข้าใจมากขึ้นเกี่ยวกับการใช้คอมพิวเตอร์ในระดับที่ต่ำกว่า แต่มันก็ท่วมท้นไปมาก ที่มหาวิทยาลัยฉันเข้าเรียนเกี่ยวกับ microprogramming นั่นคือวิธีที่ตัวประมวลผลมีสายแบบยากที่จะใช้รหัส ASM ถึงตอนนี้ฉันคิดอยู่เสมอว่าฉันจะไม่ทำอะไรให้สำเร็จถ้าเรียนรู้เพิ่มเติมเกี่ยวกับ "ระดับต่ำ"

คำถามหนึ่งที่ฉันมีคือ: เป็นไปได้อย่างไรที่ฮาร์ดแวร์จะถูกซ่อนไว้เกือบทั้งหมดจากผู้พัฒนา มันถูกต้องหรือไม่ที่จะบอกว่าระบบปฏิบัติการเป็นเลเยอร์ซอฟต์แวร์สำหรับฮาร์ดแวร์? ตัวอย่างเล็ก ๆ น้อยหนึ่ง: ในการเขียนโปรแกรมฉันไม่เคยเจอความต้องการที่จะเข้าใจ L2 หรือ L3 Cache คืออะไร สำหรับสภาพแวดล้อมของแอปพลิเคชันทางธุรกิจทั่วไปเราแทบไม่จำเป็นต้องเข้าใจแอสเซมเบลอร์และการคำนวณในระดับที่ต่ำกว่าเพราะในปัจจุบันมีเทคโนโลยีสแต็คสำหรับเกือบทุกอย่าง ฉันเดาว่าจุดรวมของระดับล่างเหล่านี้คือการให้ส่วนต่อประสานกับระดับที่สูงขึ้น ในทางกลับกันฉันสงสัยว่าจะมีอิทธิพลต่อระดับล่างได้มากน้อยเพียงใดตัวอย่างเช่นการประมวลผลกราฟิกทั้งหมด

ในทางกลับกันมีสาขาวิทยาศาสตร์คอมพิวเตอร์เชิงทฤษฎีนี้ซึ่งทำงานในรูปแบบการคำนวณเชิงนามธรรม อย่างไรก็ตามฉันยังพบกับสถานการณ์ที่ไม่ค่อยพบซึ่งฉันคิดว่ามันเป็นประโยชน์ในการคิดประเภทของแบบจำลองความซับซ้อนการตรวจสอบหลักฐาน ฯลฯ ฉันรู้ว่ามีคลาสความซับซ้อนที่เรียกว่า NP และพวกเขาไม่สามารถแก้ปัญหาได้ สิ่งที่ฉันขาดไปมากคือการอ้างอิงสำหรับกรอบการคิดเกี่ยวกับสิ่งเหล่านี้ สำหรับฉันดูเหมือนว่ามีค่ายต่าง ๆ ทุกประเภทที่ไม่ค่อยมีปฏิสัมพันธ์

ไม่กี่สัปดาห์ที่ผ่านมาฉันได้อ่านเกี่ยวกับปัญหาด้านความปลอดภัย ที่นี่อย่างใดชั้นที่แตกต่างกันมากมารวมกัน การโจมตีและการหาประโยชน์มักเกิดขึ้นในระดับที่ต่ำกว่าดังนั้นในกรณีนี้จำเป็นต้องเรียนรู้เกี่ยวกับรายละเอียดของเลเยอร์ OSI, การทำงานภายในของ OS ฯลฯ


1
มีคำตอบที่ดีสำหรับคำถามนี้ (คนแรกที่ถาม) programmers.stackexchange.com/questions/81624/ …
Puckl

การโจมตีและการหาประโยชน์สามารถเกิดขึ้นได้ในทุกระดับ ถ้าฉันเขียนสคริปต์ PHP ที่มีช่องโหว่มันสามารถถูกนำไปใช้ประโยชน์ได้โดยไม่คำนึงถึงระบบปฏิบัติการพื้นฐานฮาร์ดแวร์ที่ใช้งานเดี่ยว
tdammers

1
พบหนังสือเล่มที่ดีเกี่ยวกับหัวข้อ: องค์ประกอบของระบบคอมพิวเตอร์: การสร้างคอมพิวเตอร์สมัยใหม่จากหลักการแรก Noam Nisan, Shimon Schocken พูดคุยโดย Mr. Schocken เกี่ยวกับวิธีการนี้: youtube.com/watch?v=IlPj5Rg1y2w&feature=plcp
RParadox

ย้อนกลับไปในสมัยของการใช้ภาษาแอสเซมบลีสำหรับรูทีนกราฟิก VGA เป็นวิธีเดียวที่จะได้รับประสิทธิภาพใด ๆ แต่ฉันคิดว่าฉันไม่รู้ว่าฉันกำลังทำอะไรอยู่! แต่ในช่วง 10 ปีที่ผ่านมาหรือมากกว่าในอาชีพการงานของฉันฉันไม่ต้องมองอะไรเลย และตอนนี้ฉันส่วนใหญ่ไม่รู้ว่าเกิดอะไรขึ้นในระดับนั้น ฉันต้องจัดสรรหรือล้างความทรงจำของตัวเองไม่บ่อยนัก ฉันสงสัยว่าหลายคนในทีมของฉันไม่รู้ว่ากองคืออะไร! ในหลาย ๆ วิธีมันไม่ได้มีประสิทธิภาพในการเขียนโค้ดในระดับดังกล่าวทำให้เกิดการคิดค้นล้อเพื่อพูด ค่อนข้างเรายืนอยู่บนไหล่ของยักษ์
Gavin Howden

คำตอบ:


19

คำหลักสำหรับการคิดเกี่ยวกับสิ่งเหล่านี้คือสิ่งที่เป็นนามธรรม

Abstraction หมายถึงการละเว้นรายละเอียดของระบบอย่างจงใจเพื่อให้คุณสามารถคิดได้ว่ามันเป็นองค์ประกอบที่แยกส่วนไม่ได้เมื่อทำการประกอบระบบขนาดใหญ่ออกจากระบบย่อยหลาย ๆ ระบบ เป็นที่ทรงพลังเหลือล้น - การเขียนโปรแกรมที่ทันสมัยขณะที่การพิจารณารายละเอียดของการจัดสรรหน่วยความจำและการลงทะเบียนทะลักและ runtimes ทรานซิสเตอร์จะเป็นไปได้ในบางวิธีที่เงียบสงบ แต่ก็เป็นเหลือใจง่ายขึ้นไม่ได้เพื่อคิดเกี่ยวกับพวกเขาและใช้การดำเนินการระดับสูงแทน กระบวนทัศน์การคำนวณที่ทันสมัยอาศัยสิ่งที่เป็นนามธรรมหลายระดับ: อุปกรณ์อิเล็กทรอนิกส์แบบโซลิดสเตต, ไมโครโปรแกรม, คำแนะนำเครื่อง, ภาษาการเขียนโปรแกรมระดับสูง, OS และ API การเขียนโปรแกรมเว็บ, กรอบงานที่ผู้ใช้ตั้งโปรแกรมได้ ทุกวันนี้แทบไม่มีใครเข้าใจระบบทั้งหมดและไม่มีแม้แต่เส้นทางที่เป็นไปได้ที่เราจะย้อนกลับไปสู่สภาวะของกิจการนั้น

ด้านพลิกของสิ่งที่เป็นนามธรรมคือการสูญเสียพลังงาน การออกจากการตัดสินใจเกี่ยวกับรายละเอียดไปยังระดับที่ต่ำกว่าเรามักจะยอมรับว่าพวกเขาอาจทำด้วยประสิทธิภาพที่ไม่ดีเนื่องจากระดับที่ต่ำกว่าไม่มี 'ภาพใหญ่' และสามารถเพิ่มประสิทธิภาพการทำงานของพวกเขาโดยความรู้ในท้องถิ่นเท่านั้น ฉลาดเป็นมนุษย์ (โดยทั่วไปสำหรับ isntance การคอมไพล์ HLL ไปยังโค้ดเครื่องในปัจจุบันมักทำได้ดีกว่าโดยเครื่องมากกว่าโดยมนุษย์ที่มีความรู้มากที่สุดเนื่องจากสถาปัตยกรรมโปรเซสเซอร์นั้นซับซ้อนมาก)

ปัญหาด้านความปลอดภัยเป็นสิ่งที่น่าสนใจเพราะข้อบกพร่องและ 'การรั่วไหล' ในสิ่งที่เป็นนามธรรมมักถูกนำไปใช้เพื่อละเมิดความสมบูรณ์ของระบบ เมื่อ API ตั้งสมมติฐานว่าคุณอาจเรียกวิธีการ A, B, และ C แต่ถ้ามีเงื่อนไข X มันเป็นเรื่องง่ายที่จะลืมเงื่อนไขและไม่ได้เตรียมตัวไว้สำหรับ fallout ที่เกิดขึ้นเมื่อเงื่อนไขถูกละเมิด ตัวอย่างเช่นบัฟเฟอร์คลาสสิกล้นใช้ประโยชน์จากความจริงที่ว่าการเขียนไปยังเซลล์หน่วยความจำทำให้เกิดพฤติกรรมที่ไม่ได้กำหนดเว้นแต่คุณจะได้จัดสรรบล็อกหน่วยความจำนี้โดยเฉพาะด้วยตัวคุณเอง API รับประกันสิ่งนั้นเท่านั้นจะเกิดขึ้นเป็นผล แต่ในทางปฏิบัติผลลัพธ์จะถูกกำหนดโดยรายละเอียดของระบบในระดับที่ต่ำกว่าถัดไป - ซึ่งเราลืมไปอย่างจงใจ! ตราบใดที่เราปฏิบัติตามเงื่อนไขนี้ก็ไม่มีความสำคัญ แต่ถ้าไม่ใช่ผู้โจมตีที่เข้าใจทั้งสองระดับอย่างใกล้ชิดสามารถควบคุมพฤติกรรมของทั้งระบบได้ตามต้องการและทำให้สิ่งเลวร้ายเกิดขึ้น

กรณีของข้อผิดพลาดในการจัดสรรหน่วยความจำนั้นแย่มากเพราะมันกลายเป็นเรื่องยากจริงๆที่จะจัดการหน่วยความจำด้วยตนเองโดยไม่มีข้อผิดพลาดเดียวในระบบขนาดใหญ่ นี่อาจเป็นกรณีที่เป็นนามธรรมที่ล้มเหลวถึงแม้ว่ามันเป็นไปได้ที่จะทำทุกสิ่งที่คุณต้องการด้วย CmallocAPI มันเป็นเรื่องง่ายที่จะละเมิด บางส่วนของชุมชนการเขียนโปรแกรมตอนนี้คิดว่านี่เป็นสถานที่ที่ผิดที่จะแนะนำขอบเขตระดับเข้าสู่ระบบและส่งเสริมภาษาด้วยการจัดการหน่วยความจำอัตโนมัติและการรวบรวมขยะแทนที่จะสูญเสียพลังงาน แต่ให้การป้องกันความเสียหายของหน่วยความจำและพฤติกรรมที่ไม่ได้กำหนด . ในความเป็นจริงเหตุผลสำคัญที่ยังคงใช้ C ++ ทุกวันนี้คือข้อเท็จจริงที่ว่ามันช่วยให้คุณสามารถควบคุมได้อย่างแม่นยำว่าทรัพยากรที่ได้มาและเปิดตัวเมื่อใด ด้วยวิธีนี้ความแตกต่างที่สำคัญระหว่างภาษาที่มีการจัดการและที่ไม่มีการจัดการในปัจจุบันสามารถมองเห็นได้ว่าเป็นความไม่เห็นด้วยเกี่ยวกับสถานที่ที่จะกำหนดเลเยอร์ของสิ่งที่เป็นนามธรรมได้อย่างแม่นยำ

เช่นเดียวกันอาจกล่าวได้ว่าเป็นกระบวนทัศน์ทางเลือกที่สำคัญอื่น ๆ ในการคำนวณปัญหาที่เกิดขึ้นตลอดเวลาที่ต้องสร้างระบบขนาดใหญ่เพราะเราไม่สามารถแก้ปัญหาทางวิศวกรรมตั้งแต่เริ่มต้นสำหรับความต้องการที่ซับซ้อนทั่วไปในปัจจุบัน (มุมมองที่พบบ่อยในเอไอวันนี้ก็คือว่าสมองของมนุษย์จริงไม่ทำงานเช่นนั้น - พฤติกรรมที่เกิดขึ้นผ่านลูปความคิดเห็นของเครือข่ายที่เชื่อมต่อกันอย่างหนาแน่น ฯลฯ แทนของโมดูลที่แยกต่างหากและชั้นด้วยง่ายอินเตอร์เฟซที่แยกระหว่างพวกเขาและนี่คือเหตุผลที่เรา มีความสำเร็จเพียงเล็กน้อยในการจำลองสติปัญญาของเราเอง)


1
เยี่ยมมากขอบคุณ ดังนั้นตัวอย่างของการรวบรวมขยะ / การจัดการหน่วยความจำอาจเป็นตัวอย่างที่รู้จักกันดีที่สุดของการโต้ตอบนี้ Neil Gershenfeld ได้เขียนสิ่งที่น่าสนใจบางอย่างแม้ว่าฉันจะเข้าใจเพียงบางส่วนของมัน
RParadox

... จุดที่ดีมากเกี่ยวกับความซับซ้อน หากเครื่องเท่านั้นที่สามารถออกแบบเครื่องของเราสิ่งนี้นำไปสู่อะไร หากคน AI กำลังพูดคุยเกี่ยวกับ AIs สร้าง AIs ที่ฉลาดกว่าเราอาจจะอยู่ที่นั่น ;)
RParadox
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.