操作系统与计算机网络补充

  2020-5-29 


很久以前总结过一次,这里着重突出一些内容

操作系统

  1. 死锁恢复

    死锁四要素:互斥、占有和等待、不可抢占、环路等待

死锁恢复办法:

  1. 撤消进程,剥夺资源

    1. 线程设置优先级,让一个(或几个)线程回退,剩下的线程就像没发生死锁一样继续保持着它们需要的锁
    2. 死锁发生的时候设置随机的优先级;如果赋予这些线程的优先级是固定不变的,同一批线程总是会拥有更高的优先级。

    也可以死锁避免(银行家算法),避免系统进入危险状态

  2. 进程间通信

    ①管道

    ②消息队列

    ③共享储存

    ④信号量

    ⑤套接字

    ⑥信号

  3. JAVA线程间通信

    ①volatile

    ②Object的wait()和notify()

    ③JUC的CountDownLatch

    ④JUC的各种锁

    ⑤管道

    ⑥信号量

  4. 内存泄漏和内存溢出的区别

    内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现 out of memory;

    内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

  5. 局部变量

    局部变量的生命周期是在一个大括号内,即一个所处结束。

    所以循环内、方法内定义的变量都是局部变量。他们都虚拟机栈中(一层循环/一次方法调用使用一个栈帧,即栈的一格)。

    循环不会导致栈溢出,因为每一层循环入栈之后,该层循环结束就销毁

    局部区域可以引用到全局变量,外部区域无法引用局部变量(内部括号可以识别外部括号的变量,所以不能在局部区域定义一个和外部变量一样的变量。但是外部环境不认识局部变量,局部环境内定义的局部变量的生命周期随局部环境(栈)的释放而释放。)

    【循环或方法内创建的对象,也是储存在堆中,而引用才是储存在栈中,java里没有局部对象,凡是new创建的对象,都是在堆中

  6. 栈溢出:StackOverflow

    栈过深(递归深度太大)

    局部变量过多

    (数组、List、map数据过大:这些结构里存放对象的引用,引用过多,实际上和2条一样,也是局部变量过多导致栈溢出)

  7. 进程和线程有什么区别

    根本区别:进程是操作系统资源分配的基本单位,而线程任务调度和执行的基本单位

    在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小

    所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行

    内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。

    包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

  8. 协程

    协程(Coroutines)是一种比线程更加轻量级的存在,正如一个进程可以拥有多个线程一样,一个线程可以拥有多个协程

    协程不是被操作系统内核所管理的,而是完全由程序所控制,也就是在用户态执行。这样带来的好处是性能大幅度的提升,因为不会像线程切换那样消耗资源。协程仅仅是一个特殊的函数,协程与进程和线程不是一个维度的。一个线程内的多个协程虽然可以切换,但是多个协程是串行执行的,只能在一个线程内运行,没法利用CPU多核能力。协程与进程一样,切换是存在上下文切换问题的。协程的切换者是用户(编程者或应用程序)

计算机网络

  1. IPV4是32位(4B),IPV6是128位(16B)

  2. socket

    套接字可以看成是两个网络应用程序进行通信时,各自通信连接中的一个端点。通信时,其中的一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过网络接口卡的传输介质将这段信息发送给另一台主机的Socket中,使这段信息能传送到其他程序中。因此,两个应用程序之间的数据传输要通过套接字来完成

    socket有三种类型:

    SOCK_STREAM:即TCP,工作在传输层,进程之间通信(IP+端口),需要先建立连接,保证数据的完整性和有序性,有分包机制,有流量控制机制
    SOCK_DGRAM:即UDP,工作在传输层,进程之间通信(IP+端口),无连接,不保zd证数据完整性,不保证有序性,有分包机制,无流量控制机制
    SOCK_RAW:即IP,工作在网络层,主机之间通信(IP),无连接,不保证数据完整性和有序性,无分包机制,无流量控制

    socket调用流程:

    bind()绑定本地地址,connect()建立连接,listen()等待连接,accept()接受连接请求,send(),recv(),dendto(),recvfrom(),close()

    分为阻塞模式和非阻塞模式,非阻塞要使用select()

    更多相关:https://www.jianshu.com/p/066d99da7cbd

    多路复用机制:https://www.jianshu.com/p/397449cadc9a

  3. TCP和UDP的区别,什么时候使用谁,哪些用了TCP哪些用了UDP?

    TCP是面向连接的,UDP是无连接的

    1、基于连接与无连接

    2、对系统资源的要求(TCP较多,UDP少)

    3、TCP保证【数据正确性】,UDP可能丢包

    4、UDP更保证即时性

    5、TCP保证数据【顺序】,UDP不保证

    6、TCP只能1对1,UDP不限制

    7、由于历史的原因,互联网上物理链路的最小MTU = 576,基于UDP传输的DNS为了限制报文不超过576,所以将DNS报文限制在512字节。这样一旦DNS查询应答超过512字节,基于UDP的DNS就只有截短为512字节,那么用户得到的DNS应答就是不完整的。为了克服这种困难,最简单的方式就是使用TCP,来重新查询。但使用UDP同样可以传输远远大于576字节的数据,只要应用程序可以标识数据ID。

    UDP使用尽最大努力交付,即不保证可靠交付

    https://blog.csdn.net/huanglei305/article/details/99712771

  4. DNS使用TCP or UDP

    • 使用UDP传输是由于效率高,传输小于等于512字节报文。
    • 使用TCP传输是由于可以传输大于512字节报文。
    • 使用签名是保证数据来源的可靠性。
    • 使用TCP传输,同样是可以传输证书链、签名。
    • 使用UDP同样可以传输远远大于576字节的数据,只要应用程序可以标识数据ID。
  5. 游戏中使用TCP or UDP

    都有

    对于实时性要求较高的部分,使用UDP(比如FPS、MOBA,需要低延迟)

    其余的可以使用TCP

  6. 三次握手,四次挥手,详细状态、过程、参数

    1、ACK 是TCP报头的控制位之一,对数据进行确认。确认由目的端发出, 用它来告诉发送端这个序列号之前的数据段都收到了。 比如确认号为X,则表示前X-1个数据段都收到了,只有当ACK=1时,确认号才有效,当ACK=0时,确认号无效,这时会要求重传数据,保证数据的完整性。

    2、SYN 同步序列号,TCP建立连接时将这个位置1。

    3、FIN 发送端完成发送任务位,当TCP完成数据传输需要断开时,,提出断开连接的一方将这位置1。

    状态变化:客户端 SYN-SENT->ESTABLISHED 服务端:LISTEN->SYN-RCVD->ESTABLISHED

    img

    状态变化:客户端ESTABLISHED->FIN-WAIT-1->FIN-WAIT2->TIME WAIT->CLOSED

    服务端:ESTABLISHED->CLOSE-WAIT->LAST-ACK->CLOSED

    img

    服务端的CLOSE-WAIT状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文

    客户端的TIME_WAIT状态是为了确保最后一个确认报文能够到达(如果服务端没收到,会再次重发连接释放报文请求),让本连接持续时间内所产生的所有报文都从网络中消失

  7. TCP头包含哪些信息?三握四挥参数怎么变化?

    几大参数:源端口、目的端口、标记字节流序号[序号seq,确认号ack],数据偏移量(数据部分offset),状态标志位[同步SYN,确认ACK,终止FIN],窗口值(不提),校验和(不提)

    连接请求报文:SYN=1,ACK=0

    连接确认/确认报文:SYN=1,ACK=1

    客户端连接释放报文:FIN=1

    服务端连接释放报文:FIN=1,ACK=1

    注意,发送和接收是两个字节流,所以seq和ack标号也是不同的起点,x,y

    A->B seq=x,那B->A seq=y,ack=x+1,A->B seq=x+1,ack=y+1

    注意:TCP头部有端口信息没IP信息!IP信息是在IP包头中

  8. TCP四大算法

    TCP可靠传输超时重传

    TCP滑动窗口(缓存,发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。提高【吞吐量】,【进行流量控制】(下面);这样就可以发很多包,而不用等确认了)

    TCP流量控制接收方的TCP报文中,设置发送方窗口的大小!从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。)

    TCP拥塞控制(通过各种算法来设定报文段一轮的发送数量。慢开始、拥塞避免;快重传、快恢复)

    流量控制和拥塞控制都是控制速率,但不同在于流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。

  9. 网络层实现主机之间的通信,而链路层实现具体每段链路之间的通信。因此在通信过程中,IP 数据报的源地址和目的地址始终不变,而 MAC 地址随着链路的改变而改变。【路由器中包含arp表和路由表,arp表是记录ip地址和mac对应关系,相邻路由器可以看做广播域,路由器也是通过arp知道相连路由器的mac地址】

    主机在进行ip地址请求的时候,①先找网关路由器的MAC地址:先通过arp协议找到本地网关路由器(如果有交换机,则该帧到达交换机后由交换机进行广播该arp请求帧),然后网关路由器广播回复arp请求,②然后开始IP请求过程(此时MAC目的地址为网关路由器,IP目的地址为目的IP),网关路由器查路由表判断该ip地址是否属于本网络,如果是本网络,则不会走外网,直接内网ARP协议,MAC直达;如果是外网,就走下一跳(内部网关协议:RIP OSPF或外部网关协议:BGP)。

    ARP协议:每个主机都有一个 ARP 高速缓存,里面有本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表。(本地路由表)

    如果主机 A 知道主机 B 的 IP 地址,但是 ARP 高速缓存中没有该 IP 地址到 MAC 地址的映射,此时主机 A 通过广播的方式发送 ARP 请求分组,主机 B 收到该请求后会发送 ARP 响应分组给主机 A 告知其 MAC 地址,随后主机 A 向其高速缓存中写入主机 B 的 IP 地址到 MAC 地址的映射。

  10. 【交换器、路由器的区别:交换机工作在链路层,只工作在一个广播域;路由器工作在传输层,连接异构网络,隔离广播域】

  11. 路由器工作原理

    路由表根据这个数据包的的目的IP,然后查出下一跳的IP地址,然后根答据ARP解析得到下一跳,然后再将链路层封装好,发送出去。

    路由器的工作原理

      1)HostA在网络层将来自上层的报文封装成IP数据包,其中源IP地址为自己,目标IP地址是HostB,HostA会用本机配置的24位子网掩码与目标地址进行“与”运算,得出目标地址与本机不是同一网段,因此发送HostB的数据包需要经过网关路由A的转发。

      2)HostA通过ARP请求获取网关路由A的E0口的MAC地址,并在链路层将路由器E0接口的MAC地址封装成目标MAC地址,源MAC地址是自己。

      3)路由器A从E0可接收到数据帧,把数据链路层的封装去掉,并检查路由表中是否有目标IP地址网段(即192.168.2.2的网段)相匹配的的项,根据路由表中记录到192.168.2.0网段的数据请发送给下一跳地址10.1.1.2,因此数据在路由器A的E1口重新封装,此时,源MAC地址是路由器A的E1接口的MAC地址,封装的目标MAC地址则是路由器2的E1接口的MAC地址。

      4)路由B从E1口接收到数据帧,同样会把数据链路层的封装去掉,对目标IP地址进行检测,并与路由表进行匹配,此时发现目标地址的网段正好是自己E0口的直连网段,路由器B通过ARP广播,获知HostB的MAC地址,此时数据包在路由器B的E0接口再次封装,源MAC地址是路由器B的E0接口的MAC地址,目标MAC地址是HostB的MAC地址。封装完成后直接从路由器的E0接口发送给HostB。

      5)此时HostB才会收到来自HostA发送的数据。

      总结:路由表负责记录一个网络到另一个网络的路径,因此路由器是根据路由表工作的。

  12. 为什么要划分子网?

    划分子网就是人为地将一个公网IP分成多个子网段方便管理
    就算不划分也可以,不过这个公网IP下的所有计算机都能互相连接而不受限制,那么就不好管理机密数据了

  13. 三个表

    路由表是IP地址可达范围的一张表,相当于是网络里的地图,负责三层的数据转发;
    ARP表示IP地址和MAC地址的逻辑关系表;
    MAC地址表是MAC地址和交换机接口的逻辑关系表,负责二层的数据转发

    MAC不会走出广播域

    路由器在要跨网段的时候起作用

  14. 一些应用层协议是基于什么底层协议实现的?【继续补充】

    DNS(TCP/UDP)

    FTP(TCP)

    DHCP(UDP)

    Ping(网络层ICMP,ICMP封装在IP数据报中),Traceroute(UDP)

  15. web请求页面:DHCP-ARP-DNS-HTTP(基于TCP)

  16. 一个报文段从发送再到接收到确认所经过的时间称为往返时间 RTT

  17. 内部专用网络要想将内部地址转换为外部地址就需要网络地址转换NAT

  18. 虚拟专用网络VPN 使用公用的互联网作为本机构各专用网之间的通信载体。专用指机构内的主机只与本机构内的其它主机通信;虚拟指好像是,而实际上并不是,它有经过公用的互联网

    VPN会对内部数据进行加密,只有目标路由器才能解密

  19. 数据传输单元

    应用层——消息

    传输层——数据段(segment)

    网络层——分组、数据包,包(packet)

    链路层——帧(frame)

    物理层——P-PDU(bit)

  20. HTTP的post和get请求

    GET 用于获取资源,而 POST 用于传输实体主体。

    GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体中。

    安全的 HTTP 方法不会改变服务器状态,也就是说它【只是可读】的。GET 方法是安全的,而 POST 却不是,因为 POST 的目的是传送实体主体内容,这个内容可能是用户上传的表单数据,上传成功之后,服务器可能把这个数据存储到数据库中,因此状态也就发生了改变。

    HEAD 获取报文首部

    PUT 上传文件

    …….()

  21. DNS 权威解析记录,DNS过程

    由本地服务器代理,先查根,然后迭代/递归的方式去查顶级,权威

    https://jingyan.baidu.com/article/ad310e80e8f6c91848f49e4c.html

    一个服务器所负责管辖(或有权限)的范围叫做区(zone)

    权限域名服务器:负责一个“区”的域名服务器。

    很多情况下,根域名服务器并不直接把待查询的域名直接解析出IP地址,而是告诉本地域名服务器下一步应当找哪一个顶级域名服务器进行查询。

    img

  22. DNS记录类型

    A记录:A记录就是服务器的IP,域名绑定A记录就是告诉DNS,当输入域名的时候给你引导向设置在DNS的A记录所对应的服务器。

    CNAME记录:别名。这种记录允许您将多个域名映射到同一台计算机

    MX记录:是邮件交换记录,它指向一个邮件服务器,用于电子邮件系统发邮件时根据 收信人的地址后缀来定位邮件服务器

    NS记录:Name Server 是一种域名服务器记录,用来明确当前你的域名是由哪个DNS服务器来进行解析的。


且听风吟