C中的CPU模拟

时间:2012-12-22 19:49:55

标签: c operating-system

我正在研究一个班级项目。我需要设计一个cpu,一个lts(长期调度程序)和一个调度程序。 Cpu和lts是线程,它们操作相同的线程安全链表(这意味着链表上的所有操作必须互斥).Cpu有三个组件。(引导:它只在执行开始时工作一次并得到准备队列中的第一项。获取:它将从正在运行的进程的代码段获得[IP] th指令到IR。执行它将执行IR中的指令。当创建时间为时,Lts将假设进程置于就绪队列中。创建时间是创建进程之前执行的总指令数。

DWORD WINAPI cpuFunction(){
    boot();

    while(cpu.runningProcess != NULL){
        WaitForSingleObject(readyQueue->mutex, INFINITE);
        fetch();
        exec();
        ReleaseMutex(readyQueue->mutex);

    }


    return (DWORD) 0;
}


DWORD WINAPI ltsFunction(){
    processList =createProcessList(FILE_NAME); 
    readyQueue = createList();
    while(1){
        WaitForSingleObject(readyQueue->mutex, INFINITE);
        if(processList != NULL){
            nextProcess = getFromList(processList,0);
            if(nextProcess->processCreationTime == cpu.executedInstructionCount){
                nextProcess = removeFromList(processList,0);
                addToList(readyQueue, nextProcess);
                printf("Process %d is in the ready queue.\n",nextProcess->processID);
            } else{
                nextProcess = NULL;
            }
        }
        ReleaseMutex(readyQueue->mutex);
    }
    Sleep(500);

}

在我的代码中,我想要做的是在每个执行步骤之后,必须解锁cpu函数中的互斥锁,并且应该检查它是否是下一个进程的创建时间。这就是我使用互斥锁的原因。但问题是他们不工作。首先lts将第一个进程放入就绪队列(其创建时间为0),然后cpu开始运行但它不会停止直到第一个进程终止。但是,在执行insturuction之后,必须将第二个进程置于readyqueue中。我不知道如何解决,我真的需要帮助。

2 个答案:

答案 0 :(得分:1)

如果一个线程需要在没有锁定互斥锁的情况下等待其他线程,则标准方法是使用条件。如果我正确地读了你的问题,你有两个线程需要使用受相同互斥锁保护的东西,交错。

有关条件的重要事项是,它们始终与互斥锁相关联。线程锁定互斥锁,然后在互斥锁被锁定时开始等待条件,从而释放互斥锁。然后当线程从条件等待中唤醒时,它将再次锁定互斥锁。当另一个线程想要唤醒等待条件的线程时,它必须首先锁定相同的互斥锁,然后发出条件信号以唤醒等待它的线程,然后释放互斥锁(因此唤醒的线程实际上可以获得互斥锁)

此MSDN页面提供了一个示例:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686903%28v=vs.85%29.aspx

但是,您可以至少浏览一下有关同步的MSDN主题下的所有内容:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686353%28v=vs.85%29.aspx

答案 1 :(得分:1)

我不是百分百肯定,但我猜测会发生的事情是第一个CPU在第二个有机会运行之前“抓住”Mutex。你可以通过在realease之后添加sleep(20);来尝试这个[这显然是一个糟糕的解决方案,但它会显示这是否真的是问题]。

即使您的系统中有多个内核/ CPU,也不能保证等待时间最长的线程赢得了获取互斥锁的竞争。

不使用互斥锁当然是一种解决方案,但我认为在你说“哦,互斥体不起作用,我会做其他事情”之前你仍然需要了解你做错了什么 - 因为很可能你迟早会在其他地方遇到相同或类似的问题,除非你明白发生了什么。