//---------------------------------------------------------------------- // // ProcessModuleInit // // Initialize the process module. This involves initializing all // of the process control blocks to appropriate values (ie, free // and available). We also need to initialize all of the queues. // //---------------------------------------------------------------------- void ProcessModuleInit () { int i; dbprintf ('p', "ProcessModuleInit: function started\n"); AQueueInit (&freepcbs); AQueueInit(&runQueue); AQueueInit (&waitQueue); AQueueInit (&zombieQueue); // For each PCB slot in the global pcbs array: for (i = 0; i < PROCESS_MAX_PROCS; i++) { dbprintf ('p', "Initializing PCB %d @ 0x%x.\n", i, (int)&(pcbs[i])); // First, set the internal PCB link pointer to a newly allocated link if ((pcbs[i].l = AQueueAllocLink(&pcbs[i])) == NULL) { printf("FATAL ERROR: could not allocate link in ProcessModuleInit!\n"); GracefulExit(); } // Next, set the pcb to be available pcbs[i].flags = PROCESS_STATUS_FREE; // Finally, insert the link into the queue if (AQueueInsertFirst(&freepcbs, pcbs[i].l) != QUEUE_SUCCESS) { printf("FATAL ERROR: could not insert PCB link into queue in ProcessModuleInit!\n"); GracefulExit(); } } // There are no processes running at this point, so currentPCB=NULL currentPCB = NULL; dbprintf ('p', "ProcessModuleInit: function complete\n"); }
//---------------------------------------------------------------------- // // ProcessDestroy // // Destroy a process by setting its status to zombie and putting it // on the zombie queue. The next time the scheduler is called, this // process will be marked as free. We can't necessarily do it now // because we might be the currently running process. // // NOTE: This must only be called from an interrupt or trap. However, // it need not be followed immediately by a ProcessSchedule() because // the process can continue running. // //---------------------------------------------------------------------- void ProcessDestroy (PCB *pcb) { dbprintf('p', "Entering ProcessDestroy for 0x%x.\n", (int)pcb); ProcessSetStatus (pcb, PROCESS_STATUS_ZOMBIE); if (AQueueRemove(&(pcb->l)) != QUEUE_SUCCESS) { printf("FATAL ERROR: could not remove link from queue in ProcessDestroy!\n"); exitsim(); } if ((pcb->l = AQueueAllocLink(pcb)) == NULL) { printf("FATAL ERROR: could not get link for zombie PCB in ProcessDestroy!\n"); exitsim(); } if (AQueueInsertFirst(&zombieQueue, pcb->l) != QUEUE_SUCCESS) { printf("FATAL ERROR: could not insert link into runQueue in ProcessWakeup!\n"); exitsim(); } dbprintf('p', "Leaving ProcessDestroy for 0x%x.\n", (int)pcb); }
//---------------------------------------------------------------------- // // ProcessDestroy // // Destroy a process by setting its status to zombie and putting it // on the zombie queue. The next time the scheduler is called, this // process will be marked as free. We can't necessarily do it now // because we might be the currently running process. // // NOTE: This must only be called from an interrupt or trap. However, // it need not be followed immediately by a ProcessSchedule() because // the process can continue running. // //---------------------------------------------------------------------- void ProcessDestroy (PCB *pcb) { dbprintf ('p', "ProcessDestroy (%d): function started\n", GetCurrentPid()); ProcessSetStatus (pcb, PROCESS_STATUS_ZOMBIE); if (AQueueRemove(&(pcb->l)) != QUEUE_SUCCESS) { printf("FATAL ERROR: could not remove link from queue in ProcessDestroy!\n"); GracefulExit(); } if ((pcb->l = AQueueAllocLink(pcb)) == NULL) { printf("FATAL ERROR: could not get link for zombie PCB in ProcessDestroy!\n"); GracefulExit(); } if (AQueueInsertFirst(&zombieQueue, pcb->l) != QUEUE_SUCCESS) { printf("FATAL ERROR: could not insert link into runQueue in ProcessWakeup!\n"); GracefulExit(); } dbprintf ('p', "ProcessDestroy (%d): function complete\n", GetCurrentPid()); }
//---------------------------------------------------------------------- // // ProcessModuleInit // // Initialize the process module. This involves initializing all // of the process control blocks to appropriate values (ie, free // and available). We also need to initialize all of the queues. // //---------------------------------------------------------------------- void ProcessModuleInit () { int i,j; dbprintf ('p', "Entering ProcessModuleInit\n"); AQueueInit (&freepcbs); AQueueInit (&runQueue); AQueueInit (&waitQueue); AQueueInit (&zombieQueue); // For each PCB slot in the global pcbs array: for (i = 0; i < PROCESS_MAX_PROCS; i++) { dbprintf ('p', "Initializing PCB %d @ 0x%x.\n", i, (int)&(pcbs[i])); // First, set the internal PCB link pointer to a newly allocated link if ((pcbs[i].l = AQueueAllocLink(&pcbs[i])) == NULL) { printf("FATAL ERROR: could not allocate link in ProcessModuleInit!\n"); exitsim(); } // Next, set the pcb to be available pcbs[i].flags = PROCESS_STATUS_FREE; //------------------------------------------------------- // STUDENT: Initialize the PCB's page table here. //------------------------------------------------------- //////////////////////////////////// // TODO3 CHANGE FOR 2 LEVEL DONE // JSM, Set all entries of every page table to 0 (Invalid) since no pages have been allocated for any process // and no level 2 page tables have been allocated for any processes for (j = 0; j < MEM_L1_PAGE_TABLE_SIZE; j++) { pcbs[i].pagetable[j] = 0x00000000; } /////////////////////////////////// // Finally, insert the link into the queue if (AQueueInsertFirst(&freepcbs, pcbs[i].l) != QUEUE_SUCCESS) { printf("FATAL ERROR: could not insert PCB link into queue in ProcessModuleInit!\n"); exitsim(); } } // There are no processes running at this point, so currentPCB=NULL currentPCB = NULL; dbprintf ('p', "Leaving ProcessModuleInit\n"); }