ไม่บิตเหนียวไม่เหมือนธง set-UID หรือ set-GID ไม่มีผลต่อการเปลี่ยนแปลงข้อมูลรับรองกระบวนการ
สิ่งที่บิตเหนียวทำคือทำให้ข้อความโปรแกรม "เหนียว" เดิมทีมันไม่ใช่การเรียกชื่อผิด
พื้นหลัง: ส่วนภาพโปรแกรมและข้อความที่แชร์
ในสาระสำคัญโดยไม่ต้องลึกเข้าไปในรายละเอียดของรูปแบบไฟล์ปฏิบัติการ (ซึ่งสามารถและมีหนังสือที่เต็มไป): ส่วนต่าง ๆ ของไฟล์ภาพของโปรแกรมที่โหลดเข้าสู่หน่วยความจำโดยตรงเพื่อเรียกใช้โปรแกรมประกอบด้วยรหัสเครื่อง, ค่าคงที่, การเริ่มต้น ค่าของตัวแปร (ไม่เริ่มต้นด้วยศูนย์) และช่องว่าง (ในรูปแบบเดียวหรืออื่น) สำหรับตัวแปรที่ไม่กำหนดค่าเริ่มต้นและไม่มีค่าเริ่มต้น
เหล่านี้ถูกจัดกลุ่มเป็นคอลเลกชันที่รู้จักกันในชื่อ "ส่วน" และมีชื่อทั่วไป รหัสเครื่องและ (บางครั้ง) ค่าคงที่จะเป็นสิ่งที่เรียกว่าส่วน "ข้อความ" ของรูปภาพโปรแกรม ตัวแปรที่ไม่ได้เริ่มต้นเป็นศูนย์นั้นก็เช่นเดียวกันส่วน "data"; และตัวแปรที่ไม่มีการกำหนดค่าเริ่มต้นและไม่มีการกำหนดค่าเริ่มต้นคือ "bss" (ชื่อที่มีประวัติแบบโฟล์คทั้งหมดอยู่ด้านหลัง)
เมื่อกระบวนการมีไฟล์อิมเมจที่สามารถเรียกใช้งานโปรแกรมได้โหลดลงในส่วนต่าง ๆ - ข้อความข้อมูลและ bss - จะเริ่มต้นจากเนื้อหาของไฟล์ภาพ
มีอะไรพิเศษเกี่ยวกับส่วน "ข้อความ" คือรหัสเครื่อง (และค่าคงที่) นั้นแทบจะไม่ได้เขียนไว้เสมอไป มีความเป็นไปได้ที่จะถูกแชร์ไปยังอิมเมจหน่วยความจำเสมือนของกระบวนการดำเนินการทั้งหมดที่มีไฟล์อิมเมจที่สามารถเรียกใช้งานนั้นโหลดเข้ามาได้ สถานการณ์ที่แน่นอนซึ่งข้อความโปรแกรมสามารถแบ่งปันไม่อยู่ในขอบเขตของคำตอบนี้และเกี่ยวข้องกับสิ่งต่าง ๆ เช่น idempotence fixup ตัวโหลดและข้อมูลประจำตัวโครงร่างพื้นที่ที่อยู่ ผู้คนสามารถและมีหนังสือที่เขียนเกี่ยวกับเรื่องนี้ได้เช่นกัน ☺
ข้อความที่ใช้ร่วมกันเป็นการเพิ่มประสิทธิภาพที่ใช้โดยเคอร์เนล มันไม่จำเป็นต้องมีทุกอิมเมจของโปรแกรมที่กำลังทำงานอยู่เพื่อที่จะมีหน่วยความจำภาพอิมเมจของตัวเองใช้หน่วยความจำกายภาพที่มีค่าซึ่งมีสำเนาหลายชุดของรหัสเครื่องเดียวกัน (และค่าคงที่)
ข้อความเหนียว
แต่สามารถทำได้ดีกว่าข้อความที่แชร์ เห็นได้ชัดว่าหากมีกระบวนการทำงานอย่างน้อยหนึ่งกระบวนการที่ใช้อิมเมจโปรแกรมข้อความที่แชร์เฉพาะเคอร์เนลจะแนบพื้นที่หน่วยความจำเสมือนของกระบวนการใหม่ไปยังเซ็กเมนต์ข้อความที่ใช้ร่วมกันที่มีอยู่เมื่อมีการเรียกใช้อินสแตนซ์ใหม่ของโปรแกรม มีเกือบทุกอินสแตนซ์ของ (พูด) /bin/login
หรือ/bin/sh
ทำงานที่ใดที่หนึ่งบนระบบขนาดกลางดังนั้นอินสแตนซ์ใหม่ของโปรแกรมเข้าสู่ระบบหรือเชลล์เริ่มต้นสามารถแนบไปกับสำเนาที่โหลดของเซ็กเมนต์ข้อความที่เคอร์เนลโหลดลงในหน่วยความจำแล้ว
ข้อความปักหมุดขยายแนวคิดนี้ไปยังรูปภาพโปรแกรมที่ไม่มีกระบวนการใดกำลังทำงานอยู่ หากไฟล์รูปภาพที่เรียกใช้งานได้ถูกทำเครื่องหมายว่าเป็นข้อความเหนียวแล้วเคอร์เนลจะเก็บเซกเมนต์ข้อความไว้รอบ ๆ หลังจากกระบวนการสุดท้ายเพื่อใช้งาน ด้วยความหวังว่าอินสแตนซ์อื่นของโปรแกรมจะทำงานเร็ว ๆ นี้และสามารถแนบกลับไปยังกลุ่มได้
ใน Unices ตอนต้นเซ็กเมนต์ข้อความที่โหลดจะถูกสลับเป็นแลกเปลี่ยนที่เก็บข้อมูลเมื่อไม่มีการเชื่อมต่อกับกระบวนการ (Unices ภายหลังหยุดการใช้ swap สำหรับสิ่งนี้) คุณอาจเคยได้ยินชื่อบันทึกข้อความด้วย
แน่นอนการตั้งค่าบิตข้อความเหนียวบนภาพของโปรแกรมเป็นสิ่งที่ต้องทำด้วยความระมัดระวัง สิ่งที่โปรแกรมได้รับประโยชน์จากมันขึ้นอยู่กับสิ่งที่เครื่องใช้โดยทั่วไป และปัจจุบันเซกเมนต์ข้อความที่ไม่เชื่อมต่อใช้ทรัพยากรเคอร์เนลซึ่งหมายความว่ามีข้อ จำกัด ในทางปฏิบัติเกี่ยวกับจำนวนที่สามารถมีได้ในระบบใด ๆ ดังนั้นโดยทั่วไปการดำเนินการที่ต้องใช้สิทธิ์ superuser
desuetude
มีสมมติฐานมากมายที่รองรับการทำงานของข้อความเหนียวซึ่งไม่เป็นความจริงอีกต่อไป การอ่านเซกเมนต์ที่ทำไว้ล่วงหน้าจากที่เก็บข้อมูลสโตร์นั้นไม่จำเป็นต้องเร็วกว่าการทำเพจจิ้งตามความต้องการอย่างง่ายจากไฟล์ภาพที่เรียกใช้งานได้จริง รูปแบบระบบแฟ้มดีขึ้นสำหรับรูปแบบการอ่านแบบสุ่ม (ตรงข้ามกับลำดับ) การปรากฎตัวของความต้องการเพจจิ้งเปลี่ยนสิ่งต่าง ๆ เช่นเดียวกับสิ่งต่าง ๆ เช่นแคชแบบครบวงจรการแก้ไขภายนอกที่ไม่ใช่ idempotent ซึ่งเป็นผลมาจากความแตกต่างในการค้นหาไลบรารีที่ใช้ร่วมกัน
วันของบิตข้อความเหนียวสำหรับภาพโปรแกรมที่ปฏิบัติการได้หายไปนาน ตัวอย่างเช่นการตั้งค่าสถานะตัวทำเครื่องหมายข้อความเหนียวสำหรับภาพโปรแกรมที่ใช้งานได้นั้นถือว่าล้าสมัยโดยนักเขียน 4.3BSD ในช่วงกลางทศวรรษ 1980
อ่านเพิ่มเติม
- Maurice J. Bach (1986) การออกแบบของระบบปฏิบัติการยูนิกซ์ ศิษย์ฮอลล์. ไอ 9780132017992