操作系统
系统调用按功能分类:
- 设备管理
- 文件管理
- 进程控制
- 进程通信
- 内存管理
进程间的通信方式:
管道 / 匿名管道(Pipes):
⽤于具有亲缘关系的⽗⼦进程间或者兄弟进程之间的通信
有名管道(Names Pipes):
匿名管道由于没有名字,只能⽤于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道。 有名管道严格遵循先进先出(first in first out)。 有名管道以磁盘⽂件的⽅式存在,可以实现本机任意两个进程通信。
信号(Signal):
信号是⼀种⽐复杂的通信⽅式,⽤于通知接收进程某个事件已经发⽣;
消息队列(Message Queuing):
消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。 管道和消息队列的通信数据都是先进先出的原则。 与管道(⽆名管道:只存在于内存中的⽂件;命名管道:存在于实际的磁盘介质或者⽂件系统)不同的是消息队列存放在内核中,只有在内核重启(即,操作系统重启)或者显示地删除⼀个消息队列时,该消息队列才会被真正的删除。消息队列可以实现消息的随机查询,消息不⼀定要以先进先出的次序读取,也可以按消息的类型读取.⽐ FIFO 更有优势。消息队列克服了信号承载信息量少,管道只能承载⽆格式字 节流以及缓冲区⼤⼩受限等缺
信号量(Semaphores):
信号量是⼀个计数器,⽤于多进程对共享数据的访问,信号量的意图在于进程间同步。这种通信⽅式主要⽤于解决与同步相关的问题并避免竞争条件。
共享内存(Shared memory):
使得多个进程可以访问同⼀块内存空间,不同进程可以及时看到对⽅进程中对共享内存中数据的更新。 这种⽅式需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有⽤的进程间通信⽅式。
套接字:
此⽅法主要⽤于在客户端和服务器之间通过⽹络进⾏通信。 套接字是⽀持 TCP/IP 的⽹络通信的基本操作单元,可以看做是不同主机之间的进程进⾏双向通信的端点,简单的说就是通信的两⽅的⼀种约定,⽤套接字中的相关函数来完成通信过程。
线程间的同步方式:
互斥量(Mutex):
采⽤互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有⼀个,所以可以保证公共资源不会被多个线程同时访问。 ⽐如 Java 中的synchronized 关键词和各种 Lock 都是这种机制
信号量(Semphared):
它允许同⼀时刻多个线程访问同⼀资源,但是需要控制同⼀时刻访问此资源的最⼤线程数量
事件(Event)(Wait / Notify):
通过通知操作的⽅式来保持多线程同步,还可以⽅便的实现多线程优先级的比较
进程的调度算法:
先到先服务算法(First Come First Serve):
从就绪队列中选择⼀个最先进⼊该队列的进程为之分配资源,使它⽴即执⾏并⼀直执⾏到完成或发⽣某事件⽽被阻塞放弃占⽤ CPU 时再重新调度。
短作业优先调度算法(Short Job First):
从就绪队列中选出⼀个估计运⾏时间最短的进程为之分配资源,使它⽴即执⾏并⼀直执⾏到完成或发⽣某事件⽽被阻塞放弃占⽤ CPU 时再重新调度。
时间片轮转调度算法(Round Robin):
时间⽚轮转调度是⼀种最古⽼,最简单,最公平且使⽤最⼴的算法,每个进程被分配⼀个时间段,称作它的时间⽚,即该进程允许运⾏的时间
多级反馈队列调度算法:
多级反馈队列调度算法既能使⾼优先级的作业得到响应⼜能使短作业(进程)迅速完成。因⽽它是⽬前被公认的⼀种较好的进程调度算法, UNIX 操作系统采取的便是这种调度算法。
优先级调度:
为每个流程分配优先级,⾸先执⾏具有最⾼优先级的进程,依此类推。具有相同优先级的进程以 FCFS ⽅式执⾏。可以根据内存要求,时间要求或任何其他资源要求来确定优先级。
内存管理机制:
简单分为连续分配管理⽅式和⾮连续分配管理⽅式这两种。 连续分配管理⽅式是指为⼀个⽤户程序分配⼀个连续的内存空间,常⻅的如 块式管理 。 同样地,⾮连续分配管理⽅式允许⼀个程序使⽤的内存分布在离散或者说不相邻的内存中,常⻅的如⻚式管理 和 段式管理。
块式管理:
远古时代的计算机操系统的内存管理⽅式。将内存分为⼏个固定⼤⼩的块,每个块中只包含⼀个进程。 如果程序运⾏需要内存的话,操作系统就分配给它⼀块,如果程序运⾏只需要很⼩的空间的话,分配的这块内存很⼤⼀部分⼏乎被浪费了。 这些在每个块中未被利⽤的空间,我们称之为碎⽚
页式管理:
把主存分为⼤⼩相等且固定的⼀⻚⼀⻚的形式,⻚⼩,相对相⽐于块式管理的划分⼒度更⼤,提⾼了内存利⽤率,减少了碎⽚。⻚式管理通过⻚表对应逻辑地址和物理地址。
段式管理:
⻚式管理虽然提⾼了内存利⽤率,但是⻚式管理其中的⻚实际并⽆任何实际意义。 段式管理把主存分为⼀段段的,每⼀段的空间⼜要⽐⼀⻚的空间⼩很多 。 但是,最重要的是段是有实际意义的,每个段定义了⼀组逻辑信息,例如,有主程序段 MAIN、⼦程序段X、数据段 D 及栈段 S 等。 段式管理通过段表对应逻辑地址和物理地址。
段页式管理:
段⻚式管理机制结合了段式管理和⻚式管理的优点。 简单来说段⻚式管理机制就是把主存先分成若⼲段,每个段⼜分成若⼲⻚,也就是说 段⻚式管理机制 中段与段之间以及段的内部的都是离散的。
快表:
为了解决虚拟地址到物理地址的转换速度,操作系统在 ⻚表⽅案 基础之上引⼊了 快表 来加速虚拟地址到物理地址的转换。我们可以把快表理解为⼀种特殊的⾼速缓冲存储器(Cache),其中的内容是⻚表的⼀部分或者全部内容。作为⻚表的 Cache,它的作⽤与⻚表相似,但是提⾼了访问速率。由于采⽤⻚表做地址转换,读写内存数据时 CPU 要访问两次主存。有了快表,有时只要访问⼀次⾼速缓冲存储器,⼀次主存,这样可加速查找并提⾼指令执⾏速度
使用快表后的地址转换流程:
- 根据虚拟地址中的页号查找表
- 如果该页在快表中,直接从快表中读取相应的物理地址
- 如果该页不在快表中,就访问内存中的页表,再从页表中国得到物理地址,同时将页表中的该映射表添加到快表中
- 当快表填满后,又要登记新页时,就按照一定的淘汰策略淘汰掉快表中的一个页
多级页表:
引⼊多级⻚表的主要⽬的是为了避免把全部⻚表⼀直放在内存中占⽤过多空间,特别是那些根本就不需要的⻚表就不需要保留在内存中。
分页机制和分段机制的共同点和区别:
共同点:
- 分页机制和分段机制都是为了提高内存利用率,较少内存碎片
- 页和段都是离散存储的,所以两者都是离散分配内存的方式。但是,每个页和段中的内存是连续的
区别:
- 页的大小是固定的,由操作系统决定;而段的大小不固定,取决于我们当前运行的程序。
- 分页仅仅是为了满足操作系统内存管理的需求,而段是逻辑信息的单位,在程序中可以体现为代码段,数据段,能够更改好满足用户的需求
CPU 寻址、为什么需要虚拟地址空间:
现代处理器使⽤的是⼀种称为 虚拟寻址(Virtual Addressing) 的寻址⽅式。使⽤虚拟寻址,CPU需要将虚拟地址翻译成物理地址,这样才能访问到真实的物理内存。 实际上完成虚拟地址转换为物理地址转换的硬件是 CPU 中含有⼀个被称为 内存管理单元(Memory Management Unit,MMU) 的硬件。
如果直接把物理地址暴露出来的话会带来严重问题,⽐如可能对操作系统造成伤害以及给同时运⾏多个程序造成困难。
虚拟地址访问内存的优势:
- 程序可以使⽤⼀系列相邻的虚拟地址来访问物理内存中不相邻的⼤内存缓冲区
- 程序可以使⽤⼀系列虚拟地址来访问⼤于可⽤物理内存的内存缓冲区。当物理内存的供应量变⼩时,内存管理器会将物理内存⻚(通常⼤⼩为 4 KB)保存到磁盘⽂件。数据或代码⻚会根据需要在物理内存与磁盘之间移动
- 不同进程使⽤的虚拟地址彼此隔离。⼀个进程中的代码⽆法更改正在由另⼀进程或操作系统使⽤的物理内存
虚拟内存:
局部性原理:局部性原理是虚拟内存技术的基础,正是因为程序运⾏具有局部性原理,才可以只装⼊部分程序到内存就开始运⾏。
虚拟内存的技术实现:虚拟内存的实现需要简历在离散分配的内存管理方式的基础上。虚拟内存的实现有以下三种方式:
请求分页存储管理:
建⽴在分⻚管理之上,为了⽀持虚拟存储器功能⽽增加了请求调⻚功能和⻚⾯置换功能。 请求分⻚是⽬前最常⽤的⼀种实现虚拟存储器的⽅法。请求分⻚存储管理系统中,在作业开始运⾏之前,仅装⼊当前要执⾏的部分段即可运⾏。 假如在作业运⾏的过程中发现要访问的⻚⾯不在内存,则由处理器通知操作系统按照对应的⻚⾯置换算法将相应的⻚⾯调⼊到主存,同时操作系统也可以将暂时不⽤的⻚⾯置换到外存中。
请求分段存储管理:
建⽴在分段存储管理之上,增加了请求调段功能、分段置换功能。 请求分段储存管理⽅式就如同请求分⻚储存管理⽅式⼀样,在作业开始运⾏之前,仅装⼊当前要执⾏的部分段即可运⾏; 在执⾏过程中,可使⽤请求调⼊中断动态装⼊要访问但⼜不在内存的程序段; 当内存空间已满,⽽⼜需要装⼊新的段时,根据置换功能适当调出某个段,以便腾出空间⽽装⼊新的段。
请求段页式存储管理
请求分页与分页存储管理的区别:
- 请求分⻚存储管理建⽴在分⻚管理之上。他们的根本区别是是否将程序全部所需的全部地址空间都装⼊主存,这也是请求分⻚存储管理可以提供虚拟内存的原因
- 它们之间的根本区别在于是否将⼀作业的全部地址空间同时装⼊主存。请求分⻚存储管理不要求将作业全部地址空间同时装⼊主存。基于这⼀点,请求分⻚存储管理可以提供虚存,⽽分⻚存储管理却不能提供虚存
无论哪种方式:一般都需要:
- 一定容量的内存和外村:在载⼊程序的时候,只需要将程序的⼀部分装⼊内存,⽽将其他部分留在外存,然后程序就可以执⾏了;
- 缺页中断:如果需执行的指令或访问的数据尚未在内存(称为缺页或缺段),则由处理器通知操作系统将相应的页面或段调入内存,然后继续执行程序。
- 虚拟地址空间:逻辑地址到物理地址的变换
页面置换算法:
- 最佳页面置换算法(OPTimal replacement)
- 先进先出页面置换算法(First In First Out)
- 最近最久未使用页面置换算法(Least Currently Used)
- 最近最少使用页面置换算法(Least Frequently Used)