<style> html, body, .ui-content { background-color: #333; color: #ddd; } .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { color: #ddd; } .markdown-body h1, .markdown-body h2 { border-bottom-color: #ffffff69; } .markdown-body h1 .octicon-link, .markdown-body h2 .octicon-link, .markdown-body h3 .octicon-link, .markdown-body h4 .octicon-link, .markdown-body h5 .octicon-link, .markdown-body h6 .octicon-link { color: #fff; } .markdown-body img { background-color: transparent; } .ui-toc-dropdown .nav>.active:focus>a, .ui-toc-dropdown .nav>.active:hover>a, .ui-toc-dropdown .nav>.active>a { color: white; border-left: 2px solid white; } .expand-toggle:hover, .expand-toggle:focus, .back-to-top:hover, .back-to-top:focus, .go-to-bottom:hover, .go-to-bottom:focus { color: white; } .text-left { text-align: left !important; } .ui-toc-dropdown { background-color: #333; } .ui-toc-label.btn { background-color: #191919; color: white; } .ui-toc-dropdown .nav>li>a:focus, .ui-toc-dropdown .nav>li>a:hover { color: white; border-left: 1px solid white; } .markdown-body blockquote { color: #bcbcbc; } .markdown-body table tr { background-color: #5f5f5f; } .markdown-body table tr:nth-child(2n) { background-color: #4f4f4f; } .markdown-body code, .markdown-body tt { color: #eee; background-color: rgba(230, 230, 230, 0.36); } a, .open-files-container li.selected a { color: #5EB7E0; } </style> # Operating System Homework 1&2 --- ## HW1 - Sleep Syscall ---- 1. 定義syscall ```= case SC_Sleep: val=kernel->machine->ReadRegister(4); cout << "Sleep Time" << val << "(ms)" <<endl; kernel->alarm->WaitUntil(val); return; ``` ---- 2. 定義syscall中使用到的WaitUntil function 3. 為了不在thread sleep過程中被搶佔,所以需要將interrupt關閉 ```= void Alarm::WaitUntil(int x) { IntStatus oldLevel = kernel->interrupt->SetLevel(IntOff); Thread* t = kernel->currentThread; _bedroom.PutToBed(t, x); kernel->interrupt->SetLevel(oldLevel); } ``` ---- 4. 定義WaitUntil使用到的sleep queue ```= class Bedroom { public: Bedroom():_current_interrupt(0) {}; void PutToBed(Thread *t, int x); bool MorningCall(); bool IsEmpty(); private: class Bed { public: Bed(Thread* t, int x): sleeper(t), when(x) {}; Thread* sleeper; int when; }; int _current_interrupt; std::list<Bed> _beds; }; ``` ---- 5. 透過CallBack來定期檢查是否將sleep thread喚醒 ```= void Alarm::CallBack() { Interrupt *interrupt = kernel->interrupt; MachineStatus status = interrupt->getStatus(); bool woken = _bedroom.MorningCall(); if (status == IdleMode && !woken && _bedroom.IsEmpty()) { if (!interrupt->AnyFutureInterrupts()) { timer->Disable(); } } else { interrupt->YieldOnReturn(); } } ``` --- ## HW2 - FCFS 、 Priority 、 SJF 、SRTF ---- 1. 透過argc、argv去解析目前輸入參數 ```= for (int i = 1; i < argc; i++) { if(strcmp(argv[i], "-RR") == 0) { type = RR; } else if (strcmp(argv[i], "-FCFS") == 0) type = FIFO; } else if (strcmp(argv[i], "-PRIORITY") == 0) { type = Priority; } else if (strcmp(argv[i], "-SJF") == 0) { type = SJF; } else if (strcmp(argv[i], "-SRTF") == 0) { type = SRTF; } } ``` ---- ```= for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-prio")==0){ priorityList.push_back(atoi(argv[i + 1])); } else if (strcmp(argv[i], "-burst")==0){ burstList.push_back(atoi(argv[i+1])); } } ``` ---- 2. 定義scheduler的ready list ```= Scheduler::Scheduler(SchedulerType type) { schedulerType = type; switch(schedulerType) { case RR: readyList = new List<Thread *>; break; case SJF: readyList = new SortedList<Thread *>(JobTimeCompare); break; case Priority: readyList = new SortedList<Thread *>(PriorityCompare); break; case FIFO: readyList = new SortedList<Thread *>(FCFSCompare); break; case SRTF: readyList = new List<Thread *>; break; } } ``` ---- ```= int PriorityCompare(Thread *a, Thread *b) { if(a->getPriority() == b->getPriority()) return 0; int res =a->getPriority() > b->getPriority() ? 1 : -1; return res; } int JobTimeCompare(Thread *a,Thread *b){ if(a->getBurstTime() == b->getBurstTime()) return 0; return a->getBurstTime() > b->getBurstTime()?1:-1; } int FCFSCompare(Thread *a, Thread *b){ return 1; } ``` ---- 3. 考慮thread允許被搶佔的情形 ```= if(kernel->scheduler->getSchedulerType() == RR || kernel->scheduler->getSchedulerType() == SRTF) { interrupt->YieldOnReturn(); } ``` ---- 4. 考慮使用SRTF scheduler時,當thread先放棄CPU,並切換到下一個thread執行的情形 ```= void Thread::Yield () { Thread *nextThread; IntStatus oldLevel = kernel->interrupt->SetLevel(IntOff); ASSERT(this == kernel->currentThread); if(kernel->scheduler->getSchedulerType() == SRTF){ kernel->scheduler->ReadyToRun(this); //也包含將本身放到ready list nextThread = kernel->scheduler->SRTFFindNextToRun(); } else{ nextThread = kernel->scheduler->FindNextToRun(); } ... } ``` --- ## 未來作業方針 - 需要實作的作業都以分組進行 - 作業的提示會盡量詳細 --- 因為修改kernel層通常trace code的流程比較複雜,所以有些同學期中時有反應作業的難度比較高有點吃力,之後的實作作業我也都會採用分組的方式來降低每位同學的負擔,另外作業也會盡量給多一點提示
{"metaMigratedAt":"2023-06-15T15:32:05.409Z","metaMigratedFrom":"YAML","title":"Operating System Homework","breaks":true,"slideOptions":"{\"transition\":\"fade\"}","contributors":"[{\"id\":\"988bd23b-fef4-4a1b-b3b0-9b10aff25aa6\",\"add\":8312,\"del\":2502}]"}
    284 views