网上头条面筋总结
get 和 post 的区别
两者都是向服务器获取数据,并且都会从服务器获取数据。
区别:
1、传送方式:get通过地址栏传输,post通过报文传输。
2、传送长度:get参数有长度限制(受限于url长度),而post无限制
3、GET和POST还有一个重大区别,简单的说:
GET产生一个TCP数据包;POST产生两个TCP数据包
长的说:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)
http://www.w3school.com.cn/tags/html_ref_httpmethods.asp
对称加密和非对称加密
对称加密:加密和解密用的是同样的秘钥
非对称加密:一对密钥,公钥和私钥,私钥只能由安全一方保管,而公钥可以发给任何人。用公钥对消息进行加密,而只有私钥才能对该消息解密。
ping 的过程使用到哪些协议
ICMP、DNS和ARP
什么是长连接、短连接?
短连接:客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。
长连接:客户和服务器每进行一次HTTP操作,建立的连接不会关闭,客户端再访问这个服务器时,会继续使用这一条已经建立的连接。其中有个保持时间。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接
非递归后序遍历
https://www.cnblogs.com/moxiangfeng/p/10738591.html
Reactor和Proactor的区别
https://www.cnblogs.com/me115/p/4452801.html(看不懂)
阻塞IO和非阻塞IO的区别、同步IO和异步IO的区别
阻塞IO:资源不可用时,IO请求一直阻塞,直到反馈结果
非阻塞IO:资源不可用时,IO请求离开返回,返回数据标识资源不可用
同步IO:应用程序阻塞在发送或接受数据的状态,直到数据成功传输或返回失败
异步IO:应用程序发送或加收数据后立刻返回,数据写入OS缓存,由OS完成数据发送或接受,并返回成功或失败的信息给应用。
gcc和g++的区别
gcc是GCC中的GUN C Compiler,g++是GCC中的GUN C++ Compiler
主要区别:
- 对于*.c和*.cpp文件,gcc分别当做c和cpp文件编译,而g++则统一当做cpp文件编译
- g++会自动链接标准库STL,而gcc不会
- gcc在编译C文件时,可使用的预定义宏是比较少的
编译器为每个类对象都添加一个隐藏成员,隐藏成员中保存了一个指向函数地址数组的指针,称为虚表指针,这种数组称为虚函数表,即,每个类使用一个虚函数表,每个类对象用一份虚表指针。
虚函数的构造过程:
虚函数的调用过程:
红黑树
https://blog.csdn.net/q3244676719/article/details/81540830
STL的内存分配器
默认用alloctator实现。allocator是一个由两级分配器构成的内存管理器,当申请的内存大小大于128byte时,就启动第一级分配器通过malloc直接向系统的堆空间分配,如果申请的内存大小小于128byte时,就启动第二级分配器,从一个预先分配好的内存池中取一块内存交付给用户,这个内存池由16个不同大小(8的倍数,8~128byte)的空闲列表组成,allocator会根据申请内存的大小(将这个大小round up成8的倍数)从对应的空闲块列表取表头块给用户。
优点:
(1)小对象可以快速分配。小对象的内存池是系统调用一次malloc分配一块足够大的区域给程序备用,当内存池耗尽时再向系统申请一块新的区域。
(2)避免了内存碎片的生成。
type_traits
C++中的的一个头文件,定义了一系列的类去获得编译时的类型信息
http协议怎么知道已完成数据传送
http的传输层使用的是TCP协议,所以http协议是根据TCP判断已完成数据传送的方式来判断的。即根据TCP报文段的FIN来判断,当FIN=1时,则表明是最后一个报文段,传送结束。
找一个无序数组的中位数
先来一个快排,再找中位数,如果是偶数个,则取中间的两个结果的平均值。
快排的时间复杂度,最坏情况呢,最好情况呢,堆排序的时间复杂度呢,建堆的复杂度是多少
快排:最好nlogn,最坏n2 ,平均nlogn;堆排:建堆和排序都是nlog2。
Linux的磁盘管理
http://www.runoob.com/linux/linux-filesystem.html
Linux有哪些进程通信方式、共享内存如何实现、共享内存实现的具体步骤
进程通信方式:管道通信、消息队列、信号量、共享存储、FIFO
1、管道。半双工、只能用于亲缘关系。
2、消息队列。即消息的链接表,存放在内核中。一个消息队列由一个标识符来标识。
3、信号量。一个计数器、用于实现进程间的互斥和同步,不是用于存储进程间的通信数据。
4、共享内存。指两个或多个进程共享一个给定的存储区。特点:最快、需要同步、通常和信号量结合在一起使用。
5、FIFO。一种文件类型,在无关的进程之间交换数据。
创建共享内存的步骤:
1、定义共享内存的结构体
2、利用CreateFileMapping函数创建共享内存
3、定义指向共享内存结构体的指针pShareMem,利用MapViewOfFile函数将刚刚创建的内存映射到定义指针pShareMem
读写共享内存的步骤:
1、定义共享内存的结构体
2、用OpenFileMapping函数打开上面创建的共享内存区,该函数返回共享内存的地址
3、将共享内存映射为文件指针
4、定义指向共享内存结构体的指针,将共享内存的内容拷贝到结构体指针里
参考来源:https://blog.csdn.net/long12310225/article/details/77503676
Docker
一个开源的应用容器引擎。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后就可以发布到任何流行的Linux机器上,也可实现虚拟化。
Linux下如何实现cgroup
cgroup即用来限制某些进程的分配资源。
实现步骤:
1、首先挂载一个子系统。比如我想限制某些进程的资源,那么,我会先挂载memory子系统。
2、在memory子系统中创建一个cgroup节点,在这个节点中,将需要控制的进程id写入,并且将控制的属性写入。
参考来源:https://blog.csdn.net/gaojy19881225/article/details/80019874
MySQL的事务隔离级别
读已提交 解决 脏读问题。
可重复读 解决 不可重复度问题。
串行化 解决 幻读问题。
参考来源:https://www.cnblogs.com/huanongying/p/7021555.html
一个有向图用邻接矩阵,并且是有权图,怎么判断图中是否有环
使用拓扑排序、递归
找到二叉树中最长的一条路径
1、递归找出所有路径 https://www.cnblogs.com/moxiangfeng/p/10667350.html
2、找出最长者输出
孤儿进程和僵尸进程,如何避免僵尸进程,父进程怎么知道子进程结束了
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
避免产生僵尸进程:使用wait()或者waitpid()等待子进程退出
如何处理大量僵尸进程:将产生大量僵尸进程的那个父进程使用KILL发送SIGTERM信号。
参考来源:https://www.cnblogs.com/Anker/p/3271773.html
为什么迅雷下载是基于UDP的
迅雷下载是P2P的
操作系统的死锁必要条件,如何避免死锁
互斥条件、请求和保持条件、不可抢占条件、循环等待条件。
避免死锁:确保系统始终处于安全状态。可利用银行家算法来避免死锁
LRU(最近使用)算法的实现,要求使用链表和哈希
https://blog.csdn.net/z702143700/article/details/48374201
输出二叉树的左视图(即从左边看过去能看到的节点)
思路:从右到左层次遍历,用一个last来记录每一层的最后一个节点。
代码:
1 /** 2 3 输出二叉树的左视图 4 5 **/ 6 7 vector<int> rightSideView(TreeNode* root) { 8 vector<int> ans; 9 if(root == NULL) 10 return ans; 11 int front=-1,rear=-1; 12 int last=0,lever=0; 13 14 TreeNode* Q[1000]; 15 Q[++rear] = root; 16 TreeNode *p = root; 17 while(front < rear){ 18 p = Q[++front]; 19 if(p->right) 20 Q[++rear] = p->right; 21 if(p->left != NULL) 22 Q[++rear] = p->left; 23 24 if(last == front){ 25 ans.push_back(Q[front]->val); 26 last=rear; 27 lever++; 28 } 29 } 30 return ans; 31 }