วันเสาร์ที่ 26 มิถุนายน พ.ศ. 2553

เรื่องเล่าของ Memory ตอน 2 (ตัวแป๊ร ตัวแปร)

หน้าที่หลัก memory คือจัดเก็บข้อมูลที่ซีพียูจะประมวลผล โปรแกรมใดต้องการใช้พื้นที่ memory ก็ต้องจับจอง (allocate) จู่ ๆ จะเข้าไปถือครองพื้นที่เอง บ่ได้หรอก เหมือนกับจะไปขายของที่ตลาดนัดก็ต้องไปขอจองพื้นที่ทำสัญญาจะขายของ แล้วจึงเอาของไปวางขายในพื้นที่ที่จองไว้ได้ การจองพื้นที่ก็เหมือนกับเราประกาศตัวแปรเตรียมไว้สำหรับข้อมูล ส่วนของที่เราเอาไปวางขายก็เหมือนข้อมูล อย่างเราเขียนโปรแกรมด้วยภาษาซี ง่าย ๆ มีการประกาศตัวแปร เช่น
int i;
float x,y;
แบบนี้ก็เป็นการประกาศขอจองพื้นที่ในหน่วยความจำไง โดยจองพื้นที่ชื่อ i  พื้นที่ชื่อ x และพื้นที่ชื่อ y เพียงแต่ว่ายังไมได้เอาข้อมูลไปเก็บไว้ เป็นการกันท่า (ที่) ไว้ก่อน

เมื่อเราเขียนโปรแกรมต่อไปอีกว่า
i = 22;
x = 98.5;
อย่างนี้ก็แปลว่ามีการเขียนบันทึกข้อมูลลงบนพื้นที่ i กับพื้นที่ x เรียบร้อยแล้ว ส่วนพื้นที่ y ยังบ่ได้ใช้

จริง ๆ แล้วพื้นที่ใน memory เนี่ยมันมีบ้านเลขที่ หมายถึง address นะ เป็นเลขฐานสิบหก เช่น 0x2034AC54, 0xC030C00 เป็นต้น การจับจองพื้นที่ก็ต้องระบุ address ที่ต้องการ แต่คงเป็นการยากที่จะต้องมาบอก มาประกาศขอพื้นที่นี้ถึงพื้นที่นั้น ให้เป็นเลขฐานสิบหก จึงกำหนดให้เป็นการประกาศเป็นชื่อตัวแปรขึ้นมาแทน แล้ว OS จะไปจัดการเบื้องหลังการถ่ายทำให้เองว่า พื้นที่ตรงไหนว่าง ก็จัดสรรให้เป็นตัวแปรตามที่ประกาศขอมาโดยอัตโนมัติ โปรแกรมเมอร์ก็ไม่ต้องเหนื่อย เห็นไม๊ว่าโปรแกรมเมอร์อย่างเรา ๆ ก็ยังไม่ถึงกับลงไปทำงานระดับ physical ซักเท่าไร

เรื่องเล่าของ Memory ตอน 1

การจัดการกับโครงสร้างข้อมูลนี่เกี่ยวข้องตรง ๆ กับ Memory เลยนะ  และ Memory ที่จะเล่าให้ฟัง (อ่าน) ต่อไปนี้ก็คือเจ้า RAM (Random Access Memory) เป็นการ์ดเล็ก ๆ ยาวไม่ถึงคืบ เสียบอยู่บนเมนบอร์ด สามารถถอดเปลี่ยนเพื่อ upgrade ได้ไม่ยาก หน้าที่ของเจ้า RAM มีไว้สำหรับจัดเก็บข้อมูลที่ถูกซีพียูเรียกมาประมวลผล ณ เวลานั้น ๆ  หากมองเข้าไปในพื้นที่ของ RAM ที่แฝงอยู่ในการ์ดแล้วต้องบอกว่าไร้รูปทรงจริง ๆ เพราะมีการจับจองพื้นที่และคืนพื้นที่ภายในนั้นอยู่ตลอดเวลา อย่างน้อย ๆ ผู้ที่จับจองพื้นที่อยู่ตลอดเวลาก็เห็นจะเป็น พี่เบิ้ม OS (windows, linux ฯลฯ) นอกจากนี้ก็เป็นพวกโปรแกรมต่าง ๆ ที่เราเปิดขึ้นมาใช้งาน อาจจะเป็นโปรแกรม office โปรแกรมเกม เปิด Browser เปิดโปรแกรมฆ่าไวรัส และเมื่อเราปิดการใช้งานส่วนใดก็จะมีการคืนพื้นที่การจับจอง memory ส่วนนั้น ๆ ให้เป็นอิสระ ในอดีต RAM มีราคาสูงมาก OS จะต้องบริหารจัดการ memory โดยหากข้อมูลใน memory ส่วนใดยังไม่ถูกเรียกใช้ทันทีก็จะนำไปฝากไว้ที่หน่วยความจำถาวรก่อน (ฮาร์ดดิสก์) ที่เรียกว่าการทำ Virtual memory ไง พอจะใช้งานก็ไปอ่านออกมาจากฮาร์ดดิสก์ ก็เขียน ๆ อ่าน ๆ กันอยู่อย่างนี้ ดังนั้นจึงมีการอ่านเขียนฮาร์ดดิสก์อยู่ตลอดเวลา (swap file) ทั้ง ๆ ที่เราก็ไม่ได้ไปทำอะไรซักหน่อย แต่นี่ก็เป็นวิธีบริหารหน่วยความจำนะจ๊ะ

ขอบคุณภาพจาก 168hours.wordpress.com

วันพฤหัสบดีที่ 3 มิถุนายน พ.ศ. 2553

เรียนอะไรบ้าง

เรื่องที่อยู่ในขอบข่ายจะต้องศึกษาประกอบด้วยหัวข้อใหญ่ ๆ 7 หัวข้อ ตามลำดับดังนี้
1. อาร์เรย์ (Array) หรือแถวลำดับ
2. สแตก (Stack)
3. คิว (Queue)
4. ลิงค์ลิสต์ (Linked list) หรือ ลิสต์เชื่อมโยง
5. ต้นไม้ (Tree)
6. กราฟ (graph)
7. การค้นหาข้อมูล (Searching)
8. การเรียงลำดับข้อมูล (Sorting)

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

ความสำคัญของวิชาโครงสร้างข้อมูล

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