动态规划
高效的动态规划算法
作者:Meet Zaveri
动态规划主要用于解决寻找最优解的优化问题。当问题反复出现,并且可以被分解为更小的子问题时,可以从解决更小的子问题出发,记录结果,将结果作为更大问题的原始解。
动态规划经常需要找到状态方程,例如斐波拉契数列。动态规划主要包括两种问题:优化问题和组合问题。
动态规划的解决方法分为两种:
- 自上而下(记忆存储Memoization)
从最顶端开始分解问题,分解到最小并且问题已经解决,此时返回保存的结果。采用递归的思路。 - 自下而上(表格填充Tabulation)
从解决子问题出发,获得一个比较好的解决方案。采用迭代的思路。
并发
高并发是什么
作者:hncg
并发指的是两个事件在同一时间段交替触发,在宏观上看,是同时完成的。
C/S的http请求流程:
网络编程流程演化史:
上下文:
- CPU上下文
任务从哪里加载,从哪里运行。这些信息保存在CPU寄存器和操作系统的程序计数器中。 - 进程上下文
虚拟内存、栈、全局变量等用户空间的资源以及内核堆栈、寄存器等内核空间的状态。 - 线程上下文
父进程的资源加上线程自己的私有数据。
同一进程的线程的切换由于资源共享,切换消耗的资源更少。
操作系统
Java与操作系统交互细节
作者:董鹏dp
代码执行需要有可执行的上下文环境(指令寄存器、数据寄存器、栈空间等内存资源),这行代码还必须作为一个执行流能够被操作系统的任务调度器识别,并分配CPU资源。java代码需要被编译器转化成java字节码。
解释执行:jvm通过类加载器加载class文件中的字节码,再通过解释器解释成汇编指令,最终转译成CPU可以识别的机器指令。
即时编译(JIT):JVM直接将某些热点代码一次全部编译成机器指令再执行。
进程上下文:为进程分配的内存以及CPU资源。JVM启动后也是linux上的一个普通进程。
虚拟存储:
CPU采用段基址+段内偏移的方式访问内存,段基址是绝对物理地址,在程序启动时确认。虚拟存储让每个进程以为自己独占整个内存空间。
内存映射:将磁盘文件直接映射到用户的虚拟存储空间中。
MappedByteBuffer:
java中实现内存映射的方式。访问数据页的时候,先查页表,发现还没加载就发起缺页异常。然后从磁盘中将数据加载进内存。
synchronized:
声明了synchronized的代码块编译而成的字节码包含一个monitorenter和多个monitorexit。当执行monitorenter时检查目标锁对象的计数器是否为0,如果为0将锁对象的持有线程设置为自己,然后计数器加1,获取到锁。如果不为0,则检查锁对象的持有线程是不是自己,如果是自己就将计数器加1获取锁,如果不是则阻塞等待。退出的时候计数器减1,当减为0的时候清除锁对象的持有线程标记。
happen-before:
描述两个操作的内存可见性。针对volatile和锁的实现就有该规则。