-线程和进程的关系
-进程间的通信
- 信道(匿名的/有名的)
- 信号:用于通知进程某个事件已经发生
- 消息队列:一方放,一方拿
- 信号量:同步的标识
- 内存共享:
- 套接字:用于客户端和服务器之间的网络套接字
-线程间的同步方式
- 互斥量
- 信号量
3.事件: wait/notify保证同步
-进程的调度算法
- 先到先服务(FCFS)
- 短作业优先(SJF):
- 时间片轮转:
- 多级反馈队列优先:
- 应设置多个就绪队列,并为各个队列赋予不同的优先级,第1级队列的优先级最高,第2级队列次之,其余队列的优先级逐次降低。
- 赋予各个队列中进程执行时间片的大小也各不相同,在优先级越高的队列中,每个进程的运行时间片就越小。例如,第2级队列的时间片要比第1级队列的时间片长一倍, ……第i+1级队列的时间片要比第i级队列的时间片长一倍。
- 当一个新进程进入内存后,首先将它放入第1级队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第2级队列的末尾,再同样地按FCFS原则等待调度执行;如果它在第2级队列中运行一个时间片后仍未完成,再以同样的方法放入第3级队列……如此下去,当一个长进程从第1级队列依次降到第 n 级队列后,在第 n 级队列中便釆用时间片轮转的方式运行。
- 仅当第1级队列为空时,调度程序才调度第2级队列中的进程运行;仅当第1 ~ (i-1)级队列均为空时,才会调度第i级队列中的进程运行。如果处理机正在执行第i级队列中的某进程时,又有新进程进入优先级较高的队列(第 1 ~ (i-1)中的任何一个队列),则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回到第i级队列的末尾,把处理机分配给新到的更高优先级的进程。
- 优先级调度
- 高响应比优先:
根据比率:R=(w+s)/s (R为响应比,w为等待处理的时间,s为预计的服务时间)
地址转化
将逻辑地址转化为物理地址
-内存管理机制
- 连续分配方式
将内存分为固定大小的几个块,每一块由一个进程负责 - 非连续分配方式
- 页式管理
把主存分为较小的页,通过“页表”对应逻辑地址和物理地址,提高内存利用率。 - 段式管理
段比页更小,每个段定义一组逻辑信息,例如主程序段main,子程序段X,数据段D,栈段S,通过“段表”对应逻辑地址和物理地址。 - 段页式管理
每个段分成若干页
分页和分段的比较
共同点:都是为了提高内存利用率,减少内存碎片。都是离散存储的,页内、段内都是连续的。
区别:页大小固定,由操作系统决定,段大小不固定,取决于当前运行的程序。段式逻辑单位,分为代码段、数据段等。
-多级页表和块表
多级页表
页目录号找到页目录-》页目录找到页-〉页找到想找的那块偏移
一个逻辑地址用10bits的页目录号+10bits的页号+12bits的偏移组成。页目录表的每一项对应一个页表,然后再根据页表找到对应的页。这种思想就类似与书本,目录的地方有一个章目录(页目录表)和节目录(页表),如果要查找某一节的内容首先找到这一章的地方,然后再查具体的某一节。我如果要找第五章的第4节,那么前面四章都不用看,直接找第五章就行了,这样除了第五章之外的页号对应的页框号的就不用存了。能节省大量内存;并且保证了章目录和节目录都是连续的,这就意味着可以使用偏移量的形式查找对应的章节。如下图:
快表
相当于缓存了一些页面和页框的对应关系
- 在CPU与内存访问之间加一层TLB,TLB是一组寄存器,用来存放最近使用过的页对应的页框号;
- 这样如果CPU需要访问某一页首先在TLB里面找,如果TLB里面有就不用访问内存了,因为TLB是寄存器,cpu访问寄存器的速度远大于对内存的访问速度。这样就可以提升时间性能了。可以看到提升时间性能最主要的因素就是可以在TLB里面直接找到该页对应的页框号。
- 那么如何提升命中率的,首先TLB肯定是越大越好,但是TLB材料很贵,不会做得很大。TLB的大小大概是[64,1024]。为什么TLB里面存放这么少的项就能实现“近似访存1次”?因为程序的局部性原理。程序的局部性原理在用户程序里面对应的就是循环。TLB也被称为快表。
虚拟内存
虚拟内存使得应用程序认为它拥有连续的可用的内存,实际上它拥有的是被分割成多个的物理内存碎片,还有部分暂存在外部磁盘存储器上,在需要时进行数据交换。
好处:
- 可以使用相邻的虚拟地址访问物理内存中不相邻的大内存缓冲区
- 不同进程使用的虚拟地址彼此隔离,一个进程无法修改由另一进程或操作系统使用的物理内存。
局部性原理
1.** 时间局部性**
- 因为程序中存在着大量循环操作。某条指令一旦执行,不久后可能再次执行;
- 某数据被访问过,不久之后可能再次被访问。
2.** 空间局部性**
因为指令通常是顺序存放、顺序执行的,数据一般也是以向量、数组、表等形式簇聚存储的。一旦程序访问了某个单元,不久以后其附近的存储单元也将被访问。
局部性原理使得只需要装入部分程序到内存就可以开始运行。
页面置换算法
缺页中断:需要访问的页不再主存,需要操作系统将其调入主存后访问。
如果此时主存已满,就需要删除一个页面,删除页面的规则就是页面置换算法。
- opt页面置换算法:选择“以后将永不使用”的页面,过于理想无法实现,成为衡量其他算法的标准。
- fifo置换算法,先进先出。
- lru置换算法,least currently used,最近没被使用过的先出
- lfu置换算法,least frequently used,最少使用的先出。