Skip to content

Commit

Permalink
memory paging and segmentation
Browse files Browse the repository at this point in the history
  • Loading branch information
wolverinn committed Dec 5, 2019
1 parent 6952395 commit 449ad06
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 10 deletions.
3 changes: 3 additions & 0 deletions Git-ComdLine-REST.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@
#### Git 分支管理

## RESTful API
Representational State Transfer

URI(Uniform Resource Identifier)

### 参考
- [Git教程 - 廖雪峰的官方网站](https://www.liaoxuefeng.com/wiki/896043488029600)
Expand Down
40 changes: 30 additions & 10 deletions Operating Systems.md
Original file line number Diff line number Diff line change
Expand Up @@ -230,10 +230,10 @@ wait操作:执行wait操作的进程进入条件变量链末尾,唤醒紧急

> 为什么需要线程同步:线程有时候会和其他线程共享一些资源,比如内存、数据库等。当多个线程同时读写同一份共享资源的时候,可能会发生冲突。因此需要线程的同步,多个线程按顺序访问资源。
- 互斥量 Mutex:互斥量是内核对象,只有拥有互斥对象的线程才有访问互斥资源的权限。因为互斥对象只有一个,所以可以保证互斥资源不会被多个线程同时访问;当前拥有互斥对象的线程处理完任务后必须将互斥对象交出,以便其他线程访问该资源;
- 信号量 Semaphore:信号量是内核对象,它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。信号量对象保存了最大资源计数和当前可用资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就减1,只要当前可用资源计数大于0,就可以发出信号量信号,如果为0,则将线程放入一个队列中等待。线程处理完共享资源后,应在离开的同时通过```ReleaseSemaphore```函数将当前可用资源数加1。如果信号量的取值只能为0或1,那么信号量就成为了互斥量;
- 事件 Event:允许一个线程在处理完一个任务后,主动唤醒另外一个线程执行任务。事件分为手动重置事件和自动重置事件。手动重置事件被设置为激发状态后,会唤醒所有等待的线程,而且一直保持为激发状态,直到程序重新把它设置为未激发状态。自动重置事件被设置为激发状态后,会唤醒**一个**等待中的线程,然后自动恢复为未激发状态。
- 临界区 Critical Section:任意时刻只允许一个线程对临界资源进行访问。拥有临界区对象的线程可以访问该临界资源,其它试图访问该资源的线程将被挂起,直到临界区对象被释放。
- **互斥量** Mutex:互斥量是内核对象,只有拥有互斥对象的线程才有访问互斥资源的权限。因为互斥对象只有一个,所以可以保证互斥资源不会被多个线程同时访问;当前拥有互斥对象的线程处理完任务后必须将互斥对象交出,以便其他线程访问该资源;
- **信号量** Semaphore:信号量是内核对象,它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。信号量对象保存了最大资源计数和当前可用资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就减1,只要当前可用资源计数大于0,就可以发出信号量信号,如果为0,则将线程放入一个队列中等待。线程处理完共享资源后,应在离开的同时通过```ReleaseSemaphore```函数将当前可用资源数加1。如果信号量的取值只能为0或1,那么信号量就成为了互斥量;
- **事件** Event:允许一个线程在处理完一个任务后,主动唤醒另外一个线程执行任务。事件分为手动重置事件和自动重置事件。手动重置事件被设置为激发状态后,会唤醒所有等待的线程,而且一直保持为激发状态,直到程序重新把它设置为未激发状态。自动重置事件被设置为激发状态后,会唤醒**一个**等待中的线程,然后自动恢复为未激发状态。
- **临界区** Critical Section:任意时刻只允许一个线程对临界资源进行访问。拥有临界区对象的线程可以访问该临界资源,其它试图访问该资源的线程将被挂起,直到临界区对象被释放。

##### 互斥量和临界区有什么区别?
<details>
Expand Down Expand Up @@ -310,10 +310,10 @@ IO多路复用(IO Multiplexing)是指单个进程/线程就可以同时处
在两个或者多个并发进程中,每个进程持有某种资源而又等待其它进程释放它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁(deadlock)。

### 死锁产生的必要条件?
- 互斥:一个资源一次只能被一个进程使用;
- 占有并等待:一个进程至少占有一个资源,并在等待另一个被其它进程占用的资源;
- 非抢占:已经分配给一个进程的资源不能被强制性抢占,只能由进程完成任务之后自愿释放;
- 循环等待:若干进程之间形成一种头尾相接的环形等待资源关系,该环路中的每个进程都在等待下一个进程所占有的资源。
- **互斥**:一个资源一次只能被一个进程使用;
- **占有并等待**:一个进程至少占有一个资源,并在等待另一个被其它进程占用的资源;
- **非抢占**:已经分配给一个进程的资源不能被强制性抢占,只能由进程完成任务之后自愿释放;
- **循环等待**:若干进程之间形成一种头尾相接的环形等待资源关系,该环路中的每个进程都在等待下一个进程所占有的资源。

### 死锁有哪些处理方法?
<details>
Expand Down Expand Up @@ -354,6 +354,18 @@ IO多路复用(IO Multiplexing)是指单个进程/线程就可以同时处
- 利用杀死进程:强制杀死某些进程直到死锁解除为止,可以按照优先级进行。
</details>

### 分页和分段有什么区别?
- 页式存储:用户空间划分为大小相等的部分称为页(page),内存空间划分为同样大小的区域称为页框,分配时以页为单位,按进程需要的页数分配,逻辑上相邻的页物理上不一定相邻;
- 段式存储:用户进程地址空间按照自身逻辑关系划分为若干个段(segment)(如代码段,数据段,堆栈段),内存空间被动态划分为长度不同的区域,分配时以段为单位,每段在内存中占据连续空间,各段可以不相邻;
- 段页式存储:用户进程先按段划分,段内再按页划分,内存划分和分配按页。

区别:
- 目的不同:分页的目的是管理内存,用于虚拟内存以获得更大的地址空间;分段的目的是满足用户的需要,使程序和数据可以被划分为逻辑上独立的地址空间;
- 大小不同:段的大小不固定,由其所完成的功能决定;页的大小固定,由系统决定;
- 地址空间维度不同:分段是二维地址空间(段号+段内偏移),分页是一维地址空间(每个进程一个页表/多级页表,通过一个逻辑地址就能找到对应的物理地址);
- 分段便于信息的保护和共享;分页的共享收到限制;
- 碎片:分段没有内碎片,但会产生外碎片;分页没有外碎片,但会产生内碎片(一个页填不满)

### 什么是虚拟内存?
每个程序都拥有自己的地址空间,这个地址空间被分成大小相等的页,这些页被映射到物理内存;但不需要所有的页都在物理内存中,当程序引用到不在物理内存中的页时,由操作系统将缺失的部分装入物理内存。这样,对于程序来说,逻辑上似乎有很大的内存空间,只是实际上有一部分是存储在磁盘上,因此叫做虚拟内存。

Expand All @@ -363,11 +375,19 @@ IO多路复用(IO Multiplexing)是指单个进程/线程就可以同时处
<details>
<summary>展开</summary>

内存管理单元(MMU)管理着地址空间和物理内存的转换,其中的页表(Page table)存储着页(程序地址空间)和页框(物理内存空间)的映射表。一个虚拟地址分成两个部分,一部分存储页面号,一部分存储偏移量
**内存管理单元**(MMU)管理着逻辑地址和物理地址的转换,其中的页表(Page table)存储着页(逻辑地址)和页框(物理内存空间)的映射表,页表中还包含包含有效位(是在内存还是磁盘)、访问位(是否被访问过)、修改位(内存中是否被修改过)、保护位(只读还是可读写)。逻辑地址:页号+页内地址(偏移);每个进程一个页表,放在内存,页表起始地址在PCB/寄存器中
</details>

### 有哪些页面置换算法?

在程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断从而将该页调入内存中。此时如果内存已无空闲空间,系统必须从内存中调出一个页面到磁盘中来腾出空间。页面置换算法的主要目标是使页面置换频率最低(也可以说缺页率最低)。

- **最佳页面置换算法**OPT(Optimal replacement algorithm):置换以后不需要或者最远的将来才需要的页面,是一种理论上的算法,是最优策略;
- **先进先出**FIFO:置换在内存中驻留时间最长的页面。缺点:有可能将那些经常被访问的页面也被换出,从而使缺页率升高;
- **第二次机会算法**SCR:按FIFO选择某一页面,若其访问位为1,给第二次机会,并将访问位置0;
- **时钟算法** Clock:SCR中需要将页面在链表中移动(第二次机会的时候要将这个页面从链表头移到链表尾),时钟算法使用环形链表,再使用一个指针指向最老的页面,避免了移动页面的开销;
- **最近未使用算法**NRU(Not Recently Used):检查访问位R、修改位M,优先置换R=M=0,其次是(R=0, M=1);
- **最近最少使用算法**LRU(Least Recently Used):置换出未使用时间最长的一页;实现方式:维护时间戳,或者维护一个所有页面的链表。当一个页面被访问时,将这个页面移到链表表头。这样就能保证链表表尾的页面是最近最久未访问的。
- **最不经常使用算法**NFU:置换出访问次数最少的页面

<details>
<summary>局部性原理</summary>
Expand Down

0 comments on commit 449ad06

Please sign in to comment.