正向代理和反向代理的区别?

正向代理和反向代理的本质都是代为收发请求和响应。


正向代理是一个位于客户端和目标服务器之间的代理服务器。为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。
正向代理的情况下客户端必须要进行一些特别的设置才能使用。

反向代理正好相反。对于客户端来说,反向代理就好像目标服务器,并且客户端不需要进行任何设置。
客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,因此客户端并不会感知到反向代理后面的服务,也不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了。

正向代理隐藏了客户端。(访问谷歌的梯子)

反向代理隐藏了服务器。(负载均衡,访问内网服务器)

参考资料:

反向代理为何叫反向代理? <https://www.zhihu.com/question/24723688>

进程,线程,协程?

进程

进程指一个正在执行的程序,是系统资源分配的最小单位,一个进程一般由以下几部分组成:

* 程序代码(称为文本段或者代码段)
* 当前的活动(包括程序计数器,寄存器的内容)
* 数据段(包括全局变量)
* 栈(包括函数参数,返回地址和局部变量等临时参数)
* 堆(进程运行期间动态分配的内存)
进程的特点:

* 动态性:进程由创建而产生,由调度而执行,因得不到资源而暂停执行,由撤销而消亡。
* 并发性:多个进程可以在一段时间内同时运行。
* 独立性:进程是独立运行的基本单位。
* 异步性:进程各自可以独立地,以不可知地速度前进。
线程

线程又称为轻量级进程,是进程内的一条运行线,是程序的实际执行者,一个进程至少包含一个主线程,也可以有更多的子线程。

* 使用CPU的基本单元,由线程ID,程序计数器,寄存器集合和堆栈组成。
* 同一进程的线程共享进程的代码段,数据段和其他资源。
线程的特点:

* 响应度高:一个进程中一个线程的阻塞不会导致整个进程的阻塞。
* 资源共享:同属一个进程的多个线程共享这个进程的所有资源。
* 通信简单:
* 经济:创建线程所花费的资源比较少,线程切换比进程切换所需资源少。
* 多处理器体系结构的利用:可以利用多个CPU执行多个线程实现并发处理。
对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元。

无论进程还是线程,都是由操作系统所管理的。

协程

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

协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。

参考资料:

内存中堆和栈的区别 <https://blog.csdn.net/ironyoung/article/details/41682167>

单核CPU与多核CPU,进程与线程,程序并发执行? <https://cloud.tencent.com/developer/article/1456363>

漫画:什么是协程?
<https://mp.weixin.qq.com/s?src=11×tamp=1567930581&ver=1839&signature=J3g8gcr3ih99QgEHXnF0scQukmmrYoy52BnIDg3K79BSwdSRRqCDAHV1WRBySlzDU6GC2aq4kz2di88rDPVU29mltGY2kpoiZCEC5wITrdh1*pGRbtJAQUXemDSGLwBW&new=1>

goroutine背后的系统知识 <http://www.sizeofvoid.net/goroutine-under-the-hood/>

进程调度算法



如上图所示,进程是有不同的状态的,当有多个进程处于就绪状态时,CPU调度程序从中选择一个进程将CPU分配给它。

决定选择哪个就绪进程去CPU运行的部分称为调度程序,它所使用的算法称为调度算法。

先来先服务调度算法

最短作业优先算法

* 非抢占式的:当运行进程主动放弃CPU控制权时进行调度
* 抢占式的:
* 进程主动离开CPU时调度运行时间最短的进程
* 当新到达进程的运行时间小于正在运行进程的剩余运行时间时进行调度
高响应比优先算法

响应比=(等待处理器的时间+期望服务的时间)/ 期望服务的时间

时间片轮转算法

* 抢占式调度算法
* 时钟每隔一段时间产生一个中断,运行状态的进程进入就绪状态,用先来先服务的方法从就绪队列中选择一个进程去执行
优先权调度算法

* 每个进程有一个优先权,优先权不同时调度优先权最高的进程,优先权相同时按照先来先服务顺序调度
* 抢占式/非抢占式
多级队列调度

* 把就绪队列划分为多个独立的队列
* 各个队列之间使用优先级调度
* 同一优先级之间使用时间片轮转调度
多级反馈队列调度

* 可抢占式算法
* 有多个队列优先级从高到低
* 进程刚进入系统,进入RQ0,执行完一个时间片,进入RQ1
* 最低优先级的队列是按照时间片轮转法调度
虚拟内存

虚拟存储器就是指仅把作业的一部分装入内存就可以运行作业的存储系统。

它具有请求调入功能和置换功能,是从逻辑上对内存容量进行扩充的一种存储系统。

请求页式存储管理

* 一个进程调入内存时只调入部分页
* 当需要的页面不在内存时,请求调入所需的页面
* 如果内存不足,可以把内存中的某个页面换出到外部辅存中
缺页中断

缺页:进程执行时要访问的页面不在内存

缺页导致缺页中断:OS响应缺页中断,把所需页面调入内存

缺页置换算法

* 在缺页发生时,OS一定要在内存中选择一个页面调出内存,为要调入的页面让出空间
* 页面置换算法负责选择要淘汰的页面
*
最优页面置换算法

* 在缺页发生时,在内存中的页面中会有一些将很快被访问,一些却要等待100或者1000条指令才能访问到
* 每个页面都会有该页面下次要被访问之前所要执行的指令数目进行标记
* 置换算法淘汰标记最大的页面
* 这种算法最优,但是它无法实现。
*
先进先出置换算法

* 在缺页发生时,置换最先进入内存的页面
*
LRU置换算法(Least Recently Used 近期最少使用)

*
在置换时选择未使用时间最长的页面

*
LRU算法的实现:计时器

*
LRU算法的实现:双向链表

*
在访问页时将此页移动至head

*
置换时不需要查找,替换tail的页面

HTTP状态码

分类 描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或者无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误
常见的状态码

状态码 状态码英文名称 中文描述
200 OK 请求成功,一般用于GET与POST请求
320 Found 资源临时被移动,客户端应继续使用原有URI
403 Forbidden 服务器理解客户端的请求,但是拒绝执行此请求
404 Not Found 服务器无法根据客户端的请求找到资源
500 Internal Server Error 服务器内部错误,无法完成请求
502 Bad Gateway 网关或者代理服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
参考资料:

HTTP状态码(菜鸟教程) <https://www.runoob.com/http/http-status-codes.html>

HTTP和HTTPS的区别

HTTPS的特性

*
机密性

对称加密,非对称加密,混合加密

*
完整性

摘要算法

*
身份认证,不可否认

数字签名(私钥+摘要算法)

参考资料:

程序员小灰
<https://mp.weixin.qq.com/s?src=11×tamp=1568444051&ver=1851&signature=qwmEGtWCEedi2pMz0RaHwh3npopHwcWWAI1PQSpbZ0V4cCSnl7DNEMa5ojoIWL3JBiTmOXaN7IO70H0JADeBi3KRAP2TFvtUJFWz-SGtC-*7BgRjRncyUSWGCVlowGqL&new=1>

极客时间:透视HTTP协议 <https://time.geekbang.org/column/intro/100029001>

数据库

索引

事务

算法

*
leetcode: 数据流中的第K大值
<https://leetcode-cn.com/problems/kth-largest-element-in-a-stream/>

Golang实现
<https://github.com/YahuiAn/Algorithm/blob/master/LeetCode/0703.kth-largest-element-in-a-stream/kth-largest-element-in-a-stream.go>

*
斐波那契数列----有一段楼梯有n级台阶,规定每一步只能跨一级或两级,要登上第n级台阶有几种不同的走法?

*
字符串转数字(比如说string类型的123,转化后应该为int类型的123)

总结


一面大概经历了1.30小时,面试官基本是按照我简历中项目所涉及的技能点来问我的,所有的知识点都问的很浅,真的是很基础的东西,三道算法题前两道都是说思路,最后一道给我分享了一个腾讯文档让我手敲代码,总体难度属于简单。