Skip to content

Commit

Permalink
'add'
Browse files Browse the repository at this point in the history
  • Loading branch information
tony committed Aug 15, 2019
1 parent 531ff3f commit e2a6ce5
Show file tree
Hide file tree
Showing 7 changed files with 144 additions and 1 deletion.
Binary file added img/os04.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/os05.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/os06.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/os07.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/os08.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/os09.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
145 changes: 144 additions & 1 deletion os基本概念.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,14 +117,67 @@ Linux 的系统调用主要有以下这些:

##### 大内核

大内核是将操作系统功能作为一个紧密结合的整体放到内核。

由于各模块共享信息,因此有很高的性能。

##### 微内核

由于操作系统不复杂,因此将一部分操作系统功能移出内核,从而降低内核的复杂性。移出的部分根据分层的原则划分成若干服务,相互独立。

在微内核结构下,操作系统被划分成小的、定义良好的模块,只有微内核这一个运行在内核态,其余模块运行在用户态。

因为需要频繁地在用户态和核心态之间进行切换,所以会有一定的性能损失。

![](./img/os04.jpg)

#### 1.5 中断分类

- 外中断
- 异常
- 陷入

##### 外中断

由CPU执行指令以外的事件引起,如I/O完成中断,表示设备输入/输出处理已经完成,处理器能够发送下一个输入/输出请求。此外还有时钟中断、控制台中断等。

##### 异常

由CPU执行指令的内部事件引起,如非法操作码、地址越界、算术溢出等。

##### 陷入

在用户程序中使用系统使用。

| 类型 | 源头 | 响应方式 | 处理机制 |
| -------- | ------------------------ | ---------- | ------------------------------------ |
| 中断 | 外设 | 异步 | 持续,对用户应用程序是透明的 |
| 异常 | 应用程序意想不到的行为 | 同步 | 杀死或重新执行意想不到的应用程序指令 |
| 系统调用 | 应用程序请求操作提供服务 | 异步或同步 | 等待和持续 |

#### 1.6 什么是堆和栈?说一下堆栈都存储哪些数据?

栈区(stack)——由**编译器**自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

堆区(heap)——一般由**程序员分配释放**,若程序员不释放,程序结束时可能由OS回收。

数据结构中这两个完全就不放一块来讲,数据结构中栈和队列才是好基友,我想新手也很容易区分。

我想需要区分的情况肯定不是在数据结构话题下,而大多是在OS关于不同对象的内存分配这块上。

简单讲的话,在C语言中:

```
int a[N]; // go on a stack
int* a = (int *)malloc(sizeof(int) * N); // go on a heap
```

![](./img/05.jpg)

#### 1.7 如何理解分布式锁?

分布式锁,是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。

### 二、进程管理

- 进程与线程
Expand All @@ -141,6 +194,8 @@ Linux 的系统调用主要有以下这些:

#### 2.1 进程与线程

![](./img/06.png)

- 进程
- 线程
- 区别
Expand All @@ -157,7 +212,7 @@ Linux 的系统调用主要有以下这些:

##### 2.1.2 线程

**线程是独立调度的基本单位**,一个进程可以有多个线程,它们共享进程资源。
**线程是独立调度的基本单位**,一个进程可以有多个线程,它们共享进程资源。QQ和浏览器是两个进程,浏览器进程里面有很多线程,例如HTTP请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起HTTP请求时,浏览器还可以响应用户的其它事件。

##### 2.1.3 区别

Expand All @@ -168,6 +223,18 @@ Linux 的系统调用主要有以下这些:

#### 2.2 进程状态的切换(生命周期)

![](./img/os07.jpg)

- **就绪状态(ready)**:等待被调度
- **运行状态(running)**
- **阻塞状态(waiting)**:等待资源

应该注意以下内容:

- 只有就绪态和运行态可以相互转换,其它的都是单向转换。就绪状态的进程通过调度算法从而获得CPU时间,转为运行状态;而运行状态的进程,在分配给它的CPU的时间片用完之后就会转为就绪状态,等待下一次调度。
- 阻塞状态就是缺少需要的资源从而由运行状态转换而来,但是该资源不包括CPU时间,缺少CPU时间会从运行态转换为就绪态。
- 进程只能自己阻塞自己,因为只有进程自身才知道何时需要等待某种事件的发生。

#### 2.3 进程调度算法

不同环境的调度算法目标不同,因此需要针对不同环境来讨论调度算法。
Expand All @@ -186,6 +253,10 @@ Linux 的系统调用主要有以下这些:

**先来先服务(FCFS)**,按照请求的顺序进行高度。有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。

**短作业优先(SJF)**,按估计运行时间最短的顺序进行调度。长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。

**最短剩余时间优先(SRTN)**,按估计剩余时间最短的顺序进行调度。

##### 2.3.2 交互式系统

交互式系统有大量的用户交互操作,在该系统中调度算法的目标是快速地进行响应。
Expand All @@ -194,17 +265,89 @@ Linux 的系统调用主要有以下这些:
- 优先级调度
- 多级反馈队列

**时间片轮转**

将所有就绪进程按FCFS(先来先服务)的原则排成一个队列,每次调度时,把CPU时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把CPU时间分配给队首的进程。

时间片轮转算法的效率和时间片的大小有很大关系。因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。

![](./img/os08.png)

**优先级调度**

为每个进程分配一个优先级,按优先级进行调度。

为了防止低优先级永远等不到调度,可以随着时间的失衡增加等待的优先级。

**多级反馈队列**

如果一个进程需要执行100个时间片,如果采用时间片轮转调度算法,那么需要交换100次。

多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如1,2,4,8...。进程在第一个队列没执行完,就会被移到下一个队列。这种方式下,之前的进程只需要交换7次。

每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。

可以将这种调度算法看成是**时间片轮转调度算法和优先级调度算法**的结合。

![](./img/09.jpg)

##### 2.3.3 实时系统

实时系统要求一个请求在一个确定时间内得到响应。

分为**硬实时和软实时*,前者必须满足绝对的截止时间,后者可以容忍一定的超时。

参考资料:

- [操作系统典型调度算法_C语言中文网](http://c.biancheng.net/cpp/html/2595.html)

#### 2.4 进程同步

- 临界区
- 同步与互斥
- 信号量
- 管程

##### 2.4.1 临界区

**对临界资源进行访问的那段代码称为临界区。**

为了互斥访问临界资源,每个进程在进入临界区之前,需要先进行检查。

##### 2.4.2 同步与互斥

- 同步:多个进程按一定顺序执行;
- 互斥:多个进程在同一时刻只有一个进程能进入临界区。

##### 2.4.3 信号量

>P和V是来源于两个荷兰词汇,P0---prolaag(荷兰语,尝试减少的意思),V0---verhoog(荷兰语,增加的意思)
信号量(Semaphone)是一个整形变量,可以对其执行down和up操作,也就是常见的P和V操作。

- **down**:如果信号量大于0,执行-1操作;如果信号量等于0,进程睡眠,等待信号量大于0;(阻塞)
- **up**:对信号量执行+1操作,影印本睡眠的进程让其完成down操作。(唤醒)

down和up操作需要被设计成原语,不可分割,通常的做法是在执行这些操作的时候屏蔽中断。

如果信号量的取值只能为0或者1,那么就成为了**互斥量(Mutex)**,0表示临界区已经加锁,1表示临界区解锁。

```
typedef int semaphore;
semaphore mutex = 1;
void P1() {
down(&mutex);
// 临界区
up(&mutex);
}
void P2() {
down(&mutex);
// 临界区
up(&mutex);
}
```

#### 2.5 经典同步问题

#### 2.6 进程通信
Expand Down

0 comments on commit e2a6ce5

Please sign in to comment.