_莫相逢

导航

网上头条面筋总结

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
主要区别:

  1. 对于*.c和*.cpp文件,gcc分别当做c和cpp文件编译,而g++则统一当做cpp文件编译
  2. g++会自动链接标准库STL,而gcc不会
  3. 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     }

 

 

 

      

posted on 2019-04-05 23:21  莫晓风  阅读(177)  评论(0编辑  收藏  举报