前言唯有光头才能变强不是多线程就能提高程序的执行速度,使用多线程是为了更好的利用CPU资源!程序在执行时,CPU通过给每个线程分配一个CPU时间片来实现多线程。时间片是CPU分配给每个线程的执行时间。因为时间片很短,CPU通过不断切换线程来执行。.线程越多越好,因为线程上下文切换有性能损耗。使用多线程时,需要考虑如何减少上下文切换。总的来说,无锁并发编程有以下几种体验。多线程竞争时,会引起上下文切换。因此,在多线程处理数据时,可以采用一些方法来避免使用锁,比如将数据的ID按照Hash取模进行分段,不同线程用CAS算法处理不同分段的数据。Java的Atomic包使用CAS算法在不加锁的情况下更新数据。控制线程数。避免创建不必要的线程。比如任务很少,但是创建了很多线程来处理,会导致大量线程处于等待协程的状态。在单线程中实现多任务调度,在单线程中维护多个任务之间的切换协程,可以看作是用户态的一个自我管理的“线程”。不会参与CPU时间调度,时间不会平均分配。非抢占还可以考虑我们的应用是IO密集型还是CPU密集型。如果是IO密集型,线程可以多一些。如果是CPU密集型,线程不宜过多。参考资料:多线程编程——减少上下文切换(一):https://blog.csdn.net/yxpjx/article/details/52081034多线程上下文切换优化与注意:https://www.cnblogs.com/signheart/p/3e3379943de1c36d5bcc7d8cee4b9825.html2.计算机网络2.1MAC地址已经是唯一的,为什么还要IP地址?或者您可以反过来问:既然已经有了IP地址,为什么还需要MAC地址??知乎上类似的问题挺多的:有MAC(IP)的时候,我简单总结一下为什么还要IP(MAC):MAC是链路层,IP是网络层,每一层做各自的工作层子,之所以把网络分为链路层和网络层(...是为了简化问题。历史兼容问题。IP地址已经有了,为什么还需要MAC地址??原因在这阶段:DHCP是根据MAC地址分配IP。MAC地址已经是唯一的了,为什么还需要IP地址呢?MAC没有网段概念,不成簇,不易管理。如果大家有更好的意见,不妨在评论区留言~参考资料:MAC地址唯一,满足不了通讯需求?为什么需要IP?https://www.wukong.com/answer/6549169419812077827/有了IP地址,为什么还要用MAC地址?https://www.zhihu.com/question/215464082.2TCP状态下面说一下TCP的各个状态,TIME-WAIT状态。说一下TCP一共有11个状态,状态之间的转换是这样的:流程图:下面我简单总结一下各个状态:CLOSED:初始状态,表示TCP连接是“关闭”还是“未打开”.LISTEN:表示服务器端的某个SOCKET处于监听状态,可以接受来自客户端的连接。SYN-SENT:表示客户端发送了SYN报文。当客户端SOCKET执行connect()连接时,首先发送SYN报文,然后立即进入SYN_SENT状态。SYN_RCVD:表示服务器收到客户端请求连接的SYN报文。当TCP连接处于该状态时,收到客户端的ACK报文后会进入ESTABLISHED状态。ESTABLISHED:表示TCP连接已经成功建立。FIN-WAIT-1:第一个主动请求关闭连接,等待对方的ACK响应。CLOSE_WAIT:对方发送FIN报文给自己,并回复ACK报文给对方。此时进入CLOSE_WAIT状态。接下来,您需要检查您是否还有数据要发送给对方。如果没有,那么你可以close()这个SOCKET,然后发送一个FIN报文给对方,也就是关闭自己到对方这个方向的连接FIN-WAIT-2:主动关闭终端并收到ACK后,它进入FIN-WAIT-2。在这种状态下,应用程序仍然具有接收数据的能力,但不能发送数据。LAST_ACK:被动关闭方发送FIN报文后等待对方ACK报文时,处于LAST_ACK状态。CLOSED:收到对方ACK报文后,可以进入CLOSED状态。TIME_WAIT:表示已经收到对方的FIN报文,并发送了ACK报文。处于TIME_WAIT状态的TCP连接将等待2*MSLCLOSING:一种罕见的状态。表明双方正在关闭SOCKET连接。TIME_WAIT状态一般用于处理以下两个问题:关闭TCP连接时,确保最后一个ACK??正常传输(或者可以认为是:等待重传ACK)network,以便能够正常处理这些残留数据包。使用TIME-WAIT状态可确保在创建新连接时丢失先前网络中的任何剩余数据。TIME_WAIT过多如何解决?在高并发和多个短链接的情况下,TIME_WAIT会吃不完。可以通过调整内核参数来解决:vi/etc/sysctl.conf添加如下内容设置:reuse表示是否允许为新的TCP连接重新申请处于TIME-WAIT状态的sockets;recyse的意思是加快TIME-WAITsockets的回收,我们可以知道TIME_WAIT状态是一方主动关闭连接导致的,所以不能轻易使用上面两个参数。先看看能不能复用TCP连接,尽量避免这个问题(比如我们的HTTPKeepAlive)~参考资料:TCP/IP详解--TCP连接中TIME_WAIT状态过多:https://blog.csdn.net/yusiguyuan/article/details/21445883TCP连接状态详解及排查:https://blog.csdn.net/hguisu/article/details/38700899TCP的11种状态:https://www.cnblogs.com/qingergege/p/6603488.html2.3TCP滑动窗口TCP是一种可靠的传输协议。它必须保证所有的数据包都能到达,这就需要重传机制来支持。重传机制有几种:超时重传快速重传SACK方法滑动窗口可以说是TCP非常重要的一个知识点。TCP的滑动窗口主要有两个作用:提供TCP的可靠性和提供TCP的流量控制特性。滑动窗口简略示意图:滑动窗口详细示意图:#1已经收到ack确认的数据。#2发送那些还没有收到ack的。#3尚未在窗口中发送(接收方仍有空间)。#4窗口外的数据(接收方没有空间)接收端控制发送端示意图:2.4拥塞控制TCP不是自私的协议。当发生拥堵时,需要自我牺牲。就像堵车一样,每辆车都应该让路,而不是抢道。拥塞控制主要有四种算法:1)慢启动,2)拥塞避免,3)发生拥塞,4)快速恢复拥塞控制的作用:拥塞的判断:重传定时器超时,收到三个相同(重复)的ACK.强烈推荐阅读:TCP那些事(上):https://coolshell.cn/articles/11564.htmlTCP那些事(下):https://coolshell.cn/articles/11609.html参考资料:TCP连续ARQ协议和滑动窗口协议:https://www.cnblogs.com/blythe/articles/7348812.html传输层TCP/IP(十一)TCP滑动窗口和拥塞控制:https://blog.csdn。net/endlu/article/details/51140213TCP-IP详解:滑动窗口(SlidingWindow):https://blog.csdn.net/wdscq1234/article/details/52444277TCP拥塞控制-慢启动,拥塞避免,快速重传,快速启动:https://blog.csdn.net/jtracydy/article/details/52366461TCP协议的滑动窗口是具体如何控制流量?https://www.zhihu.com/question/32255109三、操作系统3.1什么是僵尸进程和孤儿进程?没有调用wait或waitId获取子进程的信息(状态),子进程的描述符还在系统中。孤儿进程:父进程退出,子进程仍在运行。这些子进程称为孤儿进程。孤儿进程会被init进程收养(进程号为1),init进程会为他们收集工作状态。僵尸进程的危害:系统进程表是一种有限的资源,如果系统进程表被僵尸进程耗尽,系统可能无法创建新进程。一个父进程创建了很多子进程,但不回收,会造成内存资源的浪费。解决僵尸进程的手段:杀死父进程,剩下的僵尸进程就会变成孤儿进程。最后,当init进程管理的子进程退出时,向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait两次处理僵尸进程fork:原理是让子进程成为孤儿进程,使其父进程成为init进程,通过init进程处理僵尸进程参考资料:僵尸进程和僵尸进程有什么区别?https://www.zhihu.com/question/26432067/answer/70643183孤儿进程和僵尸进程【总结】:http://www.cnblogs.com/Anker/p/3271773.html3.2操作系统有哪些进程间通信的方法?首先要知道进程和线程的侧重点不同:进程之间的资源是独立的,侧重的是通信问题。线程之间共享资源,关注的是安全问题。操作系统中进程间通信的方式有哪些?管道(pipe):管道是一种半双工的通信方式,数据只能在一个方向上流动,并且只能在具有亲缘关系的进程之间使用。进程亲和性通常是指父子进程关系。命名管道(namedpipe):命名管道也是一种半双工的通信方式,但它允许不相关的进程之间进行通信。消息队列(messagequeue):消息队列是消息的链表,存储在内核中,由消息队列指示符标记。消息队列克服了信号传输信息少,管道只能承载无格式字节流,缓冲区大小有限等缺点。共享内存(sharedmemory):共享内存就是映射一段内存,供其他进程访问。共享内存由一个进程创建,但多个进程可以访问它。共享内存是最快的IPC,它是专门针对其他进程通信方式低效而设计的。它倾向于与其他通信机制交互。比如信号量,一起使用来实现进程间的同步和通信。套接字(socket):套接字也是进程间的一种通信机制。与其他通信机制不同,它可以用于不同机器之间的进程通信。Signal(信号):信号是一种比较复杂的通信方式,用于通知接收进程某个时间已经发生。信号量:信号量是一个计数器,可用于控制多个进程对共享资源的访问。它经常被用作一种锁机制,以防止其他进程在一个进程正在访问共享资源时访问共享资源。因此,它主要用作不同进程之间或同一进程中不同线程之间的同步手段。3.3操作系统线程之间的通信方式有哪些?操作系统线程之间的通信方式有哪些?(可以直接理解为:线程间同步的方法有哪些)锁机制:包括互斥锁、条件变量、读写锁信号量机制(Semaphore):包括未命名线程信号量和命名线程信号量信号量机制(Signal):与进程间信号处理类似,线程间通信的目的主要是为了线程同步。参考资料:线程通信和进程通信的区别:https://www.cnblogs.com/xh0102/p/5710074.html操作系统-进程、线程、锁:https://www.cnblogs.com/biterror/p/6909653.html操作系统进程与线程:http://www.cnblogs.com/wxquare/p/5168745.html五种进程间通信方式介绍:https://blog.csdn.net/wh_sjc/article/details/70283843扩展阅读:五种进程间通信方式介绍(详解):https://blog.csdn.net/wh_sjc/article/details/70283843Linux内核调度分析(进程调度):https://cloud.tencent.com/developer/article/10274483.4操作系统进程调度算法有哪些?操作系统进程调度算法有哪些?First-come-first-servealgorithm(FCFS)谁先来就执行shortprocess/jobpriorityalgorithm(SJF)谁花的时间少就先执行highestresponseratiopriorityalgorithm(HRN)针对FCFS和SJF方法的综合平衡最高优先级算法系统将处理器分配给就绪队列中优先级最高的进程基于时间片的循环调度算法每个进程享有的CPU处理时间是一致的最短剩余时间优先级算法最短作业优先级升级版该算法,但它是一种抢占式多级反馈排队算法。设置多个就绪队列,并赋予它们不同的优先级。比如优先级逐级降低,则队列1的优先级最高。ProcessorScheduling】4.延伸阅读这部分是看别人的博文写的不错,分享给大家~4.1ConcurrentHashMap中的扩容是否需要锁全表?ConcurrentHashMap的扩容是否需要锁住整张表?总结(节选)要点:通过为每个线程分配bucket间隔(默认一个线程分配16个bucket),避免了线程之间的争用。通过对每个bucket节点进行加锁,避免了putVal方法导致的数据不一致。同时,在扩容的时候,链表也会被拆分成两部分,类似于HashMap的resize方法。参考资料:并发编程-逐行分析ConcurrentHashMap扩展https://www.jianshu.com/p/2829fe36a8dd《Java源码分析》:ConcurrentHashMapJDK1.8:https://blog.csdn.net/u010412719/article/details/521451454.2什么是一致性Hash算法(原理)?什么是一致性Hash算法(原理)?总结(摘录)要点:一致性Hash算法将整个哈希值空间组织成一个虚拟的环,优点是提高了容错性和可扩展性。对于节点的增加或减少,只需要对环空间中的一小部分数据进行迁移。参考资料:一致性哈希算法解析:https://crossoverjie.top/2018/01/08/Consistent-Hash/面试必备:什么是一致性哈希算法?https://zhuanlan.zhihu.com/p/349850264.3MySQLdate,datetime,timestamp类型的区别MySQLdate,datetime,timestamp类型的区别总结(节选)重点:date精确到日,datetime和timestamp精确到秒datetime和timestamp的区别:timestamp会随着设置的时区而变化,而datetime保存的是绝对值,不会变化。时间戳存储占用4个字节,日期时间存储占用8个字节。可以表示的时间范围不同,只能到timestamp表示到2038年,datetime最大可以到9999参考资料:MySQLdate、datetime、timestamp类型的区别:https://zhuanlan.zhihu.com/p/236637414.4Judgeingifalinkedlisthasaring/intersection判断一个链表是否有环(其实就是看有没有重复的节点遍历)。解决方案(3种):对于两次遍历,使用hashSet作为缓存,使用两个指针记录遍历过的节点,一个接一个遍历,总会出现前指针==后指针的情况。参考资料:漫画算法:如何判断链表有环?http://blog.jobbole.com/106227/判断两个非循环链表是否相交,解决方法(2种):将第一个链表尾部的next指针指向第二个链表,两个链表形成一个链表。判断这个链表是否有环,有环则相交,无环则不相交直接判断两个链表的尾节点是否相等,如果相等,它们会相交,否则它们不会相交。链表有环,一个链表无环时,两个链表一定不能相交:找到第一个链表的环点,然后破环(当然不要't忘记保存它的下一个节点),然后遍历第二个链表,如果发现第二个链表从环变成了无环,那么它们相交,否则它们不相交。参考资料:判断两个链表是否相交,找出交点:https://blog.csdn.net/jiary5201314/article/details/50990349判断单个链表是否有环,判断两个链表是否有环列表相交:http://www.cppblog.com/humanchao/archive/2008/04/17/47357.html4.5keepAlive含义HTTP协议的KeepAlive是为了连接复用,串行传输请求-响应数据在相同的连接。TCP的KeepAlive机制的目的是保持存活、心跳和检测连接错误。也欢迎大家在评论区留言,让大家互相学习~~~想阅读更多原创技术文章,欢迎关注我的微信公众号:Java3y。Java技术群讨论:742919422。公众号还有海量视频资源,关注即可免费获取。可能感兴趣的链接:文章目录导航(微信公众号):https://zhongfucheng.bitcron.com/post/shou-ji/wen-zhang-dao-hang文章目录导航(PC端):http海量精美思维导图:http://www.zhongfucheng.bitcron.com/post/shou-ji/pcduan-wen-zhang-dao-hang:http://www.zhongfucheng.bitcron.com/post/shou-ji/脑图大全
