线程不断互相中断,日志不反映系统操作

时间:2016-05-15 18:35:37

标签: java multithreading logging

我构建了一个模拟内存分页的系统,就像MMU一样。 为了更好地规范和理解它是如何工作的,我正在记录它。

我的问题是,日志似乎没有准确地反映系统的操作,或者更确切地说它反映了系统的操作,但是我遇到了一些需要帮助解决的线程问题。

我会试着解释一下。

public void run() //gets pages and writes to them
{ // i printed the pageId of every process to check they are running at the same time and competing for resources
    for(ProcessCycle currentCycle : processCycles.getProcessCycles())
    {
        Long[] longArray = new Long[currentCycle.getPages().size()];
        try {
            for(int i = 0; i < currentCycle.getPages().size();i++)
            {
                MMULogger.getInstance().write("GP:P" + id + " " + currentCycle.getPages().get(i) + " " + Arrays.toString(currentCycle.getData().get(i)), Level.INFO);
            }
            Page<byte[]>[] newPages = mmu.getPages(currentCycle.getPages().toArray(longArray));
            List<byte[]> currentPageData = currentCycle.getData();
            System.out.println("process id " + id);
            for(int i = 0; i < newPages.length;i++)
            {
                byte[] currentData = currentPageData.get(i);
                newPages[i].setContent(currentData);
            }
            Thread.sleep(currentCycle.getSleepMs());
        } catch (ClassNotFoundException | IOException | InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

此代码段取自名为Process的类。就像在计算机中一样,我有多个进程,每个进程都需要从页面读取和写入,这些页面是从名为MMU的类中请求的。这是“mmu.getpages”部分。

我们还在方法get pages:

中写入我们的日志文件
public synchronized Page<byte[]>[] getPages(java.lang.Long[] pageIds) throws java.io.IOException, ClassNotFoundException
{
    @SuppressWarnings("unchecked")
    Page<byte[]>[] toReturn = new Page[pageIds.length];
    for(int i = 0; i < pageIds.length; i++)
    {
        Long currentPage = algo.getElement(pageIds[i]);
        if(currentPage == null) //page not found in RAM
        {
            if(ram.getInitialCapacity() != ram.getNumOfPages()) //ram is NOT full
            {
                MMULogger.getInstance().write("PF:"+pageIds[i], Level.INFO);
                algo.putElement(Long.valueOf(pageIds[i]),Long.valueOf(pageIds[i]));
                ram.addPage(HardDisk.getInstance().pageFault(pageIds[i]));
            }
            else //ram is full
            {
                Long IDOfMoveToHdPage = algo.putElement(pageIds[i], pageIds[i]);
                Page<byte[]> moveToHdPage = ram.getPage((int)((long)IDOfMoveToHdPage));
                Page<byte[]> moveToRAM = HardDisk.getInstance().pageReplacement(moveToHdPage, pageIds[i]);
                ram.removePage(moveToHdPage);
                ram.addPage(moveToRAM);
                MMULogger.getInstance().write("PR: MTH " + moveToHdPage.getPageId() + " MTR " + moveToRAM.getPageId(), Level.INFO);
            }
        }
        toReturn[i] = ram.getPage((int)((long)pageIds[i]));
    }
    return toReturn;
}

总而言之,回顾 - 一个进程请求页面,我写入日志文件,处理请求哪个页面以及它想要写入的内容,然后我调用mmu.getpages,系统的逻辑继续

我的问题是日志看起来像这样:

GP:P2 5 [102, 87, -9, 85, -5]
GP:P1 1 [-9, -18, 50, -124, -102]
GP:P4 10 [79, -51, 67, 118, 111]
GP:P2 6 [-20, -22, 3, -74, -65]
GP:P3 7 [90, 56, 91, 71, -115]
PF:5
GP:P6 18 [28, -39, -3, 64, -117]
GP:P5 13 [72, -26, 52, -84, 6]
GP:P4 11 [-55, -70, -88, -9, 38]
GP:P1 2 [39, 112, -117, 5, 109]
GP:P5 12 [38, -31, 18, -40, 36]

这不是我想要的。首先,您可以看到第5页要求的流程2,并希望写入[102,87,-9,85,-5]。

在那条线之后,我本来期望看到“PF:5”,但是它进一步向下。我认为情况就是这样,因为进程2耗尽时间并且没有设法完成mmu.getpages操作。因此它永远不会将PF:5打印到文件中。

对我来说这是个问题。我希望进程以多线程方式同时运行,但我希望日志具有以下形式:

GP:P2 5 [1,1,1,1,1]
PF:5
GP:P2 7 [1,2,3,4,5]
PF:7
GP:P19 12 [0,0,0,0,0]
PF:12

例如

0 个答案:

没有答案