私はクラスプロジェクトに取り組んでいます。CPU、lts(長期スケジューラー)、ディスパッチャーを設計する必要があります。CPUとltsはスレッドであり、同じスレッドセーフリンクリストを操作します(つまり、リンクリストのすべての操作は相互に排他的である必要があります)。CPUには3つのコンポーネントがあります(ブート:実行の開始時に1回だけ機能し、レディキューからの最初のアイテムフェッチ:実行中のプロセスのコードセグメントからIRへの[IP]番目の命令を取得します。実行すると、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は実行を開始しますが、最初のプロセスが終了するまで停止しません。ただし、命令が実行された後、2番目のプロセスをreadyqueueに入れる必要があります。どうやって修正すればいいのかわからないので、本当に助けが必要です。