วันเสาร์ที่ 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 ซักเท่าไร

3 ความคิดเห็น:

Amornthep กล่าวว่า...

อาจารย์คับจะถามเรื่องการบ้านหน่อยอ่ะคับอาจารย์คับในแบบฝึกหัดที่อาจารย์ให้ทำอ่ะคับข้อ 2 กับ3อ่ะคับ จุดเริ่มต้นนี้หมายถึงAdderssเริ่มต้นหรือเปล่้าคับแล้วจุดสิ้นสุดคืออะไร คับ โจทย์ทะคับ

2.กำหนดอาเรย์ TD(-5:5,1:10) ซึ่งใช้เนื้อที่ในหน่วยความจำทั้งสิ้น 440 ไบต์และถ้าloc(TD[5,10])=2048 จงหาจุดเริ่มต้นของอารเรย์ TD และ loc(TD[3,7])

3. กำหนดอาเรย์ two D(-4:10,2:15) มี loc(twoD[1,8])=1160 และ loc(twoD[4,10])=1248 จงหาจุดเริ่มต้นและจุดสิ้นสุดของอาเรย์ twoD

ครูจูน กล่าวว่า...

ตอบ Amornthep จุดเริ่มต้น คือจุดเริ่มต้นของ Address ส่วนจุดสิ้นสุดก็คือ Address ของสมาชิกตัวสุดท้าย ในข้อ 2 ต้องหาค่า c ให้ได้ก่อน โดยอาศัยสิ่งที่โจทย์ให้มา คือ จำนวนเนื้อที่ที่ใช้ทั้งหมดสำหรับ Array นี้ ก็คือ 440 byte ถ้าเราทราบจำนวนสมาชิก ก็หา c ได้ (ก็แนะให้ว่าต้องไปหาจำนวนสมาชิกก่อน แล้วเอาไปหารไง ก็จะได้ c)
ส่วนข้อ 3 โจทย์พลิกแพลงมาก ต้องอาศัยความรู้เรื่องสมการมาช่วย เพื่อหา c ให้ได้ก่อน แล้วพอได้ c ก็เอามาแทนค่าเพื่อหาจุดเริ่มต้นได้

Amornthep กล่าวว่า...

ขอบคุณครับผม....

แสดงความคิดเห็น