操作系统中进程和线程的区别
进程线程具体比较:
-
调度开销:传统OS中,进程是独立调度和分派的基本单位,每次切换时上下文(上下文就是寄存器内容和页表信息)开销大。引入线程的OS中,线程是调度和分派的基本单位,切换时开销小。同一进程中线程间切换不会引起进程的切换,不同进程间线程的切换会引起进程的切换 1.1 为什么进程切换开销比线程大: 进程切换涉及到虚拟地址空间的切换而线程不会,线程都有自己的虚拟地址空间,线程是共享所在进程的虚拟地址空间的,切换不需要转换地址空间。而进程切换需要将虚拟地址空间转换为物理地址空间,而物理地址空间查找需要查找页表,一般用TLB缓存页表,但是由于页表切换后TLB失效,所以虚拟地址转为物理地址变慢,开销大
-
并发性:引入线程的OS中,不仅进程间可以并发执行,同一进程的多线程间可以并发执行,甚至允许一个进程中所有线程都能并发执行,不同进程间线程也能并发执行,提高并发性
-
拥有资源:进程可以拥有资源,并作为拥有资源的一个基本单位,然而线程只拥有保证独立运行的基本资源
-
独立性:同一进程中不同线程间独立性比不同进程之间独立性低得多,为了防止进程之间彼此干扰和破坏,每个进程都拥有一个独立的地址空间和其他资源
-
支持多处理机系统:传统进程不管多少处理机,进程只能运行在一个处理机上,对于多线程进程可以将多个进程分配到多个处理机上,加速进程的完成
-
进程间通信: 6.1 管道:半双工通信。亲缘关系的进程间通信
6.2 有名管道:有亲缘或无亲缘关系的进程间通信
6.3 信号量:是一个计数器,控制多个进程对共享资源的访问,常作为一种锁机制
6.4 消息队列:消息链表,存放在内核中
6.5 信号:较复杂,用于通知接收进程
6.6 共享内存:映射一段能被其他进程访问的内存,共享内存由一个进程创建,多个进程可访问
6.7 套接字:可用于不同设备及其进程间通信
- 线程间通信 7.1 锁机制:互斥锁,条件变量,读写锁,volatile,notify/wait
7.2 信号量机制:无名线程信号量和命名线程信号量
7.3 信号机制:类似进程间信号处理
进程中的某一个线程挂掉怎么影响这个进程
-
如果进程不屏蔽 segment fault 信号,一个线程崩溃,所有线程终结。
-
如果屏蔽 segment fault 信号,且线程崩溃的位置是线程私有位置(stack),那么其他线程没有问题。
-
如果屏蔽 segment fault 信号,且线程崩溃的位置是线程共享位置(heap、全局变量等),那么其他线程也会出现问题。
进程调度
- 先来先服务
- 短作业(进程)优先调度
- 高优先权优先调度 3.1 非抢占式优先权算法
3.2 抢占式优先权调度算法
- 高响应比优先调度算法
- 时间片轮转法
- 多级反馈队列调度算法
批处理系统常用算法:
- 先来先服务
- 最短作业优先
- 最短剩余时间优先
- 响应比最高者优先
分时系统常用算法:
- 轮转调度
- 优先级队列
- 多级队列
- 彩票调度
实时系统常用算法:
- 单比率调度
- 限期调度
- 最少裕度法
单核CPU可以多线程吗
可以的,并且对于改善用户体验上也很有意义。多线程提高效率指的是网络IO,某一个任务耗时特别长,别的任务就会无法执行,为了防止此现象,任务间切换时很有必要的。
计算机网络五层协议?
物理层 数据链路层 网络层 运输层 应用层
tcp/udp区别?
tcp面向字节流,udp面向报文
tcp提供可靠交付,udp尽最大努力交付
tcp面向连接,udp不建立连接
tcp连接只能点对点,udp可以一对一,一对多,多对多
tcp提供全双工通信,udp提供半双工通信
udp没有拥塞控制,udp首部开销小,只有八个字节
GET和POST的差别:
本质上没差别,都是TCP链接,只是由于HTTP规定和浏览器限制导致在应用过程中有一些不同。GET产生一个数据包,POST产生两个。但也不是说效率就一定高,网络良好情况下时间差基本无视,网络差的情况下两个数据包在保证数据不丢失上优点显著
另外,数据传输上,GET传输数据量小,需要拼接URL,请求可以缓存。POST传输数据量大,通过body体传参数,请求不可以缓存。原则上两个都不安全,但是相比较来说POST比GET安全一些
http 三次握手四次挥手:
三次握手:第一次发送syn(联机),第二次返回syn,ack(确认),第三次发送ack。保障效率和稳定
四次挥手:第一次发送fin(结束),第二次返回ack,第三次返回fin,第四次返回ack。因为ack和fin基本分开发送,所以会比握手多一次
http1.0和http2.0的区别:
- Http2.0采用二进制格式而非文本格式
- Http2.0是完全多路复用的,而非有序并阻塞的,只需一个连接即可实现并行
- Http2.0使用报头压缩。降低开销
- Http2.0让服务器可以将响应主动“推送”到客户端缓存
http和https区别:
- https = http + ssl,即多了一层加密服务,可以用来传输隐私信息
- https即用了对称加密用于高效率传输内容,也用了非对称加密用于验证证书
- 采用不同的连接方式,用的端口也不一样,http常用80/8080端口,https常用443端口
- https要申请证书
Https的抓包原理:
由Charles作为中间代理人,通信时接收服务器证书,动态生成自己的证书发送给浏览器,数据被自己拦截解密,形成抓包
一个完整的网络请求过程
- 通过DNS协议获取URL对应的IP
- 浏览器与服务器建立TCP连接
- 客户端发送HTTP请求
- 服务器收到响应后执行相应的业务逻辑
- 服务器发送响应
- 解析HTML
- 断开连接,四次挥手
DNS的作用
保存了一张域名和IP的表,用来解析消息域名
内核态和用户态
- 保护操作系统的核心安全,linux划分内存为内核空间和用户空间
- 内核空间所有进程共享,Binder机制即是如此
- 内核态下进程运行在内核空间,cpu执行的指令将不受检查不受限制容易崩溃
- 用户态下进程运行再用户空间,被执行的代码要收到cpu的检查,只能访问规定的地址
- 划分空间隔离操作系统代码和应用程序代码,即使单个应用程序出错也不影响操作系统
输入url后跳转到页面前发生了什么?
首先根据url查找对应IP,找到后建立TCP链接,然后发送HTTP请求,再让服务器处理请求,浏览器解析渲染页面,然后关闭TCP链接,使用了DNS,TCP/IP,HTTP,ARP,ICMP,HTML等协议
为什么不将mac作为IP地址?
mac地址是唯一的,但是无法通过这个地址知道它来自哪里,而IP地址通过层级关系将计算机分组,通过路由表可以确定位置
ping的实现原理
ping发送一个ICMP报文,接收端回声消息给目的地址并报告是否收到所希望的ICMPecho,利用网络上IP地址的唯一性,给目标IP地址发送一个数据包,通过对方回复的数据包来确定两台网络机器是否连通,时延是多少
TCP滑动窗口流量控制和拥塞避免
滑动窗口:所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收,如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。滑动窗口是通过算法动态调整大小的,一般情况下,接收窗口 >= 发送窗口
拥塞避免:慢开始,拥塞避免,快重传,快恢复
2021.4.16更新面试问题
https中ssl的加密过程和原理
过程:
- CA认证服务器
- 随机生成密钥
- 加密传输
原理:
-
ssl加密是基于非对称加密算法,非对称加密算法将产生一对长字符串,称为密钥对(公钥和私钥)。数据用公钥加密后,只能用私钥解密。事实上,具有服务器证书的网站是将私钥保存在服务器中,而把公钥与网站相关信息(如域名、所有者名称和有效期)一起制作成一张SSL证书,并在互联网上公布该SSL证书。
-
当用户访问网站时,他可以获得这个SSL证书。当用户提交数据时,客户端使用受保护公钥的SSL证书来加密数据。非对称加密只能用私钥解密,即使在网络传输过程中数据被截获,截获者也不能得到私钥,截获者也就不能破译密文。因此,基于SSL加密的HTTPS协议才会被视为安全的,而HTTPS网站才会被浏览器视为安全的。
计算机网络状态码
1xx:接收的请求正在处理
2xx:请求正常处理
3xx:需要附加操作以完成请求,比如重定向
4xx:服务器无法处理请求
5xx:服务器处理请求错误
如何用UDP实现TCP
- 添加seq/ack机制,确保数据发送到对端
- 添加发送和接收缓冲区,主要是用户超时重传
- 添加超时重传机制
详细说明:发送端发送数据时,生成一个随机seq=x,然后每一片按照数据大小分配seq。数据到达接收端后接收端放入缓存,并发送一个ack=x的包,表示对方已经收到了数据。发送端收到了ack包后,删除缓冲区对应的数据。时间到后,定时任务检查是否需要重传数据。
这里主要涉及到TCP和UDP报头的数据结构差异
TCP链接的概念
链接其实并不是所谓的有一根电线连起两个设备,而是两方确认了一下对方的存在后,自己在本地记录的状态,然后记录在各个设备的一个状态信息,是一个虚拟的概念
虚拟内存
虚拟内存是一种计算机系统内存管理技术。它使得应用程序认为它拥有连续可用的内存,即一个连续完整的地址空间。而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
CPU亲和度
CPU亲和度: 就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,也称为CPU关联性。再简单的点的描述就将制定的进程或线程绑定到相应的cpu上。在多核运行的机器上,每个CPU本身自己会有缓存,缓存着进程使用的信息,而进程可能会被OS调度到其他CPU上,如此,CPU cache命中率就低了,当绑定CPU后,程序就会一直在指定的cpu跑,不会由操作系统调度到其他CPU上,性能有一定的提高。
软亲和性: 进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,Linux 内核进程调度器天生就具有被称为 软 CPU 亲和性(affinity) 的特性,这意味着进程通常不会在处理器之间频繁迁移。这种状态正是我们希望的,因为进程迁移的频率小就意味着产生的负载小。
硬亲和性:利用linux内核提供给用户的API,强行将进程或者线程绑定到某一个指定的cpu核运行。
拔掉网线后TCP链接的页面
拔掉网线后会立刻显示当前页面,不会过一会再出现页面
TCP握手失败的情况
第一次握手A发送SYN传输失败,A,B都不会申请资源,连接失败。如果一段时间内发出多个SYN连接请求,那么A只会接受它最后发送的那个SYN的SYN+ACK回应,忽略其他回应全部回应,B中多申请的资源也会释放
第二次握手B发送SYN+ACK传输失败,A不会申请资源,B申请了资源,但收不到A的ACK,过一段时间释放资源。如果是收到了多个A的SYN请求,B都会回复SYN+ACK,但A只会承认其中它最早发送的那个SYN的回应,并回复最后一次握手的ACK
第三次握手ACK传输失败,B没有收到ACK,释放资源,对于后序的A的传输数据返回RST。实际上B会因为没有收到A的ACK会多次发送SYN+ACK,次数是可以设置的,如果最后还是没有收到A的ACK,则释放资源,对A的数据传输返回RST
非对称加密和对称加密的区别以及证书的联系
- 对称加密: 1.1 A和B要把通信内容加密,如果A/B使用相同的加密解密key,就是对称加密
1.2 加密和解密的key必须是唯一的,因此问题也出现了,一旦链接过多,必然产生key过多无法管理的情况
1.3 一般不能提供完整的信息鉴别,无法验证发送者和接收者的身份
1.4 公钥或私钥数量过多时保存很困难,无法保证是否会泄露而造成安全问题
- 非对称加密: 2.1 非对称加密有公钥和私钥,公钥随意公开,私钥自己保留,只有私钥才能解开公钥
2.2 公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密
2.3 典型应用是数字签名DSA算法
- 证书: 它以数字证书为核心的加密技术(加密传输、数字签名、数字信封等安全技术)可以对网络上传输的信息进行加密和解密、数字签名和签名验证,确保网上传递信息的机密性、完整性及交易的不可抵赖性
举例记忆
一个人S有公钥和私钥,这个人把公钥送给他的朋友们,他的朋友A给S写了一封信,用S送的公钥加密后寄给S,只要S自己的私钥不泄露,就可以保证这封信只被自己的私钥解密,即使信落在别人手里,别人也无法解密,非常安全。于是S打算给朋友A回信,决定采用“数字签名”,使用自己的私钥加密,朋友A收到信件后用公钥解密得到信件,证明是S回的信。 复杂的情况出现了,朋友B欺骗朋友A,用自己的公钥换走了S的公钥,朋友B用自己的私钥做数字签名写信给朋友A,让A用B自己的公钥解密,后来朋友A觉得不对劲,无法确定公钥是否属于S,于是A要求S去证书中心为公钥做认证,证书中心用自己的私钥对S的公钥和一些信息一起加密生成数字证书,S拿到证书后,以后再给A写信,只要再数字签名后附上数字证书即可。A收到信件后用证书中心的公钥解开数字证书,拿到S的真实公钥后就可以确定数字签名是否是S的了
2021.9.20更新面试问题
DNS的具体解析流程?
-
本地客户机提出域名解析请求,查找本地HOST文件后将该请求发送给本地的域名服务器。
-
当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。
-
如果本地DNS缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址。
-
本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址。
-
重复第四步,直到找到正确的纪录。
-
本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。
递归查询:在该模式下DNS服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。如果DNS服务器本地没有存储查询DNS信息,那么该服务器会询问其他服务器,并将返回的查询结果提交给客户机。
迭代查询:DNS所在服务器若没有可以响应的结果,会向客户机提供其他能够解析查询请求的DNS服务器地址,当客户机发送查询请求时,DNS服务器并不直接回复查询结果,而是告诉客户机另一台DNS服务器地址,客户机再向这台DNS服务器提交请求,依次循环直到返回查询的结果为止。
为什么TCP握手不是一次、二次或者四次?
不是一次、二次:因为双方无法确定是否建立了连接
不是四次:三次已经可以确定连接建立,四次五次都是徒劳
死锁的产生和解决手段?
死锁的定义
如果一组进程中的每一个进程都在等待仅由改组进程中的其它进程才能引发的事件,那么该组进程是死锁的。通常是源于多个进程对资源的争夺
- 对不可抢占资源进行争夺时会引起死锁
- 对可消耗性资源进行争夺时会引起死锁
- 进程推进顺序不当会引起死锁
产生死锁的必要条件
只要下面四个条件任意一个不成立死锁都不会发生
- 互斥条件:一个资源一次只能被一个线程使用
- 请求和保持条件:一个线程因请求资源而阻塞时,对已获得资源保持不放
- 不可抢占条件:线程获得的资源,在未完全使用完之前,不能强行抢占
- 循环等待条件:若干进程之间形成一种头尾相接的环形等待资源关系
处理死锁的方法
- 预防死锁:破坏上述必要条件除互斥条件另外三个中任意一个即可
- 避免死锁:银行家算法
- 检测死锁:OS的检测算法
- 解除死锁:OS的解除算法
从上到下对死锁的防范程度逐渐减弱,但对应的是资源利用率的提高,以及进程因资源因素而阻塞的频度下降(即并发程度提高)
2021.10.11更新面试问题
TCP会丢包吗?
这个问题不太好说,网上有人说会,有人说不会,面试官的说法是不会,经过我百度查证一个比较可靠的说法是“会丢包,但是由于TCP的超时重传机制使得错误数据会一遍遍发送直到他正确为止,所以对上层业务来说看上去并不会丢包”。当然这里如果有不同意见的大佬欢迎评论区或私信交流
粘包和拆包
拆包和粘包是在socket编程中经常出现的情况,在socket通讯过程中,如果通讯的一端一次性连续发送多条数据包,tcp协议会将多个数据包打包成一个tcp报文发送出去,这就是所谓的“粘包”。而如果通讯的一端发送的数据包超过一次tcp报文所能传输的最大值时,就会将一个数据包拆成多个最大tcp长度的tcp报文分开传输,这就叫做“拆包”
出现粘包的原因:
- 要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去
- 接收数据端的应用层没有及时读取接收缓冲区中的数据
- 数据发送过快,数据包堆积导致缓冲区积压多个数据后才一次性发送出去(如果客户端每发送一条数据就睡眠一段时间就不会发生粘包)
同步异步和阻塞非阻塞
在知乎看到了一个比较浅显易懂的区分:
故事:老王烧开水。
出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
老王想了想,有好几种等待方式
1.老王用水壶煮水,并且站在那里,不管水开没开,每隔一定时间看看水开了没。-同步阻塞
老王想了想,这种方法不够聪明。
2.老王还是用水壶煮水,不再傻傻的站在那里看水开,跑去寝室上网,但是还是会每隔一段时间过来看看水开了没有,水没有开就走人。-同步非阻塞
老王想了想,现在的方法聪明了些,但是还是不够好。
3.老王这次使用高大上的响水壶来煮水,站在那里,但是不会再每隔一段时间去看水开,而是等水开了,水壶会自动的通知他。-异步阻塞
老王想了想,不会呀,既然水壶可以通知我,那我为什么还要傻傻的站在那里等呢,嗯,得换个方法。
4.老王还是使用响水壶煮水,跑到客厅上网去,等着响水壶自己把水煮熟了以后通知他。-异步非阻塞
老王豁然,这下感觉轻松了很多
可以看出,其实同步是需要某一方一直轮询直到产生结果的,而异步是可以通过回调来知晓结果的。阻塞和非阻塞则相当于线程是否被卡住,被卡住期间线程不可以去做其他的任务,而非阻塞的线程可以。
欢迎指正