下列程序:
假设矩阵A、B的初值已设置好,矩阵C初始为0,各矩阵均以页为单位连续存放。又假定一个整数占一个字,代码以及变量i、j和k存放在其他页面里,并且存取变量i、i和k时不存在缺页问题。主存初始为空,在请求分页存储管理中,页面置换算法为FIFO。
进程分配10个页面,每个页面为100字,给矩阵A、B和C使用。问执行上面程序时,缺页次数是多少当执行完程序时,留在内存的10个页面各属于哪些矩阵
参考答案:
假定矩阵是按行存储的,且每页均从页面首址开始存放,则A、B、C各矩阵的存储情况见下表。
假设程序的执行顺序为:读A,读B,计算A×B,读C,计算C+A×B,写C。则程序执行中对存储器的访问顺序为读A,读B,读C和写C。
由于每页可存放100个字,由上表可知:矩阵A占用150页,矩阵B占用300页,矩阵C占用200页。假设矩阵A占用的页面为1~150,矩阵B占用的页面为151~450,矩阵C占用的页面为451~650。其存储示意如下图所示。
程序对矩阵A、C的访问是按行访问,即矩阵A、C的存放顺序与访问顺序相同。程序对矩阵B的访问是按列访问,即矩阵B的存放顺序与访问顺序不一致。访问顺序是访问某列的第一个元素后再访问该列的第2个元素、第3个元素……,并且由于矩阵B每行必须用两页存储,故一列第1个元素与第2个元素存储在不同的页中,也即按列顺序访问时,每次对矩阵B的访问实际上都要访问与前一次访问不同的页。
程序中三重for循环执行的次数为100×200×150=30000000次,每次需要依次访问矩阵A、B和C。只要不跨页,每次访问矩阵A和C时无需调入新页,但每次访问矩阵B的元素时都要调入新页。由于系统只有10个页面,所以每次访问矩阵B时,被访问元素所在的页面都不在内存中。
采用FIFO算法,当循环次数为(n×9)+1或(n×100)+1时,读A、读B与读/写C都会出现缺页,而其他情况只有在读B时会出现缺页。(n×9)+1时的情况是由于矩阵B所用的页面占用了内存所有10个页面而造成的缺页,而(n×100)+1时的情况是需要读A或C的新的一页数据造成的缺页。根据这个规律可以得出缺页的次数为:
(100×200×150)+(333333+29999-3333)×2=3719998(次)
最后留在内存中的10个页面,一个属于矩阵A,8个属于矩阵B,1个属于矩阵C。