用户态可以执行cpu调用的非特权指令
内核态可以执行特权指令和非特权指令
用户态到内核态的切换是通过中断实现的
内核态到用户态的切换是通过特权指令实现的
1.当发生中断时,cpu立即进入内核态
2.当发生中断后,当前进程暂停运行,并由操作系统内核对中断进行处理
3.对于不同的中断信号,会进行不同的处理
4.中断分为内中断和外中断。
存放进程的管理和控制信息的数据结构称为进程控制块。它是进程管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消而撤消。
1.进程是操作系统的最小调度单位,线程是cpu的最小调度单位
2.一个进程包括多个线程,且当前进程下的线程共用一个内存空间
3.进程间不会相互影响,但一个线程挂掉将导致整个进程挂掉
4.进程可以扩展到多机,进程最多适合多核
5.进程要比线程消耗更多的计算资源,同理线程要比携程消耗更多的计算资源
6.进程使用的内存地址可以上锁,就是一个线程使用某些共享内存时,其它线程必须等它结束,才能使用这一块内存。即互斥锁
同步是指不同的进程之间必须按照规定的先后次序
互斥是指不同的进程访问同一个资源时,临界资源只能有一个进程访问,其他需要等待该进程释放才可以访问
1.批处理系统
1.1先来先服务
就是按顺序来,有利于长作业的不利于短作业的,因为短作业必须等待前面长作业执行完毕才能执行,而长作业又需要执行很长时间,导致短作业等待时间过长。
1.2短作业优先
长作业可能一直等待短作业执行完毕的状态,因为如果一直有短作业过来,那么长作业就会永远得不到调度
1.3最短剩余时间优先
它是抢占式的,按剩余时间的顺序进行调度,当有新的进程来,其整个运行时间与当前进程的剩余时间作比较,若新的进程需要的时间更短,则挂起当前进程,运行新的进程。否则新的进程等待。
2.交互式系统
2.1时间片轮转
把所有就绪进程按先来先服务的原则排成一个队列,每次调度时,把cpu时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断。调度程序停止该进程的执行,并将它送往就绪队列的末尾,同时继续把cpu时间分配给队首的进程。
时间片轮转算法的效率和时间片的大小有很大关系:
因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。
而如果时间片过长,那么实时性就不能得到保证。
2.2优先级调度
为每个进程分配一个优先级,按优先级进行调度
2.3多级反馈队列
时间片轮转调度算法和优先级调度算法的结合。
管道
命名管道
消息队列
套接字
共享存储
信号量
创建态
就绪态
运行态
阻塞态
终止态
1.栈的申请是由系统自动调度的,所以申请效率较快,堆的申请是由人为申请,效率没栈快
2.栈的空间由系统开辟空间较小,堆的空间较大
3.栈是一级缓存,调用完就立即释放,堆是二级缓存,生命周期由虚拟机的垃圾回收算法来决定
4.在jvm中,栈处于线程独享区,如虚拟机栈,本地方法栈,堆处于线程共享区,存储对象,数组那些,这也是产生垃圾的地方
四个必要条件
1.互斥
2.占有和等待
3.不可抢占
4.循环等待
解决死锁:
鸵鸟策略:即什么都不做,等死锁自动解决
预防四个必要条件
分页:
1.内存空间利用率高,不会产生外部碎片,只会有少量的内部碎片
2.不方便按照逻辑模块实现信息的共享和保护
分段:
1.很方便按照逻辑模块实现信息的共享和保护
2.如果段长过大,为其分配很大的连续空间会很不方便,且会产生外部碎片
段页式:
程序的地址空间划分成多个拥有独立地址空间的段,每个段上的地址空间划分成大小相同的页。这样既拥有分段系统的共享和保护,又拥有分页系统的虚拟内存功能。
cpu的寻址有指令寻找和操作数寻址,其中指令寻址有顺序寻址和跳跃寻址,操作数寻址有隐含寻址,立即寻址,直接寻址,间接寻址等等。
1.先来先服务
公平简单,但没有优化可能时间会长
2.最短寻道时间优先
优先调度与当前磁头所在磁道距离最近的磁道。
3.电梯算法
电梯总是保持一个方向运行,直到该方向没有请求为止,然后改变运行方向。
逻辑内存是程序自身看到的地址,它是一个抽象的地址,需要映射到物理地址,因为程序无法知道可用的物理地址,所以必须做出映射。
1.使用固定偏移量映射,这样会产生内碎片
2.分页,把逻辑内存分为多个页,把物理内存分为多个帧,通过页表来把逻辑内存和物理内存联系起来(小知识:并不是所有都映射到内存的帧中,有小部分会映射到磁盘中,当内存满了,会将最少使用的帧替换到磁盘里,所以操作系统的内存看上去是无限大的)
从时间上优化可以使用快表,从空间上优化可以采用多级页表
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。
例如活动安排问题,找零钱问题都可以采用贪心算法
将问题分解成多个子问题,通过备忘录的形式记录下子问题的解,在遇到重复的子问题可以利用备忘录,同时记录下最优解,每次子问题的解和记录下的最优解比较,若更好则替换,最后获得全局最优解,是自底向上的。
「回溯算法」需要记录每一个步骤、每一个选择,用于回答所有具体解的问题;
「动态规划」需要记录的是每一个步骤、所有选择的汇总值(最大、最小或者计数);
「贪心算法」由于适用的问题,每一个步骤只有一种选择,一般而言只需要记录与当前步骤相关的变量的值。
将问题划分成n个子问题,然后递归解决,最后合并,例如归并排序,是自顶向下的
不能说二者谁的效率更高,递归需要有递归出口,当调用次数多后,要增加额外的栈处理,对执行效率有一定影响,循环结构简单,速度快,但有些问题需要有递归解决
1.顺序表可以顺序存储,也可以随机存储
2.顺序存储时,逻辑上相邻的元素,对应的物理存储位置也相邻。
3.对于按值查找是顺序存储的顺序表,可以用折半查找,时间复杂度为O(log2n) 。无顺序时时间复杂度为O(n) 。
4.对于按序号查找,顺序表支持随机访问,时间复杂度仅为0(1)
5.顺序表一般在初始化时就分配了存储空间大小
6.数组就是顺序表
1.链表只能从表头顺序存储元素,所以一般用链表时不会保证顺序
2.用链式存储时,逻辑上相邻的元素,物理存储位置则不一定相邻,对应的逻辑关系是通过指针链接来表示的。
3.在插入删除操作时,只需要修改相关指针,时间复杂度仅为0(1)
4.链表在存储结点空间时可以动态分配空间,只要内存有空间,链表就可以分配
os:java金典八股文array和ArrayList的区别
1.队列像倒的长方形,左边进去右边出来的管道,所以有先进先出的规则,具体应用像redis的list数据类型和kafka,rabbitMQ等各种消息队列
2.栈像立起来的水杯,上面进去上面出去,所以有后进先出的规则,具体应用像jvm的本地方法栈和虚拟机栈。
二叉树是每个结点最多有两个子树的树结构,二叉树是递归定义的,其结点有左右子树之分,通常包含:满二叉树、完全二叉树、平衡二叉树、二叉搜索树等。
如果二叉树中所有分支结点的度数都为2,并且叶子结点都在统一层次上,则二叉树为满二叉树,从图形形态上看,满二叉树外观上是一个三角形;从数学上看,满二叉树的各个层的结点数形成一个首项为1,公比为2的等比数列。如图:
完全二叉树从根结点到倒数第二层满足满二叉树,最后一层可以不完全填充,其叶子结点都靠左对齐。满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它可以是一棵空树,也可以是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树
平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。
前序遍历首先访问根节点,然后遍历左子树,最后遍历右子树。
中序遍历是先遍历左子树,然后访问根节点,然后遍历右子树。
通常来说,对于二叉搜索树,我们可以通过中序遍历得到一个递增的有序序列。 我们将在另一张卡片(数据结构介绍 – 二叉搜索树)中再次提及。
后序遍历是先遍历左子树,然后遍历右子树,最后访问树的根节点。
层序遍历就是逐层遍历树结构。
「图」的类型有三种类型:无向图、有向图、加权图。
深度优先搜索算法
利用栈,一条路走到底,在返回来,递归实现 dfs
广度优先搜索算法
利用队列,bfs,一个常见应用是找出从根结点到目标结点的最短路径。
Dijkstra算法:本质上是贪心算法
Floyd算法:本质上是动态规划算法
冒泡排序,选择排序,插入排序
希尔排序,堆排序,快速排序,归并排序
计数排序,基数排序,桶排序
关系网一般采用图结构,因为关系是相互的所以用无向图这种数据结构比较合适,且在工业上,推荐算法有一部分就是用图计算去提高推荐算法,像spark的spark graph可以做大数据图计算,利用图计算去找到该用户的社交网络图,可以基于用户进行协调过滤等算法。
运算器:用来完成算术运算和逻辑运算,并将运算的中间结果暂存在运算器内。
存储器:用来存放数据和程序。
控制器:用来控制、指挥程序和数据的输入、运行以及处理器运算结果。
输入设备:用来将人们熟悉的信息形式转换为机器能识别的信息形式,常见的有键盘、鼠标等。
输出设备:可将机器运算结果转换为人们熟悉的信息形式,如打印机输出,显示器输出等。
总线是计算机连接多个部件的信息传输线,是各部件共享的传输介质。可以分为片内总线,系统总线,通信总线。
原码是由0,1两个数字组成的二进制数
其最高位表示符号,‘1’表示负号,‘0’表示正号。
反码是为了解决原码的一个问题(两个相反数想加不为零)
所以正数的反码还是原码,但是负数的反码就是源码除去最高位取反
补码是为了解决0这个特殊的数字存在
正数补码等于原码,负数补码等于反码加一
RAM是可读写操作的,一般用于存储临时信息,当计算机关闭后,数据会丢失,其应用在内存
ROM是只读操作,一般用于存储长期信息,当计算机关闭后,数据不丢失,应用在控制存储器
有很多种,但原则上一共有3种基本的寻址方式
立即数寻址:其操作数就指令的一部分。
直接寻址:把操作数地址用作指令的一部分
间接寻址:把操作数地址保存在寄存器里,寄存器间接寻址,指令中给出了包含操作数地址的寄存器地址
CISC是以Intel,AMD为代表,RISC是以ARM,IBM Power为代表
CISC的指令能力强,但多数指令使用率低,指令长度可变,RISC的指令能力弱,指令长度固定(32位宽),操作寄存器,只允许两类指令访问存储器,分别是load和store
CISC支持多种寻址方式;RISC支持方式少
CISC通过微程序控制技术实现;RISC增加了通用寄存器,硬布线逻辑控制为主
CISC的研制周期长
RISC优化编译,有效支持高级语言
将指令执行重叠在一起大幅度提高计算机性能,是一种准并行处理实现技术,指令执行分为5个阶段:取指,译码,读操作数,执行,保存操作数
优点:
通过创建唯一索引,可以保证数据库表中每一行数据的唯一性;
可以加快检索速度
缺点:
开辟了物理空间
创建和维护索引都需要耗费时间,在插入删除操作时,索引也需要动态调整,故耗费更多时间
A 原子性 :事务操作,要么成功,要么失败
C 一致性:事务操作前后,数据一直保存合法的状态
I 隔离性:事务并发操作时,互不干扰
D 持久性:事务一旦提交,修改就是永久性的
扩展:联系mysql来说说
在MySQL中原子性主要提现在undo log ,失败了可以利用undo log进行回滚
隔离性是用过锁和mvvc来实现的
持久性是通过redo log ,当突然宕机后可以结合undo log和binlog恢复数据
一致性就是通过前三个特性实现的
可串行化:可避免脏读、不可重复读、幻读的发生。
可重复读:可避免脏读、不可重复读的发生。
读已提交:可避免脏读的发生。
读未提交:都不能避免。
第一范式:每列属性不可再分
第二范式:满足第一范式的基础上,每张表只描述一件事情,有主键
第三范式:满足第二范式的基础上,每列的数据都和主键直接相关不可以间接相关
层次模型,网状模型、关系模型
内模式:内模式又称存储模式,对应于物理级。
外模式:外模式又称子模式或用户模式,对应于用户级。
概念模式:概念模式又称模式或逻辑模式,对应于概念级。
游标是指向查询结果集的一个指针。是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。
有三个组成部分:实体、属性、联系。
包含一对一,一对多,多对多三种。
分组交换端到端时延是可变的和不可预测的,它宽带共享更好,它更简单,更有效,实现成本更低
电路交换不需要考虑需求,它预先分好了传输链路的使用,会造成一个问题,资源浪费,因为可能已分配而并不需要的链路时间未利用。
分组交换是按需分配。
在计算机网络自顶向下那本书中是这样解释丢包的,当流量强度接近1时,队列时延会变大,但它不会变的无穷大,因为队列空间满后,无法存储新的分组,这时路由器就会丢弃该分组,这就是丢包
每台主机都会在ARP缓冲区建立起自己的ARP列表,用来表示ip地址和mac地址之间的对应关系。
主机要发送数据时,会先去ARP列表查找是否有对应的ip地址的目的主机的mac地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送 ARP 数据包
当本网络的所有主机收到该 ARP 数据包时,首先检查数据包中的 IP 地址是否是自己的 IP 地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的 IP 和 MAC 地址写入到 ARP 列表中,如果已经存在,则覆盖,然后将自己的 MAC 地址写入 ARP 响应包中,告诉源主机自己是它想要找的 MAC 地址。
源主机收到 ARP 响应包后。将目的主机的 IP 和 MAC 地址写入 ARP 列表,并利用此信息发送数据。如果源主机一直没有收到 ARP 响应数据包,表示 ARP 查询失败。
物联网淑惠试用:
物=>物理层
联=>数据链路层
网=>网络层
淑=>传输层:TCP和UDP
惠=>会话层:数据交换的定界和同步
试=>表示层:数据压缩加密
用=>应用层:HTTP(web请求和传送),SMTP(电子邮件报文传送),FTP(两端系统之间文件传送)
HTTP 协议以明文方式发送内容,数据都是未加密的,安全性较差。HTTPS 数据传输过程是加密的,安全性较好。
HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是 80 端口,后者是 443 端口。
HTTPS 协议需要到数字认证机构(Certificate Authority, CA)申请证书,一般需要一定的费用。
HTTP 页面响应比 HTTPS 快,主要因为 HTTP 使用 3 次握手建立连接,客户端和服务器需要握手 3 次,而 HTTPS 除了 TCP 的 3 次握手,还需要经历一个 SSL 协商过程。
TCP三次握手协议
客户端:给服务端发送SYN请求
服务端:接收客户端SYN请求,返回SYN-ACK请求
客户端:接收服务器SYN-ACK请求,返回ACK请求
TCP四次挥手协议
客户端:发送FIN请求给服务端,并且进入FIN_WAIT_1状态
服务器:收到FIN请求后,发送ACK给客户端
客户端:收到ACK请求后进入FIN_WAIT_2状态,等待服务器发来FIN请求
服务器:发送ACK给客户端后,一段时间后,发送FIN给客户端
客户端:收到FIN请求后进入FIN_WAIT状态,等待一段时间后关闭连接
就是不要让发送速率太快,让接收方来得及接收,利用滑动窗口机制控制流量大小。
TCP报文段中的窗口大小字段来控制,发送方的发送窗口不可以大于接收方发回的窗口大小。
当接收方没有缓存足够使用,就会发送零窗口大小的报文,此时发送方将发送窗口设置为0,停止发送数据。之后接收方有足够的缓存,发送了非零窗口大小的报文,但是这个报文在中途丢失的,那么发送方的发送窗口就一直为零导致死锁。
解决这个问题,TCP为每一个连接设置一个持续计时器(persistence timer)。只要TCP的一方收到对方的零窗口通知,就启动该计时器,周期性的发送一个零窗口探测报文段。对方就在确认这个报文的时候给出现在的窗口大小。
就是用来将某个IP地址划分成网络地址和主机地址两部分。
和路由器的区别在于,交换机使用硬件工作,快,只能处理简单的路由转发,路由器用软件实现,较慢,能实现复杂网络路由。
主要是实现 IP 协议中未实现的部分功能,是一种网络层协议。
该协议并不传输数据,只传输控制信息来辅助网络层通信。
其主要的功能是验证网络是否畅通以及辅助 IP 协议实现可靠传输。(ping就是通过发送icmp来查看目标站点是否可达)
单工通信
半双工通信
全双工通信
数据报:使用目的主机的地址进行分组转发。
虚电路:在发送分组之前,首先建立一条线路(虚电路),所有的分组通过同一条路径进行传输,以保证正确的按次序到达目标节点。
互联网用户通常需要连接到某个 互联网服务提供商 之后才能接入到互联网,PPP(点对点)协议是用户计算机和 互联网服务提供商 进行通信时所使用的数据链路层协议。