วันจันทร์ที่ 6 กันยายน พ.ศ. 2553

Blogger Talk

สวัสดีค่ะ enjoyday.net เป็น Blog ที่ให้ข้อมูลความรู้เกี่ยวกับการทำเว็บไซต์ สอนทำเว็บตั้งแต่พื้นฐานเหมาะกับผู้เริ่มต้น ถ้างงๆ ไม่รู้จะิเริ่มต้นตรงไหน ให้เริ่มที่นี่หัวข้อ สอนการสร้างเว็บไซต์
ถ้ากำลังมองหาบทเรียนออนไลน์สอนเขียนเว็บเพจ ก็ที่นี่เลย ...
HTML
CSS
XHTML
HTML Quick List
ในปัจจุบันเว็บไซต์ส่วนใหญ่จะไม่ทำเว็บด้วยการเขียนเว็บเพจทีละหน้าเองแล้ว แต่จะอาศัย CMS (Content Management System) เช่น Wordpress, Joomla! ซึ่งเป็นระบบการจัดการเนื้อหาของเว็บไซต์อย่างอัตโนมัติ โดยที่ไม่ต้องมีความรู้ด้านการเขียนโปรแกรม
ถ้าผู้อ่านสนใจจะทำ Blog อย่าง enjoyday.net สามารถศึกษาได้จากหัวข้อ การสร้าง Blog ด้วย Wordpress หรือสนใจอยากทำเว็บไซต์ด้วย CMS ลองศึกษาจากหัวข้อ การสร้างเว็บไซต์ด้วย Joomla! ค่ะ
สำหรับผู้ที่ศึกษาเรื่องการทำ Adsense, Adwords, Affiliate, SEO หรือเรื่องอื่นๆ อยู่ แล้วเจอคำศัพท์ที่ไม่เข้าใจลองเข้าไปดูได้ที่นี่่ จะพยายามรวบรวมเพิ่มเติมให้ได้มากที่สุดค่ะ Glossary - อภิธานศัพท์
นอกจากนี้ยังมีเรื่องราวต่างๆ ที่น่าสนใจในแวดวงคอมพิวเตอร์และอินเตอร์เน็ต อ่านได้จาก Categories ที่วางอยู่ด้านขวามือ หรือคลิกที่นี่ อ่านบทความทั้งหมด
หวังว่า Blog นี้จะเป็นประโยชน์ต่อผู้สนใจทำเว็บไซต์ทั้งหลายนะคะ ^^










การสร้าง Blog !!!



Blog ไทยก็มีเยอะนะครับ แต่ส่วนใหญ่ เค้าไม่ให้มีโฆษณาใน Blog จึงขอแนะนำ Blog ของ google ดีกว่า ซึ่งมีภาษาไทย ในการอธิบายเมนูต่างๆด้วย และสามารถเลือกภาษาที่จะแสดงเมนูใน blog ได้ (กรณีทำโฆษณาภาษาอังกฤษ) การสร้าง blog กับ blogger.com ชื่อที่ได้ จะได้เป็น ชื่อที่ตั้ง.blogspot.com ถามว่า Blog สู้การทำเว็บ .com ได้มั้ย ลองเข้า google.co.th แล้วค้นคำว่า เที่ยวลาว ดูนะครับจะเห็นว่า blog สู้ .com ได้อย่างสบาย การที่เว็บจะอยู่อันดับต้น มันขึ้นกับเนื้อหาในเว็บครับ
@ ...วิธีการสมัคร Blogger.com !!!







ถ้าคุณเคยสมัครอะไรของ google ไว้แล้ว เช่น เคยสมัครเมล์ gmail ก็สามารถใช้ รหัส gmail login ในช่อง ลงชื่อเข้าใช้งานได้เลย

...หรือถ้าไม่เคยสมัครอะไร หรืออยากจะสมัครใหม่ ก็ คลิกคลิกที่ลูกศรสีส้ม สร้างบล็อคของคุณทันที.



.ที่อยู่อีเมล ใส่เมล์ของเรานะครับ เมล์อะไรก็ได้ ไม่จำเป็นต้องเป็น gmail ครับ ก็ประมาณว่า เมล์ที่เราใช้อยู่นั่นแหละครับ..ใส่เมล์นั้นอีกครั้งครับ..กำหนดรหัสผ่าน ตั้งขึ้นมาเลย ไม่ใช่รหัสเมล์นะครับ เป็นรหัสที่เราตั้งขึ้นเพื่อสมัคร blogger ครับ..ชื่อที่แสดง ก็อย่างที่ในเว็บบอกครับ คือ คือนี่จะแสดงว่าเราเราโพสข้อความอะไรใน blog ของเรา หรือเขียนคอมเม้น แสดงความคิดเห็น blog ของคนอื่น...รหัสยืนยัน ใส่รหัสสุ่มตามภาพที่ขึ้นมา...ทำเครื่องหมายช่องสี่เหลี่ยม ยอมรับข้อตกลง ...จากนั้นคลิก ดำเนินการต่อ ตั้งชื่อเว็บบล็อกเลยครับ ชื่อจะปรากฏที่บนสุดของ blog เช่น ดังภาพที่อยู่บล็อก ก็คือ ชื่อที่อยู่ url ของ blog นั่นเองครับ ตัวอย่างชื่อ blogสำหรับการ ตรวจสอบความพร้อมคือ ตรวจสอบว่าชื่อที่ตั้งอยู่ ซ้ำหรือมีใครใช้อยู่หรือยังถ้าขึ้น ที่อยู่บล็อกนี้สามารถใช้ได้ ก็สามารถใช้ชื่อนี้ได้ครับ*** ทั้งชื่อเว็บบล็อก และที่อยู่ บล็อก สามารถเปลี่ยนแปลงได้ในภายหลังครับและ 1 user ที่ใช้ login blogger สามารถ สร้าง blog ได้ 100 blog ครับถ้าอยากสร้างอีก ก็สมัคร account blogger ใหม่ เพิ่มอีกครับ ***ขั้นตอนต่อไปก็จะมีให้เลือกรูปแบบของ blog เลือกได้เลยครับ ชอบแบบไหนก็เลือกไปก่อน สามารถ เปลี่ยนแปลงภายหลังได้คลิก ดำเนินการต่อ .
..หลังจากนั้น จะมาถึงขั้นตอน เริ่มต้นการเขียนบล็อก เพื่อนำเสนอสิ่งที่เราต้องการนำเสนอทำความเข้าใจ เกี่ยวกับ blog ของ blogger ก่อนครับ ก่อนเขียน blog เราต้องทำความเข้าใจและวางแผนก่อนครับ .. blog เราสามารถ เขียนข้อความต่างๆ แทรกภาพ หรือนำเสนอต่างๆได้ ...การเขียน blog ที่ blogger - ข้อความล่าสุด จะอยู่ที่หน้า blog- ข้อความต่างๆที่เขียนไป จะเป็นหัวข้อ รวมอยู่ในคลังบทความของบล็อก ซึ่งคำว่า "คลังบทความของบล็อก" ตัวอย่าง blog เที่ยววังน้ำเขียว http://wang-namkeaw.blogspot.com/ ผมแก้คำว่า คลังบทความของบล็อก เป็น "รายละเอียด การท่องเที่ยว อ.วังน้ำเขียว" ซึ่งวิธีแก้เข้าที่หัวข้อ รูปแบบ...องค์ประกอบของหน้าคลิกเข้าที่แก้ไข เพื่อเข้าไปแก้ไขคำว่า คลังบทความของบล็อกสำหรับรูปแบบของ blog เที่ยววังน้ำเขียว ทำไมไม่มีใน แม่แบบ ของ blogger จะอธิบายอีกทีครับ ...เกี่ยวกับคลังของบทความ เราควรวางแผนแล้วว่า บทความหรือข้อความต่างๆที่เราจะเขียน blog จะเรียงลงมา เมื่อมีผู้เข้าเยี่ยมชม blog ของเรา ผู้เยี่ยมก็จะเห็นหัวข้อเหล่านั้น และเลือกที่จะคลิกอ่านได้ เป็นผลดีในการนำเสนอ - สำหรับบทความต่างๆ หรือข้อความต่างๆที่เราจะนำเสนอใน blog ข้อความล่าสุดจะอยู่หน้าแรกครับ หน้าแรกของ blog ควรจะเป็นเหมือนหน้ารับแขก ซึ่งออกแบบ เพื่อดึงดูดให้ผู้เข้าเยี่ยมชมได้สนใจ และอ่าน blog ..แล้วจะทำงัยล่ะ ? เมื่อข้อความต่างๆที่เรา เขียนไป เป็นหัวข้อต่างๆ ข้อความล่าสุดจะอยู่หน้าแรก ถ้าเราออกแบบ หน้าที่ดึงดูดความสนใจ ไว้เป็นหน้าแรกแล้ว ถ้าเรามีข้อความมาเขียน หรือ นำเสนออีก จะทำงัย ให้หน้าที่เราออกแบบไว้ อยู่หน้าแรก ...วิธีการง่ายๆก็คือ แต่ละบทความที่เราเขียนไป สามารถแก้ไขได้ เราเข้าไปแก้ไขบทความนั้น แก้ไขตรงวันที่ หรือจะแก้ไขเวลาด้วยก็ได้ ให้เป็นวันที่ล่าสุด เพื่อให้บทความนั้นยังอยู่หน้าแรกนั่นเอง ...อยู่ล่างๆ นะครับ คลิกที่ตัวเลือกของบทความ แล้วจะมีให้แก้ไขได้สำหรับ ป้ายกำกับสำหรับบทความนี้: ...หมายถืง คีย์เวิร์ด สำคัญ หรือน่าสนใจ ในบทความหรือข้อความนั้นๆนะครับ เวลาโพสหรือเขียนข้อความไปแล้ว จะขึ้นเป็นข้อความ ป้ายกำกับ อยู่ล่างสุดของบทความ..ทำความเข้าใจ การโพส หรือการเขียนข้อความ ...เผยแพร่บทความ คือเขียนข้อความเสร็จแล้ว ต้องการโพสใน blog แล้ว...สำหรับ บันทึกทันที หมายถึง เราเขียนแล้ว แต่ยังไม่อยากนำเสนอลงใน blog เราอาจยังเขียนไม่เสร็จ เราใช้ปุ่มบึนทึกทันที บันทึกไว้ก่อน ยังไม่แสดงใน blog เพื่อไว้จะมาแก้ไขเพิ่มเติมให้สมบูรณ์อีกทีในภายหลังครับ ...กลับมาเรื่องป้ายกำกับ เราสามารถแทรกไว้ใน blog เป็นเมนูได้ เพื่อให้ผู้เยี่ยมชม ได้เลือกอ่านได้ ซึ่งใน blog เที่ยววังน้ำเขียว http://wang-namkeaw.blogspot.com/ ป้ายกำกับ รวมอยู่ด้านขวานะครับ ที่เป็นหัวข้อ "คีย์เวิร์ด เด่นๆ ในการเที่ยว วังน้ำเขียว" ซึ่งแต่ก่อน จะเป็นหัวข้อว่า "ป้ายกำกับ" ซึ่งเราสามารถเปลี่ยนแปลงชื่อหัวข้อได้ครับ...สำหรับการเพิ่ม ส่วนของป้ายกำกับ ทำได้โดย มาที่องค์ประกอบของหน้ามาที่เพิ่ม Gadget ตรงไหนก็ได้ครับ ปกติจะอยู่ทางด้านซ้าย และล่างสุด เลือก ป้ายกำกับ แล้วคลิกเครื่องหมาย บวก + เพื่อเลือกรูปแบบ ป้ายกำกับ เข้ามาใน blog ...จะมีป้ายกำกับขึ้นมา เพื่อให้คลิก บันทึก เป็นการแทรกโดยสมบูรณ์ ...หรือจะแก้ไข คำว่า ป้ายกำกับ เลยก็ได้ หรือค่อยกลับมาแก้ไขภายหลังได้ครับเมื่อแทรกแล้ว ก็จะมีรูปแบบของป้ายกำกับเข้ามาใน blog...สำหรับ หัวข้อส่วนต่างๆ สามารถเคลื่อนย้ายได้ เพื่อจัดรูปแบบต่างๆของ blog โดยเอาเม้าส์ คลิกค้าง แล้วลากไปตามส่วนต่างๆ ได้ตามต้องการ...มาถึงที่ติดค้างไว้ คือรูปแบบของเว็บ เที่ยววังน้ำเขียว ทำไมไม่มีใน แม่แบบของ blogger การใส่แม่แบบนอกเหนือจากแม่แบบที่มี ใน blogger ทำดังนี้เข้าไปที่ http://btemplates.com/ จะมีรูปแบบต่างๆให้เลือก ดาวน์โหลดไฟล์ที่โหลดมา จะเป็นไฟล์ .zip ให้เรา แตกไฟล์ .zip ออกมา จะได้เป็นไฟล์ .xml..เราจะเอาไฟล์ .xml เข้า blog ได้อย่างไร ?,มาที่เมนู รูปแบบ หัวข้อ แก้ไข HTML จะมีให้ Browse เพื่อเลือกไฟล์ .xml ที่เรามีในเครื่อง (ที่เราไปโหลดมา)แล้วคลิก อัปโหลด เพื่อ โหลดไฟล์ xml เข้าไปใน blogจะมีบางรายการขึ้นมา ว่าส่วนไหนบ้างของแม่แบบเก่า จะหายไป ก็คลิกที่ยืนยันและบันทึก เพื่อ เปลี่ยนแปลงให้ blog เรา เป็นแม่แบบใหม่ ที่ต้องการ...สำหรับข้อความ บทความในการโพสต่างๆ ก็จะยังอยู่นะครับ จะไม่หายไปไหน เป็นการเปลี่ยนแม่แบบเฉยๆแต่ส่วนของการตกแต่ง หรือ Gadget ต่างๆที่เราเพิ่มเติมเสริมใน แม่แบบเก่า จะหายไป เราค่อยมาเลือก Gadget เพื่อตกแต่งใหม่ได้ครับ...มาดูเมนูการตั้งค่า ซะหน่อยบางคนสงสัยครับว่า blog ที่เขียน บทความต่างๆ ยาวลงมามาก ไม่รู้จะทำงัย มาที่ เมนูการตั้งค่า แล้วมาที่ การจัดรูปแบบสามารถเลือกได้ว่า จะแสดง หน้าละกี่บทความครับ ...ในเมนูนี้ ยังสามารถเปลี่ยน ภาษาได้ด้วย เป็นการเปลี่ยนภาษาของเมนูต่างๆ ใน blog ของเราครับ กรณี เราทำ blog ภาษาอังกฤษ แล้วอยากให้เมนูต่างๆเป็นภาษาอังกฤษ ...และอย่าลืม เข้ามาเปลี่ยน โซนเวลา ให้เป็น GMT +7 กรุงเทพด้วยนะครับ จะได้เช็คเวลาได้ กรณีมีใครมาเขียน แสดงความคิดเห็นใน blog เราครับชื่อ blog สามารถ เปลี่ยนแปลงได้ด้วยนะครับ มาที่ เมนู การเผยแพร่ครับ ...มีประโยชน์กรณีที่เรา เขียนและตกแต่ง blog เยอะแล้ว แต่ไม่พอใจชื่อ blog ที่ใช้อยู่ ครับ เราก็สามารถแก้ไขได้ครับ... 1 user สามารถเขียน blog ได้ 100 blog ...เห็นหัวบนสุด ในระบบการเขียน blog มั้ยครับ คลิกที่แผงควบคุม จะมีรายการ blog ต่างๆที่เราทำไว้เรียงลงมาให้เห็น..กรณีที่ยังไม่มี ก็จะมี blog ที่เราพึ่งทำนั่นแหละครับ 1 รายการ ถ้าเราจะทำ blog ใหม่เพิ่มอีก เรา ก็คลิกที่ สร้างบล็อกครับ ก็จะมีให้ตั้งชื่อ เพื่อสร้าง blog เพิ่มครับ ซึ่ง 1 user ของ blogger สามารถ สร้าง blog ได้ 100 blog ถ้าเราอยากสร้างมากกว่านั้น เราก็สมัคร blogger เพิ่มใหม่อีก User ครับ ... จบแล้วครับ ความรู้ในการเขียน blog และการวางแผนในการจัดรูปแบบ blog เพื่อความสวยงาม...คัดลอกได้ครับ แต่ต้องอ้างอิงว่า เอาความรู้ มาจาก http://www.makemoney-school.com/ ด้วยครับ

วันจันทร์ที่ 30 สิงหาคม พ.ศ. 2553

ปรัชญาเศรษฐกิจพอเพียงนี้ เป็นกรอบแนวความคิดและทิศทางการพัฒนาระบบเศรษฐกิจมหภาคของไทย ซึ่งบรรจุอยู่ในแผนพัฒนาเศรษฐกิจและสังคมแห่งชาติ ฉบับที่ 10 (พ.ศ. 2550-2554)เพื่อมุ่งสู่การพัฒนาที่สมดุล ยั่งยืน และมีภูมิคุ้มกัน เพื่อความอยู่ดีมีสุข มุ่งสู่สังคมที่มีความสุขอย่างยั่งยืน หรือที่เรียกว่า สังคมสีเขียว (Green Society) ด้วยหลักการดังกล่าว แผนพัฒนาฯฉบับที่ 10 นี้จะไม่เน้นเรื่องตัวเลขการเจริญเติบโตทางเศรษฐกิจ แต่ยังคงให้ความสำคัญต่อระบบเศรษฐกิจแบบทวิลักษณ์ หรือระบบเศรษฐกิจที่มีความแตกต่างกันระหว่างเศรษฐกิจชุมชนเมืองและชนบท ดร.สมเกียรติ อ่อนวิมล เรียกสิ่งนี้ว่า วิกฤตเศรษฐกิจพอเพียง คือ ความไม่รู้ว่าจะนำปรัชญานี้ไปใช้ทำอะไร กลายเป็นว่าผู้นำสังคมทุกคน ทั้งนักการเมืองและรัฐบาลใช้คำว่า เศรษฐกิจพอเพียง เป็นข้ออ้างในการทำกิจกรรมใด ๆ เพื่อให้รู้สึกว่าได้สนองพระราชดำรัสและให้เกิดภาพลักษณ์ที่ดี หรือพูดง่ายๆ ก็คือ เศรษฐกิจพอเพียง ถูกใช้เพื่อเป็นเครื่องมือเพื่อตัวเอง ซึ่งความไม่เข้าใจนี้อาจเกิดจากการสับสนว่าเศรษฐกิจพอเพียงกับทฤษฎีใหม่นั้นเป็นเรื่องเดียวกัน ทำให้มีความเข้าใจว่า เศรษฐกิจพอเพียงหมายถึงการปฏิเสธอุตสาหกรรมแล้วกลับไปสู่เกษตรกรรม ซึ่งเป็นความเข้าใจที่ผิด ปรัชญาเศรษฐกิจพอเพียงนี้ ได้รับการเชิดชูสูงสุด จาก สหประชาชาติ (UN)โดยนายโคฟี อันนัน ในฐานะเลขาธิการองค์การสหประชาชาติ ได้ทูลเกล้าฯถวายรางวัล The Human Development Lifetime Achievement Award แก่พระบาทสมเด็จพระเจ้าอยู่หัว เมื่อ 26 พฤษภาคม 2549 และได้มีปาฐกถาถึงปรัชญาเศรษฐกิจพอเพียงว่าเป็นปรัชญาที่สามารถเริ่มได้จากการสร้างภูมิคุ้มกันในตนเอง สู่หมู่บ้าน และสู่เศรษฐกิจในวงกว้างขึ้นในที่สุด เป็นปรัชญาที่มีประโยชน์ต่อประเทศไทยและนานาประเทศ โดยที่องค์การสหประชาชาติได้สนับสนุนให้ประเทศต่างๆที่เป็นสมาชิก 166 ประเทศยึดเป็นแนวทางสู่การพัฒนาประเทศแบบยั่งยืน

ปรัชญา เศรษฐกิจพอเพียง

“เศรษฐกิจพอเพียง” เป็นปรัชญาที่พระบาทสมเด็จพระเจ้าอยู่หัวทรงมีพระราชดำรัสชี้แนะแนวทาง การดำเนินชีวิตแก่พสกนิกรชาวไทยมาโดยตลอดนานกว่า 25 ปี ตั้งแต่ก่อนเกิดวิกฤติการณ์ทางเศรษฐกิจ และเมื่อภายหลังได้ทรงเน้นย้ำ แนวทางการแก้ไขเพื่อให้รอดพ้น และสามารถดำรงอยู่ได้อย่างมั่นคงและยั่งยืนภายใต้กระแสโลกาภิวัตน์และความเปลี่ยนแปลง
มีหลักพิจารณา ดังนี้
กรอบแนวคิด เป็นปรัชญาที่ชี้แนะแนวทางการดำรงอยู่และปฏิบัติตนในทางที่ควรจะเป็นโดยมีพื้นฐานมาจากวิถีชีวิตดั้งเดิมของสังคมไทย สามารถนำมาประยุกต์ใช้ได้ตลอดเวลา และเป็นการมองโลกเชิงระบบที่มีการเปลี่ยนแปลงอยู่ตลอดเวลา มุ่งเน้นการรอดพ้นจากภัยและวิกฤติ เพื่อความมั่นคงและความยั่งยืนของการพัฒนา
คุณลักษณะ เศรษฐกิจพอเพียงสามารถนำมาประยุกต์ใช้กับการปฏิบัติตนได้ในทุกระดับ โดยเน้นการปฏิบัติบนทางสายกลาง และการพัฒนาอย่างเป็นขั้นตอน
คำนิยาม ความพอเพียงจะต้องประกอบด้วย 3 คุณลักษณะพร้อม ๆ กัน ดังนี้
1. ความพอประมาณ หมายถึง ความพอดีที่ไม่น้อยเกิดไปและไม่มากเกินไป โดยไม่เบียดเบียนตนเองและผู้อื่น เช่น การผลิตและการบริโภคที่อยู่ในระดับพอประมาณ
2. ความมีเหตุผล หมายถึง การตัดสินใจเกี่ยวกับระดับของความพอเพียงนั้นจะต้องเป็นไปอย่างมีเหตุผล โดยพิจารณาจากเหตุปัจจัยที่เกี่ยวข้องตลอดจนคำนึงถึงผลที่คาดว่าจะเกิดขึ้นจากการกระทำนั้น ๆ อย่างรอบคอบ
3. การมีภูมิคุ้มกันที่ดีในตัว หมายถึง การเตรียมตัวให้พร้อมรับผลกระทบ และการเปลี่ยนแปลงด้านต่าง ๆ ที่จะเกิดขึ้นโดยคำนึงถึงความเป็นไปได้ของสถานการณ์ต่าง ๆ ที่คาดว่าจะเกิดขึ้นในอนาคตทั้งใกล้และไกล
เงื่อนไข การตัดสินใจและการดำเนินกิจกรรมต่าง ๆ ให้อยู่ในระดับพอเพียงนั้น ต้องอาศัยทั้งความรุ้ และคุณธรรมเป็นพื้นฐาน กล่าวคือ
1. เงื่อนไขความรู้ ประกอบด้วย ความรอบรู้เกี่ยวกับวิชาการต่าง ที่เกี่ยวข้องอย่างรอบด้าน ความรอบคอบที่จะนำความรู้เหล่านั้นมาพิจารณาให้เชื่อมโยงกัน เพื่อประกอบการวางแผนและความระมัดระวังในขั้นปฏิบัติ
2. เงื่อนไขความธรรม ที่จะต้องเสริมสร้างประกอบด้วย มีความตระหนักในคุณธรรม มีความชื่อสัตย์สุจริต และมีความอดทน มีความพากเพียร ใช้สติปัญญาในการดำเนินชีวิต
แนวทางปฏิบัติ/ผลที่คาดว่าจะได้รับ จากการนำปรัชญาของเศรษฐกิจพอเพียงมาประยุกต์ใช้ คือ การพัฒนาที่สมดุลและยั่งยืน พร้อมรับต่อการเปลี่ยนแปลงในทุกด้าน ทั้งด้านเศรษฐกิจ สังคมสิ่งแวดล้อม ความรู้และเทคโนโลยี

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

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


การนำไปใช้
ในประเทศไทย
ปรัชญาเศรษฐกิจพอเพียงนี้ ถูกใช้เป็นกรอบแนวความคิดและทิศทางการพัฒนาระบบเศรษฐกิจมหภาคของไทย ซึ่งบรรจุอยู่ใน แผนพัฒนาเศรษฐกิจและสังคมแห่งชาติ ฉบับที่ 10 เพื่อมุ่งสู่การพัฒนาที่สมดุล ยั่งยืน และมีภูมิคุ้มกัน เพื่อความอยู่ดีมีสุข มุ่งสู่สังคมที่มีความสุขอย่างยั่งยืน หรือที่เรียกว่า "สังคมสีเขียว" ด้วยหลักการดังกล่าว แผนพัฒนาเศรษฐกิจและสังคมแห่งชาติ ฉบับที่ 10 นี้จะไม่เน้นเรื่องตัวเลขการเจริญเติบโตทางเศรษฐกิจ แต่ยังคงให้ความสำคัญต่อระบบเศรษฐกิจแบบทวิลักษณ์ หรือระบบเศรษฐกิจที่มีความแตกต่างกันระหว่างเศรษฐกิจชุมชนเมืองและชนบท
แนวปรัชญาเศรษฐกิจพอเพียง ยังถูกบรรจุในรัฐธรรมนูญของไทย เช่น รัฐธรรมนูญแห่งราชอาณาจักรไทย พุทธศักราช 2550 ในส่วนที่ 3 แนวนโยบายด้านการบริหารราชการแผ่นดิน มาตรา 78 (1) ความว่า: "บริหารราชการแผ่นดินให้เป็นไปเพื่อการพัฒนาสังคม เศรษฐกิจ และความมั่นคง ของประเทศอย่างยั่งยืน โดยต้องส่งเสริมการดำเนินการตามปรัชญาเศรษฐกิจพอเพียงและคำนึงถึงผลประโยชน์ของประเทศชาติในภาพรวมเป็นสำคัญ"
นายสุรเกียรติ เสถียรไทย ในฐานะรัฐมนตรีกระทรวงต่างประเทศ ได้กล่าวเมื่อวันที่ 24 พฤศจิกายน พ.ศ. 2547 ในการประชุมสุดยอด The Francophonie Ouagadougou ครั้งที่ 10 ที่ Burkina Faso ว่า ประเทศไทยได้ยึดแนวทางเศรษฐกิจพอเพียง ควบคู่กับ "การพัฒนาแบบยั่งยืน" ในการพัฒนาประเทศทั้งทางด้านการเกษตรกรรม เศรษฐกิจ และการแข่งขัน ซึ่งเป็นการสอดคล้องเป้าหมายแนวทางของนานาชาติในประชาคมโลก โดยยกตัวอย่างการแก้ปัญหาวิกฤตเศรษฐกิจ พ.ศ. 2540 ซึ่งเมื่อยึดหลักปรัชญาในการแก้ปัญหาสามารถทำให้ผลิตภัณฑ์มวลรวมภายในประเทศ ของไทยเติบโตได้ถึงร้อยละ 6.7

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

ความเข้าใจของประชาชนชาวไทย
ปัญหาหนึ่งของการนำปรัญชาเศรษฐกิจพอเพียงไปใช้ก็คือ ผู้นำไปใช้อาจยังไม่ได้ศึกษาหรือไม่มีความรู้เพียงพอ ทั้งยังไม่กล้าวิเคราะห์หรือตั้งคำถามต่อตัวปรัชญา เนื่องจากเป็นปรัชญาของพระมหากษัตริย์ ความชอบธรรมให้กับการพัฒนารูปแบบใด หรือมีนัยยะทางการเมืองอะไรอยู่เบื้องหลัง

การเชิดชู
13 นักคิดระดับโลกเห็นด้วยกับแนวทางเศรษฐกิจพอเพียง และมีการนำเสนอบทความ บทสัมภาษณ์ เป็นการยื่นข้อเสนอแนวคิดเศรษฐกิจพอเพียงให้แก่โลก เช่น
ศจ. ดร. วูล์ฟกัง ซัคส์ นักวิชาการด้านสิ่งแวดล้อมคนสำคัญของเยอรมนี สนใจการประยุกต์ใช้หลักปรัชญาเศรษฐกิจพอเพียงอย่างมาก และมองว่าน่าจะเป็นอีกทางเลือกหนึ่งสำหรับทุกชาติในเวลานี้ ทั้งมีแนวคิดผลักดันเศรษฐกิจพอเพียงให้เป็นที่รู้จักในเยอรมนี
ศจ. ดร.อมาตยา เซน ศาสตราจารย์ชาวอินเดีย เจ้าของรางวัลโนเบลสาขาเศรษฐศาสตร์ ปี ค.ศ. 1998 มองว่า ปรัชญาเศรษฐกิจพอเพียงเป็นการใช้สิ่งต่างๆ ที่จำเป็นต่อการดำรงชีพ และใช้โอกาสให้พอเพียงกับชีวิตที่ดี ซึ่งไม่ได้หมายถึงความไม่ต้องการ แต่ต้องรู้จักใช้ชีวิตให้ดีพอ อย่าให้ความสำคัญกับเรื่องของรายได้และความร่ำรวย แต่ให้มองที่คุณค่าของชีวิตมนุษย์
นายจิกมี ทินเลย์ นายกรัฐมนตรีแห่งประเทศภูฏาน ให้ทรรศนะว่า หากประเทศไทยกำหนดเรื่องเศรษฐกิจพอเพียงให้เป็นวาระระดับชาติ และดำเนินตามแนวทางนี้อย่างจริงจัง "ผมว่าประเทศไทยสามารถสร้างโลกใบใหม่จากหลักปรัชญาเศรษฐกิจพอเพียง สร้างชีวิตที่ยั่งยืน และสุดท้ายจะไม่หยุดเพียงแค่ในประเทศ แต่จะเป็นหลักการและแนวปฏิบัติของโลก ซึ่งหากทำได้สำเร็จ ไทยก็คือผู้นำ
ปรัชญาเศรษฐกิจพอเพียงได้รับการเชิดชูเป็นอย่างสูงจากองค์การสหประชาชาติ โดยนายโคฟี อันนัน ในฐานะเลขาธิการองค์การสหประชาชาติ ได้ทูลเกล้าฯ ถวายรางวัลความสำเร็จสูงสุดด้านการพัฒนามนุษย์ แด่พระบาทสมเด็จพระเจ้าอยู่หัว เมื่อวันที่ 26 พฤษภาคม พ.ศ. 2549 และได้มีปาฐกถาถึงปรัชญาเศรษฐกิจพอเพียงว่า เป็นปรัชญาที่มีประโยชน์ต่อประเทศไทยและนานาประเทศ และสามารถเริ่มได้จากการสร้างภูมิคุ้มกันในตนเอง สู่หมู่บ้าน และสู่เศรษฐกิจในวงกว้างขึ้นในที่สุด
และนาย Håkan Björkman รักษาการผู้อำนวยการสำนักงานโครงการพัฒนาแห่งสหประชาชาติในประเทศไทย กล่าวเชิดชูปรัชญาเศรษฐกิจพอเพียง และยังได้ตระหนักถึงวิสัยทัศน์และแนวคิดในการพัฒนาของพระบาทสมเด็จพระเจ้าอยู่หัว และองค์การสหประชาชาติยังได้สนับสนุนให้ประเทศต่าง ๆ ที่เป็นสมาชิก 166 ประเทศให้ยึดเป็นแนวทางสู่การพัฒนาประเทศแบบยั่งยืน
การวิพากษ์
อย่างไรก็ตาม ศ. ดร. เควิน ฮิววิสัน อาจารย์ประจำมหาวิทยาลัยนอร์ธแคโรไลนา แชพเพลฮิลล์ ได้วิจารณ์รายงานขององค์การสหประชาชาติโดยสำนักงานโครงการพัฒนาแห่งสหประชาชาติ ที่ยกย่องปรัชญาเศรษฐกิจพอเพียง ว่า รายงานฉบับดังกล่าวไม่ได้มีเนื้อหาสนับสนุนว่าเศรษฐกิจพอเพียงเป็น “ทางเลือกที่จำเป็นมากสำหรับโลกที่กำลังดำเนินไปในเส้นทางที่ไม่ยั่งยืนอยู่ในขณะนี้” เลย และกล่าวว่าเนื้อหาในรายงานแทบทั้งหมดเป็นเพียงการเทิดพระเกียรติ และเป็นเพียงเครื่องมือในการโฆษณาชวนเชื่อภายในประเทศเท่านั้น ส่วน Håkan Björkman รักษาการผู้อำนวยการสำนักงานโครงการพัฒนาแห่งสหประชาชาติ กล่าวว่า "สำนักงานโครงการพัฒนาแห่งสหประชาชาติต้องการที่จะทำให้เกิดการอภิปรายพิจารณาเรื่องนี้ แต่การอภิปรายดังกล่าวนั้นเป็นไปไม่ได้ เพราะอาจสุ่มเสี่ยงต่อการหมิ่นพระบรมเดชานุภาพ ซึ่งมีโทษถึงจำคุก
นอกจากนี้ ยังมีการวิพากษ์วิจารณ์อีกว่าแนวปรัชญาเศรษฐกิจพอเพียงเป็นรูปแบบที่ไม่มีความแตกต่างไปจาก "ความนิยมท้องถิ่น" (Localism) เลย และยังมีชาวต่างชาติอีกมากที่ยังไม่เข้าใจว่าแนวปรัชญาเศรษฐกิจพอเพียง แท้จริงแล้วหมายถึงอะไร
เศรษฐกิจพอเพียง
เศรษฐกิจพอเพียง เป็นปรัชญาที่ชี้แนวทางการดำรงชีวิต ที่พระบาทสมเด็จพระปรมินทรมหาภูมิพลอดุลยเดชมีพระราชดำรัสแก่ชาวไทยนับตั้งแต่ปี พ.ศ. 2517 เป็นต้นมา[1][2] และถูกพูดถึงอย่างชัดเจนในวันที่ 4 ธันวาคม พ.ศ. 2540 เพื่อเป็นแนวทางการแก้ไขปัญหาเศรษฐกิจของประเทศไทย ให้สามารถดำรงอยู่ได้อย่างมั่นคงและยั่งยืนในกระแสโลกาภิวัตน์และความเปลี่ยนแปลงต่าง ๆ[3]
เศรษฐกิจพอเพียงมีบทบาทต่อการกำหนดอุดมการณ์การพัฒนาของประเทศ โดยปัญญาชนในสังคมไทยหลายท่านได้ร่วมแสดงความคิดเห็น อย่างเช่น ศ.นพ.ประเวศ วะสี, ศ.เสน่ห์ จามริก, ศ.อภิชัย พันธเสน, และศ.ฉัตรทิพย์ นาถสุภา โดยเชื่อมโยงแนวคิดเศรษฐกิจพอเพียงเข้ากับวัฒนธรรมชุมชน ซึ่งเคยถูกเสนอมาก่อนหน้าโดยองค์กรพัฒนาเอกชนจำนวนหนึ่งนับตั้งแต่พุทธทศวรรษ 2520 และได้ช่วยให้แนวคิดเศรษฐกิจพอเพียงเป็นที่รู้จักอย่างกว้างขวางในสังคมไทย
สำนักงานคณะกรรมการพัฒนาการเศรษฐกิจและสังคมแห่งชาติได้เชิญผู้ทรงคุณวุฒิในทางเศรษฐกิจและสาขาอื่น ๆ มาร่วมกันประมวลและกลั่นกรองพระราชดำรัสเรื่องเศรษฐกิจพอเพียงเพื่อบรรจุในแผนพัฒนาเศรษฐกิจและสังคมแห่งชาติ ฉบับที่ 9[3][4] และได้จัดทำเป็นบทความเรื่อง "ปรัชญาของเศรษฐกิจพอเพียง" และได้นำความกราบบังคลทูลพระกรุณาขอพระราชทานพระบรมราชวินิจฉัย เมื่อวันที่ 22 ตุลาคม พ.ศ. 2542 โดยทรงพระกรุณาปรับปรุงแก้ไขพระราชทานและทรงพระกรุณาโปรดเกล้าฯ พระราชทานพระบรมราชานุญาตให้นำบทความที่ทรงแก้ไขแล้วไปเผยแพร่ เพื่อเป็นแนวทางปฏิบัติของสำนักงานคณะกรรมการพัฒนาการเศรษฐกิจและสังคมแห่งชาติและทุกฝ่ายที่เกี่ยวข้อง ตลอดจนประชาชนโดยทั่วไป เมื่อวันที่ 21 พฤศจิกายน พ.ศ. 2542
ปรัชญาเศรษฐกิจพอเพียงนี้ได้รับการเชิดชูเป็นอย่างสูงจากองค์การสหประชาชาติ ว่าเป็นปรัชญาที่มีประโยชน์ต่อประเทศไทยและนานาประเทศ[5] และสนับสนุนให้ประเทศสมาชิกยึดเป็นแนวทางสู่การพัฒนาแบบยั่งยืน[6] โดยมีนักวิชาการและนักเศรษฐศาสตร์หลายคนเห็นด้วยกับแนวทางเศรษฐกิจพอเพียง แต่ในขณะเดียวกัน บางสื่อได้มีการตั้งคำถามถึงการยกย่องขององค์การสหประชาชาติ รวมทั้งความน่าเชื่อถือของรายงานศึกษาและท่าทีขององค์การ


วันจันทร์ที่ 16 สิงหาคม พ.ศ. 2553

ระบบปฏิบัติการ os

ระบบปฏิบัติการแบบเวลาจริง หรือ ระบบปฏิบัติการแบบทันที (Real-time operating system: RTOS) คือระบบปฏิบัติการที่เวลาเป็นปัจจัยสำคัญสำหรับประสิทธิภาพของระบบ นั่นคือมีชุดคำสั่งหรือโปรเซสบางอย่าง ที่จำเป็นต้องทำ ณ เวลาที่กำหนด หรือทำให้เสร็จในเวลาที่กำหนด ถ้าทำไม่ได้อาจสร้างความเสียหายหรือเกิดค่าความเสียหาย (cost) กับระบบ โดยทั่วไปสำหรับระบบปฏิบัติการแบบเวลาจริง การทำงานไม่ทันในเวลาที่กำหนด มีค่าเทียบเคียงได้กับ การไม่ได้ทำงานนั้นเลย ระบบปฏิบัติการแบบเวลาจริงมักถูกออกแบบมาเพื่อแอปพลิเคชันแบบฝังตัวหรือแอปพลิเคชันที่ติดตั้งมากับระบบตั้งแต่แรกเพื่อทำงานเฉพาะด้าน เช่น ระบบปฏิบัติการของเครื่องเล่นซีดี ทันทีที่ระบบปฏิบัติการอ่านข้อมูลจากแผ่นซีดีแล้ว จะต้องประมวลผลข้อมูล และส่งสัญญาณเสียงออกไปให้ผู้ฟังทันที ถ้าระบบปฏิบัติการทำงานไม่ทันก็จะทำให้เพลงฟังไม่รู้เรื่อง
ระบบปฏิบัติการบางตัวไม่ได้ถูกออกแบบมาตั้งแต่ต้นให้เป็นระบบปฏิบัติการแบบเวลาจริง แต่ก็สามารถถูกดัดแปลงให้เป็นได้ เช่นหลายบริษัทพัฒนาและขายลินุกซ์ที่ถูกดัดแปลงเพิ่มขีดความสามารถในการปฏิบัติการแบบเวลาจริง และเมื่อ 8 ตุลาคม พ.ศ. 2547 บริษัท มอนตาวิสตา (Montavista) ได้ส่งแพตช์ (patch) ไปยัง Linux kernel mailing list เพื่อทำให้ลินุกซ์เป็นระบบปฏิบัติการแบบเวลาจริง
ระบบปฏิบัติการแบบเวลาจริงมีจุดที่ต้องระวังในการออกแบบเป็นพิเศษอยู่ 2 จุดก็คือ
การจัดลำดับแบบเวลาจริง (real-time scheduling)
การจัดสรรหน่วยความจำ (memory allocation)
[แก้] การจัดลำดับแบบเวลาจริง
โดยโปรแกรมจัดลำดับ (scheduler) จะต้องมีความสามารถในการจัดลำดับการทำงาน ให้ทุกโปรเซสสามารถทำงานได้ทันตามที่ต้องการ โดยในปี ค.ศ. 1973 2 นักวิจัยคือ ลิวและเลย์แลนด์ ได้พิสูจน์ทฤษฎีบทบางอย่างเกี่ยวกับการจัดเวลาว่า กลุ่มโปรเซสลักษณะแบบใด จะสามารถจัดเวลาได้ทัน หรือในกรณีที่ไม่สามารถจัดเวลาได้ทันสำหรับทุกโปรเซส ลิวและเลย์แลนด์ก็ยังได้เสนออัลกอริทึมการจัดลำดับ ที่จัดเวลาให้มีค่าความเสียหายน้อยที่สุด โดยปกติแล้วระบบปฏิบัติการที่ถูกออกแบบเพื่อใช้กับงานทั่วไป (general-purpose OS) ไม่เหมาะที่จะจัดลำดับโปรเซสแบบเวลาจริง เนื่องจากจะมี ค่าใช้จ่ายส่วนเกินหรือค่าใช้จ่ายอื่น (overhead) ในการทำกระบวนการสับเปลี่ยนโปรเซส (context-switching) สูง
[แก้] การจัดสรรหน่วยความจำ
อีกปัญหาหนึ่งคือการจัดสรรหน่วยความจำ ซึ่งระบบปฏิบัติการ จำเป็นที่จะต้องจองหน่วยความจำ ขนาดที่โปรเซส หรือโปรแกรมต้องการ ให้ทันภายในช่วงเวลาสั้นๆ ที่โปรเซสทำงานอยู่ โดยอัลกอริทึมปกติ จะใช้ไล่หาตามรายการโยงของหน่วยความจำที่ว่าง ซึ่งอาจจะมีประสิทธิภาพในแง่เวลาต่ำ
นอกจากนั้น ยังมีปัญหาเรื่อง การแตกกระจายของหน่วยความจำ (memory fragmentation) เนื่องจากการจัดสรรเนื้อที่หน่วยความจำในทันทีเ ป็นเรื่องยากที่จะจัดสรรให้มีระเบียบ ปัญหานี้ไม่เป็นปัญหาใหญ่นัก สำหรับเครื่องคอมพิวเตอร์แบบตั้งโต๊ะทั่วไป เพราะว่ามีการเปิด-ปิดอยู่บ่อยครั้ง อย่างไรก็ตามสำหรับระบบฝังตัว ที่ทำงานอยู่ตลอดปี โดยไม่ได้เปิด-ปิดเลย ปัญหานี้ถือเป็นประเด็นสำคัญ

ระบบปฏิบัติการ os

ระบบปฏิบัติการคืออะไร (What is an Operating system?)
ระบบปฏิบัติการเป็นโปรแกรมควบคุมการทำงาน (ควบคุมการRun) ของโปรแกรมประยุกต์ ทำหน้าที่
โต้ตอบและเป็นสื่อกลางระหว่างโปรแกรมประยุกต์และฮาร์ดแวร์ (Hardware)
ระบบปฏิบัติการ (Operating System :OS) เป็นซอฟต์แวร์ระบบ (System Software) ที่ทำหน้าที่ควบคุม
การทำงานของเครื่องและอุปกรณ์ ควบคุมและสั่งการให้ Hardware สามารถทำงานได้ เช่น ทำหน้าที่ในการตรวจเช็คอุปกรณ์ Keyboard ขณะเปิดเครื่อง ถ้าผู้ใช้ลืมเสียบสาย Keyboard ที่ port ด้านหลังของเครื่อง ขณะที่ซอฟต์แวร์ระบบตรวจสอบแล้วไม่พบอุปกรณ์เชื่อมต่อดังกล่าว จะมีข้อความแจ้งเตือนความผิดพลาด “Keyboard Error” นอกจากนี้ยังทำหน้าที่เป็นสื่อกลางในการเชื่อมการทำงานระหว่าง User ในการใช้โปรแกรมประยุกต์ ( Application Software) ของ user กับระบบเครื่องฯ อำนวยความสะดวกในการใช้งาน และเพิ่มประสิทธิ์ภาพของระบบ

บทบาทและเป้าหมายของระบบปฏิบัติการ (Goals & Roles of an OS)
• อำนวยความสะดวก ทำให้ผู้ใช้ (user) ใช้เครื่องฯ ได้ง่าย (Operating System Objectives Convenience)
ทำให้คอมฯ ง่ายและสะดวกต่อการใช้งาน
• ใช้งานเครื่องได้อย่างมีประสิทธิภาพ (Efficiency) จัดการการใช้ทรัพยากรของระบบได้อย่างมีประสิทธิภาพ
• เพิ่มความสามารถเพื่อพัฒนาโปรแกรม (Ability to evolve) เพื่อรองรับให้ผู้ใช้เพื่อให้ผู้ใช้สามารถพัฒนาโปรแกรมได้อย่างมีประสิทธิภาพ, สามารถทดสอบโปรแกรม, และสามารถใช้ฟังก์ชั่นใหม่ ๆ ของระบบ โดยปราศจากการแทรกแซงของระบบปฏิบัติการในระหว่างการทำงาน




สรุปเป้าหมายและบทบาทของระบบปฏิบัติการ (OS) สามารถจำแนกได้ 2 เป้าหมายคือ
1. เป้าหมายหลัก ( Primary goal) คือ การอำนวยความสะดวกแก่ผู้ใช้งาน ให้สามารถใช้ระบบคอมฯ ได้ง่าย และสะดวกที่สุด (convenience for the user)
2. เป้าหมายหมายรอง (Secondary goal) คือ เพิ่มประสิทธิภาพให้กับระบบ
บางครั้ง 2 เป้าหมายนี้อาจขัดแย้งกัน เช่น ระบบ OS ที่ชาญฉลาดนั้นระหว่างทำงานระบบจะ
ตรวจจับข้อผิดพลาด (Error) อยู่ตลอดเวลา หากพบข้อผิดพลาดระหว่างการทำงานก็จะมีข้อความแจ้ง (Message) แก่ผู้ใช้ และหากมีข้อความแจ้งบ่อยครั้ง ก็จะกลายเป็นการขัดจังหวะการทำงานทำให้ผู้ใช้ ทำงานได้ไม่สะดวก ดังนั้นการออกแบบระบบปฏิบัติการ (OS) และการออกแบบสถาปัตยกรรมด้านตัวเครื่องควรมีความสอดคล้อง และหาจุดกลางระหว่างกัน

โครงสร้างระบบปฏิบัติการ (operating system structures)
ระบบปฏิบัติการเป็นซอฟต์แวร์ที่ทำหน้าที่ควบคุมการทำงานของฮาร์ดแวร์ ซึ่ง OS จะเป็นซอฟต์แวร์ที่
ทำงานในระดับ Low level ควบคุมและสั่งการเครื่องและอุปกรณ์ได้โดยตรง สามารถแสดงโครงการการเข้าถึงฮาร์ดแวดร์ ได้ตามรูปด้านล่างนี้

ระบบปฏิบัติการ (Operating System)

ระบบปฏิบัติการ (Operating System)
ระบบปฏิบัติการ (Operating System)เปรียบเสมือนโปรแกรมซึ่งทำหน้าที่เป็นแม่บ้าน โปรแกรมส่วนสำคัญของระบบซึ่งเรียกว่า Supervisor หรือ Excutive หรือ Monitor Program ซึ่งเป็นโปรแกรมที่ใช้งานในการควบคุมโปรแกรมส่วนอื่นๆอีกทีหนึ่ง จะถูกบรรจุไว้ภายในหน่อวยความจำหลัก (Main Memory) ตลอดเวลา เพื่อทำหน้าที่คล้ายผู้จัดการ (Manager) ซึ่งสามารถเรียกโปรแกรมส่วนอื่นๆ ที่เก็บไว้ในหน่วยความจำสำรอง (Secondary Storage) ที่มีความเร็วสูงมาใช้เมื่อมีความจำเป็นใด้ สาเหตุที่เก็บโปรแกรมบางส่วนของระบบปฏิบัติการที่ไม่ได้ใช้ประจำ ไว้ในหน่วยความจำสำรองที่มีความเร็วสูงก็เพื่อประหยัดเนื้อที่ของหน่วยความจำหลัก เพราะตัวโปรแกรมระบบปฏิบัติการทั้งหมดรวมกันนั้นมีขนาดใหญ่มาก และที่ต้องเป็นหน่วยความจำสำรองที่มีความเร็วสูง ก็เพื่อให้สะดวกและรวดเร็วในการเรียกใช้งาน
ในยุคแรกๆนั้น ผู้เขียนโปรแกรมต้องเขียนโปรแกรมสั่งงานด้วยภาษาเครื่องโปรแกรมที่สั่งงานนั้นจะต้องระบุขั้นตอนในการทำงานไว้ถี่ยิบนับตั้งแต่การตรวจสอบหน่วยความจำ , การกำหนดตำแหน่งต่างๆภายในหน่วยความจำที่จะใช้บรรจุโปรแกรมหรือข้อมูลเอง ซึ่งทำให้ไม่สะดวกต่อการปฏิบัติงาน ดังนั้นจึงมีผู้เขียนโปรแกรมขึ้นมาสำหรับสั่งให้เครื่องทำงานพื้นฐานเหล่านี้ และนำไปบรรจุไว้ในหน่วยความจำหลัก เมื่อผู้ใช้(User) สั่งเครื่องให้อ่านแฟ้มข้อมูล(Read File) ระบบปฏิบัติการก็จะแตกคำสั่งนี้ เป็นขั้นตอนรายละเอียดได้ทันที อนึ่งแนวความคิดลักษณะเช่นนี้ การสั่งงานขึ้นนี้มักจะทำไว้ในรูปของแมคโคร(Macro Instruction) นอกจากนั้นการควบคุมการจัดลำดับงานที่จะให้งานใดๆเข้าก่อนหลังงานใด ตัวโปรแกรมระบบปฏิบัติการจะเป็นผู้คอยจัดการให้เองโดยที่ผู้ควบคุมเครื่องไม่จำเป็นต้องคอยสั่งการอยู่ตลอดเวลา
ในตอนต้นของยุคคอมพิวเตอร์สมัยแรกๆ (First Generation) ผู้ใช้ไม่มีทางเลือกอื่นใดนอกจากสั่งงานเป็นภาษาเครื่องโดยตรง ต่อมาปลายๆยุคจึงหันมาใช้ภาษาแอสแซมบลีแทน
ในยุคที่2(Secondary Generation) ก็จะเริ่มมีการใช้ภาษาขั้นสูงในการสั่งงานกับโปรแกรมระบบปฏิบัติการอย่างหยาบๆ
ในยุคที่3(Third Generation) มีการพัฒนาภาษาชั้นสูงจึงทำให้ง่ายต่อการใช้งานและการทำงานก็ขึ้นโดยตรงกับโปรแกรมระบบปฏิบัติการ
ด้วยเหตุที่โปรแกรมระบบปฏิบัติการเป็นโปรแกรมที่มีขนาดใหญ่สลับซับซ้อนและยังขึ้นอยู่กับระบบการทำงานของแต่ละเครื่องโดยตรง ดังนั้นบริษัทผู้ผลิตจึงเป็นผู้รับผิดชอบในการเตรียมโปรแกรมนี้ให้กับลูกค้า ตัวโปรแกรมปฏิบัติการจึงมีลักษณะการทำงานและชื่อเรียกต่างๆกันออกไปเช่น บริษัทIBM ได้พัฒนาระบบปฏิบัติการรุ่นต่างๆออกมา คือ
-BOS (Basic Operating System) เป็นระบบปฏิบัติการแบบง่ายๆสำหรับเครื่อคอมพิวเตอร์ขนาดเล็กที่มีระบบการทำงานไม่ซับซ้อนมากนัก
-TOS (Tape Operating System) เป็นระบบปฏิบัติการสำหรับระบบงานที่ใช้เทปแม่เหล็ก(Megnetic Tape) เป็นหน่วยความจำสำรองโดยเฉพาะ แม้ TOS จะมีระบบการทำงานเป็นMultiprogramming แต่ความสามารถในการทำงานยังจัดว่าจำกัดมาก
-DOS (Disk Operating System) เป็นระบบปฏิบัติการที่จัดว่าคล่องตัวมากและเป็นที่นิยมใช้กันอย่างแพร่หลายในคอมพิวเตอร์ขนาดกลางของ IBM system/360 และ 370 ส่วนหนึ่งของDOS ซึ่งเรียกว่า Supervisor จะต้องเก็บอยู่ในหน่วยความจำหลักตลอดเวลา เพื่อควบคุมการปฏิบัติงานหรือเรียกระบบปฏิบัติการส่วนอื่นๆที่อยู่ในจานแม่เหล็กมาใช้ตามความเหมาะสม สามารถทำงานแบบ MultiProgramming สามารถจัดระบบส่วนความจำคล้ายแบบ Static Partition นอกจากนั้นยังอาจขยายความสามารถของ Dos ให้ทำงานแบบ Vertual Storage โดยเรียกว่า DOS/VS ซึ่งเป็นระบบ Vertual Storage แบบ Demanded Page เช่น DOS/VS I ของสำนักงานสถิติแห่งชาติ เป็นต้น
-OS (Operating System) หรือที่เรียกว่า Big Oz เป็นระบบปฏิบัติการที่ใช้กับเครื่องขนาดใหญ่ การออกแบบใช้วิธีแบ่งออกเป็นโมดุล (Module) ให้ผู้ใช้เลือกใช้ตามความเหมาสมของงาน อย่างไรก็ตามเนื่งจากระบบปฏิบัติการต้องใช้เนื้อที่ในหน่วยความจำมากเพราะมีขนาดใหญ่ จึงทำให้ต้องใช้เนื้อที่ในหน่วยความจำสำรองมาช่วยจัดเก็บอีกด้วย
บริษัท Burroughs ก็ได้มีการพัฒนาระบบปฏิบัติการขึ้นมาเช่นกันซึ่งเรียกว่า MCP(MasteControl Program) โดยมีแนวคิดที่แตกต่างออกไป มีการจัดระบบส่วนความจำแบบ Stack Machine ในการแปลภาษา MCP จะใช้ Microprogramed ของแต่ละภาษาทำการแปลโดยตรง แม้ MPC จะได้ชื่อว่าเป็นระบบทำงานโดยอัตโนมัติอย่างสิ้นเชิง มีความสามารถมาก สลับซับซ้อน และเป็นระบบที่คล่องตัวมากระบบหนึ่งก็ตาม แต่ก็ยังมีข้อยุ่งยากคือลำบากที่จะอธิบายหลักการของ MPC ให้ผู้ใช้ส่วนใหญ่ซึ่งคุ้นเคยแต่กับระบบปฏิบัติการแบบ IBM-Type เข้าใจได้ แต่ถึงกระนั้นบางที่หลักการที่ว่า ตราบใดที่ผู้ใช้รถยนต์เกียรือัตโนมัติมีความสะดวกในการขับขี่ คงจะไม่กังลวว่าเกียร์อัตโนมัติจะทำงานอย่างไร ก็อาจจะมีส่วนถูกอยู่บ้าง
หน้าที่ของระบบปฏิบัติการนั้น โดยทั่วๆไปแล้วจะแบ่งได้ดังนี้
อุปกรณ์ เช่น โปรแกรมที่เกี่ยวข้องในการทำงาน
1. Memory core,ROM,RAM Memory Management,Paging
2. Processers CPU,I/O channel Traffic controller , Scheduler
3. Device Tape , disk , drum , card punch SPOOLing , Device Driver
4. Information segment(System , user, File System , Libraly ,
library segment) segment Manager

9.1 I/O programming
ในหัวข้อนี้จะกล่าวถึงหลายเรื่องเช่น ดปรแกรมที่จัดการทางด้านหน่วยรับส่งข้อมูล (I/O Program) ระบบ Multiple Processors และ Interrupt Machanism เป็นต้น

9.1.1 Multiple Processors System
เนื่องจากมีความแตกต่างกันในด้านความเร็วของการทำงานระหว่างการทำงานระหว่างหน่วยประมวลผลกลางกับอุปกรณ์จัดเก็บข้อมูล อุปกรณ์อ่าน-เขียนข้อมูลหรืออุปกรณ์รับส่งข้อมูลต่างๆ เช่น เครื่องอ่านบัตร(Card Reader) , เครื่องพิมพ์(Printer) , ซึ่งมีความเร็วเฉลี่ยประมาณ 50 millisecond ต่อใบ หรือ บรรทัด ในขณะที่หน่วยประมวลผลกลางทำงานได้ 50,000 คำสั่งในเวลาเดียวกัน ดังนั้นจึงมีการพัฒนา I/O Channel หรือ I/O Processor ให้มาช่วยการทำงานของหน่วยประมวลผลกลางทางด้านการจัดการและการรับ-ส่งข้อมูล โดยที่หน่วยประมวลผลกลางไม่ต้องรอคอยไห้อุปกรณ์เหล่านี้ทำงานเสร็จ ก็สามารถไปทำงานอื่นต่อไปได้
CPU
Card reader 2
Card reader 1
I/O Channel #1
I/O Channel #2
I/O Channel #4
I/O Channel #3
Printer
Memory
Card punch
Control line
Data line











รูปที่ 9.3 แสดงระบบคอมพิวเตอร์ที่มี I/O channel.

ดังนั้นหน่วยประมวลผลกลางจะสามารถทำงานในด้านการคำนวณ ประมวลผลอย่างอื่นได้สะดวกยิ่งขึ้น โดยไม่ต้องเสียเวลามากนักกับการทำงานด้านรับ-ส่งข้อมูล (Input and Output)
เพราะมอบหน้าที่ให้แก่ I/O channel มาทำงานแทน
Channel เป็นอุปกรณ์ที่มีลักษณะเป็นคอมพิวเตอร์ย่อย ที่ทำการควบคุมอุปกรณ์รับ-ส่งข้อมูลต่างๆแทนหน่วยประมวลผลกลาง เพื่อให้หน่วยประมวลผลกลางสามารถทำงานหลายๆงานพร้อมกันได้(Overlapped Processing)
แม้ว่าจะมีต้นแบบความคิดพื้นฐานอันเดียวกันก็ตามแต่ channel เองก็ยังแบ่งออกเป็นอีกหลายประเภทเช่น
-หลายๆ channel ต่อเข้าอีกกับหนึ่งอุปกรณ์ หรือหนึ่ง channel ต่อเข้ากับหนึ่งอุปกรณ์ หรือหนึ่ง channel ต่อเข้ากับหลายๆอุปกรณ์แต่ บริการที่ละอุปกรณ์เท่านั้น ซึ่งจะเรียกชื่อว่า Sector Channel
-ถ้าสามารถบริการอุปกรณ์หลายๆตัวได้พร้อมๆกัน จะเรียกว่า Multiplexer Channel
: ถ้าบริการขณะใดขณะหนึ่งได้ทีละตัวเรียกว่า Selector
: ถ้าบริการขณะใดขณะหนึ่งได้ทีละหลายๆ ตัว เรียกว่า Multiplexer
: ถ้าบริการอุปกรณ์ที่มีความเร็วสูง ได้หลายตัวพร้อมๆกัน จะเรียกว่า Block Multiplexer Channel
จากรูปที่9.3 การทำงาน I/O Channel ต่างๆ จะมีระบบปฏิบัติการเป็นหัวหน้าที่จะคอยประสานงานให้ตลอดเวลา โดยอาศัย I/O Programming และกลไกลของ I/O Interupt Machanism ในการทำงาน
9.1.2 I/O Programming
หน่วยประมวลผลกลางจะติดต่อกับ I/O Processor โดยใช้คำสั่ง เช่น START I/O หรือ Halt I/Oเป็นต้น โดย I/O Processor จะต้องคอยตรวจสอบสภาวะในรีจีสเตอร์ สถานะ (Status Register) ของหน่วยประมวลผลกลางเสมอ การติดต่อระหว่าง I/O Channel กับหน่วยประมวลผลกลางจะอาศัยวิธีของ Interupts
Interupts เป็น Hardware Facility ซึ่งจะหยุดการทำงานของหน่วยประมวลผลกลาง ไว้ชั่วคราว เพื่อจัดเก็บข้อมูลข่าวสารที่เป็นสถานะการทำงานในขณะนั้น (Save Status) และโอนย้ายการทำงาน(Transfer) ไปยังตำแหน่งที่กำหนด ซึ่งเป็นตำแหน่งของโปรแกรมที่จะเข้ามาตอบสนองการ interupt นั้นๆ โปรแกรมที่ทำหน้าที่นี้คือ Interupt Handing Program
I/O Processor จะทำหน้าที่ exceute I/O Program (I/O Program นี้นักโปรแกรมนิยมเรียกใช้จากขุดโปรแกรมระบบงานเดิมที่มีอยู่แล้วในระบบ ไม่นิยมเขียนเอง) ซึ่งปกติ I/O Processor แต่ละแบบต่างก็ไม่ค่อยเหมือนกัน สิ่งที่เหมือนๆกันก็คือมีความเร็วสูงขึ้น
SPOOLing (Simutaneous Peripheral Operation on line) , SPOOLing หมายถึงแนวคิดที่จะเร่งความเร็วในการปฏิบัติงานโดยจัดให้ หน่วยประมวลผลกลางและอุปกรณ์รับ-ส่งข้อมูลต่างๆ สามารถทำงานโดยให้เสียเวลารอคอยกันให้น้อยที่สุด
ในการถ่ายทอดข้อมูลเข้าเครื่องคอมพิวเตอร์ เมื่อ channel สั่งเครื่องอ่านบัตรไปเก็บไว้ใน buffer แล้ว channelนั้นก็สามารถหันไปสั่งงานอุปกรณ์ตัวอื่นๆได้ในขณะที่กำลังมีการอ่านข้อมูลจากบัตรส่งเข้าเก็บในบัฟเฟอร์อยู่ เมื่อหน่วยประมวลผลกลางต้องการข้อมูลนี้ channel ก็จะหันมาจัดส่งข้อมูลนี้ไปให้หน่วยประมวลผลกลาง การใช้หน่วยความจำสำรองความเร็วสูงอย่างเช่น ชุดจานแม่เหล็กมาทำหน้าที่เป็นบัฟเฟอร์ จะเรียกว่า Intermediate Storage

9.1.3 I/O Processor Structure
CPU
Memory
MULTIPLEXER Channel
SELECTOR
Channel #1
SELECTOR
Channel #2
Card Reader
r
Card Punch
Printer

tapes
disks
Control Line
Data Line













รูปที่ 9.4 แสดงระบบ IBM 370

หัวข้อต่อไปนี้จะกล่าวถึง I/O Processor Structure ของเครื่อง IBM 360-370 เท่านั้น
A: Memory หน่วยความจำจะใช้ร่วมกับหน่วยประมวลผลกลาง และ I/O Processor ใช้หน่วยความจำอันเดียวร่วมกัน หน่วยวัดเป็น byte และ มีขนาด 2 24 Byte (16 Mb) เช่นกันแต่การอ้างอิงตำแหน่งภายในหน่วยความจำนั้น I/O Processor ใช้ขนาด 24 bits แทนค่าตำแหน่งจริง
(หน่วยประมวลผลกลาง ใช้หลายแบบ)
B: Register I/O Processor ไม่มีรีจีสเตอร์ภายนอก แตามี Program Counter กับ Data counter (บางอุปกรณ์รับ-ส่ง ข้อมูลมีรีจีสเตอร์อยู่ภายในเหมือนกับหน่วยประมวลผลกลาง)
C: Data ใช้ Logical data เช่น string ที่อยู่ระหว่าง byte ที่ 1-2 24 I/O Processor ปกติจะใช้ Sense data นี้
D: Instruction คำสั่งประเภทต่างๆที่ I/O Processor ทำการแปลและสั่งงาน เรียกว่า I/O Instruction หรือ I/O commands จัดแบ่ง 3 กลุ่ม
1. Data Transfer : เช่นการสั่งให้ read , raed backward , write , sense (check status) of that device
2. Device Control : เช่นการ control (Page eject , type rewind)
3. Branching : transfer การควบคุมต่างๆภายใน I/O Program นั้นๆ

CCW : Channel Command Word คือ channel instruction ที่บรรจุไว้ภายในหน่วยความจำ โดย I/O processor หรือ channel จะดึง CCW ออกมาจากหน่วยความจำ แล้วนำมาถอดรหัส (ตามรูปแบบของคำสั่งนั้นๆ ว่าเป็นคำสั่งเกี่ยวกับอะไรและสั่งให้ทำอะไร)

op code
Data address
Flag
Unused
count
0 7 8 31 32 36 37 47 48 63
- โดย op code ซึ่งยาว 8 bit (0-7) นั้นแบ่งเป็น 2 ส่วนคือ
4 bit แรกเป็น operation bits ซึ่งเป็นมาตราฐาน
4 bit หลังเป็น modifier ซึ่งเปลี่ยนแปลงไปตามประเภทของอุปกรณ์ต่างๆ
- data address (bit ที่ 8-31) กำหนดตำแหน่งของ byte ในหน่วยความจำที่เป็น data ที่จะอ้างถึงใน คำสั่งนี้
- Flag แบ่งใด้เป็น 5 อย่างคือ
1. chain data flag (bit 32) จะบอกว่า storage data ที่ถูกกำหนดใน CCW ต่อไปนี้จะใช้ต่อจาก operation ปัจจุบัน และเมื่อ initail data area หมดแล้วจึงจะใช้ area ต่อไปได้
2. chain command flag (bit 33) ระบุว่าเมื่อ ทำตามคำสั่งนี้แล้วให้ทำตามคำสั่ง CCWที่อยู่ถัดไ ป
3. suppress length indirection flag (bit 34) คอยป้องกันการระบุความยาวของโปรแกมที่ผิด (incorrect length indirection)
4. skip flag (bit 35) ชี้จุดที่จจะจัดส่งข้อมูลข่าวสารไปยังหน่วยเก็บข้อมูล
5. Program control interruption flag (bit 36) จะให้ I/O processor จัดสร้าง Interrupt condition เมื่อ CCW ปัจจุบันกำลังจะเข้าควบคุม channel นี้
- Count แสดงจำนวนความยาว byte ในหน่วยความจำที่จะอ้างอิงโดย CCW นี้ ชุดคำสั่ง CCW นี้นำมารวมกันเรียกว่า channel program (I/O program นั่นเอง) โดยหน่วยประมวลผลกลางจะเป็นผู้บอกให้เริ่มต้นทำงานโดยสั่งให้ channel เริ่มทำการ execute ได้
E : Specail Feature channel เองก็มีการป้องกัน (protecttion scheme) ตัวมันเองเช่นกัน โดยมี key สำหรับทุกๆ I/O operation ซึ่งจะต้องทำการเปรียบเทียบกับ key ของ memory block ที่จะถูกอ้างอิงเสมอและ channel ก็เป็นส่วนหนึ่งของการ interrupt ด้วย

9.1.5 การติดต่อระหว่าง หน่วยประมวลผลกลาง กับ channel
หน่วยประมวลผลกลาง จะ execute คำสั่ง start I/O ก่อนเพื่อสั่งให้ Channel เริ่มทำงานและเมื่อ Channel ทำงานนั้นเสร็จเรียบร้อยก็จะส่ง Interrupt มาบอกหน่วยประมวลผลกลางว่าจะให้ทำอะไรต่อไป จุดประสงค์ที่มี channel มาทำงานก็เพื่อลดเวลาของหน่วยประมวลผลกลาง ว่าทำงานให้แล้วจะให้ทำอะไรต่อไป จุดประสงค์ที่มี Channel มาทำงานก็เพื่อลดเวลาของหน่วยประมวลผลกลางในการควบคุมการทำงานด้ารรับ-ส่ง ข้อมูลลงไป(ซึ่งปกติต้องใช้เวลามาก) ลักษณะการทำงานของหน่วยประมวลผลกลางกับ Channel
มีความสัมพันธ์กันคล้ายกับลักษณะของเจ้านายและข้าทาส กล่าวคือ
- หน่วยประมวลผลกลาง จะเป็นผู้บอก Start Channel หรือ
- หน่วยประมวลผลกลาง จะเป็นผู้บอกให้ Channel เลิกทำงาน
- หน่วยประมวลผลกลาง จะเป็นผู้บอกให้ Channel เปลี่ยนการทำงานที่กำลังทำงานอยู่
การติดต่อระหว่างหน่วยประมวลผลกลาง กับ Channel แบ่งออกเป็น 2 อย่างคือ
1. I/O Instruction หน่วยประมวลผลกลางจะเป็นผู้เริ่มสั่งงานก่อนเพื่อกระตุ้นให้ Channel เริ่มทำงาน (หน่วยประมวลผลกลางติดต่อไปยัง Channel)
2. Channel จะใช้วิธิส่งสัญญาณ interrupt เพื่อต่อติดกับหน่วยประมวลผลกลาง ว่าทำงานเสร็จเรียบร้อยแล้ว (Channel ติดต่อไปยังหน่วยประมวลผลกลาง)
ในส่วนต่อไปนี้จะขอกล่าวถึงความสัมพันธ์ระหว่าง I/O instruction ของหน่วยประมวลผล
กลาง และของ Channel (ส่วน I/O interrupt จะกล่าวในตอนต่อไป)
I/ O Instruction ที่หน่วยประมวลผลกลางจะ execute นั้นอยู่ในรูปของ SI- format :
SI - format :

Op-code

B1
D1
0 7 8 15 16 19 20 31
ค่าที่เก็บในรีจีสเตอร์ B1 + ค่าที่เก็บใน D1 = หมายเลขของChannel และอุปกรณ์ ที่หน่วย
ประมวลผลกลางจะติดต่อไป
โดยที่ Bit ที่ 16-23 ของผลรวมเป็นตำแหน่งของ Channel (Channel address)
24-31 ของผลรวมเป็นตำแหน่งของอุปกรณ์ (device address)
ดังรุป C(B1) + D1

Channel address
Device address
0 15 16 23 24 31

I/O Instruction ที่หน่วยประมวลผลกลางจะเป็นผู้ Execute เองนั้น มีด้วยกัน 4 คำสั่ง
1. START I/O ซึ่งประกอบด้วย 2 items
- หมายเลขของ Channel และตำแหน่งของอุปกรณ์
- ตำแหน่งเริมต้นของ I/O Program
ที่ตำแหน่งเป็นเลขฐานสิบหก ที่ 7216 -75 16 ในในหน่วยความจำเป็น CAW (Channel Address Word) ซึ่งจะบรรจุจุดเริ่มต้นของ I/O Program ซึ่งจะกล่าวในบทต่อไปนี้
2. TEST I/O เพื่อตรวจสอบสภาวะว่า Channel และอุปกรณ์ที่อ้างอิงถึงนั้นๆ ว่าจะว่างงานหรือกำลังทำงานอยู่ โดยอาศัยค่าของ condition code ซึ่งค่าของ condition code จะมีการตรวจสอบโดยคำสั่ง Branch condition Instruction
3. HALT I/O เป็นคำสั่งที่มีผลให้หยุดการ Execute คำสั่ง I/O ณ. ที่ตำแหน่ง address I/O device และ channel ที่ระบุ
4. TEST CHANNEL มีการกำหนดค่าของ Condition code เพื่อชี้สภาวะการทำงานของ Channel ว่าจะว่างงานหรือไม่ว่างงาน ปกติภายในหน่วยความจำนั้น ณ. ที่ตำแหน่งที่ต่ำๆ (Low address of memory) ปกติจะถูกเก็บไว้ใช้งานกรณีพิเศษ เช่น
ตำแหน่งที่ 64 16 – 71 16 (double word) เรียกว่า Channel Status Word (CSW)
ตำแหน่งที่ 72 16 - 75 16 (full word) เรียกว่า Channel Address Word (CAW)
โดย CSW เป็นการแสดงสภาวะของอุปกรณ์หรือ เงื่อนไขที่ทำให้การทำงานด้านรับ-ส่งข้อมูลหยุดชะงักลง โดยค่า CSW อาจถูกกำหนดขึ้นในขณะที่มีการทำงานอยู่เหนือขณะที่มีการ Execute คำสั่งพวก STRT I/O , HALT I/O , TEST I/O อยู่ และ จะเป็นการระบุถึงตำแหน่งเริ่มต้นของ Channel Program หรือ I/O Program

9.1.6 Interrupt Structure and Processing
Interrupt คือเหตุการณ์ที่ตอบสนองสัญญาณ Signal ที่เกิดขึ้นเพื่อให้เกิดการเปลื่ยนแปลง การควบคุมอันสืบเนื่องมาจากในขณะที่มีการประมวลผลคำสั่งอยู่ เมื่อได้รับสัญญาน signal แล้ว หน่วยประมวลผลกลาง หรือ Processor ก็จะทำหน้าที่
- นำค่า address ก่อนหน้านั้นมาเก็บไว้ใน Instruction counter
- จัดเก็บรักษาข้อมูลเกี่ยวกับสภาวะของการทำงานในขณะนั้นเอาไว้ (Program Status Information) จากนั้นหน่วยประมวลผลกลางก็จะเริ่ม Execute interrupt routine
Interrupt routine ก็คือโปรอกรมซึ่งเขียนขึ้นเพื่อรองรับและตอบสนองเงื่อนไขต่างๆที่มีการเกิด interrupt ดังรูปที่แสดงต่อไปนี้



Program

3
1


Interrupt Routine
2


รูปที่ 9.7 แดงการทำงานเมื่อมี Interrupt เกิดขึ้น

ในตำแหน่งหมาเลข 1 หน่วยประมวลผลกลาง กำลังมีการ execute โปรแกรมก่อนที่จะเกิด interrupt ขึ้น เมื่อเกิด interrupt แล้วก็จะเกิดการกระโดไปยัง interrupt routine ที่อยู่ตำแหน่งหมายเลข 2 เพื่อตรวจสอบและแก้ไขปัญหาการ interrupt นั้นๆ เมื่อเสร็จสิ้นการทำงานใน interrupt routine เสร็จแล้ว ก็จะกระโดดกลับมายังตำแหน่งที่เกิดการ interrupt ในตอนแรกแล้วหน่วยประมวลผลกลาง ก็จะเริ่ม execute program ต่อไปอีก (ในตำแหน่งหมายเลข 3)
สภาวะหรือ เงื่อนไขของการทำงานของหน่วยประมวลผลกลาง ในขณะนั้นจะถูกเก็บไว้ที่ double word register คือPSW (Program Status Word) ซึ่งจะสอดคล้องกันกับ ของ I/O Processor
PSW ใช้ในการควบคุมการเรียงลำดับของคำสั่ง และชี้ถึงสภาวะการทำงานของโปรแกรมซึ่งกำลังทำงานอยุ่ในระบบเครื่องคอมพิวเตอร์ การเก็บรักษาค่าของข้อมูลของ PSW ไว้ในขณะที่เกิด interrupt จะช่วยให้หน่วยประมวลผลกลาง สามารถกลับมาทำงานใหม่อีกครั้งได้เมื่อมีการ reload (เพราะเมื่อมีการบรรจุค่าใหม่เข้าไปใน PSW หรือเพียงบางส่วนเท่านั้น ก็สามารถทำให้หน่วยประมวลผลกลางเปลี่ยนแปลงการทำงานได้)
จำนวนบิท ต่างๆภายใน PSW สามารถเปลี่ยนแปลง (mask) หรือกำหนดค่าใหม่ให้เหมาะกับการเกิด interrupt ต่างๆได้ เมื่อบิท เหล่านี้ถูก masked ไว้แล้ว I/O Interruption , External Interrupt และ Machine Check Interrupt อาจถูกบังคับไม่ให้ทำงานชั่วคราว แต่ก็ไม่ใช่เป็นการหยุดทำงานอย่างถาวร
รูปแบบของ PSW เป็นดังนี้

System Mask
Protection Key
Flags
Interrupt Code
0 7 8 11 12 15 16 31

ILC
CC
Program Mask
Instruction Address
32 33 34 35 36 39 40 63

ส่วนของ Program mask สามารถทำให้ 4 ใน 15 โปรแกรมการ Interrupt ไม่ให้ยอมรับรู้ได้ (ignore) แต่ 11 โปรแกรมที่เหลือแต่ละส่วนของ supervisor call นั้นการ mask เพื่อ Interrupt ไม่สามารถจะกระทำได้
นักโปรแกรมสามารถบังคับหรือกำหนดคำสั่งได้ถึง 11 สภาวะเพื่อ switch คำสั่งต่างๆได้ โดยมีดังนี้
Load PSW (LPSW)
Set Program Mask (SPM)
Supervisor Call (SVC)
Set Storage Key (SSK)
Insert storage Key (ISK)

โดยคำสั่งเหล่านี้เป็นคำสั่งที่เกี่ยวกับการ change , modify และ load ค่า PSW และเรียกคำสั่งพวกนี้ว่า Privileged instruction ซึ่งโปรแกรมทั่วๆไปจะไม่สามารถ Execute คำสั่งเหล่านี้ได้ ยกเว้นแต่โปรแกรมระบบปฏิบัติการเท่านั้นจึงจะ Execute ได้ อย่างไรก็ตามรายละเอียดของ interrupt processing ไม่สามารถจะกล่าวให้หมดในที่นี้ได้จึงขอกล่าวแต่เพียงโครงร่างเท่านั้น เพื่อให้ดุสอดคล้องกับการทำงานด้านการรับ – ส่ง ข้อมูลได้เข้าใจ
การ Interrupt ในเครื่อง IBM 370 แบ่งประเภทออกได้เป็น 5 อย่าง คือ
1. I/O Interrupt เกิดจาก channel และสัญญาณจากอุปกรณ์ต่างว่า successful หรือunsuccessful ในการรับ- ส่งข้อมูล
2. Programmer Error คือ interrupt ที่เกิดจาก Program original condition ได้แก่
a . arithemetic เช่น overflow
b. invalid instruction เช่น invalid address , infinite loop
c. storage protect เช่น เกิด page fault
3. Supervisor Call Interrupt เกิดจากการ execute คำสั่งของ Processor เช่น คำสั่ง ซึ่งเป็นตัวอย่างของคำสั่งที่ จะติดต่อกับ คำสั่งหนึ่ง
4. External Interrupt
a. Timer เป็น time interrupt
b. Cinsole interrupt button
c. ในระบบ multiprocessors CPU interrupt คือ CPU interrupt คือ CPU หนึ่ง interruptไปยังอีก CPU หนึ่ง
5. Machine check interrupt – detection of machine failure error ไม่ว่าจะเกิดสาเหตุใดก็แล้วแต่ hardware จะมีการปฏิบัติต่อการเกิด interrupt เหมือนกันหมด ดังที่จะอธิบาย ซึ่งทั้ง 5 ประเภทนั้นจะเกี่ยวข้องกับ PSW 2 ตัว คือ Old และ New (ซึ่งเก็บอยู่ในหน่วยความจำ Memory นั่นเอง ซึ่งจะอยู่ส่วนที่ address ต่ำๆใน memory )
เมื่อเกิดการ interrupt ขึ้น interrupt hardware กลไกลของ interrupt จะเก็บค่า PSW ในขณะนั้นลงในตำแหน่ง old และ new อยู่ใน memory และ load PSW จาก new เข้ามาแทนที่
Current PSW
old
new
memory




จากนั้น CPU ก็จะเริ่ม execute คำสั่งที่ระบุไว้ในส่วนของ instruction address field ของ current PSW ขณะนั้น (นั่นคือ ตาม instruction address field ของ new นั่นเอง)
อย่างไรก็ตามในผลลัพธ์ที่สุดใน interrupt routine ก็จะมีคำสั่งให้เปลี่ยนค่าของ current PSW ขณะนั้นให้มีค่าตาม Old PSW
ระบบก็จะถูกเรียกกลับคืนสู่ปกติเช่นเดิม ส่วนโปรแกรมที่เคยถูก interrupt ก็จะเริ่ม execute ต่อไป
ดังแสดงในรูป 9.8




8 bytes
Hexadecimal locations


CSW
CAW

TIMER


Memory

รูปที่ 9.8 Special interrupt locations

ใน Interrupt routine สามารถที่จะค้นหาสาเหตุของการเกิด interrupt ได้จาก old PSW กล่าวคือ ดูจาก interrupt code และตำแหน่งของ instruction ที่ขณะกำลัง execute อยู่แล้วเกิด interrupt นั่นเอง
ปกติแล้วการเกิด interrupt จะเกิดเมื่อ เสร็จสิ้นการ execute instruction หนึ่ง ระบบคอมพิวเตอร์ทั่วๆไป ก็มีกลไกลทางเครื่อง hardwaer เรียกว่า masking
Masking คือการเกิดการ interrupt กับ CPU ชั่วคราว ซึ่งอ่ศัยส่วนของ
- system mask
- program mask
- machine check mask
โดยโปรแกรม interrupt เป็นผู้จัดการ mask field เหล่านี้
สมมุติว่า ขณะที่กำลังมีการ gandle interrupt อันหนึ่งอยู่ แต่กลับมี การ interrupt อื่นๆเกิดขึ้นอีก ก็จะทำให้เกิดอาการ interrupt มาอีกเรื่อยๆ ซึ่งในที่สุดอาจทำให้เกิดผลเสียได้ ดังนั้นกรณีเช่นนี้อาจแก้ไขโดย กำหนดว่า ในขณะที่ CPU กำลัง execute interrupt queue routine อยุ่ interrupt อื่นๆ ก็จะถูก mask เอาไว้

9.1.7 Example I/O interrupt processing
จากรูป 9.9 ใน 3 ส่วน ที่ผ่านมาเราได้เคยพูดถึง
- การ execute I/O commands ซึ่งกระทำโดย channel
- การ execute I/O instruction ซึ่งกระทำโย CPU และการ interrupt เก็บค่า CSW เอาไว้และset ค่า condition code ดังนั้นในบทนี้จะขอยกตัวอย่างง่ายๆ ของรายละเอียดทั้งหมดซึ่งจะประกอบด้วย
1. main program ที่จะ excute โดย CPU
โดยเฉพาะexecute ก็จะสร้างข้อมูล output เก็บไว้ใน buffer 25 บรรทัด แต่ละบรรทัดยาว 100 characters แล้วจากนั้นก็จะเริ่มทำงานทาง I/O instruction เพื่อให้มีการส่งข้อมุล output
ทั้ง 25 บรรทัดนั้นออกมาพิมพ์ใน 1 หน้ากระดาษ โดยที่พิมพ์เว้นบรรทัดด้วย
2.channel program ซึ่ง channel จะพิมพ์ข้อมูลที่อยู่ภายใน Buffer ออกมาตามที่กล่าว
ในข้อ 1
3. interrupt hander ซึ่งจะคอยจัดการเมือ่เกิดการ execute ขึ้น (นั่นคือ เมื่อ I/O channelทำงานกับ I/O Program เสร็จเรียบร้อยแล้วนั่นเอง)
โดย interrupt program นี้จะถูก execute โดย CPU รายละเอียดต่อไปนี้อ่านในหนังสือเองหน้า 363-365









Step Hex Actual
number Contents address contents Comments
Device
10,13 I/O old PSW { 38 X’0000000EXX001500 Instruction address
8 CSW { 40 X’000021982C000000’ Command address
2 CSW { 48 002000 Status Residual count=0 .
.
11 I/O New PSW{ 78 X’XXXXXXXXXX000500 I/Ointerruption
. . Processing routine . .
12 Interrupt Handler 500 I/O Interrupt handing routine
. .
600
.
842 -Program whitch bulids output buffer for next page
Main . -Store address of CCW No.1 in CAW
1,2 Program 1000 SIO X’00E
3 . -Continue program , fill up next output buffer
9,14 1500
4 2000 CCW1 CCW X’8B,*,X’40,0 (skip to top of next page)
5 Channel 2008 CCW2 CCW X,19’PAGEHDR,X’40’,11 (write and
Program skip 3 lines)
6 2010 CCW3 CCW X’11’,LINE1,X’40’,100 (write and skip
. . (23 more CCW’s) 2 lines)
7 2190 CCW27 CCW X’11,LINE1+(24*100),0,100
.
Data 2400 PAGEHDR DC C’PAGE HEADER’
Constant .
Area 3000 LINE1 DS 25CL100 (25lines to be printed)
39C4 LINE2 DS 25CL100 (Second buffer)



รูป 9.9 Example program with I/O interrupt processing

9.1.8 Multiple Processer
channel หรือ I/O Processor ของ IBM 360-370 มักจะออกแบบมาง่ายๆไม่ค่อยสลับซับซ้อนมีประสิธิภาพมาก ตัวอย่างเช่น channel ของ CDC 7600 , I/O Processor ได้พัฒนาให้มีความสามารถเปรียบเสมือนเป็น CPU ตัวน้อยๆ หรือเท่ากับเป็น minicomputer ก้ว่าได้ ซึ่งมีคำสั่งพวก arithmetic หรือ condition ก็ได้และในระบบคอมพิวเตอร์ ใหญ่มากๆ ก็มีบริษัทโรงงานได้ผลิตให้มีหลายๆ CPU ทำงานโดยมีหน่วยความจำอันเดียวกันก็มีเช่น

9.2 memory management
การจัดการ memory นี้ถือได้ว่ามีบทบาทสำคัญต่อ OS เป็นอย่างยิ่ง โดยเฉพาะการ utilization memory ก็ยิ่งถือว่าเป็นปัญหาสำคัญมากที่สุด (ปัญหาอันดับหนึ่ง)
เพื่อที่จะแสดงให้เห็นว่า memory management มีผลกระทบต่อการที่ Processor หลายๆตัวมาทำงานร่วมกัน (CPU , I/O Processor) อย่างมีประสิทธิภาพยิ่งขึ้น และทำให้ได้ผลลัพธ์ มากขึ้นด้วย จะขอกล่าวถึงเรื่อง multiprogramming เพิ่มขึ้นได้อีกในบทของ Processor management ในเล่มนี้เป็นการพูดอย่างกว้างๆ มิได้มีรายละเอียดมากนัก โดยจะเริ่มจากเรื่องง่ายๆ แล้วสลับซับซ้อนเพิ่มขึ้นเรื่อยๆต่อไป โดยพัฒนาขึ้นอย่างไร เพื่อให้บรรลุถึงจุดสูงสุด
memory management ในบทนี้จะใช้แนวทางของ hardware เป็นหลักดังมีเรื่องต่อไปนี้
1. sigle contiguous allowcation
2. partitioned allocation
3. relocatable partitioned allcation
4. paged allocation
5. demand paged allocation
6. segment allocation
7. segment-page allocation
ซึ่งแต่ละ hardware เหล่านี้ต่างก็ใด้เขียนเรียงตามลำดับความสามารถจากน้อยไปหามากด้วย




9.2.1 sigle contiguous allocation
memory

Ursr’s Program
ทิ้งเปล่า

ข้อดี
ความง่ายไม่สลับซับซ้อน OS ที่ใช้จึงไม่ซับซ้อนและไม่กินเนื้อที่ใน memory มากนักจึงเป้นแต่ monitor program ก็เพียงพอในการควบคุม นิยมใช้กับเครื่องแบบ microcomputer มากกว่า
ข้อเสีย
- memory ไม่ใด้ถูกใช้อย่างเต็มที่เพราะยังมีที่ว่างเหลืออยู่คือเกิดมี flagmentation
- การจัดระบบงานแบบนี้ย่อมปฏิบัติงานได้ที่ละ job เท่านั้นหลายๆ job พร้อมกันไม่ได้หาก job ทั้ง job จะต้องอยู่ใน core ตลอดแม้ว่าจะมีการใช้เพียงบางส่วนก็ตามและการทำงาน job จะเสร็จสมบูรณ์ก็ต่อเมื่อ
+ เสร็จสิ้นจบ Job นั้น โดยสมบูรณ์
+ เกิด error ขึ้น
วิธีแบบนี้จะทำให้เสียเวลามากยิ่งขึ้น เมื่อนำมาใช้กับระบบที่ operator จะต้อง load tape หรือcards ลงไปเองด้วยมือหรือแม้แต่ในระบบที่มี I/O Processor ก็ตามเวลาของ CPU ที่ว่างงานก็ยังเกิดขึ้นอยู่มากในขณะที่ I/O channel ทำงานง่วนอยู่อย่างเต็มที่วิธีนี้จึงไม่ดีเท่าที่ควร
ปัญหาใหญ่ก็คือ memory ถูกใช้ไม่เต้มที่แต่ถึงอย่างไรก้ตามใน computer ขนาดใหญ่มากก็ยังมีการนำมาใช้อยุ่บ้างทั้งนี้ก็เพื่อลดปัญหาการจัดโปรแกรมที่ซับซ้อนยุ่งยาก

9.2.2 Partition Allocation
เมื่อมีการทำงานแบบ Multiprogramming ทั้งข้อมูล และโปรแกรมของแต่ละ Job จะ ต้องถูกบรรจุลงในส่วนความจำในเวลาเดียวกันด้วย
Partition จัดแบ่งออกเป็น 3 ประเภทคือ
1. Static Partition แบ่งพื้นที่กันไว้สำหรับงานหนึ่งๆ แบบตายตัว จนกว่าจะหมดรอบการทำงานครั้งหนึ่งๆจึงเลิกใช้หรือคืนพื้นที่นั้นให้แก่ระบบ
2. Dynamic Partition ในระหว่างบการปฏิบัติงานอยู่ ถ้ามีพื้นที่หน่วยความจำว่างติดต่อกันเพียงพอที่จะบรรจุงานอื่นลงไปใด้ ก้จะบรรจุงานนั้นแทรกลงในพื้นที่ว่างติดต่อกันนั้น
3. Relocatable Partition เพื่อแก้ปัญหา Flagmentation โดยใช้วิธี Compact พื้นที่ว่างที่ไม่อยู่ติดกัน (ขยับโปรแกรมต่างๆที่อยู่ในหน่วยความจำให้มาอยู่ติดกันเพื่อให้เกิดที่ว่างกว้างๆขึ้น)แต่ถึงกระนั้นก็ยังมีปัญหาว่าจะ compact เมื่อใด
- หาก compact บ่อยเกินไป ก้ย่อมเสียเวลาการทำงานไปมากเพราะในการ compact แต่ละครั้งนั้น จะต้องมีการจัดระบบตำแหน่งของข้อมูลที่บรรจุอยู่ใหม่และต้องมีการถ่ายทอดข้อมูลจากส่วนหนึ่งไปยังอีกส่วนหนึ่ง
- หากทิ้งระยะเวลาการ commpact นานเกินไป ก็จะทำให้มีที่ว่าง flagmentation มาก เช่นเดียวกับวิธี dynamic Partition
ปัญหาหลักของ Partition ก็คือ flagmentation
ตัวอย่างของ internal flagmentation เช่น เราแบ่งหน่วยความจำหลักออกเป็นบล๊อกๆ (block )แล้วจัดโปรแกรมออกเป็นหน้าๆ (page) แต่เมื่อจัดแบ่งโปรแกรมออกเป้นหน้าๆแล้วก็ตามแต่ในหน้าสุดท้ายก็ยังเกิดที่ว่างขึ้นได้ โดยที่ว่างส่วนนี้จะเรียกว่า internal flagmentation
เพื่อแก้ปัญหาการสูญเสียเวลาและที่ว่างในหน่วยความจำ วิธีการของ Partition เป็นการจัด
แบ่งโปรแกรมออกเป็นหลายๆส่วน โดยใช้กับ IBM’s Operating System/360 MFT & MVT
(Multiprogramming with a Number of Task) ดังในตัวอย่างที่ 9.11
หน่วยความจำจะถูกแบ่งออกเป็นหลายส่วน ซึ่งแต่ละ job สามารถกำหนดลงในแต่ละส่วนที่แบ่งไว้นั้นให้ติดต่อกันได้ (ตามรูป 9.11 )

memory 30 K memory
Job 1
Job 2
Job 4

Job 3
ที่ว่าง
10 k
5 k
ที่ว่าง
Job 2

Job 3

ที่ว่าง
monitor
30 k
20 k
50 k
15 k
b) หลังจาก job 1 และ job 4 เสร็จสิ้นการทำงานแล้ว



20 k
30 k
monitor
50 k
a) เริ่มต้นการ allocation












รูปที่ 9.11 แสดง Partition memory

ข้อดีของวิธี Partition ที่แสดงให้เห้นคือความสามารถทำงานแบบ multiprogramming หรือ multitasking ได้นั่นเอง
multiprogramming เป็นวิธีการที่หลายๆjob ทำการ execute พร้อมๆกันหรืออยู่ในสภาวะทำงานพร้อมกันนั่นเอง ซึ่งแตกต่างจากวิธี Serail processing ที่จะต้องทำงานทีละ job ตามลำดับ
ในวิธี Partition Multiprogramming นี้ หน่วยประมวลผลกลางจะแบ่งเวลาให้กับแต่ละ job เป็นช่วงเวลา time slice (เช่นประมาณ 100 ms) โดยเมื่อ job นั้นทำงาน ระบบปฏิบัติการจะกำหนดให้หน่วยประมวลผลกลางหรือ Processor ที่ทำงานกับ job นั้น และจะต้องทำงานภายใต้ address apace ที่โปรแกรมนั้นอยู่ในหน่วยความจำไปเรื่อยๆ จนกว่าจะเกิดเหตุการณ์ใดเหตุการณ์หนึ่งดังต่อไปนี้เกิดขึ้น คือ
1. เสร็จสิ้นการทำงานของ job นั้น พอดี (Complete)
2. เกิดข้อผิดพลาดที่โปรแกรม (Error)
3. ต้องการให้มีการทำงายด้านรับ-ส่งข้อมูล (I/O operation)
4. หมดช่วงเวลา time slice ที่กำหนดให้
หาเกิดกรณีหนึ่งขึ้น ก็จะทำให้ CPU หันไปทำงาน job อื่นที่มี priority สูงกว่าทันที
ข้อดีของ multiprogramming ก็คือช่วยลดเวลาว่างของ CPU (ทำให้ CPUทำงานได้มากขึ้น)
เช่นเดิมมี 2 งาน แต่ละงาน 1 ชม. (2 ชม. จึงจะเสร็จงาน) แต่เมื่อใช้ multiprogramming แล้วจะใช้เวลาทำงานทั้ง 2 งานเสร็จสิ้นใน 1 ชม. เท่านั้น อย่างนี้เป็นต้น โดย อาจใช้วิธีว่าแต่ละ job ต่างRUN อย่างเป้นอิสระต่อกันมีเวลา 50 % ในการทำงานด้าน I/O และ Manual operator invervention ดังนั้นช่วงที่ว่างของ CPU ก็จะหันไปทำงานกับ job ที่ 2 ต่อไปใด้เมื่อ job 1 ไปทำ I/O อย่างไรก็ตามเมื่อใช้วิธี random เอางานเข้ามาทำ multiprogramming คือมีหลายๆ job มากยิ่งขึ้นและ job เหล่านั้นก็มีการเรียกใช้การทำงานด้าร I/O ต่างๆกัน จะสามารถทำให้เพิ่ม throughput ของระบบได้ซึ่งปกติแล้วประมาณ5 jobs มารวมกันจะสามารถใช้ ให้ CPU ทำงานได้เต็มที่ถึง 90 % (โดยมีเวลาว่างแค่ 10 % ) อย่างไรก็ตามวิธีการ multiprogramming มีราคาแพงกว่า single allocation เพราะ
1. จะต้องมีกลไกลในการป้องกัน Protection Machanism เพื่อป้องกันมิให้ job อื่นมาทำลายข้อมูลกับ job กำลังทำงานอยู่หรือกับ job อื่นๆ ซึ่งแตกต่างไปจากวิธี single allocation ที่ job จะถูกยุ่งเกี่ยวจาก monitor เท่านั้น
2.ต้องใช้ memory เป็นเนื้อที่เพิ่มขึ้นสำหรับ OS เพราะ OS ต้องสลับซับซ้อนขึ้นและเพื่อให้เพียงพอที่จะเก็บหลายๆ job ไว้ใน memory ได้พร้อมๆกัน เพื่อให้เกิดประโยชน์ของวิธี multiprogramming ได้มายิ่งขึ้น
***********************ปัญหาสำคัญของ partition คือ flagmentation *******************
ดังตัวอย่าง ในรูป 9.11 job ที่ 1, 2 ,3 , 4 กินเนื้อที่ 20 k , 30k , 50k และ 10 k ตามลำดับ โดยตรงมีเนื้อที่เหลือใน memory ที่ว่างอยู่ 5k เมื่อเวลาต่อมา job1 กับ job4 ทำงานเสร็จสิ้น ก็จะทำให้เกิดที่ว่างในตำแหน่งที่ job 1 (ว่าง 20k) และตำแหน่งที่ job 4 (10k) รวมกับที่ว่างเดิมอีก 5 k เป็นที่ว่างทั้งหมดใน memory 35k ซึ่งถ้าขณะนั้นมี job 5 ซึ่งกินเนื้อที่ 30k กำลังรอการทำงานเพื่อ load ลงใน memory แต่ก็ไม่สามารถจะ load ลงไปได้ เพราะที่ว่างดังกล่าวมีถึง 35 k ก็จริง แต่มิได้อยู่ติดต่อกัน ปัญหาเช่นนี้เป็น flagmentation
ดังนั้นตามตัวอย่างที่ยกมานี้ โดยการนำ job4 ถึง 5 job มาทำรวมกันเช่นนี้ ทำให้การทำ multiprogramming ลดประสิทธิภาพลง คือการทำงานได้จริงๆแค่ 2-3 job เท่านั้น (ดังภาพที่ 9.11)
และ CPU time ก็ยังใช้ได้ไม่เต็มที่อยู่ดี
ปัญหาของ flagmentation จึงมีการหาทางแก้ไขกันอยู่หลายวิธี (โดยสร้าง list ตารางของเนื้อที่ว่าง ขึ้นมา แล้วใช้ เทคนิคต่อไปนี้ เพื่อค้นหาบริเวณที่ว่างที่เหมาะสมกับ job ที่ต้องการนั้นๆต่อไป) วิธีง่ายๆ 3 แบบ คือ
1. worth fit คือการค้นหาที่ว่างที่สุดใน list และสามารถ จะนำ job นั้นๆ ใส่ลงไปใด้
2. first fit คือ ค้นหาที่ว่างอันแรกใน list ที่ใหญ่พอจะใส่ job นั้นลงไปใด้
3. base fit คือ ค้นหาที่ว่างที่ใกล้เคียงกับขนาด job (แต่ต้องโตกว่า หรือเท่ากัน) ที่จะใส่ job นั้นลงไปได้
แนวทางแก้ปัญหาของ flagmentation ในที่นี้ขอแนะนำ 2 วิธี คือ Relocatable partition และpaging ซึ่งจะกล่าวต่อไป

9.2.3 Relocatable partition allocation
ใช้ Processor hardware เป็นตัวช่วยเพิ่มเสริมในการแก้ปัญหาของ flagmentation เข้ามาอีก วิธีง่ายๆ 3 วิธี เพื่อแก้ปัญหา flagmentation
1. อยู่เฉยๆ ไม่ต้องทำอะไรเลย
2. เพิ่มขนาดของ memory ให้ใหญ่เพียงพอกับการ multiprogramming และพอที่จะทำให้ CPU ทำงานมากที่สุด
3. หา Processor hardwareใหม่ๆ เพิ่มขึ้นมาจัดการกับ flagmentation เหล่านี้
ข้อเสีย
1. ทำให้ระบบต้องเสียเวลา และการเพิ่มขนาด ของ Memory มิใช่การแก้ปัญหา
2. Memory ปัจจุบันราคาแพงมาก เทียบได้กับค่าใช้จ่ายถึง 1 ใน 3 ของระบบก็ว่าได้
ดังนั้นส่วนมากจึงหันมาใช้ข้อ3 กันมาก และ Relocatable Partition ก็เป็นแนวทางหนึ่งในวิธีเหล่านี้ ตัวอย่างยังคงใช้อันเดิม
memory memory memory
monitor
Job 1
Job 2

Job 3
Job 4
ที่ว่าง
monitor
ที่ว่าง
20k
Job 2
30k

Job 3
50k
ที่ว่าง
15k
b) job1 , job4 ทำงานเสร็จสิ้นแล้ว
monitor
Job 2

Job 3
Job 2
ที่ว่าง
20k
30k
30k
50k
50k
30k
10k
5k
5k
a) เริ่มต้น
c) ใช้วิธี compact job2 , 3ให้อยู่ติดกันแล้ว load job5 ลงไปต่อท้าย















รูปที่ 9. 12 Relocatable Partition

การกระทำในรูป C นั้นเป็นการเลื่อน job ต่างๆ เข้ามาอยู่ติดกัน จึงทำให้มีที่ว่างเกิดขึ้นเพียงพอที่จะนำ job อื่นๆใส่ลงไปได้นั่นเอง วิธีนี้ต้องอาศัยฮาร์ดแวร์พิเศษเพิ่มขึ้นมาอีกจึงจะกระทำเช่นนี้ได้เพราะตำแหน่งของ job ที่บรรจุไปตั้งแต่ครั้งแรกนั้นเมื่อ compact แล้วตำแหน่งเหล่านี้ก้จะต้องเปลี่ยนแปลงค่าตามไปด้วย ซึ่งหมายถึงค่า
1. คำสั่งที่อ้างอิงถึงค่าตำแหน่งภายในหน่วยความจำ(Memory referencing instructure)
2. พารามิเตอร์ต่างๆ (Paramiter list)
3. โครงสร้างข้อมูล (Data Structure)
ซึ่งทั้งสามข้อนี้ต่างใช้ address pointer ทั้งนั้น เพราะฉะนั้นจึงต้องมีการเปลี่ยนแปลงค่าตำแหน่งเหล่านั้นให้ถูกต้องหลังจากที่ทำการ compact แล้ว เพื่อมิให้การทำงานของโปรแกรมเดิมต้องผิดพลาดไป แต่คอมพิวเตอร์ในปัจจุบันก้มิได้มีการแยกแยะว่าส่วนใดในหน่วยความจำหลักนั่นคือข้อมูลหรือค่าของตำแหน่งข้อมูล ดังนั้น Monitor ก้ไม่สามารถที่จะรู้ได้ว่าตรงไหนของโปรแกรมjob นั้นๆ ที่จะต้องเปลี่ยนแปลงหลังจากที่ compact แล้ว หรือเมื่อจะทำ compact อย่างไรก็ตามยังมีเทคนิคทางซอฟท์แวร์ที่จะทำได้แต่ก็อาจไม่เพียงพอ หนทางที่เป้นไปได้คือ load job เหล่านั้นเข้ามาใหม่ (โดยทำเหมือนกับว่าไม่เคยบรรจุเข้าหน่วยความจำมาก่อนเลยทำเช่นเดียวกับการทำงานของโปรแกรมโหลดเดอร์ตามปกติ) แล้วก็เริ่มต้นการทำงาน ณ. ที่ๆได้บรรจุเข้าไปใหม่นี้ (relocate) แต่วิธีนี้ก็มีผลเสียเช่นกันคือ
-ค่าใช้จ่ายแพงมากขึ้น
-หากว่า Job นั้นกำลังอยู่ระหว่างการปรับปรุงค่าหรือมีการเปลี่ยนแปลงข้อมูลในส่วน Master tape อยู่หรือกำลังวน loop อยู่ ก็จะทำให้เกิดผลเสียได้
กลไกลอย่างหนึ่งคือ relactivity โดยจะทำให้โปรแกรมเป็นอิสระต่อลำดับที่ของค่าตำแหน่งต่างๆ ที่แน่นอน เรียงตามลำดับใน memory (คล้ายกับคนงานในตู้รถไฟไม่จำเป็นต้องรู้ว่ารถไฟกำลังพาตู้รถไฟไปอยู่ที่ใด ขอแต่ทำงานของตัวในตู้ตัวเองก็พอ) กลไกง่ายๆนี้ก็คือใช้ Relocation Register ซึ่งคอยจัดเก็บค่าๆหนึ่งเพื่อจะบวกเข้ากับตำแหน่งต่างๆ ที่มีการอ้างอิงถึงตำแหน่งในหน่วยความจำหลัก
รูปที่ 9.13 a นั้น ค่าใน address space ทางซ้ายมือเป็นอิสระ มิได้ขึ้นอยู่กับทางขวามือซึ่งตำแหน่งในหน่วยความจำหลักจริงๆโดยในตัวอย่างนี้ (คำสั่งในคอมพิวเตอร์สมมุติว่าเป็นคำสั่งโดดๆ) คือคำสั่ง LOAD 2105 ถ้าอยู่ในโปรแกรมของ Job ก็จะเป็นคำสั่งอยุ่ในตำแหน่งที่ 2100 แต่ถ้าหากว่าโปรแกรม Job นี้ถูกบรรจุเริ่มต้นที่ตำแหน่ง 1000(เดิม Job เริ่มต้นที่ 2000) จะเป็นไปตามรูปที่ 9. 13 b
Relocation Core Memory
Register
2000
2100
0000
2000
2100
2105
+
2105









รูปที่ 9. 13 a ) ก่อนที่จะมีการ Relocation

เมื่อบรรจุ โปรแกรมเข้าไปที่ตำแหน่งใหม่ที่ 1000 ค่าใน Relocation Register ก็จะเป้นค่าใหม่ซึ่งจะกำหนดโดยโปรแกรม Monitor คือเป้น 1000-2000 = -1000 ดังนั้นคำสั่ง LOAD 2105 ค่าของตำแหน่งที่เป็น content ของมัน (เดิมอยู่ 2105 ตามในคำสั่ง) แต่เมื่อเป็นเช่นนี้ก็จะกลายเป็นตำแหน่ง 2105
1000 = 1105 แทน โดยค่ายังเป็น 47 เช่นเดิมไม่เปลี่ยนแปลงเลย
Relocation Core Memory
-1000 Register
Address Space
2000
2100
2105
Load 2105
00047
1000
1100
1105
+
Load1105
00047









รูปที่ 9.13 b) หลังการทำ Relocatation แล้ว

ดังนั้นไม่ว่าจะเป็นคำสั่ง ADD, LOAD , BRANCH หรือใดๆ ก็ตามก็ไม่ต้องกังวลเรื่องใดๆอีก เพราะทุกๆโปรแกรมจะเปรียบเสมือนว่าถูกบรรจุที่ตำแหน่งเริ่มต้นเป็นศูนย์เหมือนกันทั้งหมดส่วนที่เป็นตำแหน่งสัมบูรณ์จริงๆนั้นก็ขึ้นอยู่กับค่าใน relocation register
แม้ว่าหลักความคิดอย่างนี้จะดูง่ายๆก็ตาม กล่าวคือการที่ให้ name address space หรือ Job address space เป็นอิสระจากหน่วยความจำจริงๆ หลักการนี้ยังคงนำมาใช้ในวิธีการอื่นๆอีกด้วย
**********ปัญหาสำคัญคือ 1. Overhead จากการปรับค่าตำแหน่ง
2. ยังมีส่วนของ memory ที่ยังเป็นที่ว่างเหลืออยู่
ระหว่างวิธี Partitioned กับ Relocated Partition ก็ยังมีสิ่งต่อรองกันอยุ่คือ
- CPU time (recompact จะเกิด overhead จากการที่ต้องใช้เวลาปรับตำแหน่งใหม่)
- Waste memory (flagmentation ใน partition ) ซึ่งขึ้นอยุ่กับว่าจะเลือกผลเสียข้างใด

Honeywell P.635 เป็นตัวอย่างการทำ Relocatable Partition

9.2.4 Paged Allocation
แต่เดิมข้อจำกัดที่ว่าบรรจุงานหนึ่ง ๆ ลงในหน่อวยความจำหลักนั้น จะต้องให้เป็นพื้นที่ติดต่อกันเป็นผืนเดียว ต่อมาก็มีเทคนิคการหา compact แต่ก็ยังไม่ดีที่สุดอยู่ดี จึงมีวิธีใหม่คือ การจัดแบ่งหน่วยความจำหลักออกเป็นบล็อก ๆ ( Block ) และขณะเดียวกันก็แบ่งโปรแกรมออกเป็น compact แต่ขนาดของหน้าก็มีความสำคัญ เพราะ
1. หากขนาดของหน้าใหญ่เกินไป อาจเกิดปัญหาเช่นเดียวกับวิธี Dynamic Partition คือมี flagmentation มากเกินไป
2. หากขนาดของหน้าเล็กเกินไป ย่อมต้องใช้ Page map table ขนาดใหญ่ขึ้น ทำให้เปลืองหน่วยความจำในการเก็บตารางนี้และทำให้ตารางซับซ้อนยิ่งขึ้นอีก จนทำให้การทำงานต้องช้าลงไปอีก
วิธีการแก้ปัญหา flagmentation อีกวิธีหนึ่งคือ Paging
แต่ละหน้าจะกำหนดขนาดยาว 1000 ไบท์ ( ในทำนองคล้ายกับวิธีของ Relocation Partition คือ ผู้ใช้ไม่จำเป็นต้องกังวลถึงปัญหาการแยกโปรแกรมออกเป็นส่วน ๆ ) หน่วยความจำหลักเองก็จะแบ่งออกเป็นบล็อก ๆ ขนาดเท่ากันกับขนาดของหน้า คือยาว 1000 ไบท์ เช่นกัน ทั้งหน้าและบล็อกก็เปรียบเสมือนปลั๊กไฟ คืออันไหนจะเสียบเข้ากับอันไหนก็ได้ ถ้าปลั๊กนั้นว่างไม่ถูกใช้งาน และเช่นกันวิธี paging นี้ก็ต้องอาศัยส่วนของฮาร์ดแวร์อย่างอื่นเข้ามาช่วย ในการ map จาก user address กับ physical memory จริง ๆ นั่นคือนำเอารีจีสเตอร์มาใช้
โดยแต่ละหน้าก็จะมีรีจีสเตอร์ของตัวเองเรียกว่า page map เมื่อนำหลาย ๆ หน้ามารวมกัน รีจีสเตอร์หลาย ๆ ตัวก็จะนำมารวมกันเรียกว่าเป็น page map tables ( ซึ่งจัดเป็นส่วนหนึ่งของหน่วยความจำหลักด้วย )
เนื่องจากแต่ละหน้าสามารถที่จะแยกปรับตำแหน่งให้บรรจุลงในส่วนไหนก็ได้ในหน่วยความจำหลักที่มีที่ว่าง ดังนั้นจึงไม่จำเป็นว่าหน้าต่าง ๆ ภายในงานเดียวกันจะต้องบรรจุเข้าไปในพื้นที่ติดต่อกันไปเหมือนอย่างวิธี Partition เพียงแต่ส่วนที่อยู่ภายในหน้าเดียวกันเท่านั้น จึงจะอยู่ติดกันภายในบล๊อกที่หน้านั้น ๆ บรรจุลงไป จะเห็นว่าขนาดของหน้า จะมีผลกระทบสำคัญต่อระบบมาก ดังได้กล่าวมาแล้วข้างต้น ซึ่งโดยทั่ว ๆ ไป แล้วมักจะกำหนดขนาดของหน้าประมาณ 4000ไบท์






0
1000
2000
Job1
0 5
1 6
Page no.
Block no.
Monitor

Load2105
0
1000
2000
3000
Job2 page0


4000
Free
0 2

1 4

2 7
Load2105


00047 0
Job2 page1
5000
0518
Job1 page0
6000
1000
Job1 page1
7000
2000
Job2 page2
8000
7105
00047 2105
Job3 page0
3000
Free
9000
10000
0 8
Core Memory
Page map tables
Address spaces


รูป 9.14 Paging sheme of memory allocation.

ในรูป 9.14 ภายใน page map table ( 1 page table ต่อ 1 job ) จะประกอบด้วย
- หมายเลขหน้า ( page number ) และ
- หมายเลขบล็อก ( block number ) ที่บรรจุหน้านั้นลงไป
แต่ก็ต้องมีการทำงานเกี่ยวกับ การกำหนดตำแหน่งด้วย กล่าวคือต้องมีการ transform จาก Job address space เป็น physical address space ดังนั้น page map table ก็จะช่วยทำหน้าที่นี้โดยอัตโนมัติ ซึ่งในทางปฏิบัติจริง ๆ ทางด้านฮาร์ดแวร์นั้น การทำงานของหน่วยประมวลผลกลางในการ transform นั้นกินเวลาน้อยมาก
วิธี paging นี้ช่วยแก้ปัญหา flagmentation โดยไม่ต้องมีการจัด partition ( page) ต่าง ๆ ใหม่หลังจากที่งานนั้นทำเสร็จสิ้นแล้ว
ปัญหาสำคัญคือ
1. overhead จากการ transform ค่าตำแหน่งต่าง ๆ
2. ส่วนฮาร์ดแวร์ที่ต้องเพิ่มเข้ามา คือส่วนที่จะใช้สำหรับเป็นรีจีสเตอร์ต่าง ๆ สำหรับ page table และในกรณีที่งานนั้นมีขนาดไม่ลงตัวพอดีกับผลรวมการแบ่งเป็นหน้าต่าง ๆ ก็จะทำให้เกิดที่ว่างขึ้นไปหน้าสุดท้าย ซึ่งเรียกกรณีนี้ว่า page breakpage ปกติจะประมาณครึ่งหนึ่งของหน้าโดยเฉลี่ยที่เสียไป และอาจจะเป็นปัญหาต่อไปถ้าหากเกิดมีงานขนาดเล็ก ๆ หลาย ๆ งานหลุดเข้ามาในระบบ เพราะจะทำให้เกิด page breakage ขึ้นในหลาย ๆ หน้า ซึ่งถ้าเรานำที่ว่างเหล่านั้นมารวมกันแล้วก็อาจจะเท่ากับเนื้อที่หลายหน้อก็เป็นได้
ข้อเสีย
1. ยังมีส่วนของหน่วยความจำหลักที่ยังต้องเสียทิ้งไปอยู่ คือมีที่ว่างอยู่ในหลาย ๆ หน้าก็จริง แต่ไม่สามารถนำที่ว่างเหล่านั้นมาใช้ได้
2. ข้อจำกัดคือ ในการทำงานต้องให้ทุก ๆ หน้าของงานนั้น บรรจุลงในหน่วยความจำหลักทั้งหมดเสมอขณะทำงาน
3. ต้องมีส่วนฮาร์ดแวร์เข้ามาสนับสนุนเพิ่มขึ้นด้วย
Virtual Memory เป็นวิธีการก่อให้เกิดสภาวะลวงให้ดูคล้าย ๆ กับว่าหน่วยความจำหลักมีขนาดใหญ่มาก โดยการนำเอาหน่วยความจำสำรองที่มีความเร็วสูงมาช่วย เทนนิคที่ใช้กันแพร่หลายได้แก่
- Demand page memory
- segment memory

9.2.5 Demand Page Memory
จุดเป้าหมายคือพยายามใช้พื้นที่ในหน่วยความจำหลักเกิน 100 % และยกเลิกข้อจำกัดที่ว่างในหนึ่ง ๆ จะต้องบรรจุลงในหน่วยความจำหลักพร้อมกันทั้งหมด มีการนำเทคนิคเหล่านี้ไปใช้กับเครื่อง Computer IBM 360 Model 67
Honeywell 645
RCA 3 และ 7
จะเห็นว่าแต่ละหน้าจะบรรจุในหน่วยความจำหลักก็ต่อเมื่อมีความต้องการใช้งานเท่านั้น ปัญหาของวิธีนี้ก็คือ จะย้ายหน้าใดออกไป ( swapping ) ในขณะที่มีหน้าเต็มหมดแต่ต้องการใช้งานในหน้าใหม่ที่ยังไม่ได้บรรจุลงในหน่วยความจำหลักขณะนั้น จากเหตุการณ์ swapping นี้ เมื่อเกิดเหตุการณืที่ว่าก็จะต้องดึงบางหน้าเข้าและให้บางหน้าอกไปอยู่ตลอดเวลา ( แล้วหน้าเก่านั้นหล่ะ ?) ซึ่งจะเรียกว่าเกิด trashing ขึ้น โปรแกรมระบบปฏิบัติการจะต้องคำนึงถึงปัญหาเรื่อง trashing ให้มาก การเขียนโปรแกรมทำงานแบบนี้โดยไม่คำนึงถึงอัตราภาพภายใน อาจทำให้เวลาที่ใช้ในการแก้ไขปัญหา trashing นี้สูงขึ้นถึง 99 % ก็ได้
ขณะที่มีการเคลื่อนย้าย บางหน้าเข้าออกนั้น โปรแกรม monitor ก็จะต้องคอยจัดการMultiprogramming กับงานอื่นๆไปด้วย



0
B 9005 0
1000
Monitor
30
50timeok0
ok0
0 1000
x0
-50timeok0
-
10 2000
2000
20
4time
ok0
20 3000
Page2
3000
x0
-50timeok0
-
30 4000
Page0
B 9005
x0
-50timeok0
-
40 5000
4000
x0
-50timeok0
-
50 6000
Page9
5000
Load 2105
x0
x0
-50timeok0
-50timeok0
-
-
70
60 7000
8000
Memory
x0
-50timeok0
-
80 9000
4x0
most
ok0
90
Load 2105 9005
Page map table 10000
Address space



รูป 9.15 Demand paging scheme


ตัวอย่างในรูป 9.15 เป็นวิธีการหา demand pagingซึ่ง Job address space มีขนาด 10,000 ไบท์ โดยในขณะที่หน่วยความจำหลักมีเพียง 3.000 ไบท์ เท่านั้นที่จะทำงานได้ ( 2,000 byte สำหรับ monitor) โดยการใช้วิธี demand paging ( หน้าละ 1000 ไบท์ ) แต่ว่าภายใน page map table นั้น จะมีส่วนประกอบต่าง ๆ ของตารางเพิ่มมากขึ้นไปจาก page table ของวิธี paging โดยประกอบด้วย
- หมายเลขหน้า ( page number )
- หมายเลขบล็อก ( block number )
- สถานะการบรรจุ ( status ) ( ว่าขณะนั้นหน้าที่ต้องการทำงานอยู่ในบล็อกหรือนอก หน่วยความจำหลัก )
- ส่วนช่วยตัดสินใจ ( judgement ) ( ช่วยในการตัดสินใจเมื่อมีการ swapping )
ซอฟท์แวร์จะเป็นผู้ตัดสินวิธีการกำหนดงาน ( Alloation Algorithm ) ในขั้นแรกอาจเอาหน้า 1-3 บรรจุลงในหน่วยความจำหลักตามลำดับ โดยการทำงานของโปรแกรมจะเริ่มต้นที่หน้าใดหน้าหนึ่ง สมมุติว่าต่อมาภายในหน้าหนึ่งมีการเรียก ( transfer instruction ) ไปยังตำแหน่งที่อยู่ในหน้า 9 ( hardware machine ) กลไกทางฮาร์ดแวร์ก็จะไปตรวจสอบที่สถานะว่าขณะนั้นหน้าที่ 9 ที่อ้างอิงถึงอยู่ในหน่วยความจำหลักแล้วหรือยัง ( สมมุติว่ายัง ) ดังนั้นก็จะมีการเรียก ( demand ) หน้า 9 เข้ามาทำงาน โดยซอฟท์แวร์จะต้องไปค้นหาตำแหน่งของหน้า 9 ที่อยู่ในหน่วยความจำสำรอง เมื่อพบแล้วจึงบรรจุเข้าทับหน้าใดหน้าหนึ่งที่อยู่ในหน่วยความจำหลักที่อยู่ก่อนแล้ว การตัดสินใจว่าจะให้ไปทับหน้าใดนั้นจะพิจารณาจากส่วน judgement นั่นเอง เช่น โดยทับหน้าที่ไม่ได้ถูกใช้มานานที่สุด หรือไม่ค่อยถูกเรียกใช้ เป็นต้น แต่ในโปรแกรมส่วนมาก การทำงานของโปรแกรมมักไม่มีการกระจายการทำงานโดยทั่ว ๆ ภายใน address space ทั้งหมดหากแต่จะทำงานอยู่กับบริเวณจำกัด ซึ่งหน่วยประมวลผลมักจะกำหนดให้มีเวลาทำงานสูงทั้งนี้พเอจะเก็บหน้าที่ถูกใช้บ่อย ๆ ให้อยู่ภายในหน่วยความจำหลัก ให้นานที่สุดในขณะทำงาน
Paging algorithm
- หน้าไหนที่ไม่ค่อยถูกเรียกใช้ก็จะดึงออกไป ( ถูกนับโดยหน้าอื่นนั่นเอง )
- อาจใช้วิธีนับจำนวนครั้งที่มีการอ้างอิงถึงหน้านั้น ๆ โดยถ้าตัวเลขน้อยที่สุด ( คือ ถูกอ้างอิงถึงน้อยทีสุดนั่นเอง ) ก็จะถูกดึงออกไป

กลวิธีของ paging algorithms ที่มีการนับการ access คือการทำงานของหน้านั้นดดยเก็บค่าการนับไว้ที่ส่วน justment แล้วการตัดสินใจจะให้หน้าที่จะถูกหน้าอื่นทับก็จะเป็นหน้าที่มีตัวเลขนับน้อยที่สุด เสร็จแล้วภายในระยะเวลาหนึ่ง ๆ ก็จะต้องมีการคือปรับค่าภ่ยในตัว judgement นี้ใหม่ มิฉะนั้นแล้วหน้าที่มีจำนวนนับการอ้างอิงถึงน้อยที่สุด ก็จะถูกทับโดยหน้าอื่น ๆ เรื่อย ๆ ไป โดยที่อาจจะเพิ่งถูกบรรจุลงไปใหม่ ๆ ก็เป็นไปได้ซึ่งจริง ๆ แล้ว ไม่ควรจะถูกนับ
ในวิธี demand paging นี้ เฉพาะส่วนที่มีการอ้างอิงหรือเรียกหน้าที่ต้องการทำงานด้วยเท่านั้น กล่าวคือตอนที่มีการ demand เท่านั้น จึงใช้ฮาร์ดแวร์เป็นตัวจัดการ โดยที่ฮาร์ดแวร์จะตรวจสอบสถานะของหน้านั้น ๆ เพื่อให้หยุดการ process ที่กำลังทำอยู่ แล้วต่อไปก็จะมีการส่ง interrupt ไปยังโปรแกรม monitor เองโดยอัตโนมัติ ซึ่งวิธีการเช่นนี้เรียกว่า processor interrupt หรือ page interrupt หรือ page fault
ฉะนั้น page interrupt ก็คือการส่ง interrupt ไปยังโปรแกรม monitor โดยอัตโนมัติหลังจากที่ฮาร์ดแวร์มีการเรียกใช้นำเอาหน้าใด ๆ บรรจุลงในหน่วยความจำหลัก ต่อจากการเกิด interrupt แล้วโปรแกรม monitor ก็จะเริ่ม access กับหน่วยความจะสำรองเพื่อให้ได้หน้าที่ต้องการ นอกจากนั้นขณะทีมีการดึงหน้าบรรจุลงในหน่วยความจำนั้น โปรแกรม monitor ก็สามารถ multiprogram อื่น ๆ ดังที่เคยกล่าวไว้ในวิธี paging ในตอนแรกได้อีกด้วย
จากการศึกษาพบว่า
1. ส่วนที่เป็น error routine ถ้าไม่จำเป็น ( คือ particular run ) แล้วก็ไม่ควรที่จะบรรจุส่วนนี้ลงในหน่วยความจำหลัก นอกจากจะจำเป็นในการใช้งานจริง ๆ เท่านั้น
2. ประมาณ 25 % ของโปรแกรมหนึ่ง ๆ มีโอกาสที่จะไม่ถูกใช้งานในขณะที่มีการทำงานอยู่ ฉะนั่นในวิธี demand page นี้ก็จะเป็นวิธีที่สามารถเพิ่มประสิทธิภาพการทำงานแบบ multiprogramming ได้เพิ่มขึ้นถึง 25 % เช่นกันโดยอัตโนมัติ
3. ส่วนแรก ๆ เช่นส่วนเริ่มต้นของโปรแกรมมักจะถูกใช้งานเพียงครั้งเดียวเท่านั้นเช่น
- Initiazation Routine
- Sequential phases ของโปรแกรม ( เช่น สับรูทีนของตัวแปรภาษ เป็นต้น )
( แต่ทั้งนี้ก็ขึ้นอยู่กับลักษณะของงานนั้น ๆ ด้วย ) ซึ่งจะพบว่าประมาณน้อยกว่า 50 % ของโปรแกรมทั้งหมดจะต้องใช้งานจริง ๆ ภายในช่วงเวลาสั้น ๆ ซึ่งส่วนของโปรแกรมที่ใช้งานบ่อย ๆ ส่วนนี้จะถูก เรียกว่า working set ( จำนวนหน้าที่ถูกอ้างอิงใช้งานบ่อย ๆ ในช่วงเวลาใดเวลาหนึ่ง)
ในช่วง interval of time ที่เหมาะสม วิธี demand paging นี้จะมีความสำคัญมากในระบบ time-sharing ซึ่งเป็นระบบที่จะพยายาม run โปรแกรมไปพร้อม ๆ กันทีละมาก ๆ ( อาจถึง 12 โปรแกรม ) ซึ่งอาจจะขัดกับที่กล่าวมาแค่ 5 โปรแกรม ก็เหมาะสำหรับ multiprogramming และหากจะพิจารณาปัจจัยอื่น ๆ มาประกอบ เช่น response time อาจจะเพิ่มขึ้น ซึ่งจริง ๆ แล้วในระบบ time- sharing นี้หากมีจำนวนโปรแกรมมากเกินไปจะทำให้การใช้วิธี demand paging ไม่มีประสิทธิภาพเต็มที่ ( สมมุติว่ามัวิธี judgement ที่ไม่ดีเพียงพอเหมาะสม ) ก็จะทำให้เกิดเหตุการณ์ดึงหน้าเข้า-ออกบ่อย ๆ กล่าวคือ อ่านหน้าใหม่เข้ามาเพื่อทำงานแล้วก็ถูกหน้าใหม่ ๆ อื่น ๆ อีกอ่านมาทับเช่นกัน แล้วก็ต้องอ่านหน้าใหม่ๆ เข้ามาใหม่แบบนี้อีกเรื่อยๆ ก็จะทำให้ผลลัพธ์ลดลงถึง 1 % ก็ได้ ซึ่งระบบในสภาวะแบบนี้เราเรียกว่า thrashing
- thrashing คือ การที่มีการ access address แล้วทำให้เกิดเหตุการณ์ page fault ขึ้นทุกครั้งเสมอ ทำให้หน่วยความจำหลักเปรียบเสมือนเป็นจานแม่เหล็กที่มีการอ่านบ่อย ๆ จนเป็นผลให้ผลลัพธ์ของระบบลดลง กล่าวอีนัยหนึ่งก็คือ thrashing เป็นเหตุการณ์ที่มีการ swapping ขึ้นบ่อย ๆ ครั้งในเวลาอันสั้น ๆ การ swapping หมายถึงการบรรจุหน้าที่ต้องการใช้งานทับลงไปในบริเวณพื้นที่ของหน้าที่ไม่มีการใช้งานในหน่วยความจำหลักตามวิธีของการ paging algorithm เพื่อให้เป็นไปตาม demand ของระบบ แต่อย่างไรก็ตามปัญหาของ demand page ก็ยังคงเหมือนกับปัญหาของวิธี paging อยู่ดี

9.2.6 Segmented Allocation
แทนที่จะแย่งโปรแกรมออกเป็นหน้า ๆ ขนาดเท่า ๆ กัน ทั้งหมด ก็จะใช้วิธีแบ่งเป็นsegment ซึ่งมีความสมบูรณ์ในตัวของมันเองแทน ( segment ไม่จำเป็นต้องมีขนาดเท่ากันเสมอไป ) วิธีนี้ได้เปรียบวิธี paging ตรงที่ segment หนึ่ง ๆ มีความสมบูรณ์ของการทำงานในตัวมันเองจึง ไม่ค่อยมีปัญหาในการดึงหน้าเข้า-ออกบ่อย ๆ และจะลดอัตรา thrashing ลงได้ นอกจากนั้นวิธีของ segment ก็ยังทำให้สามารถเกิดการใช้งานร่วมกันได้อีกด้วย ( sharing )
ข้อดีของ segment
-ไม่เกิดปัญหา thrashing
- สามารถ shring segment กันได้

แต่ก็มีข้อจำกัดคือ
- segment หนึ่ง ๆ ต้องเล็กกว่า ขนาดของหน่วยความจำหลัก
- ในระหว่างการปฏิบัติงาน segment อาจลดจำนวนลงเมื่อถูกใช้งานเสร็จสิ้น จึงต้องมีการcompact อีก
ผู้เขียนโปรแกรมอาจจะมองลักษณะของ segment ว่าเป็น 2 มิติ ที่การกำหนดตำแหน่งจะต้องประกอบด้วย
- ชื่อ segment
- offset ภายใน segment นั้น ๆ
แต่ละ segment ไม่จำเป็นต้องมีขนาดเท่ากันเสมอไป ดังนั้น segment จึงมีส่วนช่วยในวิธี dynamic linking ของโหลดเดอร์ด้วย คือ จะมีการ bind ( เชื่อมต่อ ) กันจริง ๆก็ต่อเมื่อ จะถึงเวลา execute จริง ๆ จึงช่วยลด overhead ไปได้มากในกรณีที่ segment ไม่มีการ call เลยแต่ว่าถูกอ้างอิงเอาไว้เฉย ๆ
การที่ segment มีขนาดต่าง ๆ กันเนื่องจากผู้เขียนโปรแกรมไม่ต้องการระบุขนาดของ segment ล่วงหน้าก่อนที่จะทราบขนาดของมันจริง ๆ ดังนั้น segment จึงเหมาะกับการสร้างตารางหรือเมตริกซ์ที่ไม่ทราบขนาดมาก่อน
segmentation เป็นทั้งการจัดการหน่วยความจำและเป็นทั้ง segment ซึ่งต่อไปจะได้กล่าวถึงการจัดการ information แบบ segment
จะเห็นว่าจากวิธีการ relocatioable partition , paging และ demand paging นั้น แนวทางในการจัดการคือบังคับให้โปรแกรมระบบปฏิบัติการพยายามให้อิสระแยก job address space เหล่านั้นเยแผ่นเดียวกันติดต่อกันไปเรื่อย ๆ แต่ก็น่าจะมีคำถามว่า ผู้เขียนโปรแกรมจริง ๆนั้นต้องการให้เป็นเช่นใดกันแน่ แล้วจึงค่อยหาวิธี reduction และ paging มาใช้ประยุกต์เข้าช่วย
segment คือ กลุ่มของการสนเทศที่ถูกปฏิบัติคล้ายกับว่าเป็นสิ่งของอันเดียวกัน (entity) ซึ่งอาจจะหมายถึงหนึ่งโปรแกรมหรือหลายโปรแกรมก็ได้
ในสภาพของ segment ผู้เขียนโปรแกรมจะมองเห็นว่ามีอยู่ 2 ส่วนในการให้ตำแหน่งคือ
- ชื่อ segment นั้น
- offset ( ตำแหน่ง ) ที่อยู่ภายใน segment นั้น ๆ
Segment เป็นวิธีหนึ่งที่ช่วยทำให้เทคนิดของ dynamic linking สามารถนำไปใช้งานได้ เมื่อมีการประมวลผลคำสั่ง call กลไกในการบรรจุก็จะหาโปรแกรมแล้วนำไปบรรจุลงในหน่วยความจำหลักพร้อมกับเชื่อมโยงโปรแกรมที่ถูกอ้างอิงในขณะนั้น ( calling program ) เข้ากับโปรแกรมที่อ้างไปนั้น ( caller ) เพราะฉะนั้นก็จะไม่มี overhead ปรากฏขึ้น ถ้าหากว่าโปรแกรมหนึ่ง ๆ ไม่เคยถูกอ้างอิงเลย รูปที่ 9.16 จะแสดงให้เห็นว่าผู้เขียนโปรแกรมจะมอง segment ในลักษณะแบบใด ( คือแต่ละ segment แยกเป็นอิสระต่อกัน ซึ่งไม่จำเป็นต้องมีขนาดเท่ากัน ) โดยอนุมัติว่า ALPHA,BETA เป็น segment ที่เป็นโปรแกรมคำสั่ง แต่ DATA เป็น Segment ที่มีข้อมูลบรรจุอยู่
ALPHA BETA DATA
Attributes
Attributes
0
110
20
0
110
20
0
110
20
Attributes



.
.
.
.
..


รูป 9.16 Segmented address apace as seen by user


การอ้างอิงถึงตำแหน่งใด ๆ นั้นจะต้องระบถึง 2 ส่วน คือ ชื่อ Segment กับตำแหน่งภายใน Segment นั้นด้วย ดังตัวอย่างง่าย ๆ ที่สมมุติขึ้น ดังนี้

LOAD /25 หมายถึง ให้บรรจุงานจากตำแหน่งที่ 25 ของ Segment ที่ชื่อ DATA
ลง ใน Accumulater


TRANSFER /7 หมายถึง transfer ไปยังตำแหน่งที่ 7 ของ Segment ที่ชื่อ BETA

แต่ถ้าปกติการใช้งานจริง ๆ นั้น มักจะอ้างถึงชื่อ Segment เป็นตัวเลขมากกว่าซึ่งคล้าย ๆ กับในภาษาแอสแซมบลี และวิธีการของ รีจีสเตอร์ดัชนีรีจีสเตอร็ฐาน และ indirect address ยังถูกนำมาใช้รวมได้ด้วย
ในทัศนะของผู้เขียนโปรแกรมแล้ว Segment ก็ยังมีข้อดีอีก กล่าวคือ สามารถกำหนดสิทธิในการทำงานของ Segment ได้ เช่น read-only , write-only เมื่อจำกัดได้เช่นนี้ย่อมไม่มีการผิดพลาดให้เกิดขึ้น เพราะฮาร์ดแวร์จะเป็นตัวช่วยจัดการอยู่ ซึ่งข้อนี้เป็นการป้องกันของระบบด้วยอย่างหนึ่ง
ข้อดีข้อเด่น ของ segment
1. sharing ได้
2. มี Protection
3. ไม่เกิด Trashing
การที่ไม่มีการจำกัดขนาดของ Segment ว่าจะตจ้องเท่ากันเสมอนั้น ก็เพราะว่าผู้เขียนโปรแกรมไม่ต้องการกำหนดขนาดสูงสุดของ Segment ไว้ก่อนล่วงหน้า ( แต่มิใช่ว่าจะไม่มีขนาดที่แน่นอน ) ดังนั้นวิธีของ Segment จึงเหมาะสมกับการจัดการตารางและเมตริกซ์ ซึ่งไม่มีการกำหนดขนาดของตารางหรือเมตริกซ์มาให้ เช่น คำสั่ง
STORE /1500
ก็จะทำให้ Segment ยืดขนาดออกได้ไปอีกถึง 1500 ไบท์ทันที ( ถ้าทำได้ถึง ) วิธีการของ segment นี้โปรแกรมระบบปฏิบัติการยังนำไปใช้เป็นวิธีในการทำ Function ต่าง ๆ ด้วย เช่นกัน แต่ประโยชน์ที่สำคัญคือนำไปสู่การ dynamic binding และ sharing ด้วย
ในหัวข้อก่อน ๆเคยกล่าวไว้ว่าสับรูทีนต่าง ๆ ของงานจะต้องเชื่อมโยงติดต่อกันไปเรื่อย ๆ เป็นผืนเดียวกันกับโปรแกรมโดยซอฟท์แวร์ก่อนที่จะเริ่ม execute งานนั้น ๆ ขั้นตอนอย่าง linkage editing binding หรืออย่าง relocation laoding และอื่น ๆนั้นเทคนิคเหล่านี้ช่วยทำให้ลดเวลาในการทำงานได้ และขณะเดียวกันสำหรับในงานบางอย่าง ก็ทำให้ใช้เวลามากขึ้นในการแปลภาษาและ execute
ในวิธี segment ไม่จำเป็นต้องมีการปรับค่าตำแหน่งภายในสับรูทีนของ Segment นั้น ๆ เพียงแต่เปลี่ยนชื่อสัญญลักษณ์ที่ใช้ในการอ้างอิงถึงระหว่าง Segment กันนั้น ให้กลายเป็นตัวเลข ของ segment นั้นก็พอ
ฮาร์ดแวร์จะเป็นตัวตรวจสอบหา indication ของแต่ละคำสั่งที่มีการอ้างอิงระหว่าง segment กันว่าเป็น
- Unlink reference ( จาก charaacter string ซึ่งสร้างโดยตัวแปลภาษา )
หรือ
- เป็น link จริง ๆ ของ segment number เหล่านั้น แล้วการ binding จะกระทำก็ต่อเมื่อมีคำสั่งให้ต้องการหา linkage เท่านั้น วิธีการนี้จะเรียกว่า dynamic binding หรือ dynamic linking และ dynamic loading เช่นโปรแกรม ALPHA ดังนี้
.
.
ALPHA/0201 LOAD /5
.
ALPHA/0005 TRANSFER /0
.
เมื่อพบคำสั่งแรกที่แสดงนั้น ก็จะเกิดการ binding ดังนั้น เมื่อ System Data มีหมายเลขเป็น 4 ส่วน dynamic binding ของโปรแกรมระบบปฏิบัติการจะทำงานให้ผลเป็น ดังนี้
ALPHA / 02001 LOAD 4/5
.
.
.
ALPHA / 0005 TRANSFER /0

ถ้าพวกคำสั่ง TRANSFER / 0 ไม่ถูกทำงานอาจจะเงื่อนไขใดก็แล้วแต่หรือมีการสิ้นสุดการทำงาน ก็ตาม ก็จะไม่มีการสิ้นสุดสมบูรณ์ และ BETA ก็จะไม่ถูกบรรจุลงไป
การทำงานในระบบคอมพิวเตอร์เช่นระบบสอบถามข้อมูล หรือระบบการแปลภาษา มักจะมีหลายสับรูทีนที่ให้เลือกใช้นั้น อาจไม่มีการเรียกใช้เลยในการทำงาน ดังนั้นทางที่ดีเพื่อลดเวลาการทำงานลงและเพิ่มผลลัพธ์ แก่ระบบ ก็ควรจะมีการ binding เฉพาะสับรูทีนที่มีการเรียกใช้จริง ๆ เท่านั้น อย่างไรก็ตามแม้จะมีวิธี dynamiv linking ที่ไม่มีวิธี Segmentation hardware มาช่วย เสริมด้วยแล้ว ก็ยังคงอยู่ภายในเขตจำกัดที่กล่าวมานี้เช่นเดิม
วิธีการของ memory managment โดยวิธีที่เคยกล่าวผ่านมาล้วนอาศัยการทำ Multiprogramming มาใช้ เพื่อเพิ่มผลลัพท์ของระบบ แต่วิธีของ Segment นั้น นอกจากจะเพิ่มผลลัพธ์โดยวิธีนี้แล้ว ก็ยังทำให้เกิดการใช้ข้อมูลร่วมกันเกิดขึ้นอีกด้วย ดังรูปที่ 9.17


1
5
7
2
Job ที่1 address space








Job ที่ 2 address space


รูปที่ 9.17 แสดงการใช้สับรูทีนร่วมกันในระบบ Multiprogramming Segment

ในรูปที่9.17 มังานอยู่ 2 job แต่ละ job มี 4 segment แต่ว่าทั้ง 2 job ต้องการใช้ Segment SIN เหมือนกัน ในระบบอื่น ๆ ต่างก็ใช้ SIN ของใครของมัน แต่หากเป็นการใช้ข้อมูลร่วมกันแล้ว ก็ไม่จำเป็นต้องแยกใช้กันเลย โดยปกติผู้เขียนโปรแกรมมักใช้วิธีเขียนคำสั่งชุดแบบที่ซ้ำกันบ่อย ๆ ( Serially reusable ) คือเขียนครั้งเดียวแต่สามารถนำไปใช้ได้หลาย ๆ ครั้ง ลักษณะของชุดคำสั่งเช่นนี้บางทีอาจเป็นการกำหนดค่าเริ่มต้นทำงานที่เหมาะสมในแต่ละครั้ง โดยที่ค่าเดิมก่อนที่จะมีการเรียกใช้ ( call ) ครั้งก่อนมิได้มีผลกระทบเลย random number generator เป็นตัวอย่างอีกอันหนึ่งเช่นกันเพื่อให้การใช้ข้อมูลร่วมกันของ Segment ในการทำ Multiprogramming มีประสิทธิภาพนั้น ชุดคำสั่งต่าง ๆ ที่ใช้ร่วมกันควรจะเป็นลักษณะ re-entrant หรือ Pure-routine ด้วยคือ ชุดคำสั่งที่ไม่มีการเปลี่ยนแปลงค่าภายในตัวมันเองในทุก ๆ ครั้งที่มีการใช้งาน การใช้ชุดคำสั่งรน่วมกันนั้นสามารถทำเป็นคิวต่อกันได้ คือมี queue กับ inter lock แต่วิธีเหล่านี้ยุ่งยากซับซ้อนและบางทีก็ไม่มีประสิทธภาพที่ดีพอ
re-entrant routine ยอมให้มี multiple call และ execute ได้ก่อนที่การทำงานจะสมบูรณ์ ( Piority execute Complete ) การทำงานมักใช้การอ่านเป็นรหัสเข้ามาเท่านั้น โดยที่ใน pure procedure จึงจะไปทำงานกับตัวแปรที่เก็บค่าไว้ในรีจีสเตอร์หรือใน data segment อื่น ๆ เพื่อที่ว่าจะได้ไม่มีการเปลี่ยนแปลงค่าภายในตัวมันในการทำงาน แต่ในตัวอย่างที่ยกมาให้เห็นการ Dynamic linking นั้นมิใช่ตัวอย่างที่ดีของ pure- procedure เพราะยังมีคำสั่ง laod นั้นอยู่
ส่วนในรูปที่ 9.17 นั้น จะสามารถใช้ SIN ร่วมกันได้ ถ้าหากว่าเป็น pure-procedure ซึ่งเรียกใช้ data 1 และ data 2 ในรูปของตัวแปรเท่านั้น ซึ่งก็สามารถทำได้โดยเก็บ data Segment NO. ไว้ที่รีจีสเตอร์ดัชนีหรือรีจีสเตอร์ฐานนั่นเอง
library routine ก็มีบางระบบที่นำม่ใช้ข้อมูลร่วมกันกับ ส่วน file system, I/O routine ก็มีบางระบบที่นำมาใช้ร่วมกัน หรือแม้แต่ผู้เขียนโปรแกรมหลาย ๆ คนก็สามารถใช้ชุดของคำสั่งร่วมกันหรือร่วมใช้ data segment ร่วมกันก็ยังได้ หรือแม้แต่ PL/1 compiler, BASIC interpreter ก็เช่นกัน เช่นมี 10 jobs ที่ให้มีการแปลโปรแกรม PL/1 พร้อมกันโดยที่ตัวแปลภาษา PL/I Compiler ต้องใช้เนื้อที่ 100,000 ไบท์สำหรับ Program segment และอีก 10,000 ไบท์สำหรับ Data segment เพื่อเก็บเอาพวกตารางและตัวแปรต่าง ๆ ขณะทำการแปรเก็บไว้
เนื้อที่ในหน่วยความจำหลักทั้งหมดที่ต้องการทั้ง 10 jobs คือ 10(100,000+10,000) ไบท์ ซึ่งเท่ากับ 1,100,000 ไบท์ แต่การใช้งานร่วมกันเพียงการใช้ตัวแปลภาษา PL/I compiler segment ชุดเดียวกับอีก 10 data segment ก็จะใช้เนื้อที่จริง ๆ เพียง 200,000 ไบท์ ( ลดลง 82 % )
มาถึงขั้นนี้จึงเกิดความคิดว่า ทำไมไม่แบ่งหน่วยความจำหลักจริง ๆ ออกเป็น segment เสียเลย แต่ในทางปฏิบัตินั้นหน่วยความจำหลักเป็นผืนเดียวติดต่อกันไป จึงจำเป็นต้องมี segment map เกิดขึ้นเพื่ออเปลี่ยนลกษณะของ job segment ที่ผู้เขียนโปรแกรมมองเห็นนั้นให้อยู่ในสภาพของหน่วยความจำหลักจริง ๆ ซึ่งคล้ายๆ กับวิธีของ page map table นั่นเอง ดังรูป 9.18

(Main1)
1
(Data1)
3
(sin)
5
(cos)
7
Job1’s address
space

(Main2)
2
(Data2)
4
(sqrt)
(sin)
6
5
Job 2’s address
space
1
2
3
4
5
6
7
Segment map
Monitor
(Data 1)

(Main 1)

(Main 2)
(Data 2)
(sin)
(sqrt)
(cos)
Physical memory
Address 3/5
=segment map(3)+5

























รูป 9.18 Mapping of segment address space to physical memory.

กลไกทางฮาร์ดแวร์ของ segment map นั้นก็จะทำหน้าที่เปลี่ยน segment address ให้เป็น physical address จริง ๆ โดยอาศัยหมายเลขของ segment เป็นดัชนีในsegment map offset เข้าไปในค่าตำแหน่งเริ่มต้น ก็จะได้ตำแหน่งจริง ๆ ในหน่วยความจำหลัก
แต่ใน Segment map ก็ยังมีข้อมูลอื่น ๆ อีกเพื่อคอยแสดงว่าขณะนี้ Segment นั้นยาวเท่าไร ( Current Length ) โดยใช้ offset เป็นตัวชี้ โดยใช้ฮาร์ดแวร์ช่วย แล้วจึงติดต่อกับโปรแกรม Monitor โดยอาศัยการ Interrupt ต่อไป
เช่น Burrough 5500 ใช้วิธี Segment ที่กล่าวมาทั้งหมด แต่มีอุปสรรค 2 อย่าง คือ
1.เนื่องจากข้อกำหนดต้องให้ word ต่าง ๆ ของแต่ละ segment ต้องอยู่ติดกัน ดังนั้นจึงเกิด fragmentation โดยเฉพาะเมื่อ segment มีขนาดเพิ่มขยายขึ้น ปัญหานี้ก็จะเป็นปัญหาใหม่
2. ขนาดของ address space ทั้งหมด ถูกจำกัดที่ขนาดของหน่วยความจำหลักนั่นเอง คือมีปัญหาเช่นเดียวกับวิธี Relocatable Partition นั่นเอง

9.2.7 Segment – Paged Allocation
จุดมุ่งหมายเพื่อจะเชื่อมข้อดีเด่นของวิธีต่าง ๆ ที่เคยกล่าวมาแล้ว
Segmentation ข้อดีคือ
- sharing
- protection
paging ข้อดีคือ
- ช่วยแก้ปัญหา fragmentation
- ช่วยแก้ปัญหา compact บ่อย ๆ
Demand Paging ข้อดีคือ
- ช่วยตัดปัญหาสำหรับโปรแกรมขนาดใหญ่ ๆ หรือช่วยลดข้อจำกัดของขนาด address
space 67 รูปที่ 9.19 แสดงวิธี Segment ที่ใช้ Paging โดยใช้หนึ่ง Page table ต่อหนึ่ง Segment และแยกกันอยู่ ซึ่งทั้ง Segment และ Page Table ต่าง ๆ จะถูกเก็บไว้ในหน่วยความจำหลักมากกว่าที่จะเก็บไว้ในรีจีสเตอร์ เพราะฉะนั้นฮาร์ดแวร์จึงต้องสามารถเข้าถึงได้ 3 ชั้นของ instruction ได้ในการ load data word คือ
+ สำหรับทำกับ segment table
+ สำหรับ Page table ที่เป็นของ segment นั้น
+ แล้วจึงจะถึงตำแหน่งของ data จริง ๆ นั้น
ทั่ว ๆ ไปมักมีการนำเอา Buffer Memory ที่มีความเร็วสูงจำนวนน้อยไม่กี่ตัวเข้ามาช่วยงานในการจดจำ โดยจะจดจำ Segment ที่ใช้งานบ่อย ๆ กับ Page ซึ่งมีใช้ทั้งใน HIS-645 และ IBM 360 Model 67

(Main1)
1
(Data1)
3
(sin)
5
(cos)
7
Job1’s address
space

(Main2)
2
(Data2)
4
(sqrt)
(sin)
6
5
Job 2’s address
space
1
2
3
4
5
6
7
Segment table
Monitor
FREE
1
2
3
4
5
6
7
Page table
FREE
FREE
FREE
Physical memory
























รูปที่ 9 .19 Segment system using paging

แต่ถึงแม้ว่าจะมี Buffer เหล่านี้มาช่วย ก็ยังคงทำให้ความเร็วในการที่จะต้องทำ multilevel addressing (คือการค้นหาตำแหน่งของข้อมูลในหน่วยความจำหลักที่ต้องทำหลาย ๆ ขั้นนั้น)ทำให้ความเร็วไม่ดีขึ้นมาเท่าใดนัก ถึงแม้จะเลวลงไปประมาณ 10 % แต่ก็ถือว่าเป็นเรื่องสำคัญ ในลักษณะของการทำงานของโปรแกรมและของ memory buffer ที่มาร่วมงานนี้ โดยเฉพาะทำให้ราคาของฮาร์ดแวร์ต้องเพิ่มสูงขึ้น ซึ่งวิธีการ Segment-Page Allocation นี้ยังมีความสลับซับซ้อนอีกมากด้วย
ส่วนที่ 3
9.3 Processor Management
ระบบ multiprogramming นั้นสามารถเพิ่มผลลัพธ์ให้กับระบบดังที่เคยกล่าวมาในเรื่อง multiple processor กับ memory management มาแล้ว แต่ในหัวข้อนี้จะขอเสนอเรื่องของ multiprogramming และ multiprocessor โดยพูดถึงกลไกบางชนิด ซึ่งใช้กับเครื่องทั่ว ๆ ไป
ในการสับรูทีนร่วมกันและการควบคุม asynchronous และ interrupt ซึ่งเป็นปัญหาสำคัญมาก
โดยจะขอกล่าวถึงนิยามศัพท์บางคำก่อน ดังนี้
Process หมายถึง โปรแกรมซึ่งกำลัง execute หรืออีกนัยหนึ่งก็คือ 1 Process ก็คือ 1 single
Job

Address space หรือ Name space หมายถึง ค่าตำแหน่งที่เกี่ยวข้อง และสร้างขึ้นมาโดย
Process
Memory space หรือ Physical memory หมายถึง ค่าที่เป็นตำแหน่งภายในหน่วยความ
จำหลักจริง ๆ
Processor คือ ฮาร์ดแวร์ที่สามารถ execute ชุดของคำสั่งได้บางทีอาจจะมองลักษณะของ
Process ก็คือทางเดิน (path) ของ processor ที่ผ่านไปตาม address space ขณะที่ execute job นั้นอยู่ เพราะฉะนั้นที่เวลาต่าง ๆ กัน processor อาจจะอยู่ที่โปรแกรมระบบปฏิบัติการหรือโปรแกรมของผู้ใช้หรือโปรแกรมที่เรียกมาใช้ร่วมกันก็เป็นได้
Multiprogramming คือการที่ร่วมกัน execute สองโปรแกรมพร้อมกัน (หรือมากกว่า) โดย
Processor
Multiprocessing คือการที่มีการ execute พร้อมๆกันสอง (หรือมากกว่า ) processor ของ
ระบบ multi processor computer system
ปัญหาของพื้นฐานของ Processor Management คือการกำหนด processor ให้ทำงานกับ process ใด ๆ เพื่อให้เกิด overhead น้อยที่สุด
สภาวะของ process อาจมีได้ 3 ลักษณะ
Running 1. กำลังทำงาน (running) คือมีการ execute โดย processor อยู่ในขณะนั้น
Blocking 2. หยุดทำงานชั่วคราว คือ กำลังรอให้มีการทำงานอย่างใดอย่างหนึ่งเสียก่อน
Ready 3. พร้อมที่จะทำงานต่อ แต่รอจังหวะให้ processor มาจัดการ
ดังนั้น process จึงหยุดการทำงานลง เมื่ออยู่ในสภาวะที่ 2 กับ 3 ดังแสดงในรูป 9.20

process ได้รับ processor ต้องหยุดการ executeเพื่อให้ไป
Runningให้มา execute ได้แล้ว ทำงานบางอย่างเช่น I/O ก่อน
Ready
Blocked
หยุดการทำงานชั่วคราว ในกรณีที่เกิด interrupt เช่น หมดtime slice
รอให้งานบางอย่างทำให้เสร็จก่อน
เช่นให้ทำงาน I/O เสร็จก่อน





รูปที่ 9.20

รูป 9.20

สำหรับกลุ่ม process ที่กำลังรออยู่ในสภาวะ ready นั้น เรียกว่า ready list
การเปลี่ยนสภาวะจาก running ไปสู่ Blocking นั้น สืบเนื่องมาจากสั่งภายนอกเช่น speed I/O ของ channel หรือ อุปกรณ์ด้าน I/O ซึ่งนับเป็นงานส่วนใหญ่ของระบบปฏิบัติการในการทำงานอย่างนี้
เพราะฉะนั้นปัญหาของการจัดการ processor ก็คือ
1. Keep status จดจำสภาวะของแต่ละ process
2. Select process เลือก process จาก ready list ตัวที่จะเข้ามาทำงานต่อไป
3. Suspend process หยุดการทำงานของ process เมื่อหมด time slice
4. Coordinate มีการประสานงานร่วมกันในการติดต่อสื่อสารหากัน
ซึ่งส่วนของระบบปฏิบัติการที่มาทำงานทั้งหมดนี้ เรียกชื่อว่า traffic controller และ
ส่วนของ traffic controller ที่ทำหน้าที่ในการเลือก process นั้น (ข้อ2) เรียกว่า sheduler
Traffic controller ประกอบด้วย
1. กลไกในการที่จะเปลี่ยนแปลงสภาวะของ process
2. มี scheduler เพื่อช่วยการกำหนด processor ให้ไปทำงานกับ process เพื่อให้เกิด execute ต่ำสุดและยุติธรรมที่สุดต่อผู้ใช้ทุก ๆ คน
9.3.1 Scheduler
หน้าที่คือ 1. เลือกว่า process ใดใน ready list ที่จะนำมา run ต่อไป
2.กำหนด time-slice
เพราะเมื่อหมด time-slice แล้วจะเกิด timer interrupt ขึ้นทำให้ process ต้องกลับไปในสภาวะเดิมชั่วคราว
มีสองประเด็นในกลไกของ scheduler คือ (โดยทั้งสองประเด็นจะต้องมี ready list ด้วย ) ดังนี้
ทางที่ 1 ต้องมีรายการเป็นที่จัดเรียงลำดับไว้ตลอดเวลา เมื่อมีการนำเอา process ใด ๆ เข้ามาไว้ใน ready list ก็จะต้องจัดเรียงใหม่เสมอ ดังนั้นเมื่อ processor ว่างลงก็จะดึงเอา process แรกในรายการลำดับแรกไปทำงานได้ทันที
ทางที่ 2 เอา process เข้าไปไว้ในรายการแบบสุ่ม (random) เมื่อ processor ว่างลง ก็จะให้สำรวจหมดทุกรายการ แล้วจึงค่อยตัดสินใจ ว่าจะเอา process ใด
ซึ่งอีกแนวทางที่เคยทำกันมาคือการให้ priority แก่ process ต่าง ๆ เพื่อใช้ประกอบกับนโยบายของการทำ scheduling ด้วย ทั้งนโยบายและ priority นั้นขึ้นอยู่กับปัจจัยหลายอย่าง เช่น
1. bought คือผู้ใช้ต้องเสียค่าใช้จ่ายในระดับสูง เพื่อซื้อให้ได้ priority ที่สูง เพื่อจะทำให้งานของตนเองได้ถูกเลือกให้เข้าทำงานเร็วขึ้น
2. Required คือ กำหนด priority ตามลำดับของความสำคัญ เช่น งานเร่งด่วน งานที่อาทิตย์หนึ่งค่อยทำครั้งหนึ่ง (ก็จะกำหนดให้มี priority น้อยกว่า) เป็นต้น
3. Reserved ในบางกรณีควรจะให้ระบบตัดสินใจเองว่าควรจะให้ priority เท่าใดกับงานนั้น ๆ เช่น งานสั้น ๆ ก็อาจให้ priority สูง ๆ เพื่อจะได้ทำเสร็จได้โดยเร็ว หรือเพื่อปรับให้เกิดความสมดุลย์แก่งานทั้งหมดที่มีอยู่มนขณะนั้น เช่น งานซึ่งมีงานด้านรับ-ส่งข้อมูลหรือการอ่าน-เขียนข้อมูลมาก ๆ (I/O bound) กับงานที่มีด้านรับส่งข้อมูลน้อย ๆ แต่มีการคำนวณมาก ๆ ( CPU bound ) ให้มีการทำงานไปพร้อม ๆ กัน ถ้าหากมีงานที่เป็นด้านใดมากเกินไปอาจทำให้ channel ทำงานเกินขีดจำกัดหรือทำให้หน่วยประมวลผลกลางว่างงาน ดังนั้นเพื่อให้เกิดประโยชน์สูงสุดแกระบบก็คือให้มีการกำหนด priority เพื่อที่จะรักษาการผสมผสานกับการปรับความสมดุลย์ของภาระงานทั้งหมดให้พอดีกัน แต่อย่างไรก็ตามก็ยังเกิดความขัดแย้งกันในนโยบายอยู่อีกระหว่างงานต่าง ๆ เพื่อให้เกิด
- ความเสมอภาคกัน
- ระบบเกิดประสิทธิภาพมากที่สุด
- ให้มีผลลัพธ์ทางธุรกิจที่ดีกว่า
รูปที่ 9.21 จะเป็นขั้นตอนวิธีที่ดีกว่าในรูป 9.20 โดยยังแบ่งสภาวะ ready block แบ่ง
ย่อยลงไปอีกและนโยบายในการ scheduling ก็ใช้วิธี Desired ซึ่งใช้ในระบบ time-sharing ที่มีการใช้ paging เข้าช่วย โดยการบล็อกจะถูกแบ่งออกเป็นอีก 3 สภาวะ
- block สำหรับ I/O terminal
- block สำหรับ tape หรือ disk I/O
- block สำหรับ paging I/O
ready ก็ยังแบ่งออกเป็น 3 สภาวะอีก
- CPU bound
- High priority I/O bound
- Medium priority I/O bound
นโยบายก็คือ
- เลือก process จาก high-priority ready list ก่อน
- ถ้าไม่มี ก็จะเลือกเอา medium priority ready list
- และ low priority สูงกว่า
จุดสำคัญของรูป 9.21 คือ

Low –priority
Ready
(CPU-bound)

Running
Medium –priority
Ready
(I/O-bound)

Blocked
For disk or
Tape I/O

Hight–priority
Ready
(I/O-bound)

Blocked
For terminal I/O

Blocked
For Paging I/O

I/O completed
I/O completed
Request terminal I/O
Page fault
I/O completed
Run for 100 ms
Run for 500 ms
Run for 100 ms
Request disk or I/O tape
Exceeded time limit





















รูปที่ 9.21 Scheduling state transition for a process

สำหรับงานที่เป็น I/O bound นั้นจะถูก block นาน กว่าจะทำงานเสร็จ จึงพยายามให้มี priority สูงไว้ก่อน ทั้งนี้ก็เพื่อให้ถูกสั่งทำงานก่อนงานที่เป็น CPU bound เพื่อให้ I/O channel และ device ทำงานอย่างเต็มที่ ดังในตัวอย่างคือ งานที่ทำ I/O คืองานที่กำหนด time-slice ต่ำกว่า 100 ms.
สำหรับงานที่เป็น CPU bound มักจะกำหนด time-slice ให้เป็น 5 เท่า คือ ให้เป็น 500 ms. แต่ทั้งนี้จะต้องทำงานทีหลังที่ง่าน I/O ผ่านไป ดังนั้นจึงมีนโยบายกำหนดให้ priority ต่ำ ๆ เมื่อมีการ block

9.3.2 Traffic Controller
งาน 4 อย่างของ traffic controller คือ
- keep status of process
- select process to run next
- change status
- coordinate interprocess communication
ในข้อที่ resume process นั้น traffic controller จะต้องเก็บสภาวะสภาพการทำงานใน
status-word ก็จะประกอบด้วย
- content ของรีจีสเตอร์ต่างๆ
- instruction address
- condition code และอื่น ๆ
Traffic controller จะถูกเรียกจาก
- ภายนอกเช่น I/O request
- ภายใน เช่น interrupt ซึ่งได้แก่ I/O complete , timer interrupt , page fault interrupt
การทำงานแบบ interprocessor communication อาจมีหลาย ๆ process ที่ process หนึ่งต้องการให้อีก process หนึ่งเข้าสู่ ready list และอีกหนึ่งเข้าสู่ work state หากอนุญาตให้กระทำได้แล้ว traffic controller ก็จะต้องสามารถรับการ call ซึ่งจะส่งผลให้อีก Process หนึ่งเข้าสู่ block และ traffic controller อยู่ โดยมีเงื่อนไขบางอย่างจึงจะทำงานต่อไปได้
ในเรื่องของการจัด Processor และการติดต่อระหว่าง process นั้นมีเรื่องที่น่าสนใจอยู่ 2
อย่างคือ race กับ deadly embrace

9.3.3 Race Condition
เกิดจากการใช้ข้อมูลหรืออุปกรณ์ร่วมกันโดยหลาย ๆ Process ต้องการทำงานในขณะเวลาตรงกัน Race condition เกิดขึ้นจากปัญหาในการ scheduling กับสอง process ซึ่งลำดับของ scheduling ต่าง ๆ ของมัน ส่งผลให้เกิดการคำนวณแตกต่างกัน ดังตัวอย่างในรูป 9.22 ทำ multi-programming อยู่ด้วย

supervisor
Process 1
Process 2
Printer
Printer Request
Printer Request







รูป 9.22

ตามปกติโปรแกรมระบบปฏิบัติการซึ่งมี Traffic controller จะเป็นผู้ทำหน้าที่ request คือมีการกำหนดทรัพยากรต่าง ๆ เช่นอุปกรณ์จัดเก็บข้อมูลต่าง ๆ ให้มาทำงาน เมื่อทำงานเสร็จก็จะปล่อยคืน หากมี process ใดที่ request อุปกรณ์ที่กำลัง block อยู่กล่าวคือถูกใช้งานอยู่ process นั้นก็จะถูก block ให้รอคิวเมื่อคิวว่างแล้วจึงจะทำงานตาม request ได้ เทคนิคในการทำสิ่งเหล่านี้เรียกว่า interblocking หรือ synchronizing และ การ request กับ ปล่อยคืนดังที่กล่าวมาแล้วนั้น ก็เป็นที่รู้จักกันดีในเทคนิคชื่อ P กับ V

9.3.3 Stalemates
นับเป็นในอีกสภาวะหนึ่งที่ process สองตัวหรือหลาย ๆ ตัว ต่างก็ไม่ทราบว่ากำลัง
รอคอยการใช้อุปกรณ์ที่ว่างอยู่พร้อม ๆ กัน โดยคิดว่าอุปกรณ์นั้นไม่ว่างเพราะถูกอีก process ใช้งานอยู่ การทำ race นั้นยังไม่สามารถที่จะแก้ไขปัญหาออกไปได้หมดโดยการทำ request กับ release ดังที่กล่าวแล้วและอาจยังทำให้เกิดปัญหาขึ้น stalemate คือคนต่างยันกันอยู่อย่างนั้นจะทำอะไรต่อไปก็ไม่ได้ หรือ บางทีอาจเกิด deadly emoraces ไปเลยขอให้พิจารณารูป 9.23






SupervisorProcess

request printer
request reader
Release printer
Release reader

Printer Ar1
A Ar2
Ar3
Ar4

request reader
request printer
Release printer
Release reader

Card Reader Br1
B Br2
Br3
Br4

รูป 9.23 แสดงสภาวะ Stalemate

ทั้ง process A และ B ต่างก็มีการใช้เครื่องพิมพ์กับเครื่องอ่านบัตรร่วมกันและหากมี scheduling ต่าง ๆ กัน ก็จะได้ดังนี้ ตัวอย่างเช่น
1. Ar1,Ar2,Ar3,Ar4,Br1,Br2,Br3,Br4
2. Br1,Br2,Br3,Br4, Ar1,Ar2,Ar3,Ar4
3. Ar1,Ar2,Br1,Ar3,Br4,Ar4,Br2,Br3,Br4
จะเห็นว่าในวิธีที่ 3 process B จะถูก block โดย Br1 หรือจะต้องรอจนกว่า process A
จะสั่ง Ar4 มาให้จึงจะทำต่อไปได้ ลองพิจารณาปัญหาต่อไปนี้ตามลำดับ
อันแรกถ้ามี Ar1 ต่อมาคือ Br1 และถ้าหากลำดับที่ 3 เป็น Ar2 เพราะฉะนั้น process A ก็จะถูก block และ process B ก็จะถูก block เช่นกัน นั่นคือเกิดกรณี Statement ทั้งสอง process คือ A และ B ต่างยันกันอยู่ ซึ่งมักจะเกิดขึ้นได้ในระบบ multiprogramming

9.3.4 Multiprocessor System
(อ่านเพิ่มเติมจาก multiprogramming system : A Comparative Study ของ M.
SATYANARANAN 1980. Prentice-Hall )
เพื่อเพิ่มผลลัพธ์จึงมีการเพิ่มจำนวน processor ขึ้นมาอีก ในระยะแรก ๆ ก็มีการเพิ่ม
Processor เข้ามาเพื่อให้มาทำหน้าที่เฉพาะอย่าง ( specialize function ) เช่นใน I/O channels ระบบ multiprocessor system ก็อาศัยหน่วยประมวลผลกลางที่มีขนาดใหญ่ และมี peripheral processor หลาย ๆ ตัว (เช่นในเครื่อง CDC 6600) ซึ่งในกรณีนี้อาจเพิ่มงานให้มีความสลับซับซ้อนมากยิ่งขึ้นได้ อีกตัวอย่างหนึ่งของ Multiprocessing ก็คือ เครื่อง HIS G45 system ซึ่งมีหน่วยประมวลผลกลางมากกว่าหนึ่งตัว โดยแต่ละตัวก็มีความสามารถเท่าเทียมกัน และอีกตัวอย่างของระบบ multiprocessor ก็คือระบบคอมพิวเตอร์เครือข่ายทั่วๆไป ซึ่งนับเป็นแบบที่นิยมกันมากที่สุดในปัจจุบัน
supervisor
Processor A
Processor B
Processor C
Processor D
Processor no.2
Processor no.1
Memory







รูปที่ 9.24 แสดงลักษณะของ multiple Processor ที่ใช้ในการ multiprogramming

มีหลายๆ process อยู่ในหน่วยความจำหลัก (ซึ่งบางทีอาจเป็นเพียงบางหน้าของงานก็ได้) แล้วจะมี process อยู่จำนวนหนึ่งที่ processor กำลังทำงานอยู่ด้วย เมื่อ process ที่ถูก block นั้นออกจากสภาวะ block แล้ว ก็จะมี processor (ซึ่งอาจเป็นตัวไหนก็ได้ ไม่จำเป็นต้องเป็นตัวเก่า) เข้ามาจัดการต่อไป
ในรูป 9.25 แสดงการเกิด block ของ Single processor คือเกิด interlock
Supervisor
Process A
Process B
Process C
Process D
Processor
Needs tape
Needs tape








รูป 9.25
ครั้งแรก process A ขอทำงานกับเครื่องขับเทปแม่เหล็กก่อน ต่อมา process D ขอบ้างก็จะถูก block เพราะ process A ยังทำงานไม่เสร็จ ต้องรอจนกว่า process A ทำงานกับเครื่องขับแม่เหล็กดังกล่าวเสร็จสิ้นเสียก่อน จึงจะให้ process D ทำงานกับเครื่องขับเทปแม่เหล็กตัวดังกล่าวต่อไปได้ การ block นั้นจะเป็นการสับเปลี่ยนของ process ส่วน processor นั้นเป็นเพียงการสับเปลี่ยน (switch) งานที่ทำเท่านั้น โดยมิได้หยุดทำงานแต่อย่างใดเลย การทำงานโดยทั่วไปของ Multiprocessor ก็เหมือนๆกับมี processor เดียวที่มีเทคนิคบางอย่างที่นำมาใช้ร่วมใน Multi processor เช่น
software processor lockout คือมีการใช้ส่วนของข้อมูลบางอย่าง (data base) ของ processor หลายๆตัวด้วยกัน
ในที่นี้จะขอกล่าวตัวอย่างดังนี้ คือ
รูปที่ 9.26 แสดงข้อขักแย้งกันในการทำงานกับ Single Processor
รูปที่9.27 แสดงการมี 2 Processor
รูปที่ 9.28 แสดงผล Solution

Next Serving
17


Work List


Processor


รูปที่ 9.26 Scheduling single Processor.

เนื้อหา process โดย เสร็จแล้วก็จะต้อง
1. ค้นหาตำแหน่งของ process ที่ทำเสร็จแล้วใน work list
2. ใส่เครื่องหมายว่า complete แล้ว
3. ดูว่า process ต่อไปคืออะไร (หมายเลข 17)
4. ค้นหา process นั้น (คือ 17) ใน work list
5. ในเครื่องหมายว่า process นั้นกำลังหาอยู่
6. เปลี่ยนหมายเลขเป็นหมายเลข process ต่อไป




Work List
(Share data Base)
Next Serving
17
Processor no.1
Processor no.2







รูปที่ 9.27 Scheduling ของ 2 processors

สมมติว่าทั้ง 2 processor ทำงานเสร็จพร้อม ๆ กัน
1. processor no.1 ค้นหา process ที่ทำงานเสร็จแล้วใน work list
2. processor no.2 ค้นหา process ที่ทำงานเสร็จแล้วใน work list
3. processor no.1 ใส่เครื่องหมายว่า process นั้น complete แล้ว
4. processor no.2 ใส่เครื่องหมายว่า process นั้น complete แล้ว
5. processor no.1 ใส่ว่า process ต่อไปคือ 17
6. processor no.2 ใส่ว่า process ต่อไปคือ 17
7. processor no.1 ค้นหา process 17 ใน work list และใส่เครื่องหมาย
8. processor no.2 ค้นหา process 17 ใน work list และใส่เครื่องหมาย
9. processor no.1 เลื่อนหมายเลขเป็นเลขต่อไป (18)
10. processor no.2 เลื่อนหมายเลขเป็นเลขต่อไป (19)
จะเห็นว่าในช่วงแรกทั้งสอง processors จะทำงาน process 17 ซึ่งเป็น process เดียวกัน และต่อไปจะเห็นว่า process 18 จะไม่ถูกทำเลยโดยจะมีการกระโดดข้าม
ข้อมูลที่มีการใช้ร่วมกันคือรายชื่อของ process ทั้งหมดพร้อมทั้งข้อมูลเกี่ยวกับสถานะของแต่ละ process ซึ่งเรียกรายการนี้ว่า job queue หรือ task queue หรือ ready list หรือ work list






Next Service
17


Work List
(Share data Base)
Locked
open
Only One door at a time
Can be open





รูปที่ 9.28 Scheduling ของ multiprocessor with lockout

ในรูป 9.27 นั้นทั้งสอง processor ทำงานเสร็จพร้อมกันแล้วยังใช้ scheduling เดียวกันอีก แต่ว่าทั้งสองต่างทำงานเป็นอิสระต่อกันจึงเกิดสภาวะปัญหาดังที่กล่าวมาแล้ว แนวทางในการแก้ไขปัญหาสามารถหาได้โดยให้มีการทำงานแบบทีละ processor ดังรูปที่ 9.28 คือก่อนที่จะเข้าทำงานใน database ที่ใช้ร่วมกันนั้น processor ต้องตรวจสอบ lock bit ก่อนว่า database ว่างงานหรือไม่ (คือมี processor อื่นที่ใช้อยู่หรือไม่) ถ้าว่างจึงเข้าไปทำงานได้พร้อมกับ set bit ของ lock bit ไว้ด้วย เมื่อเสร็จงานแล้วจึง reset bit ใหม่ ซึ่งการแก้ปัญหาเหล่านี้ อาจก่อให้เกิดผลทำให้หลาย ๆ processor ต้องเสียเวลารอคอยมาก ซึ่งก็แสดงว่า software lockout เป็นตัวที่ทำให้ processor ว่างงานเสียเองได้

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

9.4.1 Device Characteristics
peripheral มีมากมายหลายประเภท โดยแบ่งกลุ่มใหญ่ๆ ได้ 2 กลุ่มคือ
- อุปกรณ์รับ-ส่งข้อมูล (Input/Output Devices) ซึ่งเคยกล่าวมาบ้างแล้วพร้อมกับเรื่องของ I/O programming
- อุปกรณ์บันทึกและจัดเก็บข้อมูล (Storage Device) ซึ่งมีการเขียนข้อมูลและการอ่านข้อมูลและได้จัดแบ่งประเภทออกไปอีกดังนี้
1. serial access storage ข้อมูลจะถูกอ่านและเขียนเป็นไปเรียงตามลำดับเสมอ การ
ค้นหาข้อมูลส่วนใด ๆ ก็ใช้วิธีค้นหาแบบ linear search ซึ่งจะกินเวลาถึงครึ่งหนึ่งในการอ่านข้อมูลทั้งหมด อุปกรณ์ลักษณะนี้ได้แก่ เครื่องขับแม่เหล็ก เครื่องอ่าน-เครื่องเจาะบัตร
เครื่องขับเทปแม่เหล็ก (Magnetic Tape Drivers) ใช้เทปแม่เหล็กเป็นสื่อในการจัดเก็บข้อมูลซึ่งสามารถเก็บข้อมูลได้ประมาณ 1600 ไบท์ต่อนิ้ว หมุนด้วยความเร็วประมาณ 200 นิ้วต่อวินาที ม้วนเทปแม่เหล็กมีความยาวหลายขนาด ตั้งแต่ 800 ฟุต จนถึง 2400 ฟุต งานที่เหมาะสมกับเทปแม่เหล็ก ได้แก่ งานที่เป็น sequential access เช่น intermediate file copy ซึ่งสร้างโดย pass 1 ของ Assembler เป็นต้น
2. Direct access storage หรือ Random Access Storage Device DASD (Direct Access Storage Device) เช่น ชุดเครื่องขับจานแม่เหล็ก ซึ่งปกติมักสามารถทำงานได้ทั้งแบบ sequential และ direct access นอกจากนี้ยังมีดรัมแม่เหล็กและอื่น ๆ

9.4.2 Device Management Techiques
ในระบบ Simple Batch monitor คือ ระบบที่สามารถทำงานได้ทีละงานเท่านั้นและสามารถใช้อุปกรณ์ตัวไหนก็ได้ในระบบ ซึ่งทำให้อุปกรณ์หลาย ๆ ตัวต้องว่างงาน ต้องอาศัยระบบ multiprogramming เข้าช่วยเพื่อทำให้อุปกรณ์เหล่านี้มีงานทำมากขึ้น จุดประสงค์หลักก็เพื่อให้อุปกรณ์ต่าง ๆ ทำงานให้เกิดประสิทธิภาพมากที่สุด โดยให้ผลลัพธ์ของงานในระบบเพิ่มขึ้น
การกำหนดอุปกรณ์ให้ทำงานกับงานต่าง ๆ นั้นแบ่งออกเป็น 2 รูปแบบ
1. Dedicate
2. Shared access
Dedicate
อุปกรณ์บางประเภท เช่น เครื่องอ่านบัตร เครื่องพิมพ์ เครื่องขับเทปแม่เหล็ก ในขณะใดขณะหนึ่งสามารถทำงานได้กับงานทีละงานเท่านั้น ซึ่งคิดแล้วคล้ายกับเสียผลประโยชน์
ในกรณีของ multiprogramming นั้นสมมติว่าทุก ๆ งานต้องการพิมพ์รายงานออก แต่ในระบบมีเครื่องพิมพ์เพียง 2 เครื่องเท่านั้น เพราะฉะนั้นก็จะทำให้ระบบmultiprogramming ทำได้แค่ 2 งานเท่านั้นซึ่งทำให้เสียผลประโยชน์ การแก้ปัญหานี้ก็คือการใช้เทคนิคที่เรียกว่า SPOOLing (Simultanous Peripheral Operation On-line) คือ ข้อมูลที่จะสั่งออกไปพิมพ์นั้นให้นำไปพักไว้ก่อนที่ส่วนของหน่วยความจำบางแห่งหรืออาจเป็นบัฟเฟอร์ แล้วรอให้งานต่าง ๆ เสร็จแล้วหรือเครื่องพิมพ์นั้นว่างจึงค่อยส่งออกไปพิมพ์ ในทำนองเดียวกันหากเป็นการอ่านข้อมูลเข้าก็จะให้นำข้อมูลไปเก็บในที่บางแห่งก่อนเช่นกัน แล้วรอจนกว่าหน่วยประมวลผลกลางจะเรียกข้อมูลเหล่านั้นไปใช้ เช่นนี้ก็จะสามารถใช้งานอุปกรณ์ดังกล่าวให้เกิดประสิทธิภาพมากขึ้น
Shared Access
อุปกรณ์บางประเภท เช่น ชุดจานแม่เหล็ก ดรัมแม่เหล็ก และอุปกรณ์ประเภท data cells ต่างๆ สามารถทำงานกับหลายๆ งานได้พร้อมกัน แต่ก็มีปัญหาสองประการซึ่งต้องงอาศัยโปรแกรมระบบปฏิบัติการเข้ามาช่วยในด้านการจัดการ
ปัญหาแรก ถึงแม้ว่าจะสามารถอ้างอิงหรือสั่งทำงานระหว่างกันของงานหลาย ๆ งานได้ก็ตาม แต่อุปกรณ์ก็สามารถทำงานให้กับทีละงานในขณะใดขณะหนึ่งเท่านั้น คือการอ่านหรือการบันทึกข้อมูลต่อหนึ่งอุปกรณ์เท่านั้น หากมีงานหลาย ๆ งาน รอคอยทำงานกับอุปกรณ์หนึ่ง ๆ พร้อมกันแล้ว โปรแกรมระบบปฏิบัติการก็จะต้องเข้ามาจัดการให้ คือส่วนที่เรียกว่า I/O traffic control การทำงานของ I/O traffic control ที่มีประสิทธิภาพจะมีผลต่อระบบ multiprogramming หรือในระบบเครื่องคอมพิวเตอร์ใหญ่ ๆ รวมทั้งผลลัพธ์ของระบบทั้งหมด ลักษณะของ I/O traffic control จะขึ้นอยู่กับลักษณะของอุปกรณ์ที่นำมาเชื่อมต่อเข้ากับระบบ และขึ้นอยู่กับลักษณะของหน่วยประมวลผลกลางด้วย
ปัญหาที่สอง คือต้องการมาตรการป้องกันที่งานๆหนึ่งจะไปทำลายอีกงาน ๆ หนึ่ง ซึ่งอย่างการทำงานในระบบ multiprogramming มักมีลักษณะเป็น master/slave (หรือ supervisor/problem หรือ privileged/non privileged)
Non-privileged state บางคำสั่ง เช่น การสั่งงานด้านรับ-ส่งข้อมูล หรือการกำหนดการภาวะ protection setting ก็จะมีการตรวจสอบความถูกต้องของคำสั่ง (Illegal) เสียก่อนแล้วจึงเกิด control ส่งไปที่ระบบปฏิบัติการต่อไป โปรแกรมระบบปฏิบัติการเองก็จะทำงานกับ privileged state เท่านั้น
เพราะฉะนั้นการรับ-การส่งข้อมูลทุกครั้งจะต้องเริ่มต้นที่ระบบปฏิบัติการ การเรียก I/O แต่ละครั้งก็จะตรวจสอบโดยระบบปฏิบัติการ โดยมีฮาร์ดแวร์ส่วนหนึ่งคอยควบคุมด้วย

9.5 Information Management
หน้าที่ที่สำคัญอันหนึ่งของโปรแกรมระบบปฏิบัติการก็คือประสิทธิภาพในการจัดการ
ข้อมูลข่าวสาร และจะเป็นแหล่งของข้อมูลข่าวสารต่าง ๆ ที่ทุกงานต่าง ๆ จะเข้ามาใช้ข้อมูลข่าวสารเหล่านี้ร่วมกัน ส่วนของระบบปฏิบัติการที่คอยจัดการเกี่ยวกับส่วนนี้จะเรียกว่า File System
File System จะทำหน้าที่เกี่ยวกับการจัดการจัดเก็บข้อมูลต่าง ๆ ในด้านทางกายภาพ เช่น ตำแหน่งที่จัดเก็บ (Physical Address) รูปแบบของการจัดเก็บ (Storage format) การอ่านเขียนข้อมูล (I/O Access) ดังนั้นผู้เขียนโปรแกรมก็จะสนใจแค่ว่าจะจัดโครงสร้างข้อมูลาทางตรรก (Logical Structure) และการสั่งกระทำหารต่าง ๆ กับข้อมูลดังกล่าวเท่านั้น นอกจากนี้ File System อาจจะให้มีการใช้ข้อมูลร่วมกันระหว่างผู้ใช้หลาย ๆ คนร่วมกันได้ (share) รวมทั้งจะต้องมีมาตรการในการป้องกันข้อมูลจากผู้ที่ไม่มีสิทธิในข้อมูลบางอย่างอีกด้วย ต่อไปนี้จะขอกล่าวถึงเฉพาะส่วนของ File System เฉพาะในระดับของผู้เขียนโปรแกรมโดยจะไม่กล่าวลึกลงไปถึงระดับการประยุกต์
ก่อนอื่นขอแยกความแตกต่างของศัพท์ต่อไปนี้
1. File System จะเป็นระบบที่เกี่ยวข้องกับการจัดองค์กรของข้อมูลข่าวสารในทางตรรกยะ การจัดเก็บรวบรวมข้อมูล (Collection) ซึ่งจะเป็นการจัดข้อมูลที่มีโครงสร้างและรูปแบบที่อาจไม่แน่นอนในระดับของระบปฏิบัติการ โดยแต่ละกลุ่มของข้อมูลข่าวสารที่ต่างกันนั้นจะเรียกว่า ไฟล์
2. Data Management System เป็น file system ที่ทำหน้าที่เกี่ยวกับโครงสร้างของข้อมูลโดยเฉพาะ เช่นการจัดองค์กรของข้อมูล (Organization etg. Sequential Structure, Indexed Sequential Structure,Direct Structure) ซึ่งเป็นส่วนที่ผู้เขียนโปรแกรมจะเข้ามาทำงานร่วมอยู่ด้วยเสมอ
3. Data Base System จัดเป็น file system ที่ทำงานเกี่ยวข้องกับโครงสร้างและการตีความของรายการข้อมูลพร้อม ๆ กันไปด้วย เช่น ระบบข้อมูลสำรองของสายการบินโดยจะเน้นบริการข้อมูลข่าวสารแก่ผู้ใช้ทั่ว ๆ ไป (Ended-Users) ให้สะดวกในการใช้ข้อมูล
** ไฟล์ (File) คือการจัดรวบรวมหน่วยของข้อมูลย่อย ๆ ที่เป็นเรื่องเดียวกันสัมพันธ์กัน (Records) มาจัดเก็บไว้เป็นหน่วยเดียวกันเพื่อให้เกิดความสะดวกรวดเร็วในการอ้างอิงถึง

9.5.1 วิวัฒนาการของระบบไฟล์
Pre-file System ERA เป็นสมัยแรกเริ่มที่แยกประเภทของไฟล์โดยการใช้สีของบัตร
เจาะรูต่าง ๆ เป็นตัวช่วยแยกให้เป็นไฟล์ต่าง ๆ กล่าวคือยังไม่มีการเก็บข้อมูลไว้ในเครื่องคอมพิวเตอร์อย่างถาวร จึงเป็นหน้าที่ของผู้เขียนโปรแกรมเองที่จะต้องจัดการข้อมูลต่าง ๆ ที่จำเป็นเองทั้งหมด เช่น ไฟล์ของตัวแปลโปรแกรมภาษาต่าง ๆ ชุดคำสั่งย่อยหรือสับรูทีนต่าง ๆข้อมูล และอื่น ๆ ดังตัวอย่างเช่นเมื่อต้องการใช้ตัวแปลภาษา โหลดเดอร์และสั่งทำงานกับโปรแกรมที่เขียนขึ้นด้วยภาษาฟอร์แทรน ผู้เขียนโปรแกรมก็จะต้องมีปีกของบัตรเจาะรูที่เป็นตัวแปลภาษาฟอร์แทรน และโหลดเดอร์ โดยแต่ละปีกของบัตรเจาะรูเหล่านั้นก็มักจะต้องเป็นสีต่างๆ กัน เพื่อไม่ให้เกิดการสับสนใรการใช้งาน ระบบนี้นับเป็นระบบที่เก่าแก่มาก
Early File System (System Tape) ใช้บัตรควบคุม (Control Card) ช่วยในการเรียกใช้ system tape มาทำงานก่อน โดยที่โปรแกรมระบบงานต่างๆ (System Programs ) ที่จำเป็นต้องใช้งานจะต้องถูกบรรจุอยู่แล้วในเทปแม่เหล็กดังกล่าว
โปรแกรมระบบงาน เช่น ตัวแปลภาษาต่าง ๆ โหลดเดอร์ จะถูกบันทึกจัดเก็บไว้ที่เทปแม่เหล็กหรือชุดจานแม่เหล็ก โดยเรียกส่วนนี้ว่า “system tape” ผู้เขียนโปรแกรมเพียงแต่ระบุข้อมูลที่ต้องการในบัตรควบคุมเท่านั้น เครื่องคอมพิวเตอร์ก็จะไปนำเอาโปรแกรมระบบงานที่ต้องการมาบรรจุลงในหน่วยความจำให้ทันที กลุ่มของบัตรควบคุมเหล่านี้จะมีรูปแบบของคำสั่งต่างหากเรียกว่า JCL (Job Control Language)
Library File System ใช้ library ซึ่งจะอยู่ที่ส่วนแรกของโปรแกรมเพื่อใช้ระบุถึงตำแหน่งของ library tape ว่าอยู่ที่ใด ภายใน library tape จะเก็บพวก system tape เอาไว้ librarian นี้จะทำหน้าที่เรียกโปรแกรมที่ต้องการเข้ามาหรือดึงโปรแกรมที่ไม่ต้องการออกไป และจะคอยเรียกเก็บ index directory เอาไว้เพื่อคอยระบุว่าแต่ละโปรแกรมนั้นอยู่ที่ใด เมื่อระบบปฏิบัติการอ่านคำสั่งมาจากบัตรควบคุมแล้ว ก็จะรู้ว่าต้องการโปรแกรมใดอีกบ้างในการทำงาน แล้วจะไปค้นหาที่ index directory ของ librarian เพื่อหาตำแหน่งที่เก็บโปรแกรมเหล่านั้นและไปอ่านมาให้

General File System
แม้ library สามารถจัดการกับปัญหาของการจัดการและการนำโปรแกรมไปเก็บแต่อย่างไรก็ตามยังไม่ได้ช่วยสำหรับข่าวสารอื่น ๆ ได้ เช่น ไฟล์ข้อมูลซึ่งมีอยู่มากมายหลายประเภท ในระบบ general file system นี้ผู้เขียนโปรแกรมสามารถเก็บข้อมูลเหล่านี้ได้โดยง่ายและยังสามารถกลับมาทำงานหรือเปลี่ยนแปลงแก้ไขในภายหลังได้อีกด้วย

9.5.2 Structure of General File System
ในรูปแบบการอ้างอิงที่ file system จะต้องจัดการนั้น อยู่ในรูปดังนี้
READ file (D) from location (F ) into location (M) for (n) location
กล่าวคือในคำสั่งจะต้องระบุว่าต้องการ
- ชื่อไฟล์อะไร (D)
- ที่เก็บอยู่ที่ตำแหน่งใด (F)
- จะเอาไปเก็บไว้ที่ตำแหน่งใด (M)
- จะเอาข้อมูลมาเท่าใด (n)
การจัดองค์การไฟล์มีหลายแบบ เช่น sequential record (เรคอร์ดจะถูกทำงานเรียงตามลำดับ) direct access record (เรคอร์ดจะถูกทำงานกับตัวใดก็ได้ไม่จำเป็นต้องเรียงลำดับ)
การทำงานของ file system พอจะแบ่งได้ดังนี้คือ
1. Accessing Method
2. Logical File System
3. Basic File System
4. File Organization Strategy
5. Allocation System Strategy
6. Device Strategy
7. I/O Control System
ตัวอย่างเช่น ผู้เขียนโปรแกรมต้องการให้มีการอ่านข้อมูลเข้ามา
Logical File System จะรับชื่อไฟล์ที่เขียนเป็นสัญลักษณ์ (symbolic name) แล้วค้นหาหมายเลขที่สอดคล้องกัน (numeric file identifier)
Basic File System นำหมายเลขไปหา file description มาให้
File Organization Strategy ใช้ file description ไปค้นหาตำแหน่งจริง
Device Strategy สร้าง I/O command ที่จะไปทำงานกับข้อมูลที่ต้องการ
I/O Control System จะ execute คำสั่ง ของ file command นั้น
9.5.3 Example of a File System
สมมติไฟล์ชื่อ ALPHA ถูกเก็บไว้ภายในดรัมแม่เหล็ก ซึ่งประกอบด้วย 11 เรคอร์ด
File Alphaโดยแต่ละเรคอร์ดยาว 250 ไบท์ รูปที่ 9.33 จะแสดงลักษณะของอุปกรณ์เก็บข้อมูลที่มีเรคอร์ดจริง ๆ ยาว 1000 ไบท์ ซึ่งนิยมเรียกว่า บล็อก block มากกว่า เพื่อลดปัญหาเรื่อง file logical record จะมีการกำกับหมายเลขให้แต่ละบล็อกที่ยาวบล็อกละ 1000 ไบท์ ดังนั้นบล็อกหนึ่งก็จะเก็บเรคอร์ดได้ถึง 4 เรคอร์ด โดยทั้ง 11 เรคอร์ดของ ALPHA จะเก็บไว้ในบล็อกหมายเลข 2 , 3 , 4 ตามลำดับ ซึ่งจะแทนด้วย ALPHA logical block 0 ,1 และ 2 logical block กับ logical record จะถือว่าอยู่ติดต่อกันไปเสมอ (แม้ว่าในสภาพจริงอาจจะไม่อยู่ติดกันก็เป็นได้)


1 2 3 4

5 6 7 8

9 10 11











0
1
5
10
6
11
12
13
14
7
8
9
2
3
4
Tracks
1000 bytes
0
10
20
0
1
2
3
4
Records









รูปที่ 9.33Physical file storage


สมมติว่ามีคำสั่งในภาษา PL/I ว่า
READ FILE (ALPHA) RECORD (6) SIZE(250) LOCATION(BUFF)
คือสั่งให้อ่านเรคอร์ดขนาด 250 ไบท์มาทั้งหมด 6 เรคอร์ดจากไฟล์ชื่อ ALPHA แล้วคัดลอกข้อมูลลงที่ตำแหน่งที่ชื่อว่า BUFF ตัวแปลภาษาพีแอล/วันก็จะแปลคำสั่งนี้ออกเป็น subroutine calls ไปยัง file system
ลองพิจารณา
VTOC ( Volume Table of Contents) หรือ file directory จะเป็นตัวช่วยบอกตำแหน่งของไฟล์ ขนาดของไฟล์และชื่อของไฟล์ที่ต้องการนั้น ๆ
Entry
Name
Length
Location
1

2BETA
900
6
ALPHA
2750
2
3GAMMA
2000
7

รูปที่ 9.34Volume of Contents

รูปที่ 9.34 แสดง VTOC (ALPHA มีขนาด 2750 ไบท์) และ logical block 0 ก็คือ physical block หมายเลข VTOC ค้นหาชื่อ ALPHA(Symbolic name) เพื่อหาหมายเลขของชื่อไฟล์นี้คือ 2
(ไฟล์อันที่ 2)
1. คำนวณตำแหน่งของเรคอร์ดที่เป็น logical byte address (ก็จะคำนวณได้เป็น
5*250=1250) คือ คำนวณตำแหน่งของเรคอร์ดที่ 6 ที่ต้องการ จะได้เป็น(6-1)*250=1250
2. logical byte address ที่ 1250 จะตรงกับไบท์ที่ 250 ภายใน logical block 1
3. แต่ทราบจาก VTCO ว่าค่าของ logical block 3 จะตรงกับ physical block 1
เพราะฉะนั้น logical block 1 จริง ๆก็คือ physical block 3
4. โดยการใช้ I/O routine ดังที่เคยกล่าวมาแล้วในหัวข้อที่ 9.1 ดังนั้น physical
block 3 ก็จะถูกอ่านมาเก็บไว้ในบัฟเฟอร์
5. จากขั้นตอนที่ 3 ทราบว่า logical record ที่ 6 ที่ต้องการนั้น เริ่มต้นจากตำแหน่งที่
250เพราะฉะนั้นก็จะดึงเอาไบท์ที่ 250-499 (250+250 คือ 1 เรคอร์ด) จากบัฟเฟอร์ไปเก็บไว้ในตำแหน่งชื่อ BUFF ตามคำสั่ง READ

Operational Considerations
มีปัญหาบางอย่างที่ต้องพิจารณา
1. VTOC สร้างขึ้นได้อย่างไร และใส่ข้อมูลอย่างไร
2. VTOC เก็บไว้ที่ใด
3. จำเป็นต้องไปค้นหาทุกๆตัวใน VTOC ทุก ๆ ครั้งที่มีการทำหรือไม่
ตัวอย่าง เช่น IBM Disk Operation System /360 (DOS /360)
ผู้เขียนโปแกรมต้องเป็นผู้เก็บรักษาจัดการเองกับ VTOC ดังการใช้บัตรควบคุม
CREATE ALPHA LENGTH = 2750,LOGICAL = 2
และ DELETE BETA อย่างนี้เป็นต้น
หากVTOC จัดเก็บไว้ในหน่วยความจำหลักทั้งหมดตลอดเวลาก็จะทำให้เปลืองเนื้อที่มาก ดังนั้นจึงจะจัดการกับ VTOC ในลักษณะโดยถือว่าเป็นไฟล์ๆ หนึ่งเช่นกัน และเก็บไว้ในอุปกรณ์จัดเก็บข้อมูล ดังนั้นไฟล์ข้อมูลเหล่านี้ก็จะสามารถย้ายไปไหนมาไหนได้ โดยที่มี VTOC ติดอยู่ที่หัวตลอด
หากจัดเก็บ VTOC ใน file system ก็จะทำให้ต้องมรการบรรจุส่วน file system ลงในหน่วยความจำด้วยแล้วจึงจะทำการค้นหา VTOC Block เมื่อต้องการทำงานกับ ไฟล์อีก ซึ่งต้องใช้เวลามากในการค้นหา VTOC โดยเฉพาะอย่างยิ่งเมื่อไม่ได้อย฿ในหน่วยความจำหลัก ดังนั้นจึงนิยมนำเฉพาะบางส่วนที่เรียกใช้บ่อย ๆ ของ VTOC นำไปเก็บในหน่วยความจำแทนที่จะเก็บไว้ทั้งหมด
File System ส่วนมากมักจะมีคำสั่งเฉพาะอยู่ 2 คำสั่งคือ
- OPEN คือสั่งให้นำบางส่วนที่ต้องการของ VTOC บรรจุลงในหน่วยความจำหลัก
- CLOSE คือสั่งยกเลิกการทำงานกับส่วนของ VTOC ที่อยู่ในหน่วยความจำหลักนั้น

9.5.4 Feature of a General file System
จากตัวอย่างที่กล่าวมายังมีข้อบกพร่องบางอย่างที่ต้องการปับปรุง เช่น
1. ต้องการลดการทำ I/O operation ให้มากที่สุด
2. ไม่มีขีดจำกัดของ logical record size and physical block size
3. ต้องการให้การกำหนดตำแหน่งของไฟล์เป็นไปโดยอัตโนมัติ
4. และการกำหนดตำแหน่งนั้นสามารถยืดหยุ่นหรือปรับตำแหน่งใหม่ได้
5. ชื่อไฟล์ไม้ต้องจำกัดตายตัวมากนัก กล่าวคือใช้ชื่อปลอมได้ หรือมี sub-directory ได้
Minimal I/O operation
จำนวนการทำ I/O Operation สามารถใช้เทคนิคคลายฯกับ coepiler machinedependent code optimimization ที่เคยกล่าวกันมาแล้วในบทคอมไพเลอร์ กล่าวคือทุกครั้งที่มีการอานข้อมูลเข้ามาเก็บในบัพเฟอร์นั้น ก็ให้เก็บค่าไว้เป็น peysical block ใดที่ไดอ่านมาเพราะฉะนั้นในขั้นที่ 5 ก็จะมีการตรวดสอบเสียก่อนว่า block ที่ต้องการนั้นได้มีการอ่านเข้ามาไว้ก่อนแล้วหรือไม่ ถ้เคยอ่านมาแล้วการทำ I / O read ก็ไม่ต้องทำซ้ำอีกเพียง แต่ดึงข้อมูลนั้นมาใช้ได้เลยจากบัฟเฟอร์ ซึ่งเทคนิคแบบนี้เรียกว่า file buffing ซึ่งก็ยังมีการจัดแบ่งแยกออกเป็นอีกหลายประเภท
เช่น มี 1 บัฟเฟอร์ต่อ 1 opened file ขณะนั้น
หรือ 1 บัฟเฟอร์ ต่อไฟล์ที่กำลังใช้งานอยู่จริง ๆ ขณะนั้น
และเพื่อให้มีการลดผลเสียที่อาจจะเกิดขึ้นจากการ random accessing หรือ sequential accessing โดยให้มีการทำ I/O overlap กันได้ ก็อาจยอมให้มีหลาย ๆ บัฟเฟอร์ต่อหนึ่งไฟล์ได้ (เรียกว่า Double Buffering)
Independent of Logical Record Size and Physical Block Size
ถ้าหาก physical record ที่มีการทำงานจริง ๆ มีขนาดเป็น 13 หรือ 2415 ไบท์ ซึ่งมิใช้เป็นผลคูณที่ลงตัว ก็มีทางหลีกเลี่ยงได้ เช่น จากขนาดเดิม 13 จริง ๆ ก็กำหนดให้ใหม่เป็น 20 ไบท์แทน โดยยอมทิ้งเนื้อที่ไปเปล่า ๆ 7 ไบท์ แต่หากเป็นเช่นนี้มาก ๆ ก็อาจจะเกิดที่ว่างมากภายในบล็อกได้ บางอุปกรณ์ยอมให้มีการจัดรูปแบบเองต่างหากของแทรค (track) อิสระเช่น ยอมให้เปลี่ยนจากรูปแบบตามปกติจาก 5 ชุดของ 1000 ไบท์เป็น 1500 ไบท์ต่อบล็อกหรือ 2000 ไบท์ต่อบล็อกก็ได้
Automatic Allocation of file Space
การที่ต้องระบุตำแหน่งที่จะบรรจุลงไปนั้นทำให้ไม่เกิดความสะดวก เพราะ
1. ทำให้ผู้เขียนโปรแกรมต้องจัดการเรื่องพื้นที่ว่างเอง
2. มีการใช้อุปกรณ์จัดเก็บข้อมูลร่วมกันระหว่างผู้ใช้หลาย ๆ คนโดยแต่ละคนต้องการเป็นอิสระจากกัน แต่ทว่าในระหว่างการทำงานอาจเกิดการ overlap กันก็อาจเป็นได้
ดังนั้นผู้เขียนโปรแกรมจึงต้องการให้ file system ช่วยจัดการในเรื่องตำแหน่งที่จะ
บรรจุเอง ซึ่งก็มีหลายเทคนิคในการจัดการเรื่องพื้นที่ว่าง
วิธีหนึ่งคือต้องจัดเก็บรายละเอียดของรายการ VTOC ที่ถูกใช้งานอยู่และที่ยังว่างอยู่ เพื่อใช้สำหรับบล็อกที่ว่างติดต่อกันที่ยังไม่กำหนดให้ใคร เพราะฉะนั้นเมื่อ ALPHA ขอ 3 บล็อกแล้ว File system ก็จะไปค้นหารายการ VTOC ที่ว่าง 3 บล็อก แต่หากไม่มีขนาดที่ต้องการแล้วรายการที่มีขนาดใหญ่กว่าก็จะถูกเลือกให้แทน โดยจะทำการแบ่งออกเป็น 2 ส่วน คือส่วนที่ต้องการ (3บล็อก) กับ ส่วนที่เหลือก็จะให้เป็นที่ว่างรายการใหม่อีก
ใน VTOC เองก็จะต้องมีรายการของ VTOC ตัวมันเองเพื่อแสดงว่า VTOC นั้นอยู่ที่ใดและมีขนาดเท่าใด ในระบบปฏิบัติการ OS/360 ก็เปิดโอกาสให้โปรแกรมสามารถอ่านหรือเขียนเรคอร์ดของ VTOC โดยใช้ขั้นตอนต่าง ๆ เหมือนกับ automatic file allocation ดังที่กล่าวมาแล้วได้

Dynamic Allocation of File Space
ถึงแม้ว่าจะมีการ automatic allocation machanism โดยที่ผู้เขียนโปรแกรมไม่ต้องยุ่งเกี่ยวนั้น ก็ยังคงมีปัญหาอยู่บางประการคงอยู่นั่นคือการใส่ไฟล์อย่างติดต่อกันไปมักจะเกิดปัญหา fragmentation ดังตัวอย่างรูป 9.36
Create Alpha , Length = 2750
Create Beta , Length = 900
VTOC
2000
0
Free
(3000)
2
GAMMA
2000
5
Free
(9000)
7
…..


…..


2
3
4
5
6
Entry
1
5
2
3
4
Name
Length
Location
VTOC
2000
0
ALPHA
2750
2
GAMMA
2000
5
BETA
900
7
Free
(8000)
8
…..


Entry
Name
Length
Location
1
a) Before CREATES are processed
b) After CREATES are processed
6
















รูป 9.36 Automatic file space allocation


แต่บางเครื่องเช่น IBM 1130 Disk Monitor System สามารถแก้ไขได้โดยการเลื่อนไฟล์ให้ขยับเข้ามาติด ๆ กันไปซึ่งคล้ายกับวิธี compact ของ relocatable partition แต่อย่างไรก็ตามก็ยังใช้เวลาในการทำงานเป็นอันมาก ซึ่งยังเป็นวิธีที่ยังแก้ไขได้ไม่ดี
ในบางกรณีขนาดของแอสเซมเบลอร์และโหลดเดอร์นั้นมีขนาดไม่แน่นอนขึ้นอยู่กับขนาดของ input data หากผู้เขียนโปรแกรมกำหนดเอง
- ถ้าขนาดใหญ่ไป ก็เหลือเป็นที่ว่าง
- ถ้าขนาดเล็กไป ก็จะทำงานไม่ได้
วิธีแก้ไขคือ ให้มีการกำหนดขนาดโดย dynamic non-continous file allocation นั่นคือที่
ว่างสามารถเพิ่มเข้ามาได้ถึงแม้จะกำลัง execute โปรแกรมอยู่ แล้วมีเนื้อที่ไม่เพียงพอ โดยที่ว่างที่ต้องการนั้นไม่จำเป็นต้องอยู่ติดกัน ซึ่งก็มีอยู่หลายชนิดในการทำงานอย่างที่ว่านี้ วิธีที่นิยมกันมากคือ วิธีเช่นในรูป 9.37

VTOC 1
Free 2 GAMMA 5 ALPHA 4
_ _



1 0
1 -
2 -
3 -
4 -
0 14
1 13
2 12
3 11
4 9

ALPHA
(logical
block 0)
0 3
1 7
2 8
3 -
4 -
4
3
2
1
0

File map for Alpha

File map for VTOC

File map for Free
VCTO
Logical
Block 0









0 6
1 10
2 -
3 -
4 -
GAMMA
(Logical block 0)
ALPHA
(Logical block 1)
ALPHA
(Logical block 2)

FREE
5
6
7
8
9

File map for Gamma




14
13
12
11
10
GAMMA
(Logical block 0)

FREE

FREE

FREE

FREE





รูป 9.37 example of file map organinzation

วิธีนี้ VTOC จะเหมือนกับรูป 9.34 และ 9.36 แต่ว่า allocation field จะถูกใช้ในการชี้ physical block address ของ file map แทน โดยใน file map ก็จะมีความสัมพันธ์ระหว่างหมายเลขของ logical block กับหมายเลข physical block สำหรับแต่ละไฟล์
ดังในรูป 9.37 file map ของไฟล์ชื่อ ALPHA จะเก็บไว้ใน physical block 4 เพื่อลงไปดูใน physical block 4 ภายในนั้นก็จะเป็น file map ซึ่งจะระบุว่าหมายเลขของ logical block จะตรงกับ physical block หมายเลขอะไรบ้างที่จะเก็บข้อมูลของ ALPHA จริง ๆ
ซึ่งในรูปนั้น ALPHA จะเก็บไว้ใน physical block ที่ 3 . 7 .8 ตามลำดับ
ดังนั้นเมื่อมีการอ้างอิงถึง (open) ไฟล์ชื่อ ALPHA ก็จะมีการนำเอารายการ VTOCและ file map (physical block file map ของ ALPHA) นำไปบรรจุลงในหน่วยความจำหลักด้วยพร้อมๆ กัน
ด้วยวิธีนี้ภายในบัตรควบคุมก็จะระบุเฉพาะชื่อไฟล์เท่านั้น ซึ่งจะมีผลให้เกิดรายการของVTOC และบล็อกอันหนึ่ง สำหรับทำ file map และในขณะที่มีการทำงานอยู่นั้น ถ้าหากมีคำสั่งเช่น WRITE ALPHA RECORD (14) ขึ้น ซึ่งจริง ๆ ยังไม่มีการ map ระหว่าง logical block กับ physical block เลขภายใน file map ก็จะมีการดึงเอาบล็อกที่ว่างมาให้และมีการกำหนดค่าที่สอดคล้องกันของหมายเลข logical block และหมายเลข physical block ภายใน file map ทำนองเดียวกันหากมีการสั่งลบไฟล์ (delete) ออกบล็อกต่าง ๆ ก็จะถูกส่งคืนให้แก่ free file (ซึ่งเป็นบล็อกหนึ่งที่ทำหน้าที่เป็น file map เช่นกัน แต่ว่าจะแสดงถึง physical block ต่าง ๆที่ว่าง)
การจัด file map แบบนี้ช่วยลดข้อจำกัดที่ว่าจะต้องมีการกำหนดให้เป็นพื้นที่ติดต่อกันสำหรับไฟล์หนึ่ง ๆ และช่วยให้สามารถขยายขนาดของไฟล์ได้อย่างยืดหยุ่น
ขอให้ลองพิจารณาวิธี file map machanism กับวิธี program map technique

FLEXIBLE File Naming
การใช้ชื่อสัญญลักษณ์ช่วยให้ผู้เขียนโปรแกรมสะดวกในการจดจำและอ้างอิงไฟล์
ของตนเอง แต่ก็ทำให้มีผลต่อ VTOC มากเพราะหากมีข้อผิดพลาดเพิ่มจำนวนขึ้นมาก ๆ ก็อาจเป็นได้ที่จะมีการตั้งชื่อไฟล์ซ้ำกัน ดังนั้นเมื่อมีการใช้คำสั่ง DELETE file ก็จะพลอยทำให้ไฟล์ของผู้ใช้คนอื่นถูกทำลายไปด้วย หรือคำสั่งอื่น ๆ READ , WRITE ก็เช่นกัน ซึ่งมีแนวทางหลายทางที่จะแก้ปัญหานี้เช่น มีการติดตั้ง clearing house สำหรับชื่อไฟล์ต่าง ๆ เป็นต้น
หรือถ้าเกิดมีปัญหาที่ผู้เขียนโปรแกรมสองคนใช้ชื่อไฟล์สองอันที่ชื่อเดียวกัน แต่ว่าเป็นคนละไฟล์กัน หรือปัญหาที่ว่าเป็นไฟล์อันเดียวกันแต่ผู้เขียนโปรแกรมสองคนใช้ชื่อเรียกไม่เหมือนกัน ซึ่งกรณีหลังนี้จะเกิดขึ้นเมื่อมีชื่อของไฟล์นั้นยังไม่ได้ติดตั้ง จนกระทั่งเขียนโปรแกรมเสร็จแล้วจึงค่อยตั้ง หรือบางทีผู้เขียนโปรแกรมอาจต้องกราเรียกไฟล์หนึ่งได้หลาย ๆ ชื่อ (เรียกว่า การใช้ alias file name)
ในที่นี้ จะกล่าวถึงวิธีง่าย ๆ ของ flexible file naming
สมมติว่าไฟล์ทั้งหมดจะต้องมีหมายเลขเสมอ เพื่อแทนชื่อที่เป็นสัญญลักษณ์ดังรูป 9.38


VTOC
(This is really VTOC file)
500 1
3000 2
2000 5
2750 4
900 9Entry Length Location
1
(This is really free file)2
(This is really Gamma file)3
(This is really Alpha file)4
(This is really BETA file)5


รูป 9.38 VTOC without symbolic

ซึ่งเหมือนกับในรูป 9.36 ยกเว้นตรงที่ไม่มีช่อง symbol name เท่านั้น เราสามารถอ้างอิงไฟล์โดยใช้ลำดับที่ของรายการ VTOC แทน (เช่น หมายเลข 4 ก็คือ ไฟล์ชื่อ ALPHA)
วิธีใหม่นี้เราจะไม่ใช้ชื่อเป็นสัญญลักษณ์ แต่จะใช้ Directory แทน ซึ่งคล้ายกับไฟล์ข้อมูลทั่ว ๆ ไป แต่ใช้เพื่อหารจับคู้กันระหว่างชื่อที่เป็นสัญญลักษณ์กับลำดับรายการของ VTOC ทั้งนี้เพื่อไม่ให้ขัดแย้งกันระหว่างการตั้งชื่อไฟล์ ดังนั้นผู้เขียนโปรแกรมแต่ละคนต้องมี Directory เป็นของตนเอง เพราะฉะนั้นก็ต้องมี Master Directory หรือ Root Directory ซึ่งจะระบุรายการ VTOC ไปยังแต่ละ directory ของผู้เขียนโปรแกรมแต่ละคน
















1
Entry
File map
2
4
2
Free File
File map

File map
John 8
Stuart 9

2
4
10
15
12
- -
3
25
131
102
15
ALPHA,DELTA3
4
BETA
125
76
7
ALPHA,GAMMA
38
9
13
9
(sTUART’s directory) VTOC
ALPHA 4
GAMMA 7 BETA 5
DELTA 4
25
8
ALPHA 7
BETA 5

File
map








รูป 9.39

รูป 9.39 จะแสดงรายละเอียดของ hierarchical file structure ใน VTOC สองรายการแรกจะเป็นของ VTOC เองกับส่วนที่เป็นที่ว่าง รายการอันที่ 3 มักจะกำหนดให้สำหรับ master directory file เพื่อทำงาน ซึ่งคล้าย ๆ ไฟล์อื่นๆที่จะมาทำงานกับ file map
ภายใน master directory นั้นแต่ละรายการจะชี้ระบุไปยัง directory ของ ผู้เขียนโปรแกรมแต่ละคน ภายใน directory ของแต่ละคนเองก็จะทำหน้าที่เหมือนกับ file map คือจะบอกว่าไฟล์ต่าง ๆ ที่ผู้เขียนโปรแกรมคนนั้นเป็นผู้ใช้มีไฟล์อะไรบ้าง และอยู่ใน VTOC รายการที่เท่าไร (คือ ชี้กลับมายัง VTOC อีกครั้ง )ซึ่งก็จะเป็นแหล่งทางกายภาพจริง ๆ ของที่อยู่ของไฟล์นั้น
จะสังเกตเห็นว่าจากรูป
JOHN มีอยู่ 2 ไฟล์คือ ALPHA กับ BETA
STUART มี 4 ไฟล์คือ ALPHA ,BETA,GAMMA,และ DELTA
ข้อเสียคือยุ่งยากในการจัดเก็บ directory และในการบำรุงรักษา ปรับปรุง ให้ทันกับเหตุการณ์
- โดยทั้งสองคนใช้ไฟล์ชื่อ BETA ร่วมกันใช้ชื่อเดียวกันด้วย ซึ่งลักษณะเช่นนี้เรียกว่า linked file
- ในขณะเดียวกันไฟล์ชื่อ ALPHA ของ JOHN จะเป็นคนละไฟล์ที่ชื่อ ALPHA ของ STUART
- และไฟล์ที่ชื่อ ALPHA ของ STUART ก็หมายถึงไฟล์ที่ชื่อ DELTA (ใช้สองชื่อ) เช่นกัน
- และไฟล์ที่ชื่อ GAMMA ของ STAURT ก็คือไฟล์ชื่อ ALPHA ของ JOHN นั่นเอง
ALPHA
GAMMA BETA
DELTA
ALPHA
BETA
JOHN
STUART
3
7
8
99
5
4
John’s directory
Stuart’s directory














รูปที่ 9.40

รูปที่ 9.40 จะแสดงให้เห็นว่า File system ยอมให้มี multi-level ของการทำ directory
ของผู้เขียนโปรแกรมแต่ละคนได้ หรือบางทีก็เรียกว่า private library

9.6 General File System Model Revisited
การซับซ้อนและยืดหยุ่นมากขึ้นอาจไม่ใช้การแก้ปัญหาที่ดีเสมอไป ต่อไปนี้จะเป็น
การศึกษาองค์กรจริง ๆ ของ file system ที่เคยพูดไว้ในหัวข้อ 9.5.2 ซึ่งเมื่อทำงานโดยมีการ request มา (ดังแสดงในรูป 9.35)
จะแบ่งการทำงานออกเป็น 7 ขั้นตอน คือ
1. Access Method (AM)
ทำหน้าที่เปลี่ยนหมายเลขของ logival record เป็นตำแหน่งของ logical byte ภายใต้
ไฟล์นั้น แล้วก็จะไปทำขั้นตอนที่ 2 ต่อ
2. Logical File System (LFS)
ชื่อของไฟล์ที่เขียนเป็นสัญญลักษณ์จะถูกเปลี่ยนเป็นหมายเลขของ VTOC รายการที่
สอดคล้องกัน โดยจะมีการค้นหาใน master directory ก่อน และใน directory ย่อย ๆ ต่อมาถ้าหากว่าไม่ปรากฏชื่อนั้นใน Active Table (AMT) (เนื่องจากว่า directory เหล่านี้ มักจะถือว่าเป็น directory เฉพาะ ดังนั้น LFS สามารถใช้ให้ Basic File System มาอ่าน directory ย่อย ๆ เหล่านั้นได้) ต่อจากนั้นก็จะทำขั้นต่อไป
3. Basic File System (BFS)
หมายเลขของ VTOC รายการนั้น ก็จะถูกนำมาพิจารณาว่าไฟล์นั้นได้เปิดไว้อยู่แล้ว
หรือไม่ซึ่งจะตรงกับรายการในตาราง Active File Table (AFT) แต่ถ้าไฟล์นั้นยังไม่ได้เปิด ก็จะต้องมีการบรรจุ VTOC รายการเข้ามาใหม่โดยจะเก็บไว้ใน AFT
(ในขั้นตอนนี้ VTOC จะคล้าย ๆ กับเป็นไฟล์พิเศษเฉพาะอันหนึ่ง ซึ่ง BFS สามารถใช้ให้ file organization strategy Model มาอ่าน VTOC รายการนี้ได้)
4. File Organization Strategy Model(FOSM)
ค่าตำแหน่ง logical byte (ที่ได้จากข้อ 1 ) ก็จะถูกเปลี่ยนเป็นหมายเลขของ logocal
Block พร้อมกับค่า offset ของมัน แล้วโดยการใช้ file map ก็จะได้เป็นหมายเลข physical block (ถ้าหากว่าบล็อกที่ต้องการนั้นอยู่ในบัฟเฟอร์อยู่แล้ว) ก็จะมีการกลับไปยังผู้เรียกใช้ได้ทันที แต่ถ้าหากว่าบล็อกนั้นไม่อยู่ในบัพเฟอร์ device strategy module ก็จะต้องถูกเรียกมาให้อ่าน physical block ที่ต้องการนั้น แล้วจึงกลับไปยังผู้ใช้ที่เรียกใช้ได้ แต่ถ้าเป็นการ WRITE และ physical block ที่ต้องการนั้นยังไม่ถูกกำหนดมาให้ WRITE Allocation strategy module ก็จะถูกเรียกมาให้ทำการกำหนดบล็อกต่าง ๆ ให้
5. Allocation Strategy Module (ASM)
หน้าที่ก็คือคอยรับใช้การเรียกเพื่อไปดึงเอา physical block ที่ไม่มีผู้ใช้มาให้แก่ file
map ของผู้ที่ต้องการใช้ ทำงานเสร็จแล้วจึงจะกลับไปยังผู้เรียกต่อไป (Caller)
6. Device Strategy Module (DSM)
หน้าที่คือทำหน้าที่เปลี่ยนหมายเลขของ physical block ให้เป็น address format ซึ่ง
จะใช้ได้ในอุปกรณ์ (ตัวอย่างเช่น เป็นหมายเลข cylinder no. , track no. หรือ physical record no. เป็นต้น) ซึ่ง I/O command ที่เหมาะสมก็จะได้ถูกกำหนดขึ้นอีกต่อไปเพื่อใช้ในการดึงข้อมูลนั้นมา
7. Input/Output Control System (IOCS)
หน้าที่ควบคุมการใช้ I/O channel เป็นผู้ที่เริ่มทำ I/O command แล้วก็ทำ process
Interrupt ทำเสร็จแล้วจึงกลับไปยังผู้เรียก (caller) ได้

9.6.1 Segmentation
หัวข้อนี้เป็นการกล่าวถึง segmentation with paging ดังที่เคยกล่าวมาแล้ว การเปรียบ
เทียบลักษณะของ file system ซึ่งมีส่วนคล้ายกันกับการจัดการหน่วยความจำแบบ segmented – page คือ
1. แนวคิดความหมายของแฟ้มข้อมูลและ segment ซึ่งต่างก็ถือว่าเป็น logical
organization ของข้อมูลข่าวสารอย่างหนึ่งเหมือนกัน
2. ทั้งแฟ้มข้อมูลและ segment ต่างก็มีขนาดที่ไม่แน่นอนและอาจจะเติบโตขึ้นได้
เรื่อย ๆ (Arbitrary Size และ Dynamic Growth)
3. การเรียกตำแหน่งใด ๆ ของข้อมูลต่าง ๆ ก็ใช้วิธี two-dimensional addressing คือ
ของแฟ้มข้อมูลจะใช้ชื่อสัญญลักษณ์ของแฟ้มข้อมูลนั้นกับ logical byte ส่วนของ segment ใช้ชื่อของ segment นั้นกับค่า offset
4. VTOC ของแฟ้มข้อมูลทำหน้าที่คล้าย ๆ กับ descriptor ของ segment
5. file map ก็ทำหน้าที่คล้ายกับ page map
6. memory buffer ของแฟ้มข้อมูลก็ทำหน้าที่คล้าย ๆ กับ memory block/page ถึง
แม้จะมีสิ่งที่เหมือน ๆ กันในโครงสร้างก็ตาม แต่เนื้อหารายละเอียดก็ย่อมแตกต่างกันไป
การจัดการข้อมูลในลักษณะของ segment นั้นพอจะแบ่งได้เป็น 2 แนวทางคือ
1. เป็นกลไกต่างหากออกจาก file system
2. เป็นส่วนหนึ่งของระบบ file system ซึ่งในส่วนนี้จะดูตัวอย่างได้จากระบบ multies
System ของเครื่อง HIS 645
ในต่อไปจะศึกษาในรายละเอียดของ segment สำหรับการจัดการข้อมูล

จุดประสงค์ของ segment มีดังต่อไปนี้
1.เพื่อให้เกิดการใช้ส่วนของชุดคำสั่งทางกายภาพร่วมกัน เช่น ชุดคำสั่ง
การหาค่ารากที่สอง ชุดคำสั่งการหาค่า SIN หรือ COS หรืออื่น ๆ ทั้งนี้เนื่องจากไม่ต้องการให้เกิดหลาย ๆ ชุดของคำสั่งขึ้นมาทั้งที่เป็นชุดคำสั่งอย่างเดียวกัน เมื่อมีหลาย ๆ process ต้องการใช้ชุดคำสั่งดังกล่าว ต้องการให้มีชุดคำสั่งเพียงอันเดียว แต่สามารถมีหลาย ๆ ชุดข้อมูล ซึ่งมีลักษณะที่เปลี่ยนแปลงค่าของตัวเองได้ (Impure-procedure) เพราะค่าของข้อมูลเหล่านี้มีค่าไม่เหมือนกันระหว่างผู้ใช้ข้อมูลแต่ละคน และค่าเหล่านี้อาจจะมีการเปลี่ยนแปลงอยู่เสมอ ขณะมีการ execute
2.เพื่อให้เกิด dynamic linking อนุญาตให้ผู้เขียนโปรแกรมสามารถสร้าง linkage
ชั่วคราวของโปรแกรมได้จนกว่าจะถึงเวลา execute ซึงรวมทั้งไม่ยอมให้ไม่ต้องระบุชื่อที่มีการเรียก segment ได้จนกว่าจะมีการ execute จริง ๆ
จากจุดประสงค์ 6 ข้อ มีการพัฒนาออกมาเป็นรูปแบบดังนี้
ข้อที่ 1 (shared procedure) หมายถึงว่าเรามี impure linkage segment หลาย ๆ อันซึ่งไม่มีการใช้ร่วมกันประกอบกับมี pure procedure segment ซึ่งใช้ร่วมกันโดยพวก linkage segment ต่าง ๆ ที่เชื่อมกันอยู่นั้นจะประกอบไปด้วย external reference ของ procedure segment เอาไว้ด้วย
ข้อที่ 2 (dynamic linkage) หมายถึงว่าให้มีการ bind พวก external referance ก็ต่อเมื่อถึงเวลา execute จริง ๆ เท่านั้น
ข้อที่ 3 (segment invariant under recompilatio of other segment)หมายถึงว่าเรามิ segment หนึ่งที่เกี่ยวข้องกับทุก procedure segment โดยจะเรียกว่า symbol table
จะพบว่ามีการ pratection ร่วมเข้าด้วยในจุดประสงค์ ข้อ 4. 5 . 6
การ Implementation
Memory ฮาร์ดแวร์ของคอมพิวเตอร์ที่ใช้ segment จะทำหน้าที่ แปลค่าตำแหน่ง (interpret address) ที่มีการอ้างอิงกันโดยใช้หมายเลขของ segment กับ offset เช่นในรูป ในรูป 9.43 จะถูกเปลี่ยนเป็นตำแหน่งภายในหน่วยความจำหลักจริง ๆ โดยฮาร์ดแวร์
x
0
L
Segment S
A








ในรูป 9.43


ฮาร์ดแวร์จะใช้ค่า s เป็นดัชนีเพื่อค้นหาในตาราง (เป็น descriptes segment ) เพื่อที่จะให้ได้ตำแหน่ง (สมมติL) ของ segment นั้น ๆ แล้วจึงนำค่า offset ไปรวมเข้าด้วยกัน (บวกกับค่าL) จึงจะได้ค่าตำแหน่งที่แท้จริง
การ Imprement ที่จะพูดถึงต่อไปนี้เป็นการ implement ในเครื่อง HIS 645 ด้วยวิธี MULTICS system ซึ่งเป็นโครงการร่วมกันของ M.I.T Honey well และ Bel Labs Project
Processor for user #1 descript segment for user #1
Seg Loc Access
0
1

31
32
DBR
32 m
LP
SP
Stacck
segment

Stack
Frame for



External
References
For John
SQRT
m
k
-- calling
-- seque-
nce
-- TRA/p/K*
Call
SQRT
Static segment

link
























รูป 9.44



สมมุติว่าเรามีลักษณะของ segment ดังแสดงในรูป 9.44 address space ทั้งหมดจะมีอธิบายไว้ในส่วน descriptor segment อยู่ที่ใด เนื่องจากการ linkage และ stack segment มักจะถูกอ้างอิงถึงบ่อยๆ ดังนั้นจึงมีการกำหนดรีจีสเตอร์ขึ้นมาเพื่อคอยชี้ไปยัง segment ต่างๆเหล่านั้นที่ถูกอ้างอิงถึงเมื่องานเริ่มทำการ execute
DBR (Descriptor Base Register) ที่จะเป็นตัวชี้ไปยัง descriptor segment ของมัน แต่ถ้าหากมีงานใหม่จะเข้ามาทำ Process ต่างๆ ด้วย DBR ตัวนี้จะคอยชี้ไปยังงานนั้นเช่นกัน โดยจะใช้หมายเลขของ segment เป็นดัชนีชี้ภายใน descriptor segment ซึ่งจะระบุถึงตำแหน่งต่างๆภายใน segment และ offset ก็จถูกนำเข้ามาร่วมกันอีก แต่ระบบ MULTICS นี้จะใช้ร่วมกับวิธี page memory location scheme ดังนั้น descriptor segment จึงจะยังไม่ชี้ไปที่ตำแหน่งของ segment ภายในหน่วยความจำในทันที แต่จะต้องผ่าน Page table เสียก่อน เนื่องจาก Paging ไม่มีส่วนสำคัญในเรื่องที่จะพูดจึงขอข้ามไป (แต่ยังจะใช้รูป 9.44 อธิบายการ implement เรื่อง segment อยู่)
สมมุติว่ามี Procedure segment ชื่อ JOHN ซึ่งใน source code นั้นจะมีคำสั่ง CALL SQRT (เรียก square root มาทำงาน) ตัวแปลภาษาจะแปลคำสั่ง CALL นี้ให้เป็นลำดับของการ CALL ต่างๆ และมีการสั่ง transfer ไว้ในคำสั่งนี้ เราลองมาพิจารณาการ Transfer ของคำสั่งนี้ดู
เป็นธรรมดาที่ single transfer ไปยัง SQRT routine อาจจะมีการเรียกใช้พร้อมกัน แต่อย่างไรก็ตามในจุดประสงค์ข้อที่ 2 (dynamic linking) กำกับไว้ว่าตัวแปล
ภาษาไม่สามารถสร้าง transfer ไปยัง SQRT routine โดยตรงได้เพราะชุดคำสั่งย่อยนี้จะยังไม่ถูกดึงมาไว้ในหน่วยความจำหลักจนกว่าจะถึงเวลา execute จริงๆเท่านั้นเพราะในเวลา execute จริงๆ นั้นจึงจะมีการ transfer ไปยัง supervisor ให้มีการไปนำเอาชุดคำสั่งย่อยที่เป็น SQRT นี้มาบรรจุลงไปเมื่อมีการ execute คำสั่งนี้เท่านั้นหรืออีกทางเลือกหนึ่งเป็นว่าให้ตัวแปรภาษาสร้างการ transfer ไปยัง supervisor เพื่อ supervisor สั่งการและบรรจุเอาชุดคำสั่งย่อยนี้มา แล้วจึงจะมรการนำค่าตำแหน่งของคำสั่ง transfer พร้อมกับชุดคำสั่งย่อยมาใส่แทน แล้วก็เริ่ม execute คำสั่ง transfer นี้ใหม่อีก
ยังไงก็ตามวิธีนี้อาจจะไม่ทำงานเพราะจะทำให้ procedure JOHN กลายเป็น inpure procedure ซึ่งขัดกับจุดประสงค์ข้อที่ 1 ที่ให้มีการใช้งานร่วมกัน ซึ่งหากงานที่สองถูก execute ต่อมา ก็จะทำให้เกิดการ transfer ไปยังชุดคำสั่งย่อย SQRT ที่ผิด เช่น งานแรกอาจจะมี transfer ไปยังชุดคำสั่งย่อย SQRT ซึ่งอยู่ใน library system แต่ในขณะเดียวกันก็จะมีการ transfer ไปยังชุดคำสั่งย่อย SQRT ของงานแรกเช่นกัน เพราะในจุดประสงค์ข้อที่ 1 เราต้องการให้มีการใช้งานร่วมกันได้ ดังนั้น JOHN จึงอาจจะเป็น physical procedure ของทั้งสองงานก็อาจเป็นได้
ดังนั้นตัวแปลภาษาจึงไม่สามารถจะสร้าง transfer ไปยัง supervisor ได้โดยตรงแต่จะ transfer (โดยอ้อม) ไปยัง linkage segment ซึ่งอาจจะเกี่ยวข้องกับ JOHN ดังนั้นชุดคำสั่งย่อยอื่นๆของ linkage segment ที่เกี่ยวข้องกับ JOHN ก็จะถูกเตรียมไว้ให้ผู้ใช้แต่ละคนเพราะ linkage segment มักถูกใช้บ่อยๆ เราจึงมีรีจีสเตอร์ตัวหนึ่งคือ LP ที่คอยชี้ไปตำแหน่งดังกล่าว
ดังนั้นตัวแปลภาษาก็จะสร้างคำสั่ง transfer TRA LP/k* ขึ้นมา โดย * จะแสดงถึง indirect address ซึ่งหมายถึงการ transfer ไปยังตำแหน่งที่จะบรรจุตามค่าตำแหน่งที่อ้างอิงถึง
LP หมายถึง Linkage register
K หมายถึง หมายเลขซึ่งจะคำนวณโดยตัวแปลภาษาและเกี่ยวข้องกับชุดคำสั่ง SQRT
ถ้า SQRT เป็นชุดคำสั่งย่อยแรกที่ถูกอ้างถึงใน JOHN ค่า K ก็จะเป็น 1 ตัวแปลภาษาก็จะสร้าง Linkage แล้วนำไปแทรกลงในตำแหน่งแรกในคำสั่งเรียก SQRT (ซึ่งจริงๆ จะเป็นตัวคอยชี้ไปยังตำแหน่งจริงของ SQRT อีกทอดหนึ่ง) และจะกำหนดค่า fault-bit ในตำแหน่งนั้น
ดังนั้นเมื่อมีการ transfer ไปยังตำแหน่งนี้ในส่วนของ linkage ขณะที่มีการ execute อยู่ ฮาร์ดแวร์ก็จะพบว่า fault-bit ทำหน้าที่คล้ายกับเป็น interupt แล้วส่ง transfer ไปยัง execution routine ต่อไป
เราจะกลับไปเริ่มใหม่แล้วมาทบทวนอีกครั้งในส่วนนี้ ดังต่อไปนี้ รหัสที่เกี่ยวข้องกับคำสั่ง CALL SQRT ถูกเปลี่ยนให้เป็นลำดับของการเรียก (เก็บรีจีสเตอร์ทุกๆ ตัว และคอยปรับปรุงค่า stack pointer) แล้วจบลงด้วยคำสั่งที่เป็น transfer การ transfer ก็จะกระโดดข้ามผ่านไปทาง linkage register (ซึ่งจะเป็น 2 มิติประกอบด้วยค่าตำแหน่งคือหมายเลข segment (32) และค่า offset (m)) ฮาร์ดแวร์ก็จำใช้เลข 32 เป็นดัชนีใน segment table แล้วค้นหาตำแหน่งของ segment ที่จะ linkage เมื่อพบแล้วก็จะเอา offset(m) บวกเข้าไปก็จะได้ตำแหน่งของ linkage segment ที่เกี่ยวข้องกับ JOHN นั้น ฮาร์ดแวร์ก็จะเอาค่า k บวกเข้ากับค่าตำแหน่งนั้น ในที่สุดก็จะได้ตำแหน่งในหน่วยความจำหลัก ในส่วนของ linkage ที่เกี่ยวข้องกับ SQRT ฮาร์ดแวร์ก็จะกำหนดให้ fault-bit เปิดเอาไว้ตัว fault-bit นี้จะก่อให้เกิดการ execute ให้มีการ transfer ให้ executive system และระบบก็จะต้องไปค้นหา segment ของ SQRT ในระบบ file system
โดยเฉพาะเมื่อปรากฏว่ายังไม่มี segment ที่ต้องการ ก็จะเรียกให้ segment fault handler มาจัดการ ซึ่ง segment handler นี้จะเป็นคุณลักษณะของ segment แท้ๆ(proper) ใน descriptor segment โดยจะไปปิด fault-bit ใน linkage segment segment fault handler จะทำหน้าที่สอดคล้องกันกับ Basic file System ในการค้นหา SQRT ก็จะไปตรวจดูใน segment table ในหน่วยความจำหลักว่ามีการบรรจุแล้วหรือยัง หากไม่มีการอ้างอิงไว้ ก็จะมรการบรรจุ SQRT เข้ามร หากมีอยู่แล้วใน case ตัง segment fault handler นี้ ก็จะนำลงไปไว้ใน descriptor segment ด้วยค่าหมายเลขของ segment พร้อมตำแหน่งและสิทธิในการเข้าทำงานแรกนั้น แต่ถ้าหากว่า SQRT ถูกบรรจุลงใน job segment อื่น ก็จะต้องมี access bit ด้วยค่าตำแหน่งของ linkage segment ของ SQRT แทน กล่าวคือไม่สามารถกำหนดค่าลงใน fault-bit ด้วยค่าตำแหน่งของ SQRT สำหรับ LP(Load Pointer) จนกว่าจะมีการชี้ไปยัง linkage section ของ JOHN จึงจะต้องเปลี่ยนค่า LP เพื่อชี้ไปยัง Linkage section ของ SQRT เนื่องจากอาจจะมีการ CALL SQRT มาอีก เช่น CALL TANGENT แล้วการ CALL TANGENT นี้ก็จะถูกแปลเหมือนกันกับ calling sequence และจนในที่สุดเป็น TRA Lp/K* เช่นเดียวกัน
ดังนั้นก่อนที่จะได้ชุดคำสั่งย่อย SQRT ก็จะต้องเปลี่ยน linkage register LP ให้ชี้ไปที่ linkage segment ซึ่งเกี่ยวข้องกับ SQRT เมื่อมีการ transfer จาก JOHN ก็จะสามารถ transfer ผ่าน JOHN linkage segment ไปยัง linkage ไปยัง linkage segment ของ SQRT ซึ่งจะได้รับการกำหนดค่ารหัสที่จะทำให้มีการบรรจุรีจีสเตอร์ LP ที่ชี้ไปยัง linkage segment ของ SQRT และรหัสที่จะ transfer ไปยังคำสั่งย่อย SQRT
เนื่องจากการ Protection ก็เป็นพื้นฐานอย่างหนึ่ง segmentation เพราะฉะนั้นฮาร์ดแวร์ก็จะต้องมีการตรวจสอบ descriptor segment ด้วย ซึ่งมีการอ้างอิงถึงหน่วยความจำบางทีอาจจะมี Protection-bit อยู่ใน descriptor segment table ก็ได้ ซึ่งมักจะใช้วิธีนี้ใน multiprocessing system




















Its pareSTO * Indirect
Is segment name convert to segment #?
Is page table for segment in core ?segment #?
Is page in core?
Return up-ward
No
Page fault
Segment fault
Page fault
Find available block of physical memory
No
Yes
Yes
Yes























Necessary to allocate space for new page on device?
Generate I/O commands
Issue I/O and Process interrupt
Return up-ward
Allocate
HIS645
Hardware
factilities




รูปที่ 9.45

6.5.7 MULTICS FILE SYSTEM AND GENERAL MODEL
รูปที่ 9.45 แสดงเปรียบเทียบระหว่าง MUTICS segmentation hardware กับรูปแบบของ file system ทั่วๆไป คำสั่งที่ใช้ใน file system ในรูปจะเป็นคำสั่งให้เก็บค่าบางอย่างลงใน segment ที่ระบุอยู่ภายนอก ใน MUTICS จะสร้างรหัสให้เก็บ (โดยทางอ้อม) ผ่าน linkage section บางตัว ในที่นี้เป็นการใช้ page ร่วมกับ segmentation
Overhead ของ segment ทุกๆครั้งที่มีการ accesss กับรายการข้อมูลในส่วนของ memory hardware จะต้องกระทำผ่าน descriptor segment แล้วจึงเข้าสู่ hardware location (ในทางปฏิบัติจริงจะต้องผ่าน descriptor segment , page table แล้วจึงจะได้ค่าตำแหน่งตามลำดับ) แต่ overhead นี้อาจแก้ดดยใช้หน่วยความจำที่เกี่ยวข้องกัน และการ bind กับ segment ที่มักใช้บ่อยๆ และวิธี segmentation นี้คาดว่าคงจะนิยมใช้กันมากขึ้นในอนาคต

9.7 SUMMARY
ทั้งหมดที่กล่าวมาในหัวข้อนี้กล่าวถึงลักษณะหลายๆ อย่างของโปรแกรมระบบปฏิการและการออกแบบโมดูลต่างๆเหล่านั้น โดยจะกล่าวถึงลักษณะที่คล้ายกันอย่างกว้างๆ รวมทั้งหน้าที่ของ
- memory allocation
- processor allocation
- device allocation
- information allocation
แต่ก็มีอีกหลายประการที่ยังไม่ได้ให้ตัวอย่างของการออกแบบโมดุลเหล่านั้น