传统的I/O模型是一种1对1的模型,即单个进程只在单个文件描述符上进行I/O操作,如果读缓冲区为空或者写缓冲区满,那么调用read()
或者write()
时就会阻塞直到有数据可读或者有空间可写。如果一个服务端连接了多个客户端,某个客户端在进行I/O时发生了阻塞,那么别的客户端就也需要等待,这样就造成了很大的影响,所以就希望能以非阻塞的方式进行I/O,即如果我们的I/O调用不能立刻完成的话,就返回错误而不是阻塞进程去等待。很容易地就想到采用多进程的方式,但是为父进程为每个文件描述符或者每个客户端fork一个子进程的话,又需要花费很多的资源,而且进程上下文的切换涉及到用户空间的和内核空间资源的切换,维护的代价也很大。
-
浅记I/O多路复用
-
Spring--Bean的生命周期
Spring对于Java开发者来说应该是再熟悉不过的一样东西了,这两天我把Spring的源码从官网下载下来并且进行编译,方便后面自己写一些测试用例(尽管被网速gank了很久),并且结合了网上的一些文章去理解Spring IOC方面的知识和运作过程,我也跟着一些文章敲了测试用例,通过控制台的输出去记忆bean的生命周期过程,毕竟之前一直靠背去记忆实在是太容易忘记了。当然这篇文章也不会讲的很详细,这篇文章是在我看了一天的文章和敲完用例趁着记忆还深刻来通过记录博客来加深记忆的,下面就开始吧。
-
买卖股票问题
今天重新写了些动态规划和贪心的题目,买卖股票的问题在这两个方面还是挺经典的。买卖股票在力扣上有四种题目,难度也是有涉及到简单、中等和困难。既然写了那么多次这几道题目,索性就水一篇文章来总结下买卖股票题的做法吧
-
JVM垃圾回收
对于Java,大部分的对象都是分配在堆内存中,但是内存是有限的,不可能无限地去申请内存分配给对象,所以就需要有垃圾回收,来将一些没有被引用,已经不需要的东西释放掉来省出空间来。本文主要大概地总结下Java如何判断一个对象的存活、Java的垃圾收集算法、Java的经典垃圾收集器和一些内存分配策略。
-
浅谈虚拟内存
关于虚拟内存,本人虽然在上学校的操作系统课的时候有学到过,但说来惭愧,我对这一块的知识也是没有完全的掌握,还感觉到有点抽象。所以最近两天阅读了下CSAPP的虚拟内存这一章和参考了小林coding有关内存管理的笔记,终于是对虚拟内存这一块有了个大致的理解。
-
Mysql慢查询——查询优化
在一些公司的面试题中,可以经常看到有这么一道MySQL的面试题:
对于SQL查询慢的问题你要怎么去发现和解决
。最初我也大概只能回答个索引相关的,比如"通过EXPLAIN查看查询的访问类型和一些查询情况", "查看是否可以在某些表的字段增加索引然后改写查询语句"等,网上的八股也很少提及这个问题,所以我还是去阅读了一下《高性能MySQL》,通过阅读后,我也大致地了解了查询的一些问题所在以及优化的方法,这篇文章便是我针对这本书第六章内容的一些整理总结(其实就是相当于摘抄吧 😤 )。方便自己记忆的同时也放到博客上来给博客更新一下(其实是都放到本地没怎么上传到博客,属于是懒🐶了) -
JAVA均匀生成随机数
公式推导
假如有一个函数rand2()会均匀生成[1,2]的随机数,现在想要实现一个rand4()的函数,第一次接触该类问题时,第一反应是如下所示:
1
2
3
4
5
6
7
8
9
10
11
12rand2() + rand2() = ? ==> [2,4]
1 + 1 = 2
1 + 2 = 3
2 + 1 = 3
2 + 2 = 4
// 为了把生成随机数的范围规约成[1,n],于是在上一步的结果后减1
(rand2()-1) + rand2() = ? ==> [1,3]
0 + 1 = 1
0 + 2 = 2
1 + 1 = 2
1 + 2 = 3 -
代码块Mac风格
看到网上别人博客的代码块都是Mac风格+黑底,于是乎我也整一波,但是发现按照网上的来修改highlight_theme还是不得行,主要是网上的大部分是旧版的,跟现版本的配置文件有点出入,于是在看了一堆博客和分析报错原因后,我找到了实现的办法。
-
创建分支存储源文件
为了防止日后出现换电脑的情况而导致自己的配置文件和一些文档消失,所以创建一个分支存放源文件是有必要的,当然你也可以选择存放到云盘,只要你记得更新就是了。创建分支存放的方法其实也不是很复杂。
-
在文章中添加更新时间
鉴于网上的文章许多都是通过修改
/themes/next/layout/_macro/post.swig
,并在<span class="post-time">...</span>
标签后添加一段代码,但是现在的版本找不到swig文件。所以写下这篇文章记录下该方法。