架构第八周 - 学习总结

用户头像
Jeff.Spring
关注
发布于: 2020 年 07 月 26 日
架构第八周 - 学习总结

本周学习内容为数据结构与算法、网络与DB架构。

数据结构与算法

对于数据结构与算法,之前因为刷了将近2遍极客时间算法专栏,对于这部分也有一些印象,但是这部分其实不太想说太多,算法这个东东,不需要强调,都知道对计算机编程乃至架构设计的重要性,有人说:

其实可以这么理解,所以老师也提到现在很多大厂都只面算法,反而不是很在意求职者的实际经验。

如果是想用算法面试作为筛选面试者的办法,倒也可以。结果就是现在很多培训教育机构大搞算法培训,求职者也在这方面大搞军备竞赛。实际情况呢?一旦进入公司实际工作可能压根就用不到。而这些进入的候选人呢由于确认实际项目经验,反而做不好企业内部的工作。

我的想法是算法这东西,需要多学习,可以提升思维,可以储备知识,可以在做架构设计或者编程时以一种更加节省时间和空间的方式做成事情。但98%的实际工作中用不到算法。所以,平时学习投入多少精力,需要自己去权衡。而且除了一些个别大厂,很少有企业面试会大谈算法。

至于算法的掌握程度,在广度上,基础的数据结构与算法一定是必须掌握的,比如数组、链表、栈、队列、二叉树、二叉排序树、B+Tree,算法比如排序类的插入排序、冒泡排序、归并排序、快速排序、桶排序,查找类的二分查找、Hash表查找、跳表查找等。还有些算法思想递归、DP动态规划,包括一些图相关的等要掌握。但是并不是所有都要掌握,比如红黑树,它的定义很容易理解,但是实现起来非常复杂,研究这个其实没有太大意义,我也没听过哪些个大佬说去搞这个的。

除了算法部分,这周还讲了网络和DB架构相关的东西。

比如网络IO中的阻塞IO、非阻塞IO、select、poll、epoll。这里简单归纳一下。

NIO与BIO



  • NIO是面向buffer编程,当Channel读事件就绪,channel将数据读取到buffer中,当Channel写事件就绪,从buffer读取 数据写入Channel中。这个过程不涉及线程的阻塞,但是在多路复用器进行selector.select()方法执行时是阻塞的,因为这一步需要去轮训Channel列表是否就绪。所以并不是每次都能得到就绪的列表,进而做相应事件处理。每个Channel就是一个socket。

selector多路复用器的select()重载:

  • int select() 阻塞到至少有一个通道在你注册的事件上就绪了。

  • int select(long timeout) 和select()一样,除了最长会阻塞timeout毫秒(参数)。

  • int selectNow() 不会阻塞,不管什么通道就绪都立刻返回



代码示例:

Selector selector = Selector.open();
channel.configureBlocking(false);
SelectionKey key = channel.register(selector, SelectionKey.OP_READ);
while(true) {
int readyChannels = selector.select();
if(readyChannels == 0) continue;
Set selectedKeys = selector.selectedKeys();
Iterator keyIterator = selectedKeys.iterator();
while(keyIterator.hasNext()) {
SelectionKey key = keyIterator.next();
if(key.isAcceptable()) {
// a connection was accepted by a ServerSocketChannel.
} else if (key.isConnectable()) {
// a connection was established with a remote server.
} else if (key.isReadable()) {
// a channel is ready for reading
} else if (key.isWritable()) {
// a channel is ready for writing
}
keyIterator.remove();
}
}



  • BIO是面向内核编程,socket.read()/scoket.write()方法都会被内核缓冲区所阻塞。



select(poll)与epoll

  • select(poll)管理操作系统所有的socket,当某个socket的读写事件触发时,内核唤醒用户线程,用户线程会遍历所有的socket(其中只有个别是读写事件就绪的)找到事件发生的socket进行后续数据读写。效率看起来是比较低下的。

  • epoll管理所有socket,但是它维护了一个eventpoll来讲每个读写事件就绪的socket放入进去,用户线程只对eventpoll中的就绪socket进行读写事件处理。效率很高。但是用户线程需要定期轮训eventpoll这一步是阻塞的。



智慧语录

当然这些并不是老师原话,结合了自己的理解和整理。

  • 官方文档中许多关键点并未写出,而网络博客也是五花八门的,在实际工作学习中可能并无资料可用,此时可以自己先梳理猜想建立思路,然后进行验证,这样会更加高效。

  • 架构设计中许多的思路和想法都是想通的,要做到触类旁通。



发布于: 2020 年 07 月 26 日 阅读数: 35
用户头像

Jeff.Spring

关注

努力支撑经历,经历支撑能力! 2018.12.03 加入

追不上BAT的人... 分享,聚焦

评论

发布
暂无评论
架构第八周 - 学习总结