auto commit
This commit is contained in:
@ -187,8 +187,6 @@ GNU 计划,译为革奴计划,它的目标是创建一套完全自由的操
|
|||||||
|
|
||||||
## HDD
|
## HDD
|
||||||
|
|
||||||
[Decoding UCS Invicta – Part 1](https://blogs.cisco.com/datacenter/decoding-ucs-invicta-part-1)
|
|
||||||
|
|
||||||
Hard Disk Drives(HDD) 俗称硬盘,具有以下结构:
|
Hard Disk Drives(HDD) 俗称硬盘,具有以下结构:
|
||||||
|
|
||||||
- 盘面(Platter):一个硬盘有多个盘面;
|
- 盘面(Platter):一个硬盘有多个盘面;
|
||||||
@ -200,6 +198,8 @@ Hard Disk Drives(HDD) 俗称硬盘,具有以下结构:
|
|||||||
|
|
||||||
<div align="center"> <img src="../pics//014fbc4d-d873-4a12-b160-867ddaed9807.jpg" width=""/> </div><br>
|
<div align="center"> <img src="../pics//014fbc4d-d873-4a12-b160-867ddaed9807.jpg" width=""/> </div><br>
|
||||||
|
|
||||||
|
[Decoding UCS Invicta – Part 1](https://blogs.cisco.com/datacenter/decoding-ucs-invicta-part-1)
|
||||||
|
|
||||||
## 磁盘接口
|
## 磁盘接口
|
||||||
|
|
||||||
### 1. IDE
|
### 1. IDE
|
||||||
|
299
notes/计算机操作系统.md
299
notes/计算机操作系统.md
@ -9,7 +9,6 @@
|
|||||||
* [进程与线程](#进程与线程)
|
* [进程与线程](#进程与线程)
|
||||||
* [进程状态的切换](#进程状态的切换)
|
* [进程状态的切换](#进程状态的切换)
|
||||||
* [进程调度算法](#进程调度算法)
|
* [进程调度算法](#进程调度算法)
|
||||||
* [进程调度算法实现](#进程调度算法实现)
|
|
||||||
* [进程同步](#进程同步)
|
* [进程同步](#进程同步)
|
||||||
* [经典同步问题](#经典同步问题)
|
* [经典同步问题](#经典同步问题)
|
||||||
* [进程通信](#进程通信)
|
* [进程通信](#进程通信)
|
||||||
@ -240,304 +239,6 @@ Linux 的系统调用主要有以下这些:
|
|||||||
|
|
||||||
分为硬实时和软实时,前者必须满足绝对的截止时间,后者可以容忍一定的超时。
|
分为硬实时和软实时,前者必须满足绝对的截止时间,后者可以容忍一定的超时。
|
||||||
|
|
||||||
## 进程调度算法实现
|
|
||||||
|
|
||||||
以下只是假象系统上的调度算法实现。源代码:[Scheduling](https://github.com/CyC2018/Algorithm/tree/master/Process-Scheduling/src)
|
|
||||||
|
|
||||||
### 1. FCFS
|
|
||||||
|
|
||||||
首先创建进程数据结构:
|
|
||||||
|
|
||||||
```java
|
|
||||||
public class Process {
|
|
||||||
private String name;
|
|
||||||
private long totalTime;
|
|
||||||
private long remainTime;
|
|
||||||
private long comeInTime;
|
|
||||||
|
|
||||||
public Process(String name, long totalTime, long comeInTime) {
|
|
||||||
this.name = name;
|
|
||||||
this.totalTime = totalTime;
|
|
||||||
this.remainTime = totalTime;
|
|
||||||
this.comeInTime = comeInTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run(long runTime) {
|
|
||||||
System.out.println("process " + name + " is running...");
|
|
||||||
System.out.println("come in time : " + comeInTime);
|
|
||||||
System.out.println("total time : " + totalTime);
|
|
||||||
System.out.println("remain time : " + remainTime);
|
|
||||||
System.out.println();
|
|
||||||
remainTime -= runTime;
|
|
||||||
try {
|
|
||||||
Thread.sleep(runTime);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getTotalTime() {
|
|
||||||
return totalTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getRemainTime() {
|
|
||||||
return remainTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getComeInTime() {
|
|
||||||
return comeInTime;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
接着创建一个进程等待队列数据结构:
|
|
||||||
|
|
||||||
```java
|
|
||||||
public interface ProcessQueue {
|
|
||||||
|
|
||||||
void add(Process process);
|
|
||||||
|
|
||||||
Process get();
|
|
||||||
|
|
||||||
boolean isEmpty();
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
FCFS 算法使用普通的先进先出队列即可实现该进程等待队列:
|
|
||||||
|
|
||||||
```java
|
|
||||||
public class FCFSProcessQueue implements ProcessQueue {
|
|
||||||
|
|
||||||
private Queue<Process> queue = new LinkedList<>();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void add(Process process) {
|
|
||||||
queue.add(process);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Process get() {
|
|
||||||
return queue.poll();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEmpty() {
|
|
||||||
return queue.isEmpty();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
接下来是调度器的实现,把它设计成可独立运行的 Thread,它对进程等待队列进行轮询,如果有进程的话就从队列中取出一个任务来执行。批处理系统中,调度器调度一个进程都直接让进程执行完毕,也就是给进程运行时间为进程的总时间。
|
|
||||||
|
|
||||||
```java
|
|
||||||
public class Scheduler extends Thread {
|
|
||||||
|
|
||||||
protected ProcessQueue processQueue;
|
|
||||||
|
|
||||||
public Scheduler(ProcessQueue processQueue) {
|
|
||||||
this.processQueue = processQueue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
```java
|
|
||||||
public class BatchScheduler extends Scheduler {
|
|
||||||
public BatchScheduler(ProcessQueue processQueue) {
|
|
||||||
super(processQueue);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
while (true) {
|
|
||||||
if (!processQueue.isEmpty()) {
|
|
||||||
Process process = processQueue.get();
|
|
||||||
process.run(process.getTotalTime());
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Thread.sleep(10);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
使用一个模拟器来模拟实际场景下进程的不定时到达,每 1s 到达一个进程,并且进程的运行时间再 0s \~ 3s 之间,使得多个进程会发生竞争关系。
|
|
||||||
|
|
||||||
```java
|
|
||||||
public class ProcessComeEmulator extends Thread {
|
|
||||||
|
|
||||||
private ProcessQueue processQueue;
|
|
||||||
|
|
||||||
public ProcessComeEmulator(ProcessQueue processQueue) {
|
|
||||||
this.processQueue = processQueue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
int processId = 0;
|
|
||||||
while (true) {
|
|
||||||
System.out.println("process " + processId + " is coming...");
|
|
||||||
System.out.println();
|
|
||||||
Process process = new Process((processId++) + "", getRandomTime(), System.currentTimeMillis());
|
|
||||||
processQueue.add(process);
|
|
||||||
try {
|
|
||||||
Thread.sleep(1000);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private long getRandomTime() {
|
|
||||||
return (long) (Math.random() * 3000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
最后创建一个客户端来运行整个调度程序:
|
|
||||||
|
|
||||||
```java
|
|
||||||
public class FCFSClient {
|
|
||||||
public static void main(String[] args) {
|
|
||||||
ProcessQueue processQueue = new FCFSProcessQueue();
|
|
||||||
ProcessComeEmulator processComeEmulator = new ProcessComeEmulator(processQueue);
|
|
||||||
processComeEmulator.start();
|
|
||||||
Scheduler scheduler = new FCFSScheduler(processQueue);
|
|
||||||
scheduler.start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
执行结果如下:
|
|
||||||
|
|
||||||
```html
|
|
||||||
process 0 is coming...
|
|
||||||
|
|
||||||
process 0 is running...
|
|
||||||
come in time : 1528964425691
|
|
||||||
total time : 1807
|
|
||||||
remain time : 1807
|
|
||||||
|
|
||||||
process 1 is coming...
|
|
||||||
|
|
||||||
process 1 is running...
|
|
||||||
come in time : 1528964426691
|
|
||||||
total time : 2311
|
|
||||||
remain time : 2311
|
|
||||||
|
|
||||||
process 2 is coming...
|
|
||||||
|
|
||||||
process 3 is coming...
|
|
||||||
|
|
||||||
process 4 is coming...
|
|
||||||
|
|
||||||
process 2 is running...
|
|
||||||
come in time : 1528964427692
|
|
||||||
total time : 2651
|
|
||||||
remain time : 2651
|
|
||||||
|
|
||||||
process 5 is coming...
|
|
||||||
|
|
||||||
process 6 is coming...
|
|
||||||
|
|
||||||
process 3 is running...
|
|
||||||
come in time : 1528964428692
|
|
||||||
total time : 137
|
|
||||||
remain time : 137
|
|
||||||
|
|
||||||
process 4 is running...
|
|
||||||
come in time : 1528964429692
|
|
||||||
total time : 2513
|
|
||||||
remain time : 2513
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. SJF
|
|
||||||
|
|
||||||
与 FCFS 不同的是,SJF 的进程等待队列需要使用优先级队列来实现:
|
|
||||||
|
|
||||||
```java
|
|
||||||
public class SJFProcessQueue implements ProcessQueue {
|
|
||||||
|
|
||||||
private PriorityQueue<Process> processesQueue = new PriorityQueue<>(
|
|
||||||
(o1, o2) -> (int) (o1.getTotalTime() - o2.getTotalTime()));
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void add(Process process) {
|
|
||||||
processesQueue.add(process);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Process get() {
|
|
||||||
return processesQueue.poll();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEmpty() {
|
|
||||||
return processesQueue.isEmpty();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
运行客户端:
|
|
||||||
|
|
||||||
```java
|
|
||||||
public class SJFClient {
|
|
||||||
public static void main(String[] args) {
|
|
||||||
ProcessQueue processQueue = new SJFProcessQueue();
|
|
||||||
ProcessComeEmulator processComeEmulator = new ProcessComeEmulator(processQueue);
|
|
||||||
processComeEmulator.start();
|
|
||||||
Scheduler scheduler = new BatchScheduler(processQueue);
|
|
||||||
scheduler.start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
```java
|
|
||||||
process 0 is coming...
|
|
||||||
|
|
||||||
process 0 is running...
|
|
||||||
come in time : 1528964250005
|
|
||||||
total time : 2496
|
|
||||||
remain time : 2496
|
|
||||||
|
|
||||||
process 1 is coming...
|
|
||||||
|
|
||||||
process 2 is coming...
|
|
||||||
|
|
||||||
process 1 is running...
|
|
||||||
come in time : 1528964251006
|
|
||||||
total time : 903
|
|
||||||
remain time : 903
|
|
||||||
|
|
||||||
process 3 is coming...
|
|
||||||
|
|
||||||
process 2 is running...
|
|
||||||
come in time : 1528964252006
|
|
||||||
total time : 1641
|
|
||||||
remain time : 1641
|
|
||||||
|
|
||||||
process 4 is coming...
|
|
||||||
|
|
||||||
process 5 is coming...
|
|
||||||
|
|
||||||
process 4 is running...
|
|
||||||
come in time : 1528964254007
|
|
||||||
total time : 243
|
|
||||||
remain time : 243
|
|
||||||
|
|
||||||
process 5 is running...
|
|
||||||
come in time : 1528964255007
|
|
||||||
total time : 646
|
|
||||||
remain time : 646
|
|
||||||
|
|
||||||
process 3 is running...
|
|
||||||
come in time : 1528964253006
|
|
||||||
total time : 2772
|
|
||||||
remain time : 2772
|
|
||||||
```
|
|
||||||
|
|
||||||
## 进程同步
|
## 进程同步
|
||||||
|
|
||||||
### 1. 临界区
|
### 1. 临界区
|
||||||
|
Reference in New Issue
Block a user