示例#1
0
        /// <summary>
        /// Swaps in the specified <see cref="MemoryPage"/> from disk.  Currently implemented as XML for fun.
        /// </summary>
        /// <param name="winner">The <see cref="MemoryPage"/> that is being swapped in</param>
        public void SwapIn(MemoryPage winner)
        {
            // Generate a filename based on address and page number
            string filename = System.Environment.CurrentDirectory + "/page" + winner.pageNumber + "-" + winner.addrVirtual + ".xml";

            if (File.Exists(filename) && winner.isValid == false)
            {
                //BinaryFormatter ser = new BinaryFormatter();
                //Stream reader = new FileStream(filename, FileMode.Open);

                XmlSerializer ser    = new XmlSerializer(typeof(MemoryPageValue));
                Stream        fs     = new FileStream(filename, FileMode.Open);
                XmlReader     reader = new XmlTextReader(fs);

                // Load the MemoryPageValue in from Disk!
                MemoryPageValue pageValue = (MemoryPageValue)ser.Deserialize(reader);

                // Copy the bytes from Physical Memory so we don't pageFault in a Fault Hander
                for (int i = 0; i < CPU.pageSize; i++)
                {
                    CPU.physicalMemory[winner.addrPhysical + i] = pageValue.memory[i];
                }

                //Console.WriteLine("Swapping in page {0} at physical memory {1}",winner.pageNumber, winner.addrPhysical);

                winner.accessCount  = pageValue.accessCount;
                winner.lastAccessed = pageValue.lastAccessed;

                pageValue = null;

                reader.Close();
                fs.Close();
                File.Delete(filename);
            }
            else             //no swap file, do nothing
            {
                //Console.WriteLine(filename + " doesn't exist");
            }

            // We are now in memory and we were involved in Page Fault
            winner.isValid = true;
            winner.pageFaults++;
        }
示例#2
0
        /// <summary>
        /// Swaps the specified <see cref="MemoryPage"/> to disk.  Currently implemented as XML for fun.
        /// </summary>
        /// <param name="victim">The <see cref="MemoryPage"/> to be swapped</param>
        public void SwapOut(MemoryPage victim)
        {
            if (victim.isDirty)
            {
                // Generate a filename based on address and page number
                string filename = System.Environment.CurrentDirectory + "/page" + victim.pageNumber + "-" + victim.addrVirtual + ".xml";

//				IFormatter ser = new BinaryFormatter();
//				Stream writer = new FileStream(filename, FileMode.Create);

                XmlSerializer ser    = new XmlSerializer(typeof(MemoryPageValue));
                Stream        fs     = new FileStream(filename, FileMode.Create);
                XmlWriter     writer = new XmlTextWriter(fs, new UTF8Encoding());

                MemoryPageValue pageValue = new MemoryPageValue();

                // Copy the bytes from Physical Memory so we don't pageFault in a Fault Hander
                byte[] bytes = new byte[CPU.pageSize];
                for (int i = 0; i < CPU.pageSize; i++)
                {
                    bytes[i] = CPU.physicalMemory[victim.addrPhysical + i];
                }

                // Copy details from the MemoryPage to the MemoryPageValue
                pageValue.memory       = bytes;
                pageValue.accessCount  = victim.accessCount;
                pageValue.lastAccessed = victim.lastAccessed;

                //Console.WriteLine("Swapping out page {0} at physical memory {1}",victim.pageNumber, victim.addrPhysical);

                // Write the MemoryPageValue to disk!
                ser.Serialize(writer, pageValue);

                //writer.Flush();
                //writer.Close();
                fs.Close();
            }
            victim.isValid = false;
        }