เหตุใดจึงต้องจัดเก็บลิงก์ตนเองและพาเรนต์ (. และ .. ) ในรายการไดเรกทอรี


11

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

มีประโยชน์ในการจัดเก็บลิงค์ไปยังไดเรกทอรีตัวเองและผู้ปกครองในโครงสร้างข้อมูลบนดิสก์ที่แสดงถึงไดเรกทอรีหรือไม่

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


ฉันมักจะคิดว่าพวกเขาอยู่ที่นั่นเพียงเพื่อให้โปรแกรมสามารถเข้าถึงไดเรกทอรีปัจจุบันและผู้ปกครองได้อย่างง่ายดาย คำถามที่น่าสนใจ แต่มันเป็นของที่นี่หรือไม่
Raphael

@ ราฟาเอลฉันเข้าใจถ้าคุณคิดว่าคำถามของฉันกว้างเกินไป (→“ ไม่ใช่คำถามที่แท้จริง”) หรือบางที“ ไม่สร้างสรรค์” เพราะมันค่อนข้างเปิดกว้าง แต่ฉันไม่เห็นด้วยว่ามันเป็นเรื่องนอกเรื่อง: มันเกี่ยวกับการออกแบบระบบไฟล์นั่นเป็นวิธีที่ไม่ใช้วิทยาศาสตร์คอมพิวเตอร์ หากคุณคิดว่ามันไม่ใช่หัวข้อโปรดอธิบายเหตุผลของคุณเกี่ยวกับเมตา
Gilles 'ดังนั้นหยุดความชั่วร้าย'

@ ราฟาเอลฉันได้แก้ไขคำถามของฉันหวังว่ามันควรจะชัดเจนว่ามุมมองของฉันเป็นของนักออกแบบระบบปฏิบัติการที่ฝังตัว ขอบคุณสำหรับความคิดเห็นของคุณ
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


2

การมีลิงก์ไปยังไดเรกทอรีแม่นั้นสมเหตุสมผลดีสำหรับฉัน หากคุณไม่มีพวกเขาคุณจะต้องทำงานกับรายการไดเรกทอรีทั้งหมด ดังนั้นสำหรับตัวอย่างเช่นจะต้องมีการแสดงเป็น/home/svick/Documents/ { /, /home/, /home/svick/, /home/svick/Documents }หากคุณไม่ทำเช่นนั้นคุณจะไม่สามารถค้นหาไดเรกทอรีหลักได้เลย (หรืออาจจะแพงมาก) สิ่งนี้ไม่เพียง แต่ไร้ประสิทธิภาพเท่านั้น แต่ยังเป็นอันตรายด้วย หากคุณมีสองรายการดังกล่าวที่ทับซ้อนกันพวกเขาสามารถยกเลิกการซิงโครไนซ์ได้อย่างง่ายดายหากคุณย้ายบางไดเรกทอรี

ในทางกลับกันหากคุณมีการอ้างอิงไปยังไดเรกทอรีหลักจะมีประสิทธิภาพและปลอดภัยยิ่งขึ้น

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


2
คำพูดเดียวกัน: ทำไมมันในแต่ละระบบไฟล์มากกว่าในเลเยอร์ VFS? ระบบไฟล์ Linux ส่วนใหญ่มี.และ..รายการ
Gilles 'หยุดความชั่วร้าย'

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

1
@svick: Gilles ไม่ได้เปรียบเทียบการเชื่อมโยงหลักกับการไม่มีการเชื่อมโยงหลัก เขาเปรียบเทียบการมีอยู่ในระบบไฟล์จริงด้วยการจำลองโดยเลเยอร์กลางของโค้ด (vfs) ระหว่างระบบไฟล์จริงและพื้นที่ผู้ใช้
rgrig

2

คุณได้รับกรณีพิเศษน้อยลง ในหลาย ๆ สถานการณ์ VFS อาจจัดการ ".. " เนื่องจากมันจัดการกับชื่อไดเรกทอรีอื่น ๆ


3
หากไดเรกทอรีนั้นเป็นเสมือนจริงโปรแกรม (usermode I presume) สามารถยังคงจัดการได้เหมือนกับไดเรกทอรีอื่น ๆ คุณไม่จำเป็นต้องมีลิงก์เพื่อนำเสนอในระดับที่เก็บข้อมูล
Aryabhata

1
ใช่ แต่ทำไมไม่จัดการกับสิ่งนั้นที่เลเยอร์ VFS? เหตุใดจึงมีที่เก็บข้อมูลที่เกี่ยวข้อง
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

เหตุใดผู้คนจึงใช้รายการที่เชื่อมโยงกับ Sentinel แทนที่จะดูแลกรณีรายการว่างในฟังก์ชันเพิ่ม / ลบ
rgrig

@rgrig: มันเกิดขึ้นเฉพาะเมื่อส่วนต่อประสานการใช้งานลิสต์ที่พิจารณาถูกเขียนด้วยภาษาที่ไม่ดีเป็นพิเศษในการจัดการโครงสร้างข้อมูลแบบอินดัคชั่น (C, Java, ฯลฯ …) นี่คือปัญหานี้ไม่เกี่ยวข้องเพราะชั้น VFS ไม่สามารถเข้าถึงได้โดยตรงจากมุมมองของผู้ใช้
Stéphane Gimenez

@ StéphaneGimenez: ปัญหานี้เป็นที่เกี่ยวข้องเพราะวีเอฟเอจะเขียนใน C.
rgrig

2

เหตุผลเดียวที่ฉันจินตนาการได้คือสถานการณ์ต่อไปนี้:

  1. การใช้งานดั้งเดิมของระบบไฟล์มีอยู่ในรูปแบบไดเร็กทอรีเดียวกัน แต่แนวคิดของพา ธ ไฟล์และไดเร็กทอรีย่อยไม่ถูกพิจารณาในเวลานั้น (ดูที่ระบบไฟล์ PDP-7 Unix )

  2. จากนั้นผู้คนคิดว่าการแก้ไขพา ธ และไดเรกทอรีย่อยจะเป็นประโยชน์!

  3. เพื่อรักษาความเข้ากันได้แบบย้อนหลังกับการใช้งานที่เก่ากว่ามันมีการตัดสินใจแล้วว่า.และ..จะถูกเก็บไว้ในดิสก์เหมือนกับไดเรกทอรีอื่น ๆ

ดังนั้นเราอาจจะเหลือสิ่งของที่ไร้ประโยชน์เหล่านั้นเพียงเพื่อความเข้ากันได้แบบย้อนหลังกับซอฟต์แวร์อายุ 40 ปีใช่ไหม สถานการณ์ที่น่าเชื่อถือ?


หมายเหตุ: นอกจากนี้ยังไม่ได้โง่อย่างสมบูรณ์ที่จะเพิ่มรายการเหล่านี้ไปยังรายชื่อไดเรกทอรีเนื่องจากคุณต้องเก็บหมายเลขไอโหนดของไดเรกทอรีหลักที่แท้จริงของคุณอยู่ที่ไหนสักแห่ง (โปรดจำไว้ว่าอนุญาตให้มีการเชื่อมโยงไปยังไดเรกทอรีในไดเรกทอรีนี้) หมายเลขไอโหนดของตัวเองอาจเป็นการตรวจสุขภาพที่ดี


1

ฉันไม่เห็นเหตุผลที่จะใช้งาน.และ..ในระดับใดระดับหนึ่งมากกว่าอีกระดับหนึ่ง อย่างไรก็ตามหากคุณกำหนดเป้าหมายระบบฝังตัวเลเยอร์ใด ๆ ที่คุณสามารถบันทึกอาจได้รับเงินเป็นดอลลาร์ดังนั้นจึงอาจเหมาะสมที่จะลองใช้ทุกสิ่งให้ต่ำที่สุดเท่าที่จะทำได้

สำหรับความต้องการทั่วไปของ.และ..คุณจะแสดงเส้นทางญาติโดยไม่ต้องได้อย่างไร อย่างน้อย..ก็ขาดไม่ได้สำหรับเส้นทางที่ออกจากทรีย่อยปัจจุบัน ถ้าคุณไม่จำเป็นต้องเส้นทางดังกล่าว (บางทีต้นไม้เป็นวิธีดั้งเดิมสิทธิ์การเข้าใช้การเข้ารหัส?) ..คุณไม่จำเป็นต้อง

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