操作系统- CPU模拟在C



我正在做一个班级项目。我需要设计一个cpu,一个lts(长期调度程序)和一个调度程序。Cpu和lts都是线程,它们操作同一个线程安全链表(这意味着链表上的所有操作必须是互斥的)。Cpu由三部分组成。(启动:它将只在执行开始时工作一次,并从就绪队列中获取第一项。Fetch:它将从运行进程的代码段获取[IP]条指令到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应该检查它是否是下一个进程的创建时间。这就是为什么我使用互斥锁。但问题是它们不起作用。首先,lts将第一个进程放入就绪队列(其创建时间为0),然后cpu开始运行,但直到第一个进程终止才停止。但是,在执行指令之后,必须将第二个进程放入readyqueue中。我不知道怎么解决,我真的需要帮助。

如果一个线程需要等待另一个线程而不需要锁定互斥锁,标准的方法是使用条件语句。如果我没看错你的问题,你有两个线程需要使用相同互斥锁保护的东西,交错。

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

此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

我不是100%确定,但我猜发生的事情是第一个CPU在第二个CPU有机会运行之前"抓取"互斥锁。您可以通过在发布后添加sleep(20);来尝试这一点(这显然是一个糟糕的解决方案,但它将显示这是否真的是问题所在)。

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

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

最新更新