<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}]"}