阅读本文大概需要 8 分钟。
每周完成一个 ARTS
Algorithm 来源 LeetCode 46. Permutations。
Review 关于 IO 多路复用之 select,poll,epoll 详解。
Tip 分享 个 zsh 的小工具。
Share 分享关于碎片化时间一些小的思考。
PS:由于公众号不支持添加外链,所以大家遇到有链接的地方滑到文章最下面点击阅读原文就可以访问了哈,如果觉得文章不错,欢迎分享给周围的朋友们哈
马上又要过完年了,抓住假期的小尾巴,下面更新 ARTS 第 十七 周的内容。
1.Algorithm
46. Permutations 难度:[Medium]
【题意】
Given a collection of distinct integers, return all possible permutations.
Example:
Input: [1,2,3]Output:[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
【思路】
这道题是求全排列问题:
给的输入数组没有重复项,还是用递归来求解。这里我们需要用到一个 visited 数组来标记某个数字是否访问过以及不能重复使用的数字,然后在递归函数的时候从的循环应从头开始,其中 cur是记录当前已经拼出的个数,一旦其达到了 nums 数组的长度,说明此时已经是一个全排列了,退出,因为再加数字的话,就会超出。
第二种方法用到了 STL 的 next_permutation,算是一种投机取巧的方法了。
【参考代码】点击原文链接查看,这里就不贴出了。
2.Review
IO 多路复用之 select,poll,epoll 详解
本次 Review 阅读了 一篇关于Linux IO 模式及 select、poll、epoll 的知识。结合 《UNPVTN》学到了很多。
继续分享 IO 多路复用之 select,poll,epoll 详解。
Select poll epoll 都是多路复用的机制。IO多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或写就绪)能够通知应用程序进行相应的读写操作,但select,poll,epoll本质上都是同步IO,因为它们需要在读写事件就绪后自己负责进行读写,也就是说这个读写操作是阻塞的,而异步IO则无需自己负责进行读写。
Select 函数
该函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经历一段时间后唤醒它。
举个栗子,用户进程调用 select,告知内核仅在下列情况下发生时才返回:
集合{1,4,5}中任何一个描述符准备好读;
集合{2,7}中的任何描述符准备好些;
集合{1,4}中任何描述符有异常条件待处理;
已经经历了10秒。
代码:
#include <sys/select.h>
#include <sys/time.h>
int select (int n, fd_set *readfds, fd_set writefds, fd_set exceptfds, struct timeval *timeout);
返回:若有就绪描述符则为数目,若超时则为0,若出错则为-1
Select 函数监视的文件描述符分 3 类,分别是 writefds、readfds和 exceptfds。调用后 select 函数会阻塞,直到有描述副就绪(有数据可读、可写、或者有 except),或者超时(timeout 指定等待时间,如果立即返回设为 null 即可),函数返回。当 select 函数返回后,可以通过遍历 fdset,来找到就绪的描述符。
select 目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点。select 的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在 Linux 上一般为 1024,可以通过修改宏定义甚至重新编译内核的方式提升这一限制,但 是这样也会造成效率的降低。
poll 函数
Poll 函数提供的功能与 select 类似,不过在处理流设备时,它能够提供额外的信息
代码:
#include <poll.h>
int poll (struct pollfd *fds, unsigned int nfds, int timeout);
第一个参数是指向一个结构数组第一个元素的指针。
每个数组元素都是一个pollfd 结构,用于指定测试某个给定描述符 fd 的条件,不同于 select 使用三个位图来表示 fdset 的方式,poll 使用一个 folld 的指针实现。
struct pollfd {int fd; /* file descriptor */short events; /* requested events to watch */short revents; /* returned events witnessed */**};
pollfd 结构包含了要监视的 event 和发生的 event,不再使用 select “参数-值”传递的方式。同时,pollfd 并没有最大数量限制(但是数量过大后性能也是会下降)。 和 select 函数一样,poll返回后,需要轮询 pollfd 来获取就绪的描述符。
从上面看,select 和 poll 都需要在返回后,通过遍历文件描述符来获取已经就绪的 socket。事实上,同时连接的大量客户端在一时刻可能只有很少的处于就绪状态,因此随着监视的描述符数量的增长,其效率也会线性下降。
由于太长的篇幅会影响一定的学习效率,epoll 函数部分留到下次分享。
3 Tip
继续本周的分享个 zsh 的小工具,zsh-autosuggestions。类似于 sl 跑火车命令,安装后,在命令行输入命令式,可以自动提示历史命令并补全后面的命令,就像 IDE 代码提示一样,非常方便。
下面是 MacOS 的安装
【1】brew 安装
brew install zsh-autosuggestions
【2】启用工具
source/usr/local/share/zsh-autosuggestions/zsh-autosuggestions.zsh
CentOS 安装:sudo yum install -y zsh
Ubuntu 安装:sudo apt-get install -y zsh
在检查下系统的 shell:cat /etc/shells,你会发现多了一个:/bin/zsh
4 Share
过年在家,一些小的思考分享一下
在家为什么不能专注的学习?
因为你的大量时间都被碎片化了,一会妈妈喊你吃饭了,一会爸爸喊你去吃烧烤了,一会妹妹喊你去拍抖音了,一会奶奶喊你去喝鸡汤了,一会爷爷喊你去买蜡烛了。。。
我们常说,这是个碎片化的时代,其实不是这个时代碎片化了,而是出现了很多让时间碎片化的东西,然后人们沉溺于这些东西导致自己的时间碎片化了。
有没有发现,现代人对手机的依赖程度越来越严重了,一上午的时间,你拿起手机,刷两次朋友圈可能就是分钟级的中断,发现没什么更新的内容,然后你接着刷会微博或者看个抖音、其他的视频,这样可能就是十分钟级别的中断。
手机上如果下载了知识付费类的 APP ,比如哪怕是看个知识星球甚至是极客时间的新回答和新推送,都可能是十分钟级别的中断,在加上被动的打扰和必要的去洗手间、喝水,应付等活动,被打断的次数必然会超过自己可控的数量。
这些叠加起来的时间可能就是小时级别的,更严重的是导致长时间专注的工作时间极少有能达到 1 小时的,一天 24 小时,连 1 小时的专注时间我们都把握不住,想一想。对于编程、设计,写作等其他严肃性的需要长时间的专注与投入的工作,对效率的影响简直就是灾难。
碎片化是可以拿来学习的,但我们应该把握自己的时间,切断不必要的干扰,不要为了碎片化时间的学习而将自己的时间碎片化。