无向图有16条边,其中度为4的顶点个数为3,度为3的顶点个数为4,其他顶点的度均小于3。图G所含的顶点个数至少是:11
总度数=162=32
度为2的顶点个数为x,度为1的顶点个数为y,度为0的顶点个数为z
由此可列出三元一次方程组:34+43+2x+1y+0z=32
化简得2x+y=8
要使图G所含的顶点个数最少,则x=4
此时顶点个数为3+4+4=11
对角线以下元素均为0,表示该有向图是一个无环图,因此一定存在拓扑序列(可能不唯一)。
图存在拓扑序列,不一定满足邻接矩阵主对角线以下元素均为0,但是可以适当调整结点编号,使其邻接矩阵满足前述性质。
拓扑排序算法
拓扑排序:
1)每个顶点只出现一次
2)顶点A在序列中排在顶点B的前面,则在图中不存在从顶点B到顶点A的路径
DAG:有向无环图,只有有向无环图(DAG)才有拓扑排序。
每个DAG图都有一个或多个拓扑序列,对一个DAG图进行拓扑序列的算法:
1)从DAG图中选择一个没有前驱顶点并输出
2)图中删除该顶点和所有以它为起点的有向边
3)重复1,2直到当前的DAG图为空或者当前图不存在无前驱的顶点为止。后一种情况说明有向图必然存在环。
邻接表表示并不唯一
邻接表存储的无向图:O(|V|+2|E|)
邻接表存储的有向图O(|V|+|E|)
如果有向图有n个顶点,e条弧,每个顶点一次进栈,一次出栈,输出n次,顶点入度减一的运算共e次。
使用栈实现拓扑排序
根据拓扑排序思想,排在前列的都是没有指向的,所以我们首先要找入度为0的顶点,因为入度为0的顶点,不存在指向它的顶点,也就意味着没有排在它前面的顶点。
初始化图
初始化所有顶点的入度0
统计所有顶点的入度
找到入度为0的顶点入栈
栈顶元素出栈,找到栈顶元素指向其他顶点的边,并减少该顶点入度1,若此时如果该顶点入度为0的话就入栈。
循环步骤5,直至栈元素全部出栈。
使用队列实现拓扑排序
参考文章
图有关的时间复杂度:邻接表O(n+e),邻接矩阵O(n^2)
有向图进行广度遍历
邻接表O(n+e)
多级页表优点:减少页表所占的连续内存空间
外部碎片:动态,分段,可变分区
内部碎片:分页
Orange’s系统里,loader的作用包括了引导扇区的启动,跳入保护模式,加载kernel并将执行转交kernel
进程唤醒:将阻塞态的进程唤醒至就绪态
线程
- 内核级线程
- TCB放在os,管理和调度由os负责
- 一对一模型 一个用户对应一个线程
- 某个内核进程发起系统调用被阻塞不会影响其他内核进程运行
- 内核能同时调度同一进程中多个进程并行执行
- 同一进程的线程切换需要从用户态转到核心态,系统开销大
- 用户级线程
- 用户级线程库函数完成整个线程的管理和调度
- TCB由用户级线程库函数维护
- 跨进程需要内核参与
- 多个用户对应一个进程
- 一个线程发起系统调用而阻塞
每个线程配置一个线程控制块TCB
TCB:线程标识符+一组寄存器+线程运行状态+优先级+线程专有存储区+堆栈指针
银行家算法判断是否处于安全状态,而非死锁。适用于避免思索
死锁的预防方法能确保系统不发生互锁
当系统出现死锁时,必然有两个或两个以上的进程处于阻塞状态
进程的组成
包含了正在运行的一个程序的所有状态信息
程序的代码
程序处理的数据
要知道现在执行哪条指令,程序计数器中的值指示将运行的指令。
CPU寄存器会动态变化,一组通用寄存器的当前值,堆,栈等;
各种系统资源,内存,外存,网络
进程1和2共享同一个段S,段S对于1和2来说,使用位置不同,不同进程中的逻辑段号可能不同。
动态分区算法中,最容易产生碎片的是最佳适应算法
首次适应:地址最小
最佳适应:有长度很小的无法利用的碎片
可用于文件系统管理空闲磁盘块的数据结构:
- 位图
- 空闲磁盘块链
- 文件分配表(FAT)
索引节点用于表示文件
外部中断是CPU正在执行的指令以外的事件中断
- 缺页是在指令执行的时候发现虚拟内存缺页,因此为内部中断
- 定时器到时,时钟中断引起的,不是执行指令引起的
可屏蔽中断需要在当前指令执行完毕之后,检查中断标志位(IF)是否允许中断,才会响应。
非屏蔽中断是一种硬件中断,此种中断通过不可屏蔽中断请求NMI控制,不受中断标志位IF影响。
CPU响应中断
- 中断源有中断请求
- CPU允许中断及开中断
- 一条指令执行完毕,且没有更紧迫的任务
异常:执行程序之间发生
中断:执行完指令看中断向量表
CPU不仅可以在用户态下检测和响应中断,在内核态下可以检测和响应中断,I/O中断在内核态下响应的。
CPU只有在检测到中断请求信号后才会进入中断响应周期。
进入中断响应周期时,CPU一定处于中断允许状态。
【页置换】和【进程调度】都是对用户透明的,不涉及用户请求,因此不是系统调用完成的。
创建新进程可以通过系统调用完成。
中断I/O方式适用于字符型设备,此类设备特点是数据传输速率慢。以字符或字为单位进行传输。
若采用中断I/O方式,当外设准备好数据,向CPU发送中断请求,CPU暂停终止现行程序,转去运行中断服务程序。
由中断服务【程序】完成数据传送。
SMP(共享内存多处理器)具有共享的单一物理地址空间。
多道程序系统必须支持程序的并发执行和共享
os初始化过程中需要创建中断向量表,用于实现中断处理。
CPU检测到中断信号后,根据中断号查询中断向量表,跳转到对应的中断处理程序。
硬盘分区表:当硬盘被逻辑格式化时,需要对硬盘进行分区,即创建硬盘分区表。
文件系统的索引节点表:初始化文件系统过程中完成。
Prim算法选点,kruskal算法选边,点少就选点,边少就选边
并查集存储点,用于检测是否成环。
kruskal使用最小堆存储边,使得每次取出的边的权值最小。
peterson算法,两个flag,两个turn,可以确定保证互斥并且不会饥饿。
peterson未遵循让权等待
【保存断点和程序状态字】以及【将CPU模式改为内核态】由硬件(CPU)完成。
实现时间片轮转调度:进程就绪队列,进程控制块,时钟中断处理程序
父子进程可以共享一部分共享资源,但是不和子进程共享虚拟地址空间
创建子进程时,会为子进程分配空闲的进程描述符,唯一标识的pid等。
TELNET、SMTP、HTTP
DNS多数情况使用UDP,有时也使用TCP。
实时性高的通常是UDP,对正确性要求高的用TCP。
FTP客户端与FTP服务器建立的第一个阶段是控制连接的建立,主要用于传输FTP的各种命令。
匿名FTP访问通常用anonymous作为用户名,密码可以为空。
FTP数据端口号是控制端的端口号减一
控制端口2222,数据端口2221
客户端是连接的请求方,在连接未建立之前服务器在某一个端口监听。
服务器不需要知道客户端的地址,一旦连接建立,服务器也能主动发送数据给客户端(浏览器的现实内容来自服务器)用于一些消息的通知,如一些错误的通知。
DNS解析
递归:其他服务器直接将解析ip地址给本地
迭代:根服务器不直接告诉他解析ip地址而是告诉(本地)去找谁(下一级)
主域名服务器和辅域名服务器都是有域名数据库的。
一个主机仅有一个主域名服务器,可以有多个辅助域名服务器。
授权域名服务器一定可以将其管辖的主机名转换为主机的IP地址
SMTP基于ASCII码的协议,只能够传送ASCII码,如果需要发送非ASCII码,则需要使用MIRE扩展。
客户端不需要登录即可向服务器发送邮件。
协议需要客户端先于服务器建立TCP连接。
FTP协议不适合用在两台计算机之间共享读写文件。
FTP既可以使用TCP,也可以使用UDP,因为FTP本身具备差错控制能力。
WWW浏览器和WWW服务器之间传输网页使用的协议是:HTTP
POP3基于ASCII码。不能发送二进制数据,POP3使用明文来传输密码, 并不对密码进行加密。
WWW服务中,用户的信息查询可以从一台Web服务器自动搜索到另一台Web服务器,使用的技术是Hyperlink
电子邮件经过MIME扩展之后,可以将ASCII码内容表示为ASCII码内容,其中base64编码方式是:不管是否是ASCH码,每3个字符用另4个ASCH字符表示
quoted-P的table编码方式:将每4个ASCn码字符用6个ASCH字符表示。
不是对网络模型进行分层的目标:定义功能执行的方法
计算机网络各层及其协议的集合成为网络体系结构
网络体系结构是抽象的,它不应该包括各层协议及功能的具体实现细节。
OSI参考模型有7层