写点什么

ARTS 打卡 第 28 周

用户头像
引花眠
关注
发布于: 2020 年 12 月 28 日

ARTS 简介

Algorithm 是一道算法题,Review 是读一篇英文文章,Technique/Tips 是分享一个小技术,Share 是分享一个观点。


Algorithm

力扣(LeetCode)71. 简化路径


以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。 在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径 请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。


示例 1:
输入:"/home/"输出:"/home"解释:注意,最后一个目录名后面没有斜杠。示例 2:
输入:"/../"输出:"/"解释:从根目录向上一级是不可行的,因为根是你可以到达的最高级。示例 3:
输入:"/home//foo/"输出:"/home/foo"解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。示例 4:
输入:"/a/./b/../../c/"输出:"/c"示例 5:
输入:"/a/../../b/../c//.//"输出:"/c"示例 6:
输入:"/a//b////c/d//././/.."输出:"/a/b/c"
复制代码


解题思路:


  1. 首先将路径按照’/'分解

  2. 将分解后的目录径放入双端队列中,如果遇到"“或”."不用处理如果遇到"…",则表示进入上一级目录,则将上一个压入的目录从队列末尾删除其余目录依次放入队列

  3. 通过队列构建路径如果最终队列中没有目录,则表示已经到了根目录否则将目录拼接返回


class Solution {    public String simplifyPath(String path) {        if (path == null || path.length() == 0) {            return "";        }        String[] paths = path.split("/");        //System.out.println(Arrays.toString(paths));        Deque<String> queue = new LinkedList<>();//双段        for (String s : paths) {            if ("..".equals(s)) {                if (!queue.isEmpty()) {                    queue.pollLast();                }            } else if (!("".equals(s) || ".".equals(s))) {                queue.offerLast(s);            }        }        //System.out.println(queue.toString());        StringBuilder ans = new StringBuilder();        if (queue.isEmpty()) {            ans.append('/');            return ans.toString();        }        while (!queue.isEmpty()) {            ans.append('/').append(queue.pollFirst());        }        return ans.toString();    }}
复制代码


ps:参考资料


  1. 《剑指Offer:名企面试官精讲典型编程题(第2版)》

  2. labuladong 的算法小抄


Review

学习-微服务架构模式系列,网站地址是:https://microservices.io 微服务架构-Pattern: Messaging 这篇文章的主要介绍了微服务架构下的通信模式:消息模式 背景:使用微服务架构,服务需要处理客户端的请求,可能需要多个客户端协作才能处理。所以需要跨服务通信。 问题:微服务架构中服务如何通信


强制条件


  1. 服务之间需要协作

  2. 同步通信会使客户端与服务端严重耦合,因为必须保证双方都可用


解决方法,使用异步消息进行通信:


  1. Apache Kafka

  2. RabbitMQ


好处


  1. 解耦服务端与客户端

  2. 提升可用性 在方便的时候处理

  3. 支持多种模式请求/应答模式通知请求/异步响应发布/订阅模式发布/异步响应模式


不足


  1. 消息代理可能很复杂


需要解决的问题


  1. 请求/应答模式 在此种情形下可能很复杂

  2. 客户端如何发现消息代理


ps:《微服务架构设计模式》


Tips

记录我对于 Linux 的学习,网络管理的命令:


ps:“~” 表示为 home 目录,“.” 则是表示目前所在的目录,“…” 则表示当前目录的上一层目录 -h 用人类可读的格式展示(G(千兆字节),M(兆字节),K(千字节)),大部分命令有这个参数


pidstat

pidstat 是一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标,还可以看线程的信息。 用法: pidstat [选项] 常用选项:


  1. -d 展示磁盘 I/O 统计数据

  2. -R 报告实时优先级和调度策略信息

  3. -r 显示内存使用情况

  4. -s 显示栈相关信息

  5. -t 查看线程相关的信息,默认是进程的;与其他命令结合可以查看线程相关的信息

  6. -u 各个进程的 cpu 使用统计 默认参数

  7. -w 表示查看上下文切换情况

  8. -p 指定进程 id


cpu 统计信息

pidstat -p 1 #显示进程1的 cpu 统计信息22:55:16   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command22:55:16     0         1    0.00    0.00    0.00    0.00    0.00     0  systemd
复制代码


  1. %usr 用户空间的 cpu 使用率

  2. system 内核空间的 cpu 使用率

  3. %guest 进程在虚拟机占用 cpu 的百分比

  4. %wait 等待上下文切换的 cpu 使用率

  5. %CPU 总的 cpu 使用率

  6. CPU 处理进程的 cpu 编号

  7. Command 当前进程对应的命令


磁盘 I/O 统计数据

pidstat -d -p 122:56:16   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command22:56:16     0         1     -1.00     -1.00     -1.00    1307  systemd
复制代码


  1. kB_rd/s 每秒从磁盘读取的 KB

  2. kB_wr/s 每秒写入磁盘 KB

  3. kB_ccwr/s 任务取消的写入磁盘的 KB。当任务截断脏的 pagecache 的时候会发生

  4. iodelay 表示 I/O 的延迟(单位是时钟周期)

  5. Command 当前进程对应的命令


cpu 上下文切换

vmstat 只能查看总的 cpu 上下文切换,pidstat 可以查看每个进程的上下文切换


pidstat -w -p 122:06:16   UID       PID   cswch/s nvcswch/s  Command22:06:16     0         1      0.29      0.00  systemd
复制代码


  1. cswch/s 每秒自愿上下文切换(voluntary context switches)的次数

  2. nvcswch/s 每秒非自愿上下文切换(non voluntary context switches)的次数


ps:


  1. 自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换

  2. 非自愿上下文切换,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换


内存信息

pidstat -r -p 1
22:16:16 UID PID minflt/s majflt/s VSZ RSS %MEM Command22:16:16 0 1 0.06 0.00 176644 8540 0.02 systemd
复制代码


  1. minflt/s 任务每秒发生的次要错误,不需要从磁盘中加载页

  2. majflt/s 务每秒发生的主要错误,需要从磁盘中加载页

  3. VSZ 虚拟地址大小,虚拟内存的使用 KB

  4. RSS 常驻集合大小,非交换区五里内存使用 KB

  5. %MEM 使用的物理内存占比


查看线程相关信息

以查看 cpu 上下文切换为例,查看线程相关信息


pidstat -wt -p 541859
22:20:16 UID TGID TID cswch/s nvcswch/s Command22:20:16 1000 541859 - 0.09 0.01 kate22:20:16 1000 - 541859 0.09 0.01 |__kate22:20:16 1000 - 541861 0.09 0.00 |__QXcbEventQueue22:20:16 1000 - 541862 0.00 0.00 |__gmain22:20:16 1000 - 541863 0.00 0.00 |__dconf worker22:20:16 1000 - 541864 0.00 0.00 |__gdbus22:20:16 1000 - 541865 0.00 0.00 |__QDBusConnection
复制代码


  1. TGID 线程组 ID,也就是线程组 leader 的进程 ID,等于 pid

  2. TID 线程 ID


ps: pidstat 只能看到进程(也就是主线程)的信息,如果要仔细分析,还需要查看线程的相关信息。


Share

分享最近对的学习,这次分享的是SpringBoot 系列(7)- 自动化配置,可能会有不足之处,之后会根据理解继续修改。


发布于: 2020 年 12 月 28 日阅读数: 15
用户头像

引花眠

关注

还未添加个人签名 2018.06.11 加入

还未添加个人简介

评论

发布
暂无评论
ARTS打卡 第28周