├── .DS_Store ├── README.md ├── image.png ├── package.json └── src ├── .DS_Store ├── 227404817-999e456a-c3f7-4522-b205-278d5ebab55c.png ├── AdvancedStream.md ├── alg.md ├── basic-of-computer ├── algorithms │ ├── assets │ │ ├── image-1.png │ │ ├── image-2.png │ │ ├── image-3.png │ │ ├── image-4.png │ │ ├── image-5.png │ │ ├── image-6.png │ │ ├── image-7.png │ │ └── image.png │ ├── assets2 │ │ ├── image-1.png │ │ ├── image-10.png │ │ ├── image-11.png │ │ ├── image-12.png │ │ ├── image-13.png │ │ ├── image-14.png │ │ ├── image-15.png │ │ ├── image-16.png │ │ ├── image-17.png │ │ ├── image-18.png │ │ ├── image-2.png │ │ ├── image-3.png │ │ ├── image-4.png │ │ ├── image-5.png │ │ ├── image-6.png │ │ ├── image-7.png │ │ ├── image-8.png │ │ ├── image-9.png │ │ └── image.png │ ├── leetcode-simple-44-1.md │ └── leetcode-simple-44-2.md ├── computer-network │ ├── assets │ │ ├── image-1.png │ │ ├── image-10.png │ │ ├── image-11.png │ │ ├── image-12.png │ │ ├── image-13.png │ │ ├── image-14.png │ │ ├── image-15.png │ │ ├── image-16.png │ │ ├── image-17.png │ │ ├── image-18.png │ │ ├── image-19.png │ │ ├── image-2.png │ │ ├── image-20.png │ │ ├── image-21.png │ │ ├── image-22.png │ │ ├── image-23.png │ │ ├── image-24.png │ │ ├── image-25.png │ │ ├── image-26.png │ │ ├── image-27.png │ │ ├── image-28.png │ │ ├── image-29.png │ │ ├── image-3.png │ │ ├── image-30.png │ │ ├── image-31.png │ │ ├── image-32.png │ │ ├── image-33.png │ │ ├── image-34.png │ │ ├── image-35.png │ │ ├── image-36.png │ │ ├── image-37.png │ │ ├── image-38.png │ │ ├── image-39.png │ │ ├── image-4.png │ │ ├── image-40.png │ │ ├── image-41.png │ │ ├── image-42.png │ │ ├── image-43.png │ │ ├── image-44.png │ │ ├── image-45.png │ │ ├── image-46.png │ │ ├── image-47.png │ │ ├── image-5.png │ │ ├── image-6.png │ │ ├── image-7.png │ │ ├── image-8.png │ │ ├── image-9.png │ │ └── image.png │ ├── assets2 │ │ ├── image-1.png │ │ ├── image-10.png │ │ ├── image-11.png │ │ ├── image-12.png │ │ ├── image-13.png │ │ ├── image-14.png │ │ ├── image-15.png │ │ ├── image-16.png │ │ ├── image-17.png │ │ ├── image-18.png │ │ ├── image-19.png │ │ ├── image-2.png │ │ ├── image-20.png │ │ ├── image-21.png │ │ ├── image-22.png │ │ ├── image-23.png │ │ ├── image-24.png │ │ ├── image-25.png │ │ ├── image-26.png │ │ ├── image-27.png │ │ ├── image-28.png │ │ ├── image-29.png │ │ ├── image-3.png │ │ ├── image-30.png │ │ ├── image-31.png │ │ ├── image-32.png │ │ ├── image-33.png │ │ ├── image-34.png │ │ ├── image-35.png │ │ ├── image-36.png │ │ ├── image-37.png │ │ ├── image-38.png │ │ ├── image-39.png │ │ ├── image-4.png │ │ ├── image-40.png │ │ ├── image-41.png │ │ ├── image-42.png │ │ ├── image-43.png │ │ ├── image-44.png │ │ ├── image-45.png │ │ ├── image-46.png │ │ ├── image-47.png │ │ ├── image-48.png │ │ ├── image-49.png │ │ ├── image-5.png │ │ ├── image-6.png │ │ ├── image-7.png │ │ ├── image-8.png │ │ ├── image-9.png │ │ └── image.png │ ├── computer-network.interview.zh.md │ └── computer-network.zh.md ├── index.zh.md ├── principles-of-computer-composition │ ├── assets │ │ ├── image-1.png │ │ ├── image-10.png │ │ ├── image-11.png │ │ ├── image-12.png │ │ ├── image-13.png │ │ ├── image-14.png │ │ ├── image-15.png │ │ ├── image-16.png │ │ ├── image-17.png │ │ ├── image-18.png │ │ ├── image-19.png │ │ ├── image-2.png │ │ ├── image-20.png │ │ ├── image-21.png │ │ ├── image-22.png │ │ ├── image-23.png │ │ ├── image-24.png │ │ ├── image-25.png │ │ ├── image-26.png │ │ ├── image-27.png │ │ ├── image-28.png │ │ ├── image-29.png │ │ ├── image-3.png │ │ ├── image-30.png │ │ ├── image-31.png │ │ ├── image-32.png │ │ ├── image-33.png │ │ ├── image-34.png │ │ ├── image-35.png │ │ ├── image-36.png │ │ ├── image-37.png │ │ ├── image-38.png │ │ ├── image-39.png │ │ ├── image-4.png │ │ ├── image-40.png │ │ ├── image-41.png │ │ ├── image-42.png │ │ ├── image-5.png │ │ ├── image-6.png │ │ ├── image-7.png │ │ ├── image-8.png │ │ ├── image-9.png │ │ └── image.png │ ├── principles-of-computer-composition-interview.zh.md │ └── principles-of-computer-composition.zh.md └── system-operation │ ├── assets │ ├── image-1.png │ ├── image-10.png │ ├── image-11.png │ ├── image-12.png │ ├── image-13.png │ ├── image-14.png │ ├── image-15.png │ ├── image-16.png │ ├── image-17.png │ ├── image-18.png │ ├── image-19.png │ ├── image-2.png │ ├── image-20.png │ ├── image-21.png │ ├── image-22.png │ ├── image-23.png │ ├── image-24.png │ ├── image-25.png │ ├── image-26.png │ ├── image-27.png │ ├── image-28.png │ ├── image-29.png │ ├── image-3.png │ ├── image-30.png │ ├── image-31.png │ ├── image-32.png │ ├── image-33.png │ ├── image-4.png │ ├── image-5.png │ ├── image-6.png │ ├── image-7.png │ ├── image-8.png │ ├── image-9.png │ └── image.png │ ├── assets2 │ ├── image-1.png │ ├── image-10.png │ ├── image-11.png │ ├── image-12.png │ ├── image-13.png │ ├── image-14.png │ ├── image-15.png │ ├── image-16.png │ ├── image-17.png │ ├── image-18.png │ ├── image-19.png │ ├── image-2.png │ ├── image-20.png │ ├── image-21.png │ ├── image-22.png │ ├── image-23.png │ ├── image-24.png │ ├── image-25.png │ ├── image-26.png │ ├── image-27.png │ ├── image-28.png │ ├── image-29.png │ ├── image-3.png │ ├── image-30.png │ ├── image-31.png │ ├── image-32.png │ ├── image-33.png │ ├── image-34.png │ ├── image-35.png │ ├── image-36.png │ ├── image-37.png │ ├── image-38.png │ ├── image-39.png │ ├── image-4.png │ ├── image-40.png │ ├── image-41.png │ ├── image-42.png │ ├── image-43.png │ ├── image-44.png │ ├── image-45.png │ ├── image-46.png │ ├── image-47.png │ ├── image-48.png │ ├── image-49.png │ ├── image-5.png │ ├── image-50.png │ ├── image-51.png │ ├── image-52.png │ ├── image-53.png │ ├── image-54.png │ ├── image-55.png │ ├── image-56.png │ ├── image-57.png │ ├── image-6.png │ ├── image-7.png │ ├── image-8.png │ ├── image-9.png │ └── image.png │ ├── system-operation.interview.zh.md │ └── system-operation.zh.md ├── basic.md ├── common.md ├── error.md ├── event-async.md ├── image.wx.png ├── io.md ├── jsjzcyl.md ├── linux.md ├── linux ├── assets │ ├── image-1.png │ ├── image-10.png │ ├── image-11.png │ ├── image-12.png │ ├── image-13.png │ ├── image-14.png │ ├── image-15.png │ ├── image-16.png │ ├── image-2.png │ ├── image-3.png │ ├── image-4.png │ ├── image-5.png │ ├── image-6.png │ ├── image-7.png │ ├── image-8.png │ ├── image-9.png │ └── image.png ├── assets2 │ ├── image-1.png │ ├── image-2.png │ └── image.png ├── linux.interview.zh.md └── linux.zh.md ├── module.md ├── network.md ├── nginx.md ├── node-api ├── asyncLocalStorage.md └── process.md ├── nodeArchitecture.md ├── os.md ├── process.md ├── security.md ├── storage.md ├── storage └── mysql │ ├── image-1.png │ ├── image.png │ └── mysql.zh.md └── test.md /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/.DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 前端的后端 + 自动化运维知识体系 + 面试题 2 | 3 | 注:这是几年前我自己系统学习后端知识所总结的,过了两年了,现在看来之前的水平就是垃圾,但对于初学者来说是很友好的。所以我希望后面有时间更新这块内容,目前让真正的对比java和go开发的中级和中级偏高级的后端知识能够映射到node.js中,一起加油! 4 | 5 | 整个系列文章正在更新,每个主题参考了国内大量的付费课程总结而来。 6 | 7 | - [计算机基础面试题](#计算机基础面试题) 8 | - [计算机组成原理基础知识 + 面试真题](#计算机组成原理基础知识--面试真题) 9 | - [计算机网络基础知识 + 面试真题](#计算机网络基础知识--面试真题) 10 | - [操作系统基础知识 + 面试真题](#操作系统基础知识--面试真题) 11 | - [算法leetcode简单题88道](#算法leetcode简单题88道) 12 | - [算法leetcode中等题](#算法leetcode中等题) 13 | - [Linux相关](#linux相关) 14 | - [Linux基础知识](#linux基础知识) 15 | - [Shell脚本基础](#shell脚本基础) 16 | - [小公司业务架构](#小公司业务架构) 17 | - [Javascript相关](#javascript相关) 18 | - [Js 基础问题](#js-基础问题) 19 | - [模块](#模块) 20 | - [事件/异步](#事件异步) 21 | - [进程](#进程) 22 | - [IO](#io) 23 | - [Network](#network) 24 | - [OS](#os) 25 | - [错误处理/调试](#错误处理调试) 26 | - [测试](#测试) 27 | - [存储](#存储) 28 | - [安全](#安全) 29 | - [nginx](#nginx) 30 | - [最后](#最后) 31 | 32 | 33 | # 计算机基础面试题 34 | 35 | 简述 36 | 37 | 为什么需要了解计算机基础知识, 没有基本的计算机基础,比如基本的 node api 和一些后端常见的概念,比如进程,线程都会有很大的困难,所以了解基本计算机基础知识是必修。 38 | 39 | 之前在下总结了一下这部分的基础知识,深度适合没有基础的前端同学。 40 | 41 | 欢迎加我微信,进群一起学习: 42 | 43 | 44 | 45 | ## 计算机组成原理基础知识 + 面试真题 46 | 47 | - [基础知识](./src/basic-of-computer/principles-of-computer-composition/principles-of-computer-composition.zh.md) 48 | - [面试题](./src/basic-of-computer/principles-of-computer-composition/principles-of-computer-composition-interview.zh.md) 49 | - 字符编码相关:一个中文占多少字节?Unicode 跟编码有什么关系?js 是什么编码? 50 | - 为什么 0.1 + 0.2 不等于 0.3?为什么 0.1 + 0.1 等于 0.2 ?请结合 IEEE 标准来说,如何避免这种计算误差? 51 | - ... 52 | 53 | ## 计算机网络基础知识 + 面试真题 54 | 55 | - [基础知识](./src/basic-of-computer/computer-network/computer-network.zh.md) 56 | - [面试题](./src/basic-of-computer/computer-network/computer-network.interview.zh.md) 57 | - HTTPS 一定安全可靠吗? 58 | - url编码规则是什么? 59 | - 为什么Tcp 2次握手不行?什么是泛洪攻击?Tcp的安全可靠,不丢不重是如何做到的? 60 | 61 | 62 | ## 操作系统基础知识 + 面试真题 63 | 64 | - [基础知识](./src/basic-of-computer/system-operation/system-operation.zh.md) 65 | - [面试题](./src/basic-of-computer/system-operation/system-operation.interview.zh.md) 66 | - 进程和线程的区别与联系? 67 | - 为什么要有文件描述符? 68 | - 信号是什么? linux中kill命令默认发送的信号是什么,kill -9发送的信号是什么? 69 | 70 | 71 | ## 算法leetcode简单题88道 72 | 73 | - [上半部分](./src/basic-of-computer/algorithms/leetcode-simple-44-2.md) 74 | - [下半部分](./src/basic-of-computer/algorithms/leetcode-simple-44-1.md) 75 | - 美团面试题 76 | - 有效的字母异位词 77 | - 杨辉三角 78 | - 蔚来面试题 79 | - 合并两个有序数组 80 | - 二叉树层次遍历 81 | 82 | 83 | ## 算法leetcode中等题 84 | 85 | - [待更新...] 86 | 87 | # Linux相关 88 | 89 | 简述 90 | 91 | 你想玩全栈,Linux基础知识必须掌握,建议至少掌握到中级的水平,而且这些属于死记硬背的知识。这点努力都不愿意付出,就别谈学习后端知识了。 92 | 93 | ## Linux基础知识 94 | 95 | - [基础知识](./src/linux/linux.zh.md) 96 | - [面试题](./src/linux/linux.interview.zh.md) 97 | - linux 这边常用的查看日志的指令? 98 | - linux 下进程间通信方式?管道、共享内存什么场景下会用?两个进程不在同一个机器如何通信? 99 | - 何查看 linux 进程信息,其中 vsz 和 rss 有什么区别? 100 | 101 | 102 | ## Shell脚本基础 103 | 104 | 复杂的Shell脚本,建议直接用node.js去写(会python的也是py优先),但是简单的脚本还是要会写 105 | 106 | - [待更新。。。] 107 | 108 | 109 | ## 小公司业务架构 110 | 111 | ![Alt text](image.png) 112 | 113 | 主要包含的技术: 114 | - nginx做4层或者7层负载均衡 115 | - 搭建nfs存储服务 116 | - 搭建back up备份服务 117 | - ssh免密登录 118 | - 防火墙iptables 119 | 120 | 这些技术后期在学习k8s后,部分服务会跑在k8s中,并在k8s章节添加监控服务 + 日志服务,其实监控和日志细分的话太多了,我们做的可能比较粗糙,如果做的很专业,会花费巨大的精力,而且小公司架构确实也用不着,毕竟需要一个团队去维护单独的日志服务或者监控服务。 121 | 122 | ![Alt text](./src/image.png) 123 | 124 | 如果有对ci/cd感兴趣的,请看我的ci/cd教程 125 | 126 | - [待更新。。。] 127 | 128 | # Javascript相关 129 | 130 | ## [Js 基础问题](/src/common.md) 131 | 132 | 与前端 Js 不同, 后端方面除了 SSR/爬虫之外很少会接触 DOM, 所以关于 DOM 方面的各种知识基本不会讨论. 浏览器端除了图形业务外很少碰到内存问题, 但是后端几乎是直面服务器内存的, 更加偏向内存方面, 对于一些更基础的问题也会更加关注. 133 | 134 | 部分问题: 135 | 136 | - [类型判断](/src/common.md) 137 | - typeof NaN 结果是什么?以及为什么? 138 | - [类型判断](/src/common.md) 139 | - 如何精确判断引用类型? 140 | - [原型链](/src/common.md) 141 | - Function.prototype === Object.**proto** 结果是什么,以及为什么? 142 | - [作用域](/src/common.md) 143 | - javascript 是静态作用域还是动态作用域? 144 | - [执行上下文栈](/src/common.md) 145 | - 有些人可能要说《高级程序设计》的 VO,AO,对不起,这是 ES3 的说法。答这道题就走远了 146 | - [引用传递](/src/common.md) 147 | - js 中什么类型是引用传递, 什么类型是值传递? 如何将值类型的变量以引用的方式传递? 148 | 149 | ## [模块](/src/module.md) 150 | 151 | 模块机制详细分析文章可以参考我之前写的一篇文章[NodeJS 有难度的面试题,你能答对几个?](https://juejin.cn/post/6844903951742025736),最开始就讨论了 commonjs 的模块机制。 152 | 153 | - [模块机制](/src/module.md) 154 | - 请介绍一下 node 里的模块是什么 155 | - 请介绍一下 require 的模块加载机制 156 | - [热更新](/src/module.md) 157 | - 如何在不重启 node 进程的情况下热更新一个 js/json 文件? 这个问题本身是否有问题? 158 | - [上下文](/src/module.md) 159 | - 每个 require 的 js 文件,作用域如何保证独立呢? 160 | - 知道 vm 模块有什么用吗? 161 | - [包管理](/src/module.md) 162 | - npm 包管理下,node_modules 里安装的包是按什么结构和逻辑整理目录的 163 | 164 | ## [事件/异步](/src/event-async.md) 165 | 166 | 异步还是不异步? 这是一个问题. 167 | 168 | - [Promise](/src/event-async.md) 169 | - 问烂的题就是问你什么是宏任务,什么是微任务,有啥区别,然后上个题问你打印顺序 170 | - [Events (事件)](/src/event-async.md) 171 | - 如下情况是否会死循环? 172 | 173 | ```javascript 174 | const EventEmitter = require("events"); 175 | 176 | let emitter = new EventEmitter(); 177 | 178 | emitter.on("myEvent", () => { 179 | console.log("hi"); 180 | emitter.emit("myEvent"); 181 | }); 182 | 183 | emitter.emit("myEvent"); 184 | ``` 185 | 186 | 以及这样会不会死循环? 187 | 188 | ```javascript 189 | const EventEmitter = require("events"); 190 | 191 | let emitter = new EventEmitter(); 192 | 193 | emitter.on("myEvent", function sth() { 194 | emitter.on("myEvent", sth); 195 | console.log("hi"); 196 | }); 197 | 198 | emitter.emit("myEvent"); 199 | ``` 200 | 201 | - [阻塞/异步](/src/event-async.md) 202 | - 如何实现一个 sleep 函数 203 | - 如何实现一个异步的 reduce? (注:不是异步完了之后同步 reduce) 204 | - [并行/并发](/src/event-async.md) 205 | - 并行和并发有啥区别 206 | 207 | ## [进程](/src/process.md) 208 | 209 | 后面的篇章需要了解操作系统的一些基本运行原理,才能更好的回答问题,比如进程就是一个典型的例子,以下链接是我之前写的关于操作系统的基础知识: 210 | https://juejin.cn/post/6844904112803282957 211 | 212 | - [Stream](/src/process.md) 213 | - 可读流默认是什么状态? 214 | - 背压是什么?知道 pipeline 吗?跟 pipe 有什么区别 215 | - [流内部机制](/src/AdvancedStream.md) 216 | - [Process (进程)](/src/process.md) 217 | - 请回答进程、线程和协程的区别 218 | - RPC,LPC 中文啥意思?有啥区别吗 219 | - [Child Processes (子进程)](/src/process.md) 220 | - spawn 、fork、exec、execFile 的区别? 221 | - [Cluster (集群)](/src/process.md) 222 | - Cluster 底层使用的是 Child Processes, 那它的工作机制什么 223 | - [进程间通信](/src/process.md) 224 | - 常见的 IPC 方式有哪些 225 | - [守护进程](/src/process.md) 226 | - 请实现一个简易的 nodejs 编写的守护进程 227 | 228 | ## [IO](/src/io.md) 229 | 230 | Node.js 是以 IO 密集型业务著称. 那么问题来了, 你真的了解什么叫 IO, 什么又叫 IO 密集型业务吗? 231 | 232 | - [Buffer](/src/io.md) 233 | - Buffer 一般用于处理什么数据? 其长度能否动态变化? 234 | - Buffer.alloc()和 Buffer.allocUnsafe()有什么区别 235 | - [String Decoder (字符串解码)](/src/io.md) 236 | - 知道 String Decoder 的应用场景吗? 237 | - [File System (文件系统)](/src/io.md) 238 | - 什么是文件描述符? 输入流/输出流/错误流是什么? 239 | - [Readline](/src/io.md) 240 | 241 | * Readline 是如何实现的? (有思路即可) 242 | 243 | ## [Network](/src/network.md) 244 | 245 | - [Net (网络)](/src/network.md) 246 | - 知道 TCP 的粘包是什么吗? 247 | - cookie 与 session 的区别? 服务端如何清除 cookie? 248 | - [UDP/Datagram](/src/network.md) 249 | - 什么场景适用 udp 250 | - [HTTP](/src/network.md) 251 | - 什么是跨域请求? 如何允许跨域? 252 | - 列举几个提高网络传输速度的办法? 253 | - [DNS (域名服务器)](/src/network.md) 254 | - hosts 文件是什么? 什么叫 DNS 本地解析? 255 | - [RPC](/src/network.md) 256 | - 常见 RPC 的方式有哪些 257 | 258 | ## [OS](/src/os.md) 259 | 260 | - [TTY](/src/os.md) 261 | - 什么是 TTY? 如何判断是否处于 TTY 环境? 262 | - [OS (操作系统)](/src/os.md) 263 | - 不同操作系统的换行符 (EOL) 有什么区别? 264 | - [Path](/src/os.md) 265 | - 为什么要用 path 模块去处理路径(兼容性问题) 266 | - [命令行参数](/src/os.md) 267 | 268 | ## [错误处理/调试](/src/error.md) 269 | 270 | - [`[Doc]` Errors (异常)](/src/error.md) 271 | - javascript 标准错误分为几种 272 | - 怎么处理未预料的出错? 用 try/catch ,还是其它什么? 273 | - 什么是 `uncaughtException` 事件? 一般在什么情况下使用该事件? 274 | - 什么是防御性编程? 与其相对的 let it crash 又是什么? 275 | - 为什么有些异常没法根据报错信息定位到代码调用? 如何准确的定位一个异常? 276 | - [`[Doc]` Debugger (调试器)](/src/error.md) 277 | - 内存泄漏通常由哪些原因导致? 如何分析以及定位内存泄漏? 278 | 279 | ## [测试](/src/test.md) 280 | 281 | - [单元测试](/src/test.md) 282 | - 为什么要写测试? 写测试是否会拖累开发进度?什么是覆盖率? 283 | - 平时自己用的单测工具(前端和 node 部分) 284 | - [压力测试](/src/test.md) 285 | - 压测的目的是什么 286 | 287 | ## [存储](/src/storage.md) 288 | 289 | - [`[Point]` Mysql](/src/storage.md) 290 | - 索引有什么用,大致原理是什么? 设计索引有什么注意点? 291 | - char 和 varchar 字符宽度的区别 292 | - 字符集 utf8 和 utf8mb4 的区别 293 | - 为什么需要规范 sql 数据规范化? 294 | - [`[Point]` Mongodb](/src/storage.md) 295 | - [`[Point]` 数据一致性](/src/storage.md) 296 | - 什么是数据一致性,如何解决 297 | - 什么是事务,在 mysql 如何开启 298 | 299 | ## [安全](/src/security.md) 300 | 301 | - [Crypto (加密)](/src/security.md) 302 | - 知道对称加密和非对称加密吗?https 中它们彼此是如何协作的呢? 303 | - [HTTPS](/src/security.md) 304 | - https 解决 http 的哪些问题?https 是如何解决 305 | - [XSS](/src/security.md) 306 | - 过滤 Html 标签能否防止 XSS? 307 | - [CSRF](/src/security.md) 308 | - 什么是 CSRF,如何防止? 309 | - [中间人攻击](/src/security.md) 310 | - 如何避免中间人攻击? 311 | - [Sql/Nosql 注入](/src/security.md) 312 | - 为什么会产生 sql 注入 313 | 314 | ## [nginx](/src/nginx.md) 315 | 316 | - [Nginx 怎么处理请求的?](/src/nginx.md) 317 | - [Nginx 是如何实现高并发的?](src/nginx.md) 318 | 319 | ## 最后 320 | 321 | 欢迎大家一起共建这个知识库,以及不吝啬 star 哦!感谢! 322 | -------------------------------------------------------------------------------- /image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/image.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-interview", 3 | "author": "mengxiang_chengdu", 4 | "version": "0.1.0", 5 | "license": "MIT" 6 | } 7 | -------------------------------------------------------------------------------- /src/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/.DS_Store -------------------------------------------------------------------------------- /src/227404817-999e456a-c3f7-4522-b205-278d5ebab55c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/227404817-999e456a-c3f7-4522-b205-278d5ebab55c.png -------------------------------------------------------------------------------- /src/alg.md: -------------------------------------------------------------------------------- 1 | ## 数据结构和算法 2 | 3 | 因为算法题较多,请移步下面的链接(都是本人所写) 4 | 5 | [【算法面试】leetcode最常见的150道前端面试题 --- 简单题上(44题)](https://juejin.cn/post/6987320619394138148) 6 | 7 | [【算法面试】leetcode最常见的150道前端面试题 --- 简单题下(44题)](https://juejin.cn/post/6989031479753834504) 8 | -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets/image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets/image-1.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets/image-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets/image-2.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets/image-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets/image-3.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets/image-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets/image-4.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets/image-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets/image-5.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets/image-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets/image-6.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets/image-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets/image-7.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets/image.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets2/image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets2/image-1.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets2/image-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets2/image-10.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets2/image-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets2/image-11.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets2/image-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets2/image-12.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets2/image-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets2/image-13.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets2/image-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets2/image-14.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets2/image-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets2/image-15.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets2/image-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets2/image-16.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets2/image-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets2/image-17.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets2/image-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets2/image-18.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets2/image-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets2/image-2.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets2/image-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets2/image-3.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets2/image-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets2/image-4.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets2/image-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets2/image-5.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets2/image-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets2/image-6.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets2/image-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets2/image-7.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets2/image-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets2/image-8.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets2/image-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets2/image-9.png -------------------------------------------------------------------------------- /src/basic-of-computer/algorithms/assets2/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/algorithms/assets2/image.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-1.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-10.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-11.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-12.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-13.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-14.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-15.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-16.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-17.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-18.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-19.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-2.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-20.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-21.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-22.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-23.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-24.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-25.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-26.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-27.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-28.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-29.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-3.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-30.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-31.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-32.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-33.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-34.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-35.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-36.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-37.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-38.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-39.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-4.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-40.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-41.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-42.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-43.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-44.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-45.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-46.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-47.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-5.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-6.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-7.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-8.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image-9.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets/image.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-1.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-10.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-11.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-12.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-13.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-14.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-15.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-16.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-17.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-18.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-19.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-2.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-20.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-21.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-22.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-23.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-24.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-25.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-26.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-27.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-28.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-29.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-3.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-30.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-31.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-32.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-33.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-34.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-35.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-36.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-37.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-38.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-39.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-4.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-40.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-41.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-42.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-43.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-44.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-45.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-46.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-47.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-48.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-49.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-5.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-6.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-7.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-8.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image-9.png -------------------------------------------------------------------------------- /src/basic-of-computer/computer-network/assets2/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/computer-network/assets2/image.png -------------------------------------------------------------------------------- /src/basic-of-computer/index.zh.md: -------------------------------------------------------------------------------- 1 | # 计算机基础面试题 2 | 3 | 4 | 5 | ## 简述 6 | 7 | 为什么需要了解计算机基础知识, 没有基本的计算机基础,比如基本的 node api 和一些后端常见的概念,比如进程,线程都会有很大的困难,所以了解基本计算机基础知识是必修。 8 | 9 | 之前在下总结了一下这部分的基础知识,深度适合没有基础的前端同学。 10 | 11 | 欢迎加我微信,进群一起学习: 12 | 13 | 14 | 15 | ## 计算机组成原理基础知识 + 面试真题 16 | 17 | - [基础知识](./principles-of-computer-composition/principles-of-computer-composition.zh.md) 18 | - [面试题](./principles-of-computer-composition/principles-of-computer-composition-interview.zh.md) 19 | 20 | ## 计算机网络基础知识 + 面试真题 21 | 22 | - [基础知识](./computer-network/computer-network.zh.md) 23 | - [面试题](./computer-network/computer-network.interview.zh.md) 24 | 25 | 26 | ## 操作系统基础知识 + 面试真题 27 | 28 | - [基础知识](./system-operation/system-operation.zh.md) 29 | - [面试题](./system-operation/system-operation.interview.zh.md) 30 | 31 | 32 | ## 算法leetcode简单题88道 33 | 34 | - [上半部分](./algorithms/leetcode-simple-44-2.md) 35 | - [下半部分](./algorithms/leetcode-simple-44-1.md) 36 | -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-1.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-10.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-11.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-12.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-13.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-14.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-15.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-16.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-17.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-18.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-19.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-2.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-20.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-21.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-22.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-23.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-24.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-25.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-26.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-27.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-28.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-29.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-3.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-30.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-31.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-32.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-33.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-34.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-35.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-36.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-37.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-38.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-39.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-4.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-40.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-41.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-42.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-5.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-6.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-7.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-8.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image-9.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/assets/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/principles-of-computer-composition/assets/image.png -------------------------------------------------------------------------------- /src/basic-of-computer/principles-of-computer-composition/principles-of-computer-composition-interview.zh.md: -------------------------------------------------------------------------------- 1 | ## 前言 2 | 3 | 以下题目均为面试真题。 4 | 5 | ## 切记,如果不熟悉计算机组成原理,请看我之前写的文章后再尝试解答面试题 6 | 7 | [写给前端非科班的「计算机组成原理」!!!](./principles-of-computer-composition.zh.md) 8 | 9 | ## 字符编码相关:一个中文占多少字节?Unicode 跟编码有什么关系?js 是什么编码?(北京阿里 P7 面试题) 10 | 11 | ### 一个中文占多少字节? 12 | 13 | 一个中文字符占用多少字节跟编码密切相关,不能直接说一个中文占 2 个或者 3 个字节,比如 UTF-8 编码下一个中文字符通常占用 3 个字节。 14 | 15 | ### Unicode 跟编码有什么关系? 16 | 17 | Unicode 是一种字符集,它定义了每个字符对应的唯一编号,但是并没有规定如何存储这些字符。编码则是将字符集中的字符转换为字节序列的方法。例如:utf16 可以用两个字节或四个字节来表示一个字符,你也可以设计一种编码 Unicode 的方法,例如统一用 4 个字节表示一个字符 18 | 19 | ### js 是什么编码? 20 | 21 | 在 JavaScript 中,通常使用 UTF-16 编码。而我们的网页通常是 UTF-8 编码,所以使用 javascript 内部的字符串方法时,实际上内部会做一个转换,是以 utf-16 为准。 22 | 例如: 23 | 24 | ```javascript 25 | "😂".length; // 2 26 | ``` 27 | 28 | 因为通常一个汉字的 length 属性是 1,因为在 unicode 字符集中的数字大小,只需要 utf-16 用两个个字节保存即可。有些数字较大,超过了两个字节表示的范围,就需要 4 个字节表示。 29 | 30 | 再介绍一个概念,叫码元(code unit),是指存储字符的最小单位,这里即 2 个字节。所以 length 就是码元的个数,上面的表情符号用了 4 个字节,所以是 2 个码元,所以 length 是 2。 31 | 32 | ## 浮点数相关:为什么 0.1 + 0.2 不等于 0.3?为什么 0.1 + 0.1 等于 0.2 ?请结合 IEEE 标准来说,如何避免这种计算误差 (深圳腾讯) 33 | 34 | 在 IEEE 754 标准中,浮点数的表示是有限的,而 0.1 和 0.2 在二进制下是无限循环小数。为什么是无限循环呢,这就要了解 10 进制小数如何转换为 2 进制小数了,方法如下: 35 | 36 | ### 十进制小数转为 n 进制 37 | 38 | 我们以 2 进制为例,方式是采用“乘 2 取整,顺序排列”法。具体做法是: 39 | 40 | - 用 2 乘十进制小数,可以得到积,将积的整数部分取出 41 | - 再用 2 乘余下的小数部分,又得到一个积,再将积的整数部分取出 42 | - 如此进行,直到积中的小数部分为零,或者达到所要求的精度为止 43 | 44 | 我们举个例子: 45 | 46 | 如: 十进制 0.25 转为二进制 47 | 48 | - `0.25 * 2 = 0.5` 取出整数部分:`0` 49 | - `0.5 * 2 = 1.0` 取出整数部分 1 50 | 51 | 即十进制`0.25`的二进制为 `0.01` ( 第一次所得到为最高位,最后一次得到为最低位) 52 | 53 | 此时我们可以试试十进制`0.1`和`0.2`如何转为二进制,就知道为啥 0.1 + 0.2 不等于 0.3 了 54 | 55 | ```javascript 56 | 0.1(十进制) = 0.0001100110011001(二进制) 57 | 十进制数0.1转二进制计算过程: 58 | 0.1*2=0.2……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.2”接着计算。 59 | 0.2*2=0.4……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.4”接着计算。 60 | 0.4*2=0.8……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.8”接着计算。 61 | 0.8*2=1.6……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.6”接着计算。 62 | 0.6*2=1.2……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.2”接着计算。 63 | 0.2*2=0.4……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.4”接着计算。 64 | 0.4*2=0.8……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.8”接着计算。 65 | 0.8*2=1.6……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.6”接着计算。 66 | 0.6*2=1.2……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.2”接着计算。 67 | 0.2*2=0.4……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.4”接着计算。 68 | 0.4*2=0.8……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.2”接着计算。 69 | 0.8*2=1.6……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.2”接着计算。 70 | …… 71 | …… 72 | 所以,得到的整数依次是:“0”,“0”,“0”,“1”,“1”,“0”,“0”,“1”,“1”,“0”,“0”,“1”……。 73 | 由此,大家肯定能看出来,整数部分出现了无限循环。 74 | ``` 75 | 76 | 这时,面试官又问我,既然 0.1 的 10 进制不能精确转换为 2 进制,为什么 0.1 + 0.1 == 0.2 是 true ? 77 | 78 | ### 为什么 0.1 + 0.1 == 0.2 是 true 79 | 80 | 因为 64 位浮点数,小数部分最多展示 16 位,因为在 IEEE 754 标准中的 64 位浮点数的小数部分,最多有 53 位, 2 的 53 次方就是 16 位数字,所以小数部分最多展示 16 位。 81 | 82 | 如下: 83 | 84 | ```javascript 85 | (0.1).toPrecision(16); 86 | "0.1000000000000000"(0.1).toPrecision(17); 87 | ("0.10000000000000001"); 88 | ``` 89 | 90 | 所以 0.1 + 0.1 正好 16 位(四舍五入)截断,等于 0.2。 91 | 92 | ### 如何避免 93 | 94 | 避免方法可以使用将数字转化为字符串,然后模拟加法运算,一些库就是这样实现的,所以更建议使用成熟的第三方库,当然,这种模拟运算性能并不好(相比于支持 decimal 类型的语言)。可以完全避免出现误差。(千万别说可以用乘法转换为整数做运算,也一样会有误差)。 95 | 96 | ## 补码有什么用?(上海字节) 97 | 98 | 使用补码表示法,可以将减法转化为加法,这样加法和减法都可以在加法器上进行运算,简化了计算机的设计和实现。 99 | 100 | 以4位二进制做例子,先把能表示的数字放到一个表盘上,外圈为二进制,内圈为10进制:   101 |   ![image](https://github.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/assets/26076975/80790269-54a7-4cef-8457-1a1fcdacf3dd) 102 | 103 | 104 | 我们假设从 0 点 减去 -1 等于多少点? 105 | 106 | - -1 的补码,在4位二进制中是 1111, 0 - 1,就等于 0 + 二进制的 1111 107 | - 所以结果是 1111 , 1111 转为 10 进制就是 15 108 | 109 | 110 | 举例: 111 | 在 JavaScript 中,可以使用按位非(~)运算符来实现取反操作,使用按位与(&)运算符来实现加 1 操作。以下是一个实现减法运算的例子: 112 | 113 | ```javascript 114 | function subtract(a, b) { 115 | b = ~b + 1; 116 | return a + b; 117 | } 118 | ``` 119 | -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-1.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-10.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-11.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-12.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-13.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-14.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-15.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-16.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-17.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-18.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-19.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-2.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-20.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-21.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-22.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-23.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-24.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-25.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-26.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-27.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-28.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-29.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-3.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-30.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-31.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-32.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-33.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-4.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-5.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-6.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-7.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-8.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image-9.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets/image.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-1.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-10.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-11.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-12.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-13.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-14.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-15.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-16.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-17.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-18.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-19.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-2.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-20.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-21.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-22.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-23.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-24.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-25.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-26.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-27.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-28.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-29.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-3.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-30.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-31.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-32.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-33.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-34.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-35.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-36.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-37.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-38.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-39.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-4.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-40.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-41.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-42.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-43.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-44.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-45.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-46.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-47.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-48.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-49.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-5.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-50.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-51.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-52.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-53.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-54.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-54.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-55.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-56.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-57.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-6.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-7.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-8.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image-9.png -------------------------------------------------------------------------------- /src/basic-of-computer/system-operation/assets2/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/basic-of-computer/system-operation/assets2/image.png -------------------------------------------------------------------------------- /src/basic.md: -------------------------------------------------------------------------------- 1 | 2 | # 计算机基础 3 | 4 | * [计算机组成原理] 5 | * [操作系统] 6 | * [计算机网络] 7 | * [数据结构和算法(leetcode 简单题闯关)] 8 | 9 | 10 | ## 简述 11 | 12 | 13 | 14 | 为什么需要了解计算机基础知识, 没有基本的计算机基础,比如基本的node api和一些后端常见的概念,比如进程,线程都会有很大的困难,所以了解基本计算机基础知识是必修。 15 | 16 | 之前在下总结了一下这部分的基础知识,深度适合没有基础的前端同学。 17 | ## 计算机组成原理 18 | [【重磅升级!】写给前端非科班的「计算机组成原理」!!!](https://juejin.cn/post/6990652014862532622) 19 | 20 | 21 | ## 计算机网络 22 | 23 | [前端需要了解的计算机网络知识, 这一篇就够了!(图文并茂,万字长文,点赞收藏哦!)](https://juejin.cn/post/6844904079974465544) 24 | 25 | ## 操作系统 26 | 27 | [前端入门操作系统知识,这一篇就够啦!](https://juejin.cn/post/6844904112803282957) 28 | 29 | ## 数据结构和算法 30 | [【算法面试】leetcode最常见的150道前端面试题 --- 简单题上(44题)](https://juejin.cn/post/6987320619394138148) 31 | 32 | [【算法面试】leetcode最常见的150道前端面试题 --- 简单题下(44题](https://juejin.cn/post/6989031479753834504) -------------------------------------------------------------------------------- /src/common.md: -------------------------------------------------------------------------------- 1 | # JavaScript 基础问题 2 | 3 | * [`[Basic]` 类型判断] 4 | * [`[Basic]` 作用域] 5 | * [`[Basic]` 引用传递] 6 | * [`[Basic]` 内存释放] 7 | * [`[Basic]` ES6 新特性] 8 | 9 | 10 | ## 简述 11 | 12 | 与前端 Js 不同, 后端方面除了SSR/爬虫之外很少会接触 DOM, 所以关于 DOM 方面的各种知识基本不会讨论. 浏览器端除了图形业务外很少碰到内存问题, 但是后端几乎是直面服务器内存的, 更加偏向内存方面, 对于一些更基础的问题也会更加关注. 13 | 14 | ## 类型判断 15 | 16 | ##### 1、typeof能够识别哪些类型? 17 | 18 | typeof可以测试出number、string、boolean、Symbol、undefined及function,而对于null及数组、对象,typeof均检测出为object,不能进一步判断它们的类型。 19 | 20 | ##### >>> 延伸问题:typeof NaN 结果是什么?以及为什么 21 | 22 | - 答案是number,为什么呢?因为IEEE-754标准,64位浮点数,当指数位全为1, 表示非数字(NaN Not a Number),诸如0除以0的结果。 23 | 24 | ##### >>> 延伸问题: 为什么string这种基础类型居然还能调用方法,例如'a'.indexOf('a'), 方法调用不是对象才有的能力吗? 25 | 26 | - js中为了便于基本类型操作,提供了3个特殊的引用类型:Boolean、Number、String它们具有基本类型特殊行为。 27 | 28 | - 实际上,每当读取一个基本类型的时候,js内部会自动创建一个基本包装类型对象,可以让我们调用一些方法来操作。 29 | 30 | - 'a'.indexOf('a')在调用过程中会先let str = new String('a'),然后调用indexOf,调用完毕str = null, 销毁该对象 31 | 32 | ##### 如何精确判断引用类型? 33 | 34 | Object.prototype.toString方法返回对象的类型字符串,因此可用来判断一个值的类型。 35 | 36 | ```javascript 37 | Object.prototype.toString.call(undefined); // [object Undefined] 38 | 39 | Object.prototype.toString.call(null); // [object Null] 40 | 41 | Object.prototype.toString.call("这是字符串"); // [object String] 42 | 43 | Object.prototype.toString.call(1); // [object Number] 44 | 45 | Object.prototype.toString.call(true); // [object Boolean] 46 | 47 | Object.prototype.toString.call({}); // [object Object] 48 | 49 | Object.prototype.toString.call([]); // [object Array] 50 | 51 | Object.prototype.toString.call(new Function()); // [object Function] 52 | 53 | Object.prototype.toString.call(new Date()); // [object Date] 54 | 55 | Object.prototype.toString.call(new RegExp()); // [object RegExp] 56 | 57 | Object.prototype.toString.call(new Error()); // [object Error] 58 | ``` 59 | ##### >>> 延伸问题:为什么要用 Object.prototype.toString,不用自己原型对象的toString方法,比如函数const a = new Function(); 调用a.toString()不行吗? 60 | 因为实例对象有可能会自定义toString方法,会覆盖Object.prototype.toString,所以在使用时,最好加上call。 61 | ## 原型和原型链 62 | 63 | 请回答这个题,如果回答正确你的原型和原型链就完全没问题了。 64 | ```JAVASCRIPT 65 | class Foo{} 66 | const f1 = new Foo(); 67 | ``` 68 | 请问: 69 | ```javascript 70 | // 难度小 71 | console.log(Foo.prototype.constructor === Foo) // ? 72 | console.log(f1.__proto__ === Foo.prototype) // ? 73 | 74 | // 难度中 75 | console.log(Object.prototype.__proto__ === null) // ? 76 | console.log(Function.prototype.__proto__ === Object.prototype) // ? 77 | 78 | // 难度较大 79 | console.log(Function.prototype === Object.__proto__) // ? 80 | ``` 81 | 82 | 83 | 答案:全是true,至于为啥,可能要写一篇很长的文章了,留给大家去思索吧。(简单记忆,所有函数最终都收敛到Function.prototype,所有对象都收敛到Object.prototype,或者说null) 84 | 85 | 下图应该能解释: 86 | ![image](./227404817-999e456a-c3f7-4522-b205-278d5ebab55c.png) 87 | 88 | 89 | ## 作用域 90 | 91 | 作用域是指程序源代码中定义变量的区域。在这个区域内,变量有自己的访问权限。在javascript中,采取的是静态作用域 92 | 93 | 请看下面的案例,便知什么是静态作用域 94 | ```JAVASCRIPT 95 | let value = 1; 96 | 97 | function foo() { 98 | console.log(value); 99 | } 100 | 101 | function bar() { 102 | let value = 2; 103 | foo(); 104 | } 105 | 106 | bar(); 107 | ``` 108 | 答案是1,因为foo中的value的作用域在书写完毕代码的时候就已经决定了,这就是静态作用域。 109 | 110 | 面试题: 111 | ```javascript 112 | let scope = "global scope"; 113 | function checkscope(){ 114 | let scope = "local scope"; 115 | function f(){ 116 | return scope; 117 | } 118 | return f(); 119 | } 120 | 121 | checkscope(); 122 | 123 | let scope = "global scope"; 124 | function checkscope(){ 125 | let scope = "local scope"; 126 | function f(){ 127 | return scope; 128 | } 129 | return f; 130 | } 131 | checkscope()(); 132 | ``` 133 | 请问输出什么? 134 | 135 | 跟作用域相关的一个话题是变量提升和函数提升,想了解面试者函数提升掌握能力可以出下题: 136 | 137 | ```javascript 138 | function foo() { 139 | 140 | console.log('foo1'); 141 | 142 | } 143 | 144 | foo(); // foo2 145 | 146 | function foo() { 147 | 148 | console.log('foo2'); 149 | 150 | } 151 | 152 | foo(); // foo2 153 | ``` 154 | 请问两次foo执行输出什么,为什么? 155 | 156 | 这是因为在 JavaScript 中,函数声明会被提升到作用域的顶部,这被称为“函数提升”。因此,尽管第一个 foo() 调用在第一个函数声明之前,但第二个函数声明会覆盖第一个函数声明。当第二个 foo() 被调用时,它会输出 'foo2'。同样地,第一个 foo() 调用在第二个函数声明之前,但是第二个函数声明在全局作用域被解析,它会覆盖第一个函数声明。因此,第二个 foo() 调用也会输出 'foo2'。 157 | 158 | ## 执行上下文栈 159 | 160 | 有些人可能要说《高级程序设计》的VO,AO,对不起,这是ES3的说法。答这道题就走远了。 161 | 详细内容请看 https://juejin.cn/post/6844903682283143181 162 | 163 | 一般面试题会问,能谈下执行上下文是什么吗?let和var在执行上下文栈保存的区域有什么区别? 164 | 165 | - 每当 JavaScript 解释器要执行我们编写的函数或脚本时,它都会创建一个新的上下文。每个脚本/代码都以一个称为全局执行上下文的执行上下文开始。每次我们调用一个函数时,都会创建一个新的执行上下文并将其放在执行堆栈的顶部。当您调用调用另一个嵌套函数的嵌套函数时,也会放在执行堆栈的顶部。 166 | 167 | 简而言之, 168 | 169 | 在全局环境中,环境记录器是对象环境记录器。 170 | 在函数环境中,环境记录器是声明式环境记录器。 171 | 172 | 抽象地讲,词法环境在伪代码中看起来像这样: 173 | ```javascript 174 | // 全局的执行上下文 175 | // LexicalEnvironment是指词法环境主要保存let const声明的变量 176 | GlobalExectionContext = { 177 | ThisBinding = , // this绑定 178 | LexicalEnvironment: { 179 | EnvironmentRecord: { 180 | Type: "Object", 181 | // 在这里绑定标识符 182 | } 183 | outer: 184 | } 185 | } 186 | 187 | // 函数的执行上下文 188 | // outer指向上一个执行上下文,这里是指向全局的执行上下文 189 | FunctionExectionContext = { 190 | ThisBinding = , // this绑定 191 | LexicalEnvironment: { 192 | EnvironmentRecord: { 193 | Type: "Declarative", 194 | // 在这里绑定标识符 195 | } 196 | outer: 197 | } 198 | } 199 | ``` 200 | 请注意,执行上下文中包含this的绑定,也就是说,this指向是在执行上下文中的,但是需要注意的是,函数的this绑定是动态的,在执行的时候才真正绑定。 201 | 202 | 我们再来看一下变量环境 203 | 204 | ```javascript 205 | GlobalExectionContext = { 206 | ThisBinding: , 207 | LexicalEnvironment: { // 词法环境 208 | EnvironmentRecord: { 209 | Type: "Object", 210 | // 在这里绑定标识符 211 | a: < uninitialized >, // let、const声明的变量 212 | b: < uninitialized >, // let、const声明的变量 213 | multiply: < func > // 函数声明 214 | } 215 | outer: 216 | }, 217 | VariableEnvironment: { // 变量环境 218 | EnvironmentRecord: { 219 | Type: "Object", 220 | // 在这里绑定标识符 221 | c: undefined, // var声明的变量 222 | } 223 | outer: 224 | } 225 | } 226 | ``` 227 | 如上图说是,变量环境一般声明上下文栈的VariableEnvironment属性中。 228 | 229 | 230 | 以上的上下文栈你可以考察的题目参考如下: 231 | 232 | - 请问this指向问题,然后引申一下this具体在js环境中的哪里 233 | - 然后引出上下文栈的概念,问变量环境和词法环境有什么区别,然后继续问闭包,因为闭包跟上下文栈息息相关,为啥呢,看下文的闭包这一小节。 234 | 235 | ## 闭包 236 | 237 | 什么是闭包呢? 238 | 概念太生硬,我们举个例子来看 239 | ```typescript 240 | const scope = "global scope"; 241 | function checkscope(){ 242 | var scope = "local scope"; 243 | function f(){ 244 | return scope; 245 | } 246 | return f; 247 | } 248 | 249 | const foo = checkscope(); 250 | foo(); 251 | ``` 252 | 如上,checkscope调用完毕,从函数调用栈或者上下文栈弹出,也就是销毁了,按道理说,这个函数里的变量也都全部销毁了。 253 | 254 | 但是foo调用的时候,依然能访问到scope这个变量,这就是闭包。 255 | 256 | 257 | 简单来说就是函数已经从上下文栈弹出了,销毁了,但是依然能访问到之前销毁的变量。这样的函数就是闭包。 258 | 259 | 同时也解释了,为啥我们说闭包跟作用域链息息相关了。 260 | 261 | 面试问题参考问题: 262 | - 之前讲了上下文栈里有一个outer属性指向上一个上下文,这样就可以形成一个作用域链,但实际上,作用域链保存在[[Scopes]]中,首先你知道[[Scopes]]是什么吗?其次为什么会保存到这里,而不是用上下文的outer去寻找。 263 | 264 | 答:如果单纯的通过 outer 链路来实现作用域链,那么存在一个闭包时,整个链条上的所有词法环境,变量环境,this指向都无法回收。其实,这么做也不是不行,那有没有更好的方案呢, V8 优化了这一点。而是通过 [[Scopes]] + Closure 解决。也就是说在编译函数时,把用到的词法环境的数据放到[[Scopes]] 的 Closure对象里,这样就不用保存整个词法环境了。 265 | 266 | 详细原理参考这篇文章:https://juejin.cn/post/7079995358624874509 267 | 268 | 269 | 来个终极闭包难度面试题,下面详细解释一下以下代码为什么会产生闭包 270 | ```javascript 271 | let theThing = null; 272 | let replaceThing = function () { 273 | let leak = theThing; 274 | function unused () { 275 | if (leak){} 276 | }; 277 | 278 | theThing = { 279 | longStr: new Array(1000000), 280 | someMethod: function () { 281 | 282 | } 283 | }; 284 | }; 285 | 286 | let index = 0; 287 | while(index < 100){ 288 | replaceThing() 289 | index++; 290 | } 291 | ``` 292 | 主要原因是leak产生了闭包,theThing跟unused共享了这个闭包,因为theThing被最外层引用不能回收,所以leak不会被回收。 293 | 294 | ## 引用传递 295 | 296 | > js 中什么类型是引用传递, 什么类型是值传递? 如何将值类型的变量以引用的方式传递? 297 | 298 | 简单点说, 对象是引用拷贝(引用拷贝跟引用传递有区别参考下面的案例), 基础类型是值传递, 通过将基础类型包装 (boxing) 可以以引用的方式传递. 299 | 300 | ```javascript 301 | function changeStuff(a, b, c) 302 | { 303 | a = a * 10; 304 | b.item = "changed"; 305 | c = {item: "changed"}; 306 | } 307 | 308 | var num = 10; 309 | var obj1 = {item: "unchanged"}; 310 | var obj2 = {item: "unchanged"}; 311 | 312 | changeStuff(num, obj1, obj2); 313 | 314 | console.log(num); 315 | console.log(obj1.item); 316 | console.log(obj2.item); 317 | 318 | // 10 319 | // changed 320 | // unchanged 321 | ``` 322 | 323 | 引用传递和值传递是一个非常简单的问题, 也是理解 JavaScript 中的内存方面问题的一个基础. 如果不了解引用可能很难去看很多问题. 324 | 325 | ## 内存释放 326 | 327 | > JavaScript 中不同类型以及不同环境下变量的内存都是何时释放? 328 | 329 | 引用类型是在没有引用之后, 通过 v8 的 GC 自动回收, 值类型如果是处于闭包的情况下, 要等闭包没有引用才会被 GC 回收, 非闭包的情况下,分新生代和老生代的内存区,新生代 (new space)是 切换的时候回收,老生代是标记清除。 330 | 331 | 与前端 Js 不同, 2年以上经验的 Node.js 一定要开始注意内存了, 不说对 v8 的 GC 有多了解, 基础的内存释放一定有概念了, 并且要开始注意内存泄漏的问题了. 332 | 333 | 你需要了解哪些操作一定会导致内存泄漏, 或者可以崩掉内存. 比如如下代码能否爆掉 V8 的内存? 334 | 335 | ```javaScript 336 | let arr = []; 337 | while(true) 338 | arr.push(1); 339 | ``` 340 | 可以,因为数组占用的是V8的内存 341 | 342 | 然后上述代码与下方的情况有什么区别? 343 | 344 | ```javaScript 345 | let arr = []; 346 | while(true) 347 | arr.push(); 348 | ``` 349 | 350 | 如果 push 的是 `Buffer` 情况又会有什么区别? 351 | 352 | ```javaScript 353 | let arr = []; 354 | while(true) 355 | arr.push(new Buffer(1000)); 356 | ``` 357 | 358 | 思考完之后可以尝试找找别的情况如何爆掉 V8 的内存. 以及来聊聊内存泄漏? 359 | 360 | ```javaScript 361 | function out() { 362 | const bigData = new Buffer(100); 363 | inner = function () { 364 | void bigData; 365 | } 366 | } 367 | ``` 368 | 369 | 闭包会引用到父级函数中的变量,如果闭包未释放,就会导致内存泄漏。上面例子是 inner 直接挂在了 root 上,从而导致内存泄漏(bigData 不会释放)。 370 | 371 | 对于一些高水平的同学, 要求能清楚的了解 v8 内存 GC 的机制, 懂得内存快照等 (之后会在`调试/优化`的小结中讨论) 了. 比如 V8 中不同类型的数据存储的位置, 在内存释放的时候不同区域的不同策略等等. 372 | 373 | 我可能会接着问,如何排查内存泄露呢? 374 | 375 | ## 如何排查内存泄露 376 | 377 | 详见[《如何分析 Node.js 中的内存泄漏》](https://zhuanlan.zhihu.com/p/25736931) 378 | 379 | 这篇文章分析的相当到位,主要是有很清晰的案例,让你很快就能初步掌握排查内存泄露的方法。 380 | 381 | 快照工具推荐使用 heapdump 用来保存内存快照,使用 devtool 来查看内存快照。 382 | 383 | 简单来说,就是使用heapdump.writeSnapshot,来打印内存泄露前的情况,然后对比打印前和打印后哪些变量存储的数据直线上涨,然后devtool有代码连接,就可以仔细分析具体代码了。 384 | 385 | 举个例子,对比内存快照找出泄漏位置 386 | 387 | 通过内存快照找到数量不断增加的对象,找到增加对象是被谁给引用,找到问题代码,改正之后就行,具体问题具体分析,这里通过我们在工作中遇到的情况来讲解。 388 | ``` 389 | const {EventEmitter} = require('events'); 390 | const heapdump = require('heapdump'); 391 | ​ 392 | global.test = new EventEmitter(); 393 | heapdump.writeSnapshot('./' + Date.now() + '.heapsnapshot'); 394 | ​ 395 | function run3() { 396 | const innerData = new Buffer(100); 397 | const outClosure3 = function () { 398 | void innerData; 399 | }; 400 | test.on('error', () => { 401 | console.log('error'); 402 | }); 403 | outClosure3(); 404 | } 405 | ​ 406 | for(let i = 0; i < 10; i++) { 407 | run3(); 408 | } 409 | gc(); 410 | 411 | heapdump.writeSnapshot('./' + Date.now() + '.heapsnapshot'); 412 | ``` 413 | 这里是对错误代码的最小重现代码。 414 | 415 | 首先使用 `node --expose-gc index.js` 运行代码,将会得到两个内存快照,之后打开 devtool,点击 profile,载入内存快照。打开对比,Delta 会显示对象的变化情况,如果对象 Delta 一直增长,就很有可能是内存泄漏了。 416 | 417 | ## ES6 新特性 418 | 419 | 推荐阅读阮一峰的 [《ECMAScript 6 入门》](http://es6.ruanyifeng.com/) 420 | 421 | 比较简单的会问 `let` 与 `var` 的区别, 以及 `箭头函数` 与 `function` 的区别等等. 422 | 423 | 深入的话, es6 有太多细节可以深入了. 比如结合 `引用` 的知识点来询问 `const` 方面的知识. 结合 `{}` 的使用与缺点来谈 `Set, Map` 等. 比如私有化的问题与 `symbol` 等等. 424 | 425 | 其他像是 `闭包是什么?` 这种问烂了问题已经感觉没必要问了, 取而代之的是询问闭包应用的场景更加合理. 比如说, 如果回答者通常使用闭包实现数据的私有, 那么可以接着问 es6 的一些新特性 (例如 `class`, `symbol`) 能否实现私有, 如果能的话那为什么要用闭包? 亦或者是什么闭包中的数据/私有化的数据的内存什么时候释放? 等等. 426 | 427 | `...` 的使用上, 如何实现一个数组的去重 (使用 Set 可以加分). 428 | 429 | > const 定义的 Array 中间元素能否被修改? 如果可以, 那 const 修饰对象有什么意义? 430 | 431 | 其中的值可以被修改. 意义上, 主要保护引用不被修改 (如用 [Map](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map) 等接口对引用的变化很敏感, 使用 const 保护引用始终如一是有意义的), 也适合用在 immutable 的场景. 432 | 433 | 暂时写上这些, 之后会慢慢整理, 如果内容比较多可能单独归一类来讨论. 434 | 435 | 436 | 437 | ### 补充问题 438 | 439 | - js 中什么类型是引用传递, 什么类型是值传递? 如何将值类型的变量以引用的方式传递? 440 | 441 | 答:简单点说,对象是引用传递,基础类型是值传递,通过将基础类型boxing(包装)可以以引用方式传递。 442 | 443 | - js 中, 0.1 + 0.2 === 0.3 是否为 true ? 在不知道浮点数位数时应该怎样判断两个浮点数之和与第三数是否相等? 444 | 445 | 这是烂大街的题目了,没啥难度,主要是理解10进制转2进制时会有误差,解决方法一般要用库,比如big.js,具体源码没看,待大家留言沟通。 446 | 447 | - JavaScript 中不同类型以及不同环境下变量的内存都是何时释放? 448 | 449 | 值类型一般在复杂情况是闭包引用,然后只有闭包的引用全部断开才会回收。 450 | 451 | 引用类型的话,内存上分新生代和老生代。具体算法不一样,新生代是交换空间,老生代是标记清除。 452 | 453 | 具体请参考我的文章[NodeJS有难度的面试题,你能答对几个?](https://juejin.cn/post/6844903951742025736),其中有一小节讲的是垃圾回收机制 454 | -------------------------------------------------------------------------------- /src/error.md: -------------------------------------------------------------------------------- 1 | # 错误处理/调试 2 | 3 | * `[Doc]` Errors (异常) 4 | * `[Doc]` Debugger (调试器) 5 | 6 | 7 | 8 | 9 | ## Errors 10 | 11 | 其中标准的 JavaScript 错误常见有: 12 | 13 | * [EvalError](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/EvalError): 调用 eval() 出现错误时抛出该错误 14 | * [SyntaxError](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError): 代码不符合 JavaScript 语法规范时抛出该错误 15 | * [RangeError](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RangeError): 数组越界时抛出该错误 16 | * [ReferenceError](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ReferenceError): 引用未定义的变量时抛出该错误 17 | * [TypeError](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError): 参数类型错误时抛出该错误 18 | * [URIError](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/URIError): 误用全局的 URI 处理函数时抛出该错误 19 | 20 | 我们来举例介绍下上面的错误: 21 | 22 | #### 1.SyntaxError 23 | 解析代码时发生的语法错误 24 | ```javascript 25 | var 2b; 26 | //Uncaught SyntaxError: Unexpected number 27 | ``` 28 | #### 2.ReferenceError 29 | 引用了一个不存在的变量 30 | ```javascript 31 | console.log(a); 32 | //Uncaught ReferenceError: Invalid left-hand side in assignment 33 | ``` 34 | #### 3.RangeError 35 | 超出有效范围 36 | ```javascript 37 | var a= new Array(-1); 38 | //Uncaught RangeError: Invalid array length 39 | ``` 40 | #### 4.TypeError 41 | 情况一:变量或参数不是预期类型,比如,对字符串、布尔值、数值等原始类型的值使用new命令,就会抛出这种错误,因为new命令的参数应该是一个构造函数。 42 | ```javascript 43 | var a= new abc; 44 | //Uncaught TypeError: abc is not a function 45 | ``` 46 | 情况二:调用对象不存在的方法 47 | ```javascript 48 | var b; 49 | b.c(); 50 | //Uncaught TypeError: Cannot read property c of undefined 51 | ``` 52 | #### 5.URLError(URL错误) 53 | 与url相关函数参数不正确,主要是encodeURI()、decodeURI()、encodeURIComponent() 54 | 、decodeURIComponent()、escape()和unescape()这六个函数。 55 | ```javascript 56 | decodeURI('%2') 57 | //Uncaught URIError: URI malformed 58 | ``` 59 | #### 6.EvalError(eval错误) 60 | eval函数没有被正确执行 61 | ```javascript 62 | eval(2b) 63 | //Uncaught SyntaxError: Invalid or unexpected token 64 | ``` 65 | #### 抛出自定义错误: throw new Error("错误信息") 66 | 67 | 如果不想使用系统设置的错误信息(例如前面提到的6种),可以自定义错误,例如让一个函数需要传入一个字符串,但是传入了空值,可以new不同的错误类型,并自定义错误提示语来让系统抛出信息。 68 | ```javascript 69 | function check(string){ 70 | if(!string){ 71 | throw new Error("内容不存在"); 72 | //throw new TypeError("内容不存在") 73 | } 74 | } 75 | ``` 76 | > 怎么处理未预料的出错? 用 try/catch , domains 还是其它什么? 77 | 78 | 这个话题推荐一篇腾讯同学写的文章[nodejs中错误捕获的一些最佳实践](https://imweb.io/topic/5846d2069be501ba17b10a8d)。 79 | 80 | 这里简单描述一下: 81 | 82 | 首先我们要区分操作错误和编码错误: 83 | 84 | 操作错误是指比如服务器返回500,这并不是bug,对我们程序员来说,代码出错,比如typeerror就是编码错误。 85 | #### 如何处理错误 86 | 87 | 对于明确的操作错误类型,直接处理掉。 88 | 89 | 例如尝试打开一个log文件可能会导致 ENOENT ,那么创建这个文件即可。 90 | 91 | 对于预料之外你不知道如何处理的错误,比较好的方式是记录error并crash,传递合适的错误信息给客户端 92 | 93 | #### 如何处理 代码错误 94 | 最好的方式是立即crash。 95 | 96 | 这种错误是程序的bug,一般来说写再多的代码也避免不了。因为在node应用中,我们一般会监控挂掉的进程并自动重启,所以立即crash是比较好的方式。 97 | 98 | 调试这类问题的最佳方式,是在捕获到uncaught exception的时候,记录相关信息。 99 | 100 | 总之记住,server的代码错误(bug)传递到client时会成为一个操作错误,例如server捕获到uncaught exception则返回一个500,客户端来处理这个操作错误。 101 | 102 | #### 如何传递错误? 103 | 首先,最重要的是文档,描述这个函数做了些什么,接收什么类型的参数返回什么,可能会触发什么错误。 104 | 105 | 一些基本原则: 106 | 107 | - 同步的函数里,使用throw。使用者使用try...catch即可捕获错误。 108 | - 异步函数里,更常用的方式是使用callback(err, result)的方式。 109 | - 在更复杂的场景里,可以返回一个EventEmitter对象,代替使用callback。使用者可以监听emitter对象的 error事件。 例如读取一个数据流,我们可能会同时使用 req.on('data')、req.on('error')、req.on('timeout') 。 110 | - 所以,使用throw还是callbacks、EventEmitter,取决于: 111 | 112 | 该错误是操作错误还是编码错误? 113 | 该函数是同步还是异步? 114 | 115 | > 为什么要在 cb 的第一参数传 error? 为什么有的 cb 第一个参数不是 error, 例如 http.createServer? 116 | 117 | - 我们首先要知道, 回调函数的第一个元素传 error 属于一个约定俗成的,而且错误优先逻辑上也是对的,比如这个回调的参数有3个,error放到最后的话就是第4个参数,回调参数不确定,error的顺序也不确定,写起来有点反人类。 118 | 119 | - http.createServer中传入的函数并不是回调函数,而是给request事件的监听函数。 120 | 121 | 122 | ### 错误栈丢失 123 | 124 | ```javascript 125 | function test() { 126 | throw new Error('test error'); 127 | } 128 | 129 | function main() { 130 | test(); 131 | } 132 | 133 | main(); 134 | ``` 135 | 136 | 可以收获报错: 137 | 138 | ```javascript 139 | /data/node-interview/error.js:2 140 | throw new Error('test error'); 141 | ^ 142 | 143 | Error: test error 144 | at test (/data/node-interview/error.js:2:9) 145 | at main (/data/node-interview/error.js:6:3) 146 | at Object. (/data/node-interview/error.js:9:1) 147 | at Module._compile (module.js:570:32) 148 | at Object.Module._extensions..js (module.js:579:10) 149 | at Module.load (module.js:487:32) 150 | at tryModuleLoad (module.js:446:12) 151 | at Function.Module._load (module.js:438:3) 152 | at Module.runMain (module.js:604:10) 153 | at run (bootstrap_node.js:394:7) 154 | ``` 155 | 156 | 可以发现报错的行数, test 函数, main 函数的调用关系都在 stack 中清晰的体现. 157 | 158 | 当你使用 setImmediate 等定时器来设置异步的时候: 159 | 160 | ```javascript 161 | function test() { 162 | throw new Error('test error'); 163 | } 164 | 165 | function main() { 166 | setImmediate(() => test()); 167 | } 168 | 169 | main(); 170 | 171 | ``` 172 | 173 | 我们发现 174 | 175 | ```javascript 176 | /data/node-interview/error.js:2 177 | throw new Error('test error'); 178 | ^ 179 | 180 | Error: test error 181 | at test (/data/node-interview/error.js:2:9) 182 | at Immediate.setImmediate (/data/node-interview/error.js:6:22) 183 | at runCallback (timers.js:637:20) 184 | at tryOnImmediate (timers.js:610:5) 185 | at processImmediate [as _immediateCallback] (timers.js:582:5) 186 | ``` 187 | 188 | 错误栈中仅输出到 test 函数内调用的地方位置, 再往上 main 的调用信息就丢失了. 也就是说如果你的函数调用深度比较深的情况下, 你使用异步调用某个函数出错了的情况下追溯这个异步的调用是一个很困难的事情, 因为其之上的栈都已经丢失了. 如果你用过 [async](https://github.com/caolan/async) 之类的模块, 你还可能发现, 报错的 stack 会非常的长而且曲折, 光看 stack 很难去定位问题. 189 | 190 | 这在项目不大/作者清楚的情况下不是问题, 但是当项目大起来, 开发人员多起来之后, 这样追溯错误会变得异常痛苦. 关于这个问题, 在上文中提到 [错误处理的最佳实践](https://cnodejs.org/topic/55714dfac4e7fbea6e9a2e5d) 中, 关于 `编写新函数的具体建议` 那一带的内容有描述到. 通过使用 [verror](https://www.npmjs.com/package/verror) 这样的方式, 让 Error 一层层封装, 并在每一层将错误的信息一层层的包上, 最后拿到的 Error 直接可以从 message 中获取用于定位问题的关键信息. 191 | 192 | 以昨天的数据为准(2017-3-13)各位只要对比一下看看 npm 上上个月 [verror](https://www.npmjs.com/package/verror) 的下载量 `1100w` 比 [express](https://www.npmjs.com/package/express) 的 `1070w` 还高. 应该就能感受到这种写法有多流行了. 193 | 194 | 对于verror,我们这里举一个例子: 195 | ```javascript 196 | const VError = require('verror') 197 | 198 | function model(json) { 199 | return JSON.parse(json) 200 | } 201 | 202 | function controller(json) { 203 | try { 204 | model(json) 205 | } catch (err) { 206 | const error = new VError(err, 'Model fail to parse json') 207 | throw error 208 | } 209 | } 210 | 211 | function routeHandler(rawJSON) { 212 | try { 213 | const data = controller(rawJSON) 214 | return data 215 | } catch (err) { 216 | const error = new VError(err, 'Controller fail to use json') 217 | throw error 218 | } 219 | } 220 | 221 | routeHandler('invalid json') 222 | ``` 223 | 224 | 此脚本将生成以下错误消息: 225 | ` 226 | VError:Controller fail to use json: Model fail to parse json: Unexpected token i in JSON at position 0 227 | ` 228 | 229 | 这比:`SyntaxError: Unexpected token i in JSON at position 0` 更明确 230 | 231 | 232 | ### uncaughtException 233 | 234 | 当异常没有被捕获一路冒泡到 Event Loop 时就会触发该事件 process 对象上的 `uncaughtException` 事件. 默认情况下, Node.js 对于此类异常会直接将其堆栈跟踪信息输出给 `stderr` 并结束进程, 而为 `uncaughtException` 事件添加监听可以覆盖该默认行为, 不会直接结束进程. 235 | 236 | ```javascript 237 | process.on('uncaughtException', (err) => { 238 | console.log(`Caught exception: ${err}`); 239 | }); 240 | 241 | setTimeout(() => { 242 | console.log('This will still run.'); 243 | }, 500); 244 | 245 | // Intentionally cause an exception, but don't catch it. 246 | nonexistentFunc(); 247 | console.log('This will not run.'); 248 | ``` 249 | 250 | #### 合理使用 uncaughtException 251 | 252 | `uncaughtException` 的初衷是可以让你拿到错误之后可以做一些回收处理之后再 process.exit. 官方的同志们还曾经讨论过要移除该事件 (详见 [issues](https://github.com/nodejs/node-v0.x-archive/issues/2582)) 253 | 254 | 所以你需要明白 `uncaughtException` 其实已经是非常规手段了, 应尽量避免使用它来处理错误. 因为通过该事件捕获到错误后, 并不代表 `你可以愉快的继续运行 (On Error Resume Next)`. 程序内部存在未处理的异常, 这意味着应用程序处于一种未知的状态. 如果不能适当的恢复其状态, 那么很有可能会触发不可预见的问题. 255 | 256 | 如果在 `.on` 指定的监听回调中报错不会被捕获, Node.js 的进程会直接终端并返回一个非零的退出码, 最后输出相应的堆栈信息. 否则, 会出现无限递归. 除此之外, 内存崩溃/底层报错等情况也不会被捕获. 257 | 258 | 所以官方建议的使用 `uncaughtException` 的正确姿势是在结束进程前使用同步的方式清理已使用的资源 (文件描述符、句柄等) 然后 process.exit. 259 | 260 | 在 uncaughtException 事件之后执行普通的恢复操作并不安全. 官方建议是另外在专门准备一个 monitor 进程来做健康检查并通过 monitor 来管理恢复情况, 并在必要的时候重启 (所以官方是含蓄的提醒各位用 pm2 之类的工具). 261 | 262 | 263 | ### unhandledRejection 264 | 265 | 当 Promise 被 reject 且没有绑定监听处理时, 就会触发该事件. 该事件对排查和追踪没有处理 reject 行为的 Promise 很有用. 266 | 267 | 该事件的回调函数接收以下参数: 268 | 269 | * `reason` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error) | `` 该 Promise 被 reject 的对象 (通常为 Error 对象) 270 | * `p` 被 reject 的 Promise 本身 271 | 272 | 例如 273 | 274 | ```javascript 275 | process.on('unhandledRejection', (reason, p) => { 276 | console.log('Unhandled Rejection at: Promise', p, 'reason:', reason); 277 | // application specific logging, throwing an error, or other logic here 278 | }); 279 | 280 | somePromise.then((res) => { 281 | return reportToUser(JSON.pasre(res)); // note the typo (`pasre`) 282 | }); // no `.catch` or `.then` 283 | ``` 284 | 285 | 以下代码也会触发 `unhandledRejection` 事件: 286 | 287 | ```javascript 288 | function SomeResource() { 289 | // Initially set the loaded status to a rejected promise 290 | this.loaded = Promise.reject(new Error('Resource not yet loaded!')); 291 | } 292 | 293 | var resource = new SomeResource(); 294 | // no .catch or .then on resource.loaded for at least a turn 295 | ``` 296 | 297 | > In this example case, it is possible to track the rejection as a developer error as would typically be the case for other 'unhandledRejection' events. To address such failures, a non-operational `.catch(() => { })` handler may be attached to resource.loaded, which would prevent the 'unhandledRejection' event from being emitted. Alternatively, the 'rejectionHandled' event may be used. 298 | 299 | 300 | 301 | ## Debugger 302 | 303 | debugger是node开发必备技巧,同时也可以用来帮助你调试源码,无论是工作还是学习,都是必须掌握的能力。 304 | 305 | 我们这里主要讲的是用vscode 来debug 306 | 307 | 运行 nodejs 代码的时候,如果带上了 `--inspect`(可以打断点) 或者 -`-inspect-brk`(可以打断点,并在首行断住) 的参数,那么 debugger 的模式就启动了一个websocket server。 308 | 309 | 然后通过websocket来进行通信。 310 | 311 | vscode里,我们在项目的根目录下设置.vscode/launch.json文件,就恶意配置调试的参数了。 312 | 313 | 常用的参数说明如下: 314 | #### attach 315 | 刚才我们已经说了,`--inspect`参数可以开启一个websocket server,按道理来说我们只要用客户端连接上去就可以进行调试了,这个attach就是附上去的意思。例如如下配置: 316 | ```javascript 317 | { 318 | "configurations": [ 319 | { 320 | "name": "Attach", 321 | "port": 3000, 322 | "request": "attach", 323 | "type": "node" 324 | } 325 | ] 326 | } 327 | ``` 328 | 然后点击vscode编辑器右侧的debug按钮,就可以连接3000端口的websocket server了。 329 | 330 | #### launch 331 | 332 | 如何客户端和服务端一起启动呢,可以借助launch参数。 333 | ```javascript 334 | { 335 | "configurations": [ 336 | { 337 | "name": "Launch", 338 | "port": 3000, 339 | "program": "${workspaceFolder}/index.js", // 启动程序入口文件 必须使用绝对路径 340 | "request": "launch", 341 | "type": "node", 342 | "skipFiles": [ 343 | "${workspaceFolder}/node_modules/**/*.js", // 调试时不进入node_modules中的程序 344 | "/**", // 跳过内部node模块程序 345 | ], 346 | } 347 | ] 348 | } 349 | ``` 350 | `${workspaceFolder}`是根目录的意思,还有很多其他变量,大家可以搜网上的vscode调试文章,也可以直接去官网看debug这一章。 351 | 352 | #### 调试ts配置 353 | ```javascript 354 | { 355 | "version": "0.2.0", 356 | "configurations": [ 357 | { 358 | "name": "ts-node", // 自定义名称 359 | "type": "node", // 内置特定执行器 360 | "request": "launch", 361 | "env": { 362 | "NODE_ENV": "test", // 设置node环境变量 process.env.NODE_ENV 可以获取到这个值 363 | }, 364 | "runtimeArgs": [ 365 | "-r", 366 | "ts-node/register", // 加载模块 ts-node/register 367 | "-r", 368 | "tsconfig-paths/register" // 加载模块 tsconfig-paths/register 369 | ], 370 | "skipFiles": [ 371 | "${workspaceFolder}/modules/assistant/node_modules/**/*.js", // 调试时跳过node_modules中的程序 必须使用绝对路径 372 | "/**", // 跳过内部node模块程序 373 | ], 374 | "cwd": "${workspaceFolder}/modules/assistant", // 对应runtimeArgs中找的模块的路径 375 | "protocol": "inspector", 376 | "program": "./test/photography.spec.ts", // 拼接在cwd的路径后面或者使用绝对路径 377 | "internalConsoleOptions": "openOnSessionStart" // 此属性控制调试会话期间调试控制台面板的可见性 378 | } 379 | ] 380 | } 381 | ``` 382 | 383 | 这里顺带提一嘴,我们前端框架是react,如何调试react项目呢,我们来一个简单的配置供大家参考: 384 | 385 | - 下载vscode插件 debugger for chrome extension 386 | - 配置文件(注意,此时的type是chrome,表示浏览器环境) 387 | ```javascript 388 | { 389 | "version": "0.2.0", 390 | "configurations": [ 391 | { 392 | "type": "chrome", 393 | "request": "launch", 394 | "name": "Launch Chrome against localhost", 395 | "url": "http://localhost:3000", 396 | "webRoot": "${workspaceRoot}" 397 | } 398 | ] 399 | } 400 | ``` 401 | 402 | 403 | 404 | -------------------------------------------------------------------------------- /src/event-async.md: -------------------------------------------------------------------------------- 1 | # 事件/异步 2 | 3 | - [`[Basic]` Promise] 4 | - [`[Doc]` Events (事件)] 5 | - [`[Doc]` Timers (定时器)] 6 | - [`[Point]` 阻塞/异步] 7 | - [`[Point]` 并行/并发] 8 | 9 | ## 简述 10 | 11 | 异步还是不异步? 这是一个问题. 12 | 13 | ## Promise 14 | 15 | Promise 问烂的题就是问你什么是宏任务,什么是微任务,有啥区别,然后上个题问你打印顺序。如下: 16 | 17 | ```javascript 18 | setTimeout(function () { 19 | console.log(1); 20 | }, 0); 21 | new Promise(function executor(resolve) { 22 | console.log(2); 23 | for (var i = 0; i < 10000; i++) { 24 | i == 9999 && resolve(); 25 | } 26 | console.log(3); 27 | }).then(function () { 28 | console.log(4); 29 | }); 30 | console.log(5); 31 | ``` 32 | 33 | 好了,热身结束,来个难点的题,这个题不会没有关系,有专门的文章帮你弄清为啥。 34 | 35 | ```javascript 36 | Promise.resolve() 37 | .then(() => { 38 | console.log(0); 39 | return Promise.resolve(4); 40 | }) 41 | .then((res) => { 42 | console.log(res); 43 | }); 44 | 45 | Promise.resolve() 46 | .then(() => { 47 | console.log(1); 48 | }) 49 | .then(() => { 50 | console.log(2); 51 | }) 52 | .then(() => { 53 | console.log(3); 54 | }) 55 | .then(() => { 56 | console.log(5); 57 | }) 58 | .then(() => { 59 | console.log(6); 60 | }); 61 | ``` 62 | 63 | 答案是:0 1 2 3 4 5 6,至于为啥,你着重要明白 64 | 65 | ```javascript 66 | .then(() => { 67 | console.log(0) 68 | return Promise.resolve(4) 69 | }) 70 | ``` 71 | 72 | 这里面其实创建了 3 个微任务,是不是有点吃惊,有兴趣的同学看下文连接的讲解吧,比饿了么的原本的问题要深入的多。 73 | https://juejin.cn/post/6950093219153575972 74 | 75 | ## Events 76 | 77 | `Events` 是 Node.js 中一个非常重要的 core 模块, 在 node 中有许多重要的 core API 都是依赖其建立的. 比如 `Stream` 是基于 `Events` 实现的, 而 `fs`, `net`, `http` 等模块都依赖 `Stream`, 所以 `Events` 模块的重要性可见一斑. 78 | 79 | 本质上这就是一个发布订阅模式的应用,可以出一个题,大致写一下发布订阅模块。我们接着看 Events 模块。 80 | 81 | 下面的题目可以作为普通面试题,很简单。 82 | 83 | 如下情况是否会死循环? 84 | 85 | ```javascript 86 | const EventEmitter = require("events"); 87 | 88 | let emitter = new EventEmitter(); 89 | 90 | emitter.on("myEvent", () => { 91 | console.log("hi"); 92 | emitter.emit("myEvent"); 93 | }); 94 | 95 | emitter.emit("myEvent"); 96 | ``` 97 | 98 | 以及这样会不会死循环? 99 | 100 | ```javascript 101 | const EventEmitter = require("events"); 102 | 103 | let emitter = new EventEmitter(); 104 | 105 | emitter.on("myEvent", function sth() { 106 | emitter.on("myEvent", sth); 107 | console.log("hi"); 108 | }); 109 | 110 | emitter.emit("myEvent"); 111 | ``` 112 | 113 | 使用 emitter 处理问题可以处理比较复杂的状态场景, 比如 TCP 的复杂状态机, 做多项异步操作的时候每一步都可能报错, 这个时候 .emit 错误并且执行某些 .once 的操作可以将你从泥沼中拯救出来. 114 | 115 | 第一个例子都会死循环,原因如下: 116 | 117 | “myEvent”设置了事件侦听器,当触发时,它将“hi”记录到控制台并再次发出“myEvent”。这将创建“myEvent”触发自身并将“hi”记录到控制台的无限循环。 118 | 119 | 120 | ## 阻塞/异步 121 | 122 | 这个出两个题进入下一小节吧: 123 | 124 | 1、如何实现一个 sleep 函数? 125 | 126 | ```javascript 127 | function sleep(ms) { 128 | return new Promise((resolve) => setTimeout(resolve, ms)); 129 | } 130 | ``` 131 | 132 | 2、如何实现一个异步的 reduce? (注:不是异步完了之后同步 reduce) 133 | 134 | 需要了解 reduce 的情况, 是第 n 个与 n+1 的结果异步处理完之后, 在用新的结果与第 n+2 个元素继续依次异步下去 135 | 136 | ```javascript 137 | function asyncReduce(listPromise) { 138 | listPromise.reduce((pre, next) => { 139 | return pre.then(() => listPromise()); 140 | }, Promise.resolve()); 141 | } 142 | ``` 143 | 144 | ## Event loop 145 | 146 | 一般会问浏览器和nodejs里的event loop分别是啥。 147 | 148 | 我们简单概述一下: 149 | 150 | 为什么浏览器有event loop这个东西。 151 | 152 | 我们知道javascript为了简化操作难度,设计为单线程,为啥单线程能降低操作难度呢? 153 | 154 | 假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准? 155 | 156 | 所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。 157 | 158 | 问题又来了,如果单线程的话,定时器和网络请求阻塞,我们js等半天,这用户体验也太差了吧。 159 | 160 | 所以就需要一个处理异步的机制,把 JS 代码分为同步和异步任务。 161 | 162 | 定时器、网络请求其实都是在别的线程执行的,执行完了之后把结果放在任务队列里,主线程一直循环,反正异步任务队列有东西就取出来。 163 | 164 | 这很像订阅发布模式,订阅事件,调用回调,所以事件就像任务一样,我们这个loop称之为event loop。 165 | 166 | 而此时浏览器为了能够让异步任务队列有优先级之分,也就是优先级高的先执行,就设计了宏任务和微任务,典型的宏任务就是setTimeout和setInterval,微任务就是promise后then注册的微任务。 167 | 168 | 这就是浏览器event loop的基本面貌。 169 | 170 | 171 | 172 | 设计 Loop 机制和 Task 队列是为了支持异步,解决逻辑执行阻塞主线程的问题,设计 MicroTask 队列的插队机制是为了解决高优任务尽早执行的问题 173 | 174 | ``` 175 | ┌───────────────────────┐ 176 | ┌─>│ timers │ 177 | │ └──────────┬────────────┘ 178 | │ ┌──────────┴────────────┐ 179 | │ │ I/O callbacks │ 180 | │ └──────────┬────────────┘ 181 | │ ┌──────────┴────────────┐ 182 | │ │ idle, prepare │ 183 | │ └──────────┬────────────┘ ┌───────────────┐ 184 | │ ┌──────────┴────────────┐ │ incoming: │ 185 | │ │ poll │<─────┤ connections, │ 186 | │ └──────────┬────────────┘ │ data, etc. │ 187 | │ ┌──────────┴────────────┐ └───────────────┘ 188 | │ │ check │ 189 | │ └──────────┬────────────┘ 190 | │ ┌──────────┴────────────┐ 191 | └──┤ close callbacks │ 192 | └───────────────────────┘ 193 | ``` 194 | 195 | 关于事件循环, Timers 以及 nextTick 的关系详见官方文档 The Node.js Event Loop, Timers, and process.nextTick(): [英文](https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/), [论坛中文讨论](https://cnodejs.org/topic/57d68794cb6f605d360105bf) 以及 [Tasks, microtasks, queues and schedules](https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/) 196 | 197 | ## 并行/并发 198 | 199 | 并行 (Parallel) 与并发 (Concurrent) 是两个很常见的概念. 200 | 201 | 可以看 Erlang 作者 Joe Armstrong 的博客 ([Concurrent and Parallel](http://joearms.github.io/2013/04/05/concurrent-and-parallel-programming.html)) 202 | 203 | ![con_and_par](http://joearms.github.io/images/con_and_par.jpg) 204 | 205 | 并发 (Concurrent) = 2 队列对应 1 咖啡机. 206 | 207 | 并行 (Parallel) = 2 队列对应 2 咖啡机. 208 | 209 | Node.js 通过事件循环来挨个抽取事件队列中的一个个 Task 执行, 从而避免了传统的多线程情况下 `2个队列对应 1个咖啡机` 的时候上下文切换以及资源争抢/同步的问题, 所以获得了高并发的成就. 210 | 211 | 至于在 node 中并行, 你可以通过 cluster 来再添加一个咖啡机. 212 | -------------------------------------------------------------------------------- /src/image.wx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/image.wx.png -------------------------------------------------------------------------------- /src/io.md: -------------------------------------------------------------------------------- 1 | # IO 2 | 3 | * [Buffer] 4 | * [String Decoder (字符串解码)] 5 | * [File System (文件系统)] 6 | * [Readline] 7 | 8 | 9 | # 简述 10 | 11 | Node.js 是以 IO 密集型业务著称. 那么问题来了, 你真的了解什么叫 IO, 什么又叫 IO 密集型业务吗? 12 | 13 | ## 什么是IO? 14 | 15 | 在计算机系统中I/O就是输入(Input)和输出(Output)的意思,针对不同的操作对象,可以划分为磁盘I/O模型,网络I/O模型,内存映射I/O, Direct I/O、数据库I/O等,只要具有输入输出类型的交互系统都可以认为是I/O系统,也可以说I/O是整个操作系统数据交换与人机交互的通道,这个概念与选用的开发语言没有关系,是一个通用的概念。 16 | 17 | ## 什么是IO密集型 18 | 19 | IO密集型指的是系统的CPU性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,此时CPU Loading并不高 20 | 21 | ## Buffer 22 | 23 | 在 Node.js 中,Buf所以说,Buffer 的本质就是一个继承自 Uint8Array 的子类fer 存在于 buffer 内置模块中。不过现在的 Node.js 也已经直接把 Buffer 挂载在了 globalThis 上,也就是说我们可以全局直接使用Buffer对象,而不需要require引入。 24 | 25 | Buffer 的本质就是一个继承自 Uint8Array 的子类。 26 | 27 | ```javascript 28 | const a = Buffer.from('123'); 29 | console.log(a instanceof Unit8Array); // true 30 | console.log(a.byteOffset); // 16 31 | console.log(a.buffer); // ArrayBuffer { byteLength: 8192, ... } 32 | ``` 33 | 34 | Buffer 是 Node.js 中用于处理二进制数据的类, 其中与 IO 相关的操作 (网络/文件等) 均基于 Buffer. Buffer 类的实例非常类似整数数组, ***但其大小是固定不变的***, 并且其内存在 V8 堆栈外分配原始内存空间. Buffer 类的实例创建之后, 其所占用的内存大小就不能再进行调整. 35 | 36 | 在 Node.js v6.x 之后 `new Buffer()` 接口开始被废弃, 理由是参数类型不同会返回不同类型的 Buffer 对象, 所以当开发者没有正确校验参数或没有正确初始化 Buffer 对象的内容时, 以及不了解的情况下初始化 就会在不经意间向代码中引入安全性和可靠性问题. 37 | 38 | 接口|用途 39 | ---|--- 40 | Buffer.from()|根据已有数据生成一个 Buffer 对象 41 | Buffer.alloc()|创建一个初始化后的 Buffer 对象 42 | Buffer.allocUnsafe()|创建一个未初始化的 Buffer 对象 43 | 44 | 其实Buffer.alloc的创建就是使用的Unit8Array。 45 | 46 | 47 | 48 | ### TypedArray 49 | 50 | Node.js 的 Buffer 在 ES6 增加了 TypedArray 类型之后, 修改了原来的 Buffer 的实现, 选择基于 TypedArray 中 Uint8Array 来实现, 从而提升了一波性能. 51 | 52 | 使用上, 你需要了解如下情况: 53 | 54 | ```javascript 55 | const arr = new Uint16Array(2); 56 | arr[0] = 5000; 57 | arr[1] = 4000; 58 | 59 | const buf1 = Buffer.from(arr); // 拷贝了该 buffer 60 | const buf2 = Buffer.from(arr.buffer); // 与该数组共享了内存 61 | 62 | console.log(buf1); 63 | // 输出: , 拷贝的 buffer 只有两个元素 64 | console.log(buf2); 65 | // 输出: 66 | 67 | arr[1] = 6000; 68 | console.log(buf1); 69 | // 输出: 70 | console.log(buf2); 71 | // 输出: 72 | ``` 73 | 74 | ## String Decoder 75 | 76 | 字符串解码器 (String Decoder) 是一个用于将 Buffer 拿来 decode 到 string 的模块, 是作为 Buffer.toString 的一个补充, 它支持多字节 UTF-8 和 UTF-16 字符. 例如 77 | 78 | ```javascript 79 | const StringDecoder = require('string_decoder').StringDecoder; 80 | const decoder = new StringDecoder('utf8'); 81 | 82 | const cent = Buffer.from([0xC2, 0xA2]); 83 | console.log(decoder.write(cent)); // ¢ 84 | 85 | const euro = Buffer.from([0xE2, 0x82, 0xAC]); 86 | console.log(decoder.write(euro)); // € 87 | ``` 88 | 89 | stringDecoder.write 会确保返回的字符串不包含 Buffer 末尾残缺的多字节字符,残缺的多字节字符会被保存在一个内部的 buffer 中用于下次调用 stringDecoder.write() 或 stringDecoder.end()。 90 | 91 | ```javascript 92 | const StringDecoder = require('string_decoder').StringDecoder; 93 | const decoder = new StringDecoder('utf8'); 94 | 95 | decoder.write(Buffer.from([0xE2])); 96 | decoder.write(Buffer.from([0x82])); 97 | console.log(decoder.end(Buffer.from([0xAC]))); // € 98 | ``` 99 | 100 | ## File 101 | 102 | “一切皆是文件”是 Unix/Linux 的基本哲学之一, 不仅普通的文件、目录、字符设备、块设备、套接字等在 Unix/Linux 中都是以文件被对待, 也就是说这些资源的操作对象均为 fd (文件描述符), 都可以通过同一套 system call 来读写. 在 linux 中你可以通过 ulimit 来对 fd 资源进行一定程度的管理限制. 103 | 104 | Node.js 封装了标准 POSIX 文件 I/O 操作的集合. 通过 require('fs') 可以加载该模块. 该模块中的所有方法都有异步执行和同步执行两个版本. 你可以通过 fs.open 获得一个文件的文件描述符. 105 | 106 | ### fs 文件系统模块 107 | #### 什么是fs文件模块系统? 108 | 109 | fs 模块是 Node.js 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求,该模块的所有方法都有同步和异步两种方式。 110 | 111 | JavaScript 的是没有操作文件的能力,但是 Node 是可以做到的,Node 提供了操作文件系统模块,是 Node 中使用非常重要和高频的模块,是绝对要掌握的一个模块系统。 112 | 113 | fs 模块中所有的操作都有两种形式可供选择:同步和异步 114 | 115 | - 同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码 116 | - 异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回,然后可以立即向下执行代码 117 | 118 | - 打开文件 119 | 120 | - 格式 : fs.open(path, flags[, mode], callback) 121 | - path : 文件的路径 122 | - flags : 文件打开的行为。具体值详见下方表格 123 | - mode : 设置文件模式(权限),文件创建默认权限为 0666(可读,可写) 124 | - callback : 回调函数,带有两个参数如:callback(err, fd) 125 | 126 | 打开模式(flags) 说明 127 | ``` 128 | r 以读取模式打开文件。如果文件不存在抛出异常。 129 | r+ 以读写模式打开文件。如果文件不存在抛出异常。 130 | rs 以同步的方式读取文件。 131 | rs+ 以同步的方式读取和写入文件。 132 | w 以写入模式打开文件,如果文件不存在则创建。 133 | wx 类似 ‘w’,但是如果文件路径存在,则文件写入失败。 134 | w+ 以读写模式打开文件,如果文件不存在则创建。 135 | wx+ 类似 ‘w+’, 但是如果文件路径存在,则文件读写失败。 136 | a 以追加模式打开文件,如果文件不存在则创建。 137 | ax 类似 ‘a’, 但是如果文件路径存在,则文件追加失败。 138 | a+ 以读取追加模式打开文件,如果文件不存在则创建。 139 | ax+ 类似 ‘a+’, 但是如果文件路径存在,则文件读取追加失败。 140 | ``` 141 | 示例代码: 142 | ```javascript 143 | const fs = require('fs') 144 | fs.open('./file/new成绩.txt','r+',function(err,result) { 145 | if(err) { 146 | return console.log('打开文件失败' + err.message); 147 | } 148 | console.log('打开文件成功' + result); 149 | }) 150 | ``` 151 | 152 | 在这里,首先要导入fs模块,node中导入模块需要使用内置的require()方法,这里的回调函数中,如果文件存在的话err会返回null,在js中null会默认转换为false,如果文件不存在的话,则err会返回一个错误对象,错误对象会转化为true,从而在这里去写一个判断输出逻辑! 153 | 154 | - 获取文件信息 155 | 156 | - 语法格式 : fs.stat(path, callback) 157 | - path : 文件路径 158 | - callback : 回调函数,带有两个参数如:(err, stats), stats 是 fs.Stats 对象。 159 | 160 | - stats类中的方法: 161 | 162 | - stats.isFile() 如果是文件返回 true,否则返回 false。 163 | - stats.isDirectory() 如果是目录返回 true,否则返回 false。 164 | 示例代码: 165 | ``` 166 | const fs = require('fs') 167 | fs.stat('./file/new成绩.txt', function (err, stats) { 168 | if (err) { 169 | return console.error(err); 170 | } 171 | console.log("读取文件信息成功!"); 172 | // 检测文件类型 173 | console.log("是否为文件(isFile) ? " + stats.isFile()); 174 | console.log("是否为目录(isDirectory) ? " + stats.isDirectory()); 175 | }); 176 | ``` 177 | 178 | 179 | 获取文件信息用的更多的方法是isFile()和isDirectory(),主要是来判断该文件是否属于文件或者是否属于目录! 180 | 181 | - 读取文件 182 | - 语法格式 : fs.readFile(path[, options], callback) 183 | 184 | - path:文件路径 185 | 186 | - options:配置选项,若是字符串则指定编码格式 187 | - encoding:编码格式 188 | - flag:打开方式 189 | - callback:回调函数 190 | - err:错误信息 191 | - data:读取的数据,如果未指定编码格式则返回一个 Buffer 192 | 示例代码 : 193 | ``` 194 | const fs = require('fs') 195 | fs.readFile('./file/11.txt','utf-8',function(err,data) { 196 | console.log(err); 197 | console.log('--------'); 198 | console.log(data); 199 | }) 200 | ``` 201 | 202 | 203 | - 写入文件 204 | - 语法格式 : fs.writeFile(file, data[, options], callback) 205 | - file:文件路径 206 | - data:写入内容 207 | - options:配置选项,包含 encoding, mode, flag;若是字符串则指定编码格式 208 | - callback:回调函数 209 | 210 | 示例代码 : 211 | ``` 212 | const fs = require('fs') 213 | 214 | fs.writeFile('./file/2.txt','hello node.js','utf-8',function(err,data) { 215 | //如果文件写入成功,则err的值等于null null可以转化为false 216 | //如果写入文件失败,则err是一个错误对象 217 | console.log(err); 218 | if(err) { 219 | return console.log('文件写入失败' + err.message); 220 | } 221 | console.log('文件写入成功'); 222 | }) 223 | ``` 224 | - 路径动态拼接问题 225 | 226 | - 在使用 fs 模块操作文件时,如果提供的操作路径是以./ 或 ../开头的相对路径时,容易出现路径动态拼接错误的问题 227 | - 原因:代码在运行的时候,会以执行 node 命令时所处的目录,动态拼接出被操作文件的完整路径 228 | - 解决方案:在使用 fs 模块操作文件时,直接提供完整的路径,从而防止路径动态拼接的问题 229 | 230 | 示例代码 : 231 | ``` 232 | const fs = require('fs') 233 | fs.readFile(`${__dirname}/file/11.txt`,'utf-8',function(err,data) { 234 | if(err) { 235 | return console.log('文件读取失败' + err.message); 236 | } 237 | console.log(__dirname); //D:\node复盘\01 238 | console.log('文件读取成功!' + data); 239 | }) 240 | ``` 241 | 242 | 243 | 在这里打印了__dirname,我们可以发现,打印出来的路径和我们终端打开文件的绝对路径是一样的,所以这样的话就可以解决我们有时候使用../或./时出现的路径问题了! 244 | 245 | - 其他操作 246 | 验证路径是否存在: 247 | ``` 248 | fs.exists(path, callback) 249 | fs.existsSync(path) 250 | ``` 251 | 删除文件: 252 | ``` 253 | fs.unlink(path, callback) 254 | fs.unlinkSync(path) 255 | ``` 256 | 列出文件: 257 | ``` 258 | fs.readdir(path[,options], callback) 259 | fs.readdirSync(path[, options]) 260 | ``` 261 | 截断文件: 262 | ``` 263 | fs.truncate(path, len, callback) 264 | fs.truncateSync(path, len) 265 | ``` 266 | 建立目录: 267 | ``` 268 | fs.mkdir(path[, mode], callback) 269 | fs.mkdirSync(path[, mode]) 270 | ``` 271 | 删除目录: 272 | ``` 273 | fs.rmdir(path, callback) 274 | fs.rmdirSync(path) 275 | ``` 276 | 重命名文件和目录: 277 | ``` 278 | fs.rename(oldPath, newPath, callback) 279 | fs.renameSync(oldPath, newPath) 280 | ``` 281 | 监视文件更改: 282 | ``` 283 | fs.watchFile(filename[, options], listener) 284 | ``` 285 | 关闭文件 : 286 | ``` 287 | fs.close(fd, callback) 288 | ``` 289 | ### 文件监听 290 | 文件监听是非常常用的功能,比如我们修改了文件后webpack重新打包代码或者Node.js服务重启,都用到了文件监听的功能,Node.js提供了两套文件监听的机制。 291 | 292 | #### 基于轮询的文件监听机制 293 | 基于轮询机制的文件监听API是watchFile。 294 | 295 | 基于轮询的监听文件机制本质上是不断轮询文件的元数据,然后和上一次的元数据进行对比,如果有不一致的就认为文件变化了,因为第一次获取元数据时,还没有可以对比的数据,所以不认为是文件变化,这时候开启一个定时器。隔一段时间再去获取文件的元数据,如此反复,直到用户调stop函数停止这个行为。 296 | 297 | #### 基于inotify的文件监听机制 298 | 299 | 我们看到基于轮询的监听其实效率是很低的,因为需要我们不断去轮询文件的元数据,如果文件大部分时间里都没有变化,那就会白白浪费CPU。如果文件改变了会主动通知我们那就好了,这就是基于inotify机制的文件监听。Node.js提供的接口是watch。watch的实现和watchFile的比较类似 300 | 301 | ### Promise Fs模块 302 | Node.js V14中,文件模块支持了Promise化的api。我们可以直接使用await进行文件操作。我们看一下使用例子。 303 | ``` 304 | const { open, readFile } = require('fs').promises; 305 | async function runDemo() { 306 | try { 307 | console.log(await readFile('11111.md', { encoding: 'utf-8' })); 308 | } catch (e){ 309 | 310 | } 311 | } 312 | runDemo(); 313 | ``` 314 | 315 | 316 | ## Readline 317 | 318 | `readline` 模块提供了一个用于从 Readble 的 stream (例如 process.stdin) 中一次读取一行的接口. 当然你也可以用来读取文件或者 net, http 的 stream, 319 | 320 | 我们了解一下readline的机制: 321 | - 读取数据:Readline模块从给定的可读流中读取数据,并将数据缓存在内存中,以便进行分行处理。 322 | 323 | - 分行处理:一旦有足够的数据被读取到缓存中,Readline模块将尝试将其按行进行分割。这通常是通过在数据中查找换行符("\n")或回车符("\r")来实现的。 324 | 325 | - 触发事件:每当一行数据被成功读取并分割后,Readline模块将触发一个“line”事件,并将该行数据作为参数传递给该事件的回调函数。这样,应用程序可以在每次读取新数据时立即对其进行处理。 326 | 327 | - 处理用户输入:除了读取数据外,Readline模块还提供了一个接口,用于处理用户的命令行输入。这通常是通过监听“line”事件来实现的。一旦用户输入了一行文本并按下回车键,Readline模块将触发“line”事件,并将该行文本作为参数传递给该事件的回调函数。这样,应用程序就可以根据用户的输入执行相应的操作。 328 | 329 | 330 | 举一个例子, 331 | 332 | ### 如何读取用户输入 333 | 有两种方法可以从Readline实例中读取用户输入:使用question()方法和监听line事件。接下来我们将分别介绍这两种方法。 334 | 335 | ### 使用question()方法 336 | question()方法是Readline模块提供的一个便捷的方法,可以在命令行中输出一个提示符,并等待用户输入。一旦用户输入了一行文本并按下回车键,该方法将返回一个Promise对象,该对象的值是用户输入的文本。 337 | 338 | ``` 339 | const readline = require('readline'); 340 | const rl = readline.createInterface({ 341 | input: process.stdin, 342 | output: process.stdout 343 | }); 344 | 345 | rl.question('What is your name? ', (name) => { 346 | console.log(`Hello, ${name}!`); 347 | rl.close(); 348 | }); 349 | 350 | ``` 351 | 上述代码使用question()方法输出一个提示符,并等待用户输入姓名。一旦用户输入了姓名并按下回车键,该方法将调用回调函数,并将用户输入的姓名作为参数传递给它。在此示例中,我们将用户输入的姓名作为参数,输出一条欢迎消息,并调用close()方法关闭Readline实例。 352 | -------------------------------------------------------------------------------- /src/jsjzcyl.md: -------------------------------------------------------------------------------- 1 | ## 前言 2 | 3 | 以下题目是有 60%是我以前面试前端真的遇到的面试题。例如,成都的字节,阿里,北京的阿里,腾讯还有一些中小公司。 4 | 5 | ## 如需要简单补一下计算机组成原理,请看我之前的文章 6 | 7 | [【重磅升级!】写给前端非科班的「计算机组成原理」!!!](https://juejin.cn/post/6990652014862532622) 8 | 9 | 感谢 star,是我完善文档的动力 10 | 11 | ## 什么是补码?有什么用?(成都字节) 12 | 13 | 补码是计算机中用来表示负数的一种方法。在计算机中,所有的数据都是以二进制的形式存储的,而补码就是一种将负数转化为二进制的方法。 14 | 15 | 在补码表示法中,正数的补码与其二进制表示形式相同。负数的补码由对应正数的补码按位取反(即 0 变为 1,1 变为 0),然后再加 1 得到。这种表示方式使得负数的加法与正数的加法可以使用相同的硬件电路进行计算,简化了计算机的设计。 16 | 17 | 举例: 18 | 在 JavaScript 中,可以使用按位非(~)运算符来实现取反操作,使用按位与(&)运算符来实现加 1 操作。以下是一个实现减法运算的例子: 19 | 20 | ```javascript 21 | function subtract(a, b) { 22 | b = ~b + 1; 23 | return a + b; 24 | } 25 | ``` 26 | 27 | ## 一个中文占多少字节?这个跟编码有什么关系?Unicode 跟编码有什么关系?js 是什么编码?(北京阿里) 28 | 29 | 一个中文字符占用多少字节跟编码密切相关,不能直接说一个中文占 2 个或者 3 个字节,比如 UTF-8 编码下一个中文字符占用 3 个字节。 30 | 31 | Unicode 是一种字符集,它定义了每个字符对应的唯一编号,但是并没有规定如何存储这些字符。编码则是将字符集中的字符转换为字节序列的方法。 32 | 33 | 在 JavaScript 中,通常使用 UTF-16 编码。 34 | 35 | ## 为什么 0.1 + 0.2 不等于 0.3?请结合 IEEE 标准来说,如何避免这种计算误差 (深圳腾讯) 36 | 37 | 在计算机中,浮点数的表示采用的是 IEEE 754 标准。在这个标准中,浮点数被表示为一个符号位、一个阶码和一个尾数的组合。 38 | 39 | 其中,符号位表示正负,阶码表示指数,尾数表示小数部分。对于单精度浮点数,符号位占 1 位,阶码占 8 位,尾数占 23 位。对于双精度浮点数,符号位占 1 位,阶码占 11 位,尾数占 52 位。 40 | 41 | 在 IEEE 754 标准中,浮点数的表示是有限的,而 0.1 和 0.2 在二进制下是无限循环小数。 42 | 43 | 因此,它们在转换为浮点数时会被截断为一个近似值。这个近似值与 0.3 的近似值不相等,因此 0.1 + 0.2 不等于 0.3。 44 | 45 | 避免方法可以使用将数字转化为字符串,然后模拟加法运算,一些库就是这样实现的,可以完全避免出现误差。(千万别说可以用乘法转换为整数做运算,也一样会有误差) 46 | 47 | 也可以使用 NumberFormat API(兼容 IE11),完全可以用到生产环境 48 | 49 | ``` 50 | const nf = new Intl.NumberFormat('en-US', { minimumFractionDigits: 1 }); 51 | const result = nf.format(0.1 + 0.2); 52 | console.log(result); // "0.3" 53 | ``` 54 | 55 | ## 进制转换:任意进制如何转化为十进制(北京百度) 56 | 57 | 例如:2 进制 101.1 如何转化为 10 进制。(有些同学觉得可以用 parseInt('101.1', 2),这个是不行的,因为 parseInt 返回整数) 58 | 转化方法如下(按权相加法): 59 | 60 | ``` 61 | 2进制的 101.1 = 1 x 22 + 0 x 21 + 1 x 20 + 1 x 2-1 62 | ``` 63 | 64 | 规律就是二进制的每个数去乘以 2 的相应次方,注意小数点后是乘以它的负相应次方。 65 | 66 | ## 进制转换:十进制整数转为任意进制(北京百度) 67 | 68 | 例如: 69 | 把 89 化为二进制的数 70 | 71 | ``` 72 | 89÷2=44 余1 73 | 44÷2=22 余0 74 | 22÷2=11 余0 75 | 11÷2=5 余1 76 | 5÷2=2 余1 77 | 2÷2=1 余0 78 | 1÷2=0 余1 79 | ``` 80 | 81 | 然后把余数由下往上排序 82 | `1011001` 83 | 这样就把 89 化为二进制的数了 84 | 85 | ## 进制转换:十进制小数转为 n 进制 86 | 87 | 我们还是以 2 进制为例,方式是采用“乘 2 取整,顺序排列”法。具体做法是: 88 | 89 | - 用 2 乘十进制小数,可以得到积,将积的整数部分取出- 90 | - 再用 2 乘余下的小数部分,又得到一个积,再将积的整数部分取出- 91 | - 如此进行,直到积中的小数部分为零,或者达到所要求的精度为止 92 | 93 | 所以 n 进制是一个道理 94 | 我们具体举一个例子 95 | 如: 十进制 0.25 转为二进制 96 | 97 | ``` 98 | 0.25 * 2 = 0.5 取出整数部分:0 99 | 0.5 * 2 = 1.0 取出整数部分1 100 | ``` 101 | 102 | 即十进制 0.25 的二进制为 0.01 ( 第一次所得到为最高位,最后一次得到为最低位) 103 | -------------------------------------------------------------------------------- /src/linux.md: -------------------------------------------------------------------------------- 1 | ## 前言 2 | 3 | 题目均是真题,职位为Node.js开发、全栈(node.js + react)、大前端(需要会node.js的前端职位)中的关于linux的面试题。 4 | 5 | 我是为了拓宽自己的将来的就业面哈哈,其实本质来说完全具备全栈的能力了,所以总结一波node.js相关的面试题,整体难度偏初级和中级。既然是服务端,linux基础命令的问题肯定跑不脱。 6 | 7 | 本文记录在[node面试题系列里](https://github.com/lio-mengxiang/node-interview) 8 | ## 频率最高的题:请说一下你常用的linux命令 9 | 10 | 这个自由发挥吧,常用的不就是cd、ls、vim这些命令吗。。。 不过你不是非常熟悉的命令不要说,面试官会接着问,比如你说ps命令,他会问ps -ef和ps -aux的差别等等 11 | 12 | 13 | ## LINUX这边常用的查看日志的指令 14 | 15 | 1. `tail`: 用于查看日志文件的末尾内容,通常用于实时监控日志文件的变化,常与`-f`选项一起使用,实时输出新增的日志信息。例如,`tail -f /var/log/syslog`可以实时查看系统日志文件的更新内容。 16 | 1. `grep`: 用于在文本中搜索指定的模式,通常用于从日志文件中查找特定的信息。例如,`grep "error" /var/log/syslog`可以查找系统日志文件中包含"error"关键词的信息。 17 | 18 | 切记: 实时输出新增的日志信息是一个非常实用的命令,并且面试很常见,一定要记住。 19 | 20 | ## LINUX怎么杀掉一个进程 21 | 22 | 常见的就是 kill -15 pid 23 | 24 | 面试官会追问如何强杀一个进程,可以用 kill -9 pid, 我们顺便普及一下kill和信号是什么. 25 | 26 | ### 常见的信号 27 | 28 | 上面的 -9代表的是SIGKILL信号,-15代表的是SIGTERM信号,我们在使用nodejs的时候,通常会有在写代码时,可能执行退出命令,这时候就需要传一个信号量,就可以用我们这里的学到的9和15传递给它。 29 | 30 | > 在 Node.js 中,`process.exit()` 方法用于终止当前进程,传递给该方法的数字参数表示进程的退出码。在这种情况下,`process.exit(15)` 和 `process.exit(2)` 的区别在于它们返回的退出码不同。 31 | 32 | > 在 Unix/Linux 系统中,15 号信号(SIGTERM)表示终止进程的请求,而 2 号信号(SIGINT)表示中断进程的请求。因此,`process.exit(15)` 表示进程接收到终止请求,而 `process.exit(2)` 表示进程接收到中断请求。 33 | 34 | 简单来说SIGTERM:当前进程接收到这个信号时,大多会先释放自己的资源,再停止进程,属于正常关闭。但有时候,可能这个进程正在进行一些I/O操作所以不能立即关闭。 35 | 36 | 这时候SIGKILL:属于强制关闭进程,不管你现在是啥情况。 37 | 38 | ## linux下进程间通信方式?管道、共享内存什么场景下会用?两个进程不在同一个机器如何通信? 39 | 40 | 1. 管道(Pipe):管道是一种半双工的通信方式,通常用于父子进程之间或者兄弟进程之间的通信。它的特点是只能在具有亲缘关系的进程之间使用,而且数据只能在一个方向上流动。 41 | 1. 命名管道(Named Pipe):命名管道是一种特殊的文件,可以被多个进程共享访问,可以用于非亲缘关系进程之间的通信。 42 | 1. 共享内存(Shared Memory):共享内存是一种快速的进程间通信方式,它将一段内存区域映射到多个进程的地址空间中,多个进程可以直接读写这段共享内存,以达到高效的通信目的。 43 | 1. 消息队列(Message Queue):消息队列是一种基于消息的通信方式,它允许进程将消息发送到一个队列中,供其他进程读取。 44 | 1. 套接字(Socket):套接字是一种通用的进程间通信方式,可以在本地或者远程不同的主机之间通信。 45 | 46 | 对于管道和共享内存,它们的使用场景如下: 47 | 48 | 1. 管道适用于数据流式的场景,比如父子进程之间的通信,或者进程输出传递给另一个进程进行处理等。 49 | 1. 共享内存适用于大量数据的读写场景,比如多个进程需要频繁地读写共享的数据区域,共享内存可以提高数据传输的效率。(在nodejs中主要体现在sharedArrayBufferr实现多个worker共享数据) 50 | 51 | 这里补充一下,node.js在linux下使用了Socket实现了IPC,并且内部它们与网络 socket 的行为比较类似,属于双向通信。不同的是它们在系统内核中就完成了进程间的通信,而不经过实际的网络层,非常高效。在 Node 中,IPC 通道被抽象为 Stream 对象。 52 | 53 | 不在一个机器可以使用socket通信,比如使用nodejs的net模块。 54 | 55 | ## 进程通信:信号、信号量是什么,进程间通信消息队列机制的本质是什么? 56 | 57 | 信号是IPC通信的一种机制,信号量是一种用于进程间同步和互斥的机制。 58 | 59 | 信号(Signal)是一种在进程间通信中用于处理异步事件的机制。当某个进程需要向另一个进程发送通知时,可以通过向该进程发送信号来实现。信号是一种软件中断,可以被操作系统或其他进程发送,并被接收进程处理。 60 | 61 | Linux 中常见的信号包括 `SIGINT`、`SIGTERM`、`SIGKILL` 等,这些信号通常用于终止进程或处理其他进程间的通知事件。 62 | 63 | 信号量(Semaphore)是一种用于进程间同步和互斥的机制。它是一个计数器,用于控制多个进程对共享资源的访问。当一个进程进入临界区时,它会将信号量的值减一,表示已经使用了共享资源;当进程退出临界区时,它会将信号量的值加一,表示该共享资源已经释放。其他进程可以通过等待信号量变为可用状态,然后再进入临界区。 64 | 65 | ### 进程间通信消息队列机制的本质 66 | 67 | 消息队列是 Linux 进程间通信的一种方式,它允许多个进程通过向共享的队列中发送和接收消息来进行通信。 68 | 69 | 在 Linux 中,消息队列本质上是由内核维护的一段缓冲区,是存放在内存中的消息链表。 70 | 71 | - 消息队列允许一个或多个进程向它写入或读取消息。 72 | - 消息队列可以实现消息的「随机查询」,不一定非要以先进先出的次序读取消息,也可以按消息的类型读取。比有名管道的先进先出原则更有优势。 73 | - 消息队列的生命周期随内核,如果没有释放消息队列或者没有关闭操作系统,消息队列就会一直存在。而匿名管道随进程的创建而建立,随进程的结束而销毁。 74 | 75 | ## 如何查看linux进程信息,其中vsz和rss有什么区别? 76 | 77 | 我一般是用 ps -aux,能看到的信息更全一些。 78 | 79 | 其中ps -aux 命令会显示vsz和rss两个指标的信息,简单来说rss就是程序实际上使用的内存,包括堆栈,动态链接库和本身正在内存里的代码大小。vsz会更大一些,因为它不管你实际用到多少,而是你整个代码引用了哪些动态链接库,使用了的全部代码,不管有没有在内存(有些存在磁盘上),都算进来了,并且vsz还包括了虚拟内存。 80 | 81 | 82 | 所以整体来看rss更能反映真实的代码内存占用情况。 83 | 84 | 85 | **示例如下:** 86 | 87 | 88 | 假设进程A的二进制文件是500K,并且链接了一个2500K的动态库,堆和栈共使用了200K,其中100K在内存中(剩下的被换出或者不再被使用),一共加载了动态库中的1000K内容以及二进制文件中的400K内容至内存中,那么: 89 | 90 | ``` 91 | RSS: 400K + 1000K + 100K = 1500K 92 | 93 | VSZ: 500K + 2500K + 200K = 3200K 94 | ``` 95 | 96 | ## Linux文件描述符是什么 97 | 98 | 一个 Linux 进程启动后,会在内核空间中创建一个 PCB 控制块,PCB 内部有一个文件描述符表(File descriptor table),记录着当前进程所有可用的文件描述符,即当前进程所有打开的文件。 99 | 100 | 101 | 除了文件描述符表,系统还需要维护另外两张表: 102 | 103 | 104 | - 打开文件表(Open file table) 105 | - i-node 表(i-node table) 106 | 107 | 108 | 文件描述符表每个进程都有一个,打开文件表和 i-node 表整个系统只有一个,它们三者之间的关系如下图所示。 109 | 110 | 111 | 112 | ![Linux文件描述符表示意图](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/34f8b17928164e9295598f3872b49268~tplv-k3u1fbpfcp-zoom-1.image) 113 | 114 | 115 | 从本质上讲,这三种表都是结构体数组,0、1、2、73、1976 等都是数组下标。表头只是我自己添加的注释,数组本身是没有的。实线箭头表示指针的指向,虚线箭头是我自己添加的注释。 116 | 117 | **你看,文件描述符只不过是一个数组下标吗!** 118 | 119 | 所以最终文件描述符找到了i-node表里的对应信息。 120 | 121 | inode 表包含文件名、文件大小、文件创建时间、文件所有者、文件权限等。每个文件在文件系统中都有唯一的 inode 号,通过 inode 号可以找到该文件的所有元数据和数据块信息。当进程打开一个文件时,内核会从文件系统中查找该文件对应的 inode 号,并将其记录在文件的表项中,以便进行后续的文件操作。 122 | 123 | ## linux查找文件的指令 124 | 125 | find命令,常见的使用 -name 根据文件名查询,或者 -size 根据文件大小查询。 126 | 127 | ### 将当前目录及其子目录下所有最近 20 天内更新过的文件列出: 128 | ``` 129 | 130 | find . -ctime 20 131 | ``` 132 | 133 | ## Linux下查看网络端口? 134 | 135 | 一般都是用netstat,我简单来讲一下这个命令吧,这个也是非常容易考到的题。 136 | 137 | ### 含义: 138 | 139 | netstat命令用于显示网络状态,在工作中经常要查看端口的占用情况,比如启动一个应用避免端口冲突。 140 | 141 | 常用参数: 142 | 143 | - -t 显示tcp传输协议的连接情况 144 | - -u 显示udp传输协议的连接状况 145 | - -l 表示listening,显示正在监听状态的服务,也可以用-a表示所有状态 146 | - -n: 表示numeric,用数字形式显示端口号 147 | - -p:表示process 表示显示后台进程 148 | 149 | 常用组合: neststat -lntp 150 | 151 | 152 | 153 | ## Linux下查看负载情况? 154 | 155 | 平均负载,是指处于运行或不可打扰状态的进程的平均数。(主要是R和D状态的进程) 156 | 157 | 在 Linux 系统中,要查看负载情况一般使用 uptime 命令(w 命令和 top 命令也行)* 158 | 159 | ``` 160 | $ uptime 161 | 16:33:56 up 69 days, 5:10, 1 user, load average: 0.14, 0.24, 0.29 162 | ``` 163 | 以上信息的解析如下: 164 | 165 | - 16:33:56 : 当前时间 166 | - up 69 days, 5:10 : 系统运行了 69 天 5 小时 10 分 167 | - 1 user : 当前有 1 个用户登录了系统 168 | 169 | - load average: 0.14, 0.24, 0.29 : 系统在过去 1 分钟内,5 分钟内,15 分钟内的平均负载 170 | 171 | 平均负载一般小于你的cpu总核心数就是正常的,说明有空闲的cpu。 172 | 173 | 174 | ## linux:统计一个文件里指定关键字的出现的次数 175 | 176 | ``` 177 | grep -wo 'hello' file.txt | wc -l 178 | ``` 179 | 180 | 其中,“-w”选项可以确保只匹配完整的单词,“-o”选项可以让grep命令只输出匹配到的单词,“wc -l”命令可以统计行数,也就是匹配到的单词出现的次数 181 | 182 | ## 如何把客户机的公钥添加到服务器的列表中(SSH) 183 | 184 | 目的 185 | 避免重复输入用户密码,通过SSH自动登录,节约时间 186 | 187 | 在Linux系统中,可以使用ssh命令将客户机的公钥添加到服务器的authorized_keys文件中,实现无需密码登录。具体步骤如下: 188 | 189 | 1. 在客户机上生成公钥和私钥,如果已经生成过可以跳过这一步骤。使用ssh-keygen命令生成公钥和私钥,例如: 190 | 191 | ``` 192 | ssh-keygen 193 | ``` 194 | 195 | 该命令会在用户的家目录下生成公钥文件(id_rsa.pub)和私钥文件(id_rsa)。 196 | 197 | 2. 将客户机的公钥添加到服务器的authorized_keys文件中。将公钥文件内容复制到剪贴板中,然后使用ssh命令将公钥添加到服务器的authorized_keys文件中。例如,假设客户机的公钥文件为“id_rsa.pub”,服务器的IP地址为“192.168.0.1”,用户名为“username”,可以输入以下命令: 198 | 199 | ``` 200 | ssh-copy-id -i ~/.ssh/id_rsa.pub username@192.168.0.1 201 | ``` 202 | 203 | 在这个命令中,“-i”选项用来指定公钥文件路径,“username”是服务器的用户名,“192.168.0.1”是服务器的IP地址。 204 | 205 | 3. 输入服务器的登录密码。如果之前没有将客户机的公钥添加到服务器的authorized_keys文件中,会提示输入服务器的登录密码。输入密码后,客户机的公钥会被添加到服务器的authorized_keys文件中。 206 | 3. 完成添加。添加成功后,可以使用ssh命令无需密码登录服务器。例如,输入以下命令即可登录服务器: 207 | 208 | ``` 209 | ssh username@192.168.0.1 210 | ``` 211 | 212 | 在这个命令中,“username”是服务器的用户名,“192.168.0.1”是服务器的IP地址。 213 | 214 | ## VIM(替换,删除等指令) 215 | 216 | 简单描述一些常见的方式: 217 | 218 | 替换命令: 219 | 220 | 1. :s/old/new/g:将当前行中所有的“old”替换成“new”。其中,g表示全局替换,如果不加g,则只会替换当前行中第一个匹配到的“old”。 221 | 1. :%s/old/new/g:将整个文档中所有的“old”替换成“new”。 222 | 223 | 224 | 删除命令: 225 | 226 | 1. x:删除光标所在位置的字符。 227 | 1. dd:删除当前行。 228 | 229 | 230 | ## Linux解压文件操作 231 | 232 | **打包文件** 233 | 234 | 将一个或多个文件或目录打包为单个tar文件: 235 | 236 | ``` 237 | tar -czvf archive.tar.gz /path/to/file1 /path/to/file2 /path/to/dir1 238 | ``` 239 | 240 | - `-c`:表示创建一个新的tar文件。 241 | - `-z`:表示使用gzip进行压缩。 242 | - `-v`:表示输出详细信息,可以看到打包过程中的每个文件。 243 | - `-f`:表示指定输出的文件名,后面紧跟要打包的文件和目录。 244 | 245 | **解压文件** 246 | 247 | 将tar文件解压到指定的目录: 248 | 249 | ``` 250 | tar -xzvf archive.tar.gz -C /path/to/destination 251 | ``` 252 | 253 | - `-x`:表示解压缩一个已经存在的tar文件。 254 | - `-z`:表示使用gzip进行解压缩。 255 | - `-v`:表示输出详细信息,可以看到解压缩过程中的每个文件。 256 | - `-f`:表示指定要解压的tar文件名,后面紧跟要解压缩到的目录。 257 | - `-C`:表示指定解压缩到的目录。 258 | 259 | ## 100行5列的文件每列用空格隔开计算第三列数字的和 260 | ``` 261 | awk '{sum+=$3} END {print sum}' filename.txt 262 | ``` 263 | 264 | ## Linux命令,查看8080端口的进程 265 | 266 | ``` 267 | lsof -i :8080 268 | ``` 269 | 使用 `lsof` 命令可以查看哪些进程正在使用特定的文件或者网络端口 270 | 271 | 272 | ## linux系统下常用的监控命令? 273 | 274 | 我是常用top命令,所以简单介绍一下top吧。 275 | 276 | top命令可以帮我们全面了解cpu,内存,进程等一系列当前服务的状态。 277 | 278 | ![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1c145c0ad2d84a0b984ce477931f9037~tplv-k3u1fbpfcp-watermark.image?) 279 | 280 | 在top命令的输出中,可以看到以下信息: 281 | 282 | - 第一行:系统当前时间、运行时间、登录用户数、系统负载。 283 | - 第二行:总进程数、运行中进程数、睡眠中进程数、停止进程数、僵尸进程数。 284 | - 第三行:CPU使用情况,包括用户态、系统态、空闲和等待IO的CPU占用百分比。 285 | - 第四行:内存使用情况,包括物理内存总量、空闲内存、已用内存、缓存和缓存已用内存。 286 | - 第五行:交换分区使用情况,包括总交换分区、空闲交换分区和已用交换分区。 287 | - 进程信息:进程的PID、用户、CPU占用、内存占用、进程状态、启动时间、进程命令等。 288 | 289 | 290 | ## 当我们创建一个linux用户的用户密码存放在哪个文件目录? 291 | 292 | 293 | 在Linux中,用户密码不是明文存储的,而是经过加密处理后存储在系统中。具体来说,密码是以加密方式存储在系统的/etc/shadow文件中。 294 | 295 | 该文件只有root用户有读写权限,其他用户不能访问该文件。这样可以保护用户密码不被其他用户访问或泄露。 296 | 297 | 在/etc/shadow文件中,每个用户的密码信息占用一行,包括用户名、加密后的密码、最后一次修改密码的日期、密码过期时间等信息。用户密码的加密方式通常采用哈希(hash)算法,如MD5、SHA等。 298 | 299 | 300 | ## 查看权限命令 301 | 302 | 一般都是用`ls -l`: 显示当前目录下的所有文件和目录的详细信息,包括文件权限、所有者、所属组、文件大小、创建日期等信息 303 | 304 | ## Linux IO有哪些方式 305 | 306 | 总共有5种IO方式 307 | 308 | **五种I/O模型:** 309 | 310 | - 同步阻塞型、同步非阻塞型、IO多路复用型、信号驱动I/O型、异步I/O型 311 | 312 | ### 阻塞式I/O模型(Blocking I/O Model) 313 | 314 | 同步阻塞IO模型是最简单的IO模型,用户线程在内核进行IO操作时被阻塞 315 | 316 | ### 非阻塞式I/O模型(Non-Blocking I/O Model) 317 | 在这种I/O模型中,当应用程序执行一个I/O操作时,它不会一直等待,而是立即返回,不管I/O操作是否完成。 318 | 319 | 用户线程需要不断地发起IO请求,直到数据到达后,才真正读取到数据,继续执行。即“轮询”机制 320 | 321 | ### I/O复用模型(I/O Multiplexing Model) 322 | 简单来说,上面非阻塞I/O会轮训问好没好,那如果请求有几百万个,是不是同时有几百万个线程人问,这样是对资源的巨大浪费。 323 | 324 | 325 | 为了解决这个问题,我们使用中介者模式,让一个线程作为代理,它去轮训问几百万个接口,应用程序可以在一个线程中等待多个I/O操作完成,从而减少线程数量和系统开销。 当一个I/O操作完成时,应用程序会被通知并处理完成的I/O操作。 326 | 327 | ### 信号驱动I/O模型(Signal Driven I/O Model) 328 | 329 | 但是上面的I/O复用模型仍然有一个线程要去轮训,有没有办法不轮询? 330 | 在这种I/O模型中,当应用程序执行一个I/O操作时,它会立即返回,并注册一个信号处理函数。当I/O操作完成时,内核会发送一个信号给应用程序,通知它I/O操作已完成。应用程序可以在信号处理函数中处理完成的I/O操作。 331 | 332 | ### 异步I/O模型(Asynchronous I/O Model) 333 | 在这种I/O模型中,当应用程序执行一个I/O操作时,它会立即返回,并注册一个回调函数。当I/O操作完成时,内核会调用回调函数,并传递完成的I/O操作的结果。应用程序可以在回调函数中处理完成的I/O操作。 334 | 335 | 336 | ## 用户程序写4KB的数据,写到磁盘上,经历的过程 337 | 338 | 339 | ![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/48d865f229d94eb999c18d0bab12744f~tplv-k3u1fbpfcp-watermark.image?) 340 | 341 | 1. 用户程序将数据写入文件,通过系统调用将数据传递给操作系统内核。 342 | 2. 上图可以看到,写文件首先是借助虚拟文件系统去往缓冲区写数据的,虚拟文件系统屏蔽了各种具体的文件系统,提供了统一的调用方式。 343 | 3. 操作系统内核将数据存储到系统内核缓存(buffer cache)中,等待写入磁盘。缓存是操作系统用来暂存文件系统的数据和元数据的内存区域。当应用程序向磁盘写入数据时,这些数据首先被写入到内核缓存中,再由内核异步写入磁盘。 344 | 6. 当磁盘控制器将数据从磁盘缓存区写入磁盘后,会向操作系统内核发送一个中断信号(interrupt),表示数据已经成功写入磁盘。此时,操作系统内核会将文件系统的元数据更新,包括文件大小、修改时间等。 345 | 346 | 347 | ## 进程线程协程的区别 348 | 349 | 350 | 1. 进程是操作系统资源分配的基本单位,它拥有独立的内存空间、进程控制块等,进程之间的通信需要借助进程间通信(IPC)机制。而线程是进程的执行单位,它共享进程的内存空间和资源,线程之间的通信可以直接通过共享内存等方式实现。 351 | 1. 进程之间的切换需要涉及上下文切换,需要保存和恢复大量的进程状态信息,比较耗时。线程之间的切换则比较轻量级,只需要保存和恢复少量的线程状态信息。 352 | 1. 协程是一种轻量级的线程,它不依赖于操作系统的线程调度器,而是由程序自身控制。协程之间的切换是由程序显式调用的,因此比线程切换更加轻量级,同时由于不需要操作系统的参与,协程的创建和销毁的开销也比线程小。 353 | 1. 进程和线程之间的切换是由操作系统调度器控制的,因此具有较高的安全性和稳定性。而协程的调度和执行都由程序自身控制,因此对程序的编写和调试要求较高,同时需要注意协程之间的调度和同步问题,否则容易出现死锁等问题。 354 | 355 | ## Linux里面的软连接和硬链接 356 | 357 | 硬链接和原⽂件是共⽤⼀个inode号,说明他们是同⼀个⽂件,⽽软链接和原⽂件拥有不同的inode号,表明他们是两个不同的⽂件。 358 | 359 | 硬链接:由于Linux下的⽂件是通过索引节点(Inode)来识别⽂件,硬链接可以认为是⼀个指针,指向⽂件索引节点的指针,系统并不为它重新分配inode。每添加⼀个⼀个硬链接,⽂件的链接数就加1。 360 | 361 | 362 | 软链接:软链接克服了硬链接的不⾜,没有任何⽂件系统的限制,任何⽤户可以创建指向⽬录的符号链接。因⽽现在更为⼴泛使⽤,它具有更⼤的灵活性,甚⾄可以跨越不同机器、不同⽹络对⽂件进⾏链接。 363 | 364 | 365 | 当源文件被删除时,硬链接依然可以访问文件内容,因为实际上硬链接和源文件是同一个文件,只是文件名和目录项不同;而软链接则会失效,因为它仅仅是一个指向源文件的路径名符号。 366 | 367 | ## 例如Linux问如果有一台主机连不上外网了应该怎么排查问题, 368 | 369 | 1. 确认网络连接是否正常。可以使用 `ping` 命令来测试主机与外网的连通性,例如 `ping www.google.com`。如果无法连接到外网,可以尝试检查主机的网络配置,例如 IP 地址、网关、DNS 等是否正确配置。 370 | 1. 检查防火墙配置。如果主机上有防火墙,需要检查防火墙配置是否允许主机访问外网。可以使用 `iptables -L` 命令查看当前防火墙规则,如果需要允许主机访问外网,可以添加相应的规则。 371 | 1. 检查路由表配置。如果主机无法访问外网,可能是因为路由表配置不正确导致的。可以使用 `route -n` 命令查看当前路由表配置,如果需要添加或修改路由规则,可以使用 `route add` 命令。 372 | 1. 检查 DNS 配置。如果主机无法访问外网,可能是因为 DNS 配置不正确导致的。可以使用 `cat /etc/resolv.conf` 命令查看当前 DNS 配置,如果需要修改 DNS 配置,可以编辑 `/etc/resolv.conf` 文件或者使用 `nmcli` 命令进行配置。 373 | 1. 检查网络设备。如果主机无法访问外网,可能是因为网络设备(例如网卡、交换机等)故障或配置不正确导致的。可以检查网络设备的物理连接和配置是否正确。 374 | 375 | ## linux中断流程,谈谈你对中断上下文的理解 376 | 377 | 中断可以是硬件中断(例如 I/O 中断)或软件中断(例如系统调用)。 378 | 379 | 中断流程可以简单地描述为: 380 | 381 | 1. 硬件检测到一个中断事件,向 CPU 发送中断请求信号。 382 | 1. CPU 收到中断请求信号,暂停当前执行的程序,并将当前 CPU 寄存器中的状态保存到内核堆栈中,以便在中断处理程序结束后能够恢复现场。 383 | 1. CPU 跳转到中断服务程序的入口点开始执行中断处理程序,处理中断事件。 384 | 1. 中断处理程序执行完毕后,恢复中断前的现场,将 CPU 寄存器中的状态从内核堆栈中恢复,然后返回到中断前的程序继续执行。 385 | 386 | 在中断处理程序执行期间,中断处理程序可以在中断上下文中运行,也可以在进程上下文中运行。中断上下文是指中断服务程序执行期间,处理器无法访问当前进程的上下文环境,因此中断服务程序必须在内核上下文环境中执行。 387 | 388 | ## linux中的线程一般是怎么调度的? 389 | 390 | inux 中的线程是由内核调度的,常见的调度模式例如基于时间片轮转算法实现的。Linux 内核为每个线程分配一个时间片,在时间片用完之前,线程可以一直执行。当时间片用完后,内核会将当前线程从 CPU 上移除,然后选择下一个可执行的线程继续执行,直到所有的线程都执行完毕。 391 | 392 | Linux 内核还提供了一些控制线程调度的接口,例如 `nice` 命令可以通过设置线程的优先级来控制其调度 393 | 394 | ## vim如何显示行号,Shell脚本自动化如何做 395 | 396 | 要在 vim 中显示行号,可以使用 `:set number` 命令。这会在 vim 的左侧显示每一行的行号。如果要取消行号的显示,可以使用 `:set nonumber` 命令。 397 | 398 | Shell 脚本自动化我知道有很多方式,我一般是使用定时任务去执行该脚本 399 | 400 | 1. 编写 Shell 脚本并手动执行:将需要自动化的操作封装到 Shell 脚本中,然后使用 cron 或其他定时任务工具在指定时间执行该脚本。 401 | 402 | 如果是分布式定时任务,会使用Kubernetes 中的 CronJob去执行。 403 | -------------------------------------------------------------------------------- /src/linux/assets/image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/linux/assets/image-1.png -------------------------------------------------------------------------------- /src/linux/assets/image-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/linux/assets/image-10.png -------------------------------------------------------------------------------- /src/linux/assets/image-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/linux/assets/image-11.png -------------------------------------------------------------------------------- /src/linux/assets/image-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/linux/assets/image-12.png -------------------------------------------------------------------------------- /src/linux/assets/image-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/linux/assets/image-13.png -------------------------------------------------------------------------------- /src/linux/assets/image-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/linux/assets/image-14.png -------------------------------------------------------------------------------- /src/linux/assets/image-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/linux/assets/image-15.png -------------------------------------------------------------------------------- /src/linux/assets/image-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/linux/assets/image-16.png -------------------------------------------------------------------------------- /src/linux/assets/image-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/linux/assets/image-2.png -------------------------------------------------------------------------------- /src/linux/assets/image-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/linux/assets/image-3.png -------------------------------------------------------------------------------- /src/linux/assets/image-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/linux/assets/image-4.png -------------------------------------------------------------------------------- /src/linux/assets/image-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/linux/assets/image-5.png -------------------------------------------------------------------------------- /src/linux/assets/image-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/linux/assets/image-6.png -------------------------------------------------------------------------------- /src/linux/assets/image-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/linux/assets/image-7.png -------------------------------------------------------------------------------- /src/linux/assets/image-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/linux/assets/image-8.png -------------------------------------------------------------------------------- /src/linux/assets/image-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/linux/assets/image-9.png -------------------------------------------------------------------------------- /src/linux/assets/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/linux/assets/image.png -------------------------------------------------------------------------------- /src/linux/assets2/image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/linux/assets2/image-1.png -------------------------------------------------------------------------------- /src/linux/assets2/image-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/linux/assets2/image-2.png -------------------------------------------------------------------------------- /src/linux/assets2/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/linux/assets2/image.png -------------------------------------------------------------------------------- /src/linux/linux.interview.zh.md: -------------------------------------------------------------------------------- 1 | ## 前言 2 | 3 | 题目均是真题,职位为Node.js开发、全栈(node.js + react)、大前端(需要会node.js的前端职位)中的关于linux的面试题。 4 | 5 | 6 | 本文记录在[node面试题系列里](https://github.com/lio-mengxiang/node-interview) 7 | ## 频率最高的题:请说一下你常用的linux命令 8 | 9 | 这个自由发挥吧,常用的不就是cd、ls、vim这些命令吗。。。 不过你不是非常熟悉的命令不要说,面试官会接着问,比如你说ps命令,他会问ps -ef和ps aux的差别等等 10 | 11 | 12 | ## LINUX这边常用的查看日志的指令 13 | 14 | 1. `tail`: 用于查看日志文件的末尾内容,通常用于实时监控日志文件的变化,常与`-f`选项一起使用,实时输出新增的日志信息。例如,`tail -f /var/log/syslog`可以实时查看系统日志文件的更新内容。 15 | 1. `grep`: 用于在文本中搜索指定的模式,通常用于从日志文件中查找特定的信息。例如,`grep "error" /var/log/syslog`可以查找系统日志文件中包含"error"关键词的信息。 16 | 17 | 切记: 实时输出新增的日志信息是一个非常实用的命令,并且面试很常见,一定要记住。 18 | 19 | ## LINUX怎么杀掉一个进程 20 | 21 | 常见的就是 kill -15 pid 22 | 23 | 面试官会追问如何强杀一个进程,可以用 kill -9 pid, 我们顺便普及一下kill和信号是什么. 24 | 25 | ### 常见的信号 26 | 27 | 上面的 -9代表的是SIGKILL信号,-15代表的是SIGTERM信号,我们在使用nodejs的时候,通常会有在写代码时,可能执行退出命令,这时候就需要传一个信号量,就可以用我们这里的学到的9和15传递给它。 28 | 29 | > 在 Node.js 中,`process.exit()` 方法用于终止当前进程,传递给该方法的数字参数表示进程的退出码。在这种情况下,`process.exit(15)` 和 `process.exit(2)` 的区别在于它们返回的退出码不同。 30 | 31 | > 在 Unix/Linux 系统中,15 号信号(SIGTERM)表示终止进程的请求,而 2 号信号(SIGINT)表示中断进程的请求。因此,`process.exit(15)` 表示进程接收到终止请求,而 `process.exit(2)` 表示进程接收到中断请求。 32 | 33 | 简单来说SIGTERM:当前进程接收到这个信号时,大多会先释放自己的资源,再停止进程,属于正常关闭。但有时候,可能这个进程正在进行一些I/O操作所以不能立即关闭。 34 | 35 | 这时候SIGKILL:属于强制关闭进程,不管你现在是啥情况。 36 | 37 | ## linux下进程间通信方式?管道、共享内存什么场景下会用?两个进程不在同一个机器如何通信? 38 | 39 | 1. 管道(Pipe):管道是一种半双工的通信方式,通常用于父子进程之间或者兄弟进程之间的通信。它的特点是只能在具有亲缘关系的进程之间使用,而且数据只能在一个方向上流动。 40 | 1. 命名管道(Named Pipe):命名管道是一种特殊的文件,可以被多个进程共享访问,可以用于非亲缘关系进程之间的通信。 41 | 1. 共享内存(Shared Memory):共享内存是一种快速的进程间通信方式,它将一段内存区域映射到多个进程的地址空间中,多个进程可以直接读写这段共享内存,以达到高效的通信目的。 42 | 1. 消息队列(Message Queue):消息队列是一种基于消息的通信方式,它允许进程将消息发送到一个队列中,供其他进程读取。 43 | 1. 套接字(Socket):套接字是一种通用的进程间通信方式,可以在本地或者远程不同的主机之间通信。 44 | 45 | 对于管道和共享内存,它们的使用场景如下: 46 | 47 | 1. 管道适用于数据流式的场景,比如父子进程之间的通信,或者进程输出传递给另一个进程进行处理等。 48 | 1. 共享内存适用于大量数据的读写场景,比如多个进程需要频繁地读写共享的数据区域,共享内存可以提高数据传输的效率。(在nodejs中主要体现在sharedArrayBufferr实现多个worker共享数据) 49 | 50 | 这里补充一下,node.js在linux下使用了Socket实现了IPC,并且内部它们与网络 socket 的行为比较类似,属于双向通信。不同的是它们在系统内核中就完成了进程间的通信,而不经过实际的网络层,非常高效。在 Node 中,IPC 通道被抽象为 Stream 对象。 51 | 52 | 不在一个机器可以使用socket通信,比如使用nodejs的net模块。 53 | 54 | ## 进程通信:信号、信号量是什么,进程间通信消息队列机制的本质是什么? 55 | 56 | 信号是IPC通信的一种机制,信号量是一种用于进程间同步和互斥的机制。 57 | 58 | 信号(Signal)是一种在进程间通信中用于处理异步事件的机制。当某个进程需要向另一个进程发送通知时,可以通过向该进程发送信号来实现。信号是一种软件中断,可以被操作系统或其他进程发送,并被接收进程处理。 59 | 60 | Linux 中常见的信号包括 `SIGINT`、`SIGTERM`、`SIGKILL` 等,这些信号通常用于终止进程或处理其他进程间的通知事件。 61 | 62 | 信号量(Semaphore)是一种用于进程间同步和互斥的机制。它是一个计数器,用于控制多个进程对共享资源的访问。当一个进程进入临界区时,它会将信号量的值减一,表示已经使用了共享资源;当进程退出临界区时,它会将信号量的值加一,表示该共享资源已经释放。其他进程可以通过等待信号量变为可用状态,然后再进入临界区。 63 | 64 | ### 进程间通信消息队列机制的本质 65 | 66 | 消息队列是 Linux 进程间通信的一种方式,它允许多个进程通过向共享的队列中发送和接收消息来进行通信。 67 | 68 | 在 Linux 中,消息队列本质上是由内核维护的一段缓冲区,是存放在内存中的消息链表。 69 | 70 | - 消息队列允许一个或多个进程向它写入或读取消息。 71 | - 消息队列可以实现消息的「随机查询」,不一定非要以先进先出的次序读取消息,也可以按消息的类型读取。比有名管道的先进先出原则更有优势。 72 | - 消息队列的生命周期随内核,如果没有释放消息队列或者没有关闭操作系统,消息队列就会一直存在。而匿名管道随进程的创建而建立,随进程的结束而销毁。 73 | 74 | ## 如何查看linux进程信息,其中vsz和rss有什么区别? 75 | 76 | 我一般是用 ps -aux,能看到的信息更全一些。 77 | 78 | 其中ps -aux 命令会显示vsz和rss两个指标的信息,简单来说rss就是程序实际上使用的内存,包括堆栈,动态链接库和本身正在内存里的代码大小。vsz会更大一些,因为它不管你实际用到多少,而是你整个代码引用了哪些动态链接库,使用了的全部代码,不管有没有在内存(有些存在磁盘上),都算进来了,并且vsz还包括了虚拟内存。 79 | 80 | 81 | 所以整体来看rss更能反映真实的代码内存占用情况。 82 | 83 | 84 | **示例如下:** 85 | 86 | 87 | 假设进程A的二进制文件是500K,并且链接了一个2500K的动态库,堆和栈共使用了200K,其中100K在内存中(剩下的被换出或者不再被使用),一共加载了动态库中的1000K内容以及二进制文件中的400K内容至内存中,那么: 88 | 89 | ``` 90 | RSS: 400K + 1000K + 100K = 1500K 91 | 92 | VSZ: 500K + 2500K + 200K = 3200K 93 | ``` 94 | 95 | ## Linux文件描述符是什么 96 | 97 | 一个 Linux 进程启动后,会在内核空间中创建一个 PCB 控制块,PCB 内部有一个文件描述符表(File descriptor table),记录着当前进程所有可用的文件描述符,即当前进程所有打开的文件。 98 | 99 | 100 | 除了文件描述符表,系统还需要维护另外两张表: 101 | 102 | 103 | - 打开文件表(Open file table) 104 | - i-node 表(i-node table) 105 | 106 | 107 | 文件描述符表每个进程都有一个,打开文件表和 i-node 表整个系统只有一个,它们三者之间的关系如下图所示。 108 | 109 | 110 | 111 | ![Alt text](./assets2/image.png) 112 | 113 | 114 | 从本质上讲,这三种表都是结构体数组,0、1、2、73、1976 等都是数组下标。表头只是我自己添加的注释,数组本身是没有的。实线箭头表示指针的指向,虚线箭头是我自己添加的注释。 115 | 116 | **你看,文件描述符只不过是一个数组下标吗!** 117 | 118 | 所以最终文件描述符找到了i-node表里的对应信息。 119 | 120 | inode 表包含文件名、文件大小、文件创建时间、文件所有者、文件权限等。每个文件在文件系统中都有唯一的 inode 号,通过 inode 号可以找到该文件的所有元数据和数据块信息。当进程打开一个文件时,内核会从文件系统中查找该文件对应的 inode 号,并将其记录在文件的表项中,以便进行后续的文件操作。 121 | 122 | ## linux查找文件的指令 123 | 124 | find命令,常见的使用 -name 根据文件名查询,或者 -size 根据文件大小查询。 125 | 126 | ### 将当前目录及其子目录下所有最近 20 天内更新过的文件列出: 127 | ``` 128 | 129 | find . -ctime 20 130 | ``` 131 | 132 | ## Linux下查看网络端口? 133 | 134 | 一般都是用netstat,我简单来讲一下这个命令吧,这个也是非常容易考到的题。 135 | 136 | ### 含义: 137 | 138 | netstat命令用于显示网络状态,在工作中经常要查看端口的占用情况,比如启动一个应用避免端口冲突。 139 | 140 | 常用参数: 141 | 142 | - -t 显示tcp传输协议的连接情况 143 | - -u 显示udp传输协议的连接状况 144 | - -l 表示listening,显示正在监听状态的服务,也可以用-a表示所有状态 145 | - -n: 表示numeric,用数字形式显示端口号 146 | - -p:表示process 表示显示后台进程 147 | 148 | 常用组合: neststat -lntp 149 | 150 | 151 | 152 | ## Linux下查看负载情况? 153 | 154 | 平均负载,是指处于运行或不可打扰状态的进程的平均数。(主要是R和D状态的进程) 155 | 156 | 在 Linux 系统中,要查看负载情况一般使用 uptime 命令(w 命令和 top 命令也行)* 157 | 158 | ``` 159 | $ uptime 160 | 16:33:56 up 69 days, 5:10, 1 user, load average: 0.14, 0.24, 0.29 161 | ``` 162 | 以上信息的解析如下: 163 | 164 | - 16:33:56 : 当前时间 165 | - up 69 days, 5:10 : 系统运行了 69 天 5 小时 10 分 166 | - 1 user : 当前有 1 个用户登录了系统 167 | 168 | - load average: 0.14, 0.24, 0.29 : 系统在过去 1 分钟内,5 分钟内,15 分钟内的平均负载 169 | 170 | 平均负载一般小于你的cpu总核心数就是正常的,说明有空闲的cpu。 171 | 172 | 173 | ## linux:统计一个文件里指定关键字的出现的次数 174 | 175 | ``` 176 | grep -wo 'hello' file.txt | wc -l 177 | ``` 178 | 179 | 其中,“-w”选项可以确保只匹配完整的单词,“-o”选项可以让grep命令只输出匹配到的单词,“wc -l”命令可以统计行数,也就是匹配到的单词出现的次数 180 | 181 | ## 如何把客户机的公钥添加到服务器的列表中(SSH) 182 | 183 | 目的 184 | 避免重复输入用户密码,通过SSH自动登录,节约时间 185 | 186 | 在Linux系统中,可以使用ssh命令将客户机的公钥添加到服务器的authorized_keys文件中,实现无需密码登录。具体步骤如下: 187 | 188 | 1. 在客户机上生成公钥和私钥,如果已经生成过可以跳过这一步骤。使用ssh-keygen命令生成公钥和私钥,例如: 189 | 190 | ``` 191 | ssh-keygen 192 | ``` 193 | 194 | 该命令会在用户的家目录下生成公钥文件(id_rsa.pub)和私钥文件(id_rsa)。 195 | 196 | 2. 将客户机的公钥添加到服务器的authorized_keys文件中。将公钥文件内容复制到剪贴板中,然后使用ssh命令将公钥添加到服务器的authorized_keys文件中。例如,假设客户机的公钥文件为“id_rsa.pub”,服务器的IP地址为“192.168.0.1”,用户名为“username”,可以输入以下命令: 197 | 198 | ``` 199 | ssh-copy-id -i ~/.ssh/id_rsa.pub username@192.168.0.1 200 | ``` 201 | 202 | 在这个命令中,“-i”选项用来指定公钥文件路径,“username”是服务器的用户名,“192.168.0.1”是服务器的IP地址。 203 | 204 | 3. 输入服务器的登录密码。如果之前没有将客户机的公钥添加到服务器的authorized_keys文件中,会提示输入服务器的登录密码。输入密码后,客户机的公钥会被添加到服务器的authorized_keys文件中。 205 | 3. 完成添加。添加成功后,可以使用ssh命令无需密码登录服务器。例如,输入以下命令即可登录服务器: 206 | 207 | ``` 208 | ssh username@192.168.0.1 209 | ``` 210 | 211 | 在这个命令中,“username”是服务器的用户名,“192.168.0.1”是服务器的IP地址。 212 | 213 | ## VIM(替换,删除等指令) 214 | 215 | 简单描述一些常见的方式: 216 | 217 | 替换命令: 218 | 219 | 1. :s/old/new/g:将当前行中所有的“old”替换成“new”。其中,g表示全局替换,如果不加g,则只会替换当前行中第一个匹配到的“old”。 220 | 1. :%s/old/new/g:将整个文档中所有的“old”替换成“new”。 221 | 222 | 223 | 删除命令: 224 | 225 | 1. x:删除光标所在位置的字符。 226 | 1. dd:删除当前行。 227 | 228 | 229 | ## Linux解压文件操作 230 | 231 | **打包文件** 232 | 233 | 将一个或多个文件或目录打包为单个tar文件: 234 | 235 | ``` 236 | tar -czvf archive.tar.gz /path/to/file1 /path/to/file2 /path/to/dir1 237 | ``` 238 | 239 | - `-c`:表示创建一个新的tar文件。 240 | - `-z`:表示使用gzip进行压缩。 241 | - `-v`:表示输出详细信息,可以看到打包过程中的每个文件。 242 | - `-f`:表示指定输出的文件名,后面紧跟要打包的文件和目录。 243 | 244 | **解压文件** 245 | 246 | 将tar文件解压到指定的目录: 247 | 248 | ``` 249 | tar -xzvf archive.tar.gz -C /path/to/destination 250 | ``` 251 | 252 | - `-x`:表示解压缩一个已经存在的tar文件。 253 | - `-z`:表示使用gzip进行解压缩。 254 | - `-v`:表示输出详细信息,可以看到解压缩过程中的每个文件。 255 | - `-f`:表示指定要解压的tar文件名,后面紧跟要解压缩到的目录。 256 | - `-C`:表示指定解压缩到的目录。 257 | 258 | ## 100行5列的文件每列用空格隔开计算第三列数字的和 259 | ``` 260 | awk '{sum+=$3} END {print sum}' filename.txt 261 | ``` 262 | 263 | ## Linux命令,查看8080端口的进程 264 | 265 | ``` 266 | lsof -i :8080 267 | ``` 268 | 使用 `lsof` 命令可以查看哪些进程正在使用特定的文件或者网络端口 269 | 270 | 271 | ## linux系统下常用的监控命令? 272 | 273 | 我是常用top命令,所以简单介绍一下top吧。 274 | 275 | top命令可以帮我们全面了解cpu,内存,进程等一系列当前服务的状态。 276 | 277 | ![Alt text](./assets2/image-1.png) 278 | 279 | 在top命令的输出中,可以看到以下信息: 280 | 281 | - 第一行:系统当前时间、运行时间、登录用户数、系统负载。 282 | - 第二行:总进程数、运行中进程数、睡眠中进程数、停止进程数、僵尸进程数。 283 | - 第三行:CPU使用情况,包括用户态、系统态、空闲和等待IO的CPU占用百分比。 284 | - 第四行:内存使用情况,包括物理内存总量、空闲内存、已用内存、缓存和缓存已用内存。 285 | - 第五行:交换分区使用情况,包括总交换分区、空闲交换分区和已用交换分区。 286 | - 进程信息:进程的PID、用户、CPU占用、内存占用、进程状态、启动时间、进程命令等。 287 | 288 | 289 | ## 当我们创建一个linux用户的用户密码存放在哪个文件目录? 290 | 291 | 292 | 在Linux中,用户密码不是明文存储的,而是经过加密处理后存储在系统中。具体来说,密码是以加密方式存储在系统的/etc/shadow文件中。 293 | 294 | 该文件只有root用户有读写权限,其他用户不能访问该文件。这样可以保护用户密码不被其他用户访问或泄露。 295 | 296 | 在/etc/shadow文件中,每个用户的密码信息占用一行,包括用户名、加密后的密码、最后一次修改密码的日期、密码过期时间等信息。用户密码的加密方式通常采用哈希(hash)算法,如MD5、SHA等。 297 | 298 | 299 | ## 查看权限命令 300 | 301 | 一般都是用`ls -l`: 显示当前目录下的所有文件和目录的详细信息,包括文件权限、所有者、所属组、文件大小、创建日期等信息 302 | 303 | ## Linux IO有哪些方式 304 | 305 | 总共有5种IO方式 306 | 307 | **五种I/O模型:** 308 | 309 | - 同步阻塞型、同步非阻塞型、IO多路复用型、信号驱动I/O型、异步I/O型 310 | 311 | ### 阻塞式I/O模型(Blocking I/O Model) 312 | 313 | 同步阻塞IO模型是最简单的IO模型,用户线程在内核进行IO操作时被阻塞 314 | 315 | ### 非阻塞式I/O模型(Non-Blocking I/O Model) 316 | 在这种I/O模型中,当应用程序执行一个I/O操作时,它不会一直等待,而是立即返回,不管I/O操作是否完成。 317 | 318 | 用户线程需要不断地发起IO请求,直到数据到达后,才真正读取到数据,继续执行。即“轮询”机制 319 | 320 | ### I/O复用模型(I/O Multiplexing Model) 321 | 简单来说,上面非阻塞I/O会轮训问好没好,那如果请求有几百万个,是不是同时有几百万个线程人问,这样是对资源的巨大浪费。 322 | 323 | 324 | 为了解决这个问题,我们使用中介者模式,让一个线程作为代理,它去轮训问几百万个接口,应用程序可以在一个线程中等待多个I/O操作完成,从而减少线程数量和系统开销。 当一个I/O操作完成时,应用程序会被通知并处理完成的I/O操作。 325 | 326 | ### 信号驱动I/O模型(Signal Driven I/O Model) 327 | 328 | 但是上面的I/O复用模型仍然有一个线程要去轮训,有没有办法不轮询? 329 | 在这种I/O模型中,当应用程序执行一个I/O操作时,它会立即返回,并注册一个信号处理函数。当I/O操作完成时,内核会发送一个信号给应用程序,通知它I/O操作已完成。应用程序可以在信号处理函数中处理完成的I/O操作。 330 | 331 | ### 异步I/O模型(Asynchronous I/O Model) 332 | 在这种I/O模型中,当应用程序执行一个I/O操作时,它会立即返回,并注册一个回调函数。当I/O操作完成时,内核会调用回调函数,并传递完成的I/O操作的结果。应用程序可以在回调函数中处理完成的I/O操作。 333 | 334 | 335 | ## 用户程序写4KB的数据,写到磁盘上,经历的过程 336 | 337 | 338 | ![Alt text](./assets2/image-2.png) 339 | 340 | 1. 用户程序将数据写入文件,通过系统调用将数据传递给操作系统内核。 341 | 2. 上图可以看到,写文件首先是借助虚拟文件系统去往缓冲区写数据的,虚拟文件系统屏蔽了各种具体的文件系统,提供了统一的调用方式。 342 | 3. 操作系统内核将数据存储到系统内核缓存(buffer cache)中,等待写入磁盘。缓存是操作系统用来暂存文件系统的数据和元数据的内存区域。当应用程序向磁盘写入数据时,这些数据首先被写入到内核缓存中,再由内核异步写入磁盘。 343 | 4. 当磁盘控制器将数据从磁盘缓存区写入磁盘后,会向操作系统内核发送一个中断信号(interrupt),表示数据已经成功写入磁盘。此时,操作系统内核会将文件系统的元数据更新,包括文件大小、修改时间等。 344 | 345 | 346 | ## 进程线程协程的区别 347 | 348 | 349 | 1. 进程是操作系统资源分配的基本单位,它拥有独立的内存空间、进程控制块等,进程之间的通信需要借助进程间通信(IPC)机制。而线程是进程的执行单位,它共享进程的内存空间和资源,线程之间的通信可以直接通过共享内存等方式实现。 350 | 1. 进程之间的切换需要涉及上下文切换,需要保存和恢复大量的进程状态信息,比较耗时。线程之间的切换则比较轻量级,只需要保存和恢复少量的线程状态信息。 351 | 1. 协程是一种轻量级的线程,它不依赖于操作系统的线程调度器,而是由程序自身控制。协程之间的切换是由程序显式调用的,因此比线程切换更加轻量级,同时由于不需要操作系统的参与,协程的创建和销毁的开销也比线程小。 352 | 1. 进程和线程之间的切换是由操作系统调度器控制的,因此具有较高的安全性和稳定性。而协程的调度和执行都由程序自身控制,因此对程序的编写和调试要求较高,同时需要注意协程之间的调度和同步问题,否则容易出现死锁等问题。 353 | 354 | ## Linux里面的软连接和硬链接 355 | 356 | 硬链接和原⽂件是共⽤⼀个inode号,说明他们是同⼀个⽂件,⽽软链接和原⽂件拥有不同的inode号,表明他们是两个不同的⽂件。 357 | 358 | 硬链接:由于Linux下的⽂件是通过索引节点(Inode)来识别⽂件,硬链接可以认为是⼀个指针,指向⽂件索引节点的指针,系统并不为它重新分配inode。每添加⼀个⼀个硬链接,⽂件的链接数就加1。 359 | 360 | 361 | 软链接:软链接克服了硬链接的不⾜,没有任何⽂件系统的限制,任何⽤户可以创建指向⽬录的符号链接。因⽽现在更为⼴泛使⽤,它具有更⼤的灵活性,甚⾄可以跨越不同机器、不同⽹络对⽂件进⾏链接。 362 | 363 | 364 | 当源文件被删除时,硬链接依然可以访问文件内容,因为实际上硬链接和源文件是同一个文件,只是文件名和目录项不同;而软链接则会失效,因为它仅仅是一个指向源文件的路径名符号。 365 | 366 | ## 例如Linux问如果有一台主机连不上外网了应该怎么排查问题, 367 | 368 | 1. 确认网络连接是否正常。可以使用 `ping` 命令来测试主机与外网的连通性,例如 `ping www.google.com`。如果无法连接到外网,可以尝试检查主机的网络配置,例如 IP 地址、网关、DNS 等是否正确配置。 369 | 1. 检查防火墙配置。如果主机上有防火墙,需要检查防火墙配置是否允许主机访问外网。可以使用 `iptables -L` 命令查看当前防火墙规则,如果需要允许主机访问外网,可以添加相应的规则。 370 | 1. 检查路由表配置。如果主机无法访问外网,可能是因为路由表配置不正确导致的。可以使用 `route -n` 命令查看当前路由表配置,如果需要添加或修改路由规则,可以使用 `route add` 命令。 371 | 1. 检查 DNS 配置。如果主机无法访问外网,可能是因为 DNS 配置不正确导致的。可以使用 `cat /etc/resolv.conf` 命令查看当前 DNS 配置,如果需要修改 DNS 配置,可以编辑 `/etc/resolv.conf` 文件或者使用 `nmcli` 命令进行配置。 372 | 1. 检查网络设备。如果主机无法访问外网,可能是因为网络设备(例如网卡、交换机等)故障或配置不正确导致的。可以检查网络设备的物理连接和配置是否正确。 373 | 374 | ## linux中断流程,谈谈你对中断上下文的理解 375 | 376 | 中断可以是硬件中断(例如 I/O 中断)或软件中断(例如系统调用)。 377 | 378 | 中断流程可以简单地描述为: 379 | 380 | 1. 硬件检测到一个中断事件,向 CPU 发送中断请求信号。 381 | 1. CPU 收到中断请求信号,暂停当前执行的程序,并将当前 CPU 寄存器中的状态保存到内核堆栈中,以便在中断处理程序结束后能够恢复现场。 382 | 1. CPU 跳转到中断服务程序的入口点开始执行中断处理程序,处理中断事件。 383 | 1. 中断处理程序执行完毕后,恢复中断前的现场,将 CPU 寄存器中的状态从内核堆栈中恢复,然后返回到中断前的程序继续执行。 384 | 385 | 在中断处理程序执行期间,中断处理程序可以在中断上下文中运行,也可以在进程上下文中运行。中断上下文是指中断服务程序执行期间,处理器无法访问当前进程的上下文环境,因此中断服务程序必须在内核上下文环境中执行。 386 | 387 | ## linux中的线程一般是怎么调度的? 388 | 389 | inux 中的线程是由内核调度的,常见的调度模式例如基于时间片轮转算法实现的。Linux 内核为每个线程分配一个时间片,在时间片用完之前,线程可以一直执行。当时间片用完后,内核会将当前线程从 CPU 上移除,然后选择下一个可执行的线程继续执行,直到所有的线程都执行完毕。 390 | 391 | Linux 内核还提供了一些控制线程调度的接口,例如 `nice` 命令可以通过设置线程的优先级来控制其调度 392 | 393 | ## vim如何显示行号,Shell脚本自动化如何做 394 | 395 | 要在 vim 中显示行号,可以使用 `:set number` 命令。这会在 vim 的左侧显示每一行的行号。如果要取消行号的显示,可以使用 `:set nonumber` 命令。 396 | 397 | Shell 脚本自动化我知道有很多方式,我一般是使用定时任务去执行该脚本 398 | 399 | 1. 编写 Shell 脚本并手动执行:将需要自动化的操作封装到 Shell 脚本中,然后使用 cron 或其他定时任务工具在指定时间执行该脚本。 400 | 401 | 如果是分布式定时人任务,会使用Kubernetes 中的 CronJob去执行。 -------------------------------------------------------------------------------- /src/node-api/asyncLocalStorage.md: -------------------------------------------------------------------------------- 1 | Node.js官方文档中这样描述AsyncLocalStorage:AsyncLocalStorage在回调函数和promise链中创建异步的状态。它允许在 Web 请求的整个生命周期或任何其他异步操作中存储数据 2 | 3 | 4 | # 为什么我们需要异步代码中共享上下文数据 5 | 在传统的基于线程的服务器模型中,每个请求都会分配一个新的线程来处理。其中有一个概念叫** **thread-local storage** **,** **是一种变量的存储方法,这个变量在它所在的线程内是全局可访问的,但是不能被其他线程访问到,这样就保持了数据的线程独立性。 6 | 7 | 在PHP中,每一个http请求都会创建一个独立的线程,每个线程有自己的memory, 8 | 9 | 然而,在 Node.js 的事件驱动模型中,所有的请求都在一个单线程的事件循环中处理。这就意味着在异步操作中无法直接共享上下文数据,因为每个异步操作都在不同的时间点执行,无法通过简单的变量或参数传递来共享数据。 10 | 11 | 12 | # 小试牛刀,快速理解AsyncLocalStorage的作用 13 | 14 | 15 | ```javascript 16 | import { AsyncLocalStorage } from "async_hooks"; 17 | 18 | export const storage = new AsyncLocalStorage(); 19 | 20 | async function test() { 21 | console.log(storage.getStore()); 22 | } 23 | 24 | async function run(id) { 25 | const state = { id }; 26 | 27 | return storage.run(state, async () => { 28 | await test(); 29 | }); 30 | } 31 | 32 | run(1); 33 | run(2); 34 | run(3); 35 | 36 | ``` 37 | 38 | - 首先我们引入 AsyncLocalStorage 模块 39 | - 然后实例化 AsyncLocalStorage 得到实例 storage 40 | - 然后run是主函数,在里面,我们使用 storage.run 共享了state数据,每一个run函数运行都会有一个独立的state数据 41 | - storage.run的第二个参数是一个回调函数,其中运行的异步任务可以共享state数据 42 | 43 | 所以上面打印 44 | ```javascript 45 | run(1); // { id: 1 } 46 | run(2); // { id: 2 } 47 | run(3); // { id: 3 } 48 | ``` 49 | 50 | 基本到这里,大家应该对AsyncLocalStorage的基本用法很熟悉了,接下来列举两个案例来巩固 51 | 52 | # 案例1:跟踪和记录 53 | AsyncLocalStorage 的一种常见用法是用来跟踪和日志记录。 当发生错误时,必须拥有所有可用的相关信息,例如错误id,以快速调试问题。 实现此目的的一种方法是将唯一标识符 (traceId) 传递给请求生命周期期间生成的所有日志。 54 | 55 | logging.js 56 | ```javascript 57 | import { AsyncLocalStorage } from "async_hooks"; 58 | 59 | const asyncLocalStorage = new AsyncLocalStorage(); 60 | 61 | export function withTraceId(traceId, fn) { 62 | return asyncLocalStorage.run(traceId, fn); 63 | } 64 | 65 | export function log(message) { 66 | const traceId = asyncLocalStorage.getStore(); 67 | console.log(`${message} traceId=${traceId}`); 68 | } 69 | ``` 70 | app.js 71 | ```javascript 72 | import express from "express"; 73 | import { withTraceId, log } from "./logging"; 74 | 75 | app.use((req, res, next) => { 76 | const traceId = req.header("x-trace-id") || Math.random().toString(36).substring(7); 77 | withTraceId(traceId, next); 78 | }); 79 | 80 | app.use((req, res, next) => { 81 | log(`processing request ${req.url}`); 82 | next(); 83 | }); 84 | 85 | app.get("/post/:postId", async (req, res) => { 86 | const post = await fetchPost(req.params.postId); 87 | res.send(post); 88 | }); 89 | 90 | async function fetchPost(postId: string) { 91 | log(`fetching data for post id: ${postId}`); 92 | // some logic to fetch post 93 | return `Hello world, ${postId}`; 94 | } 95 | ``` 96 | 97 | 98 | # 案例2:鉴权 99 | auth.js 100 | ```javascript 101 | async function authenticate(authToken) { 102 | // fetch user data with authToken 103 | return { 104 | id: 1, 105 | username: "john", 106 | }; 107 | } 108 | 109 | async function authMiddleware(req, res, next) { 110 | const authToken = req.header("x-auth-token"); 111 | if (!authToken) { 112 | next(); 113 | } 114 | 115 | authenticate(authToken!) 116 | .then((user) => { 117 | return asyncLocalStorage.run(user, next as any); 118 | }) 119 | .catch(next); 120 | } 121 | 122 | function getCurrentUser() { 123 | return asyncLocalStorage.getStore() as any; 124 | } 125 | 126 | ``` 127 | 128 | secret.js 129 | ```javascript 130 | async function getUserSecret() { 131 | const user = getCurrentUser(); 132 | // some async operation to fetch data for user.id 133 | const secret = `secret of ${user.username}`; 134 | return secret; 135 | } 136 | ``` 137 | 138 | app.js 139 | ```javascript 140 | app.use(authMiddleware); 141 | 142 | app.get("/secret", async (req, res) => { 143 | const user = getCurrentUser(); 144 | if (!user) { 145 | res.status(401).send("Unauthorized"); 146 | return; 147 | } 148 | const secret = await getUserSecret(); 149 | res.send(secret); 150 | }); 151 | ``` 152 | 153 | AsyncLocalStorage 的另一个用例是身份验证。 当用户登录时,您需要将用户的信息存储在某处,以便您可以在应用程序的不同部分访问它。 使用 AsyncLocalStorage,您可以存储用户的信息并在需要时检索它。 154 | 155 | 156 | 157 | -------------------------------------------------------------------------------- /src/node-api/process.md: -------------------------------------------------------------------------------- 1 | 文档分为3个部分 2 | 3 | - [常用的API](#常用api) 4 | - [API注意事项](#api注意事项) 5 | - [不常用的API简单介绍](#不常用的api简单介绍) 6 | 7 | 8 | # 常用API 9 | 10 | ## memoryUsage 11 | | API 名称 | **API 介绍** | 12 | | ----------- | ------------------------------------- | 13 | | memoryUsage | 测量node.js的内存使用情况,单位是字节 | 14 | 15 | 案例: 16 | ```javascript 17 | import { memoryUsage } from 'node:process'; 18 | 19 | console.log(memoryUsage()); 20 | // Prints: 21 | // { 22 | // rss: 4935680, 23 | // heapTotal: 1826816, 24 | // heapUsed: 650472, 25 | // external: 49879, 26 | // arrayBuffers: 9386 27 | // } 28 | ``` 29 | 30 | - rss(Resident Set Size):表示进程当前的常驻内存集(包括指令、堆栈和堆)的总大小,以字节(byte)为单位。 31 | - heapTotal:表示V8引擎堆的总大小,以字节为单位。 32 | - heapUsed:表示V8引擎堆当前使用的内存量,以字节为单位。 33 | - external:表示V8引擎管理的外部内存使用量,以字节为单位。 34 | - arrayBuffers 指的是给 ArrayBuffers and SharedArrayBuffers分配的内存, 包含所有的 Node.js [Buffer](https://nodejs.org/docs/latest/api/buffer.html)s. 也包括 external 的值。 35 | 36 | 37 | ## process.constrainedMemory() 38 | | API 名称 | **API 介绍** | 39 | | ----------------- | ------------------------------------------------------------------------------------------------------------------- | 40 | | constrainedMemory | 根据操作系统施加的限制获取进程可用的内存量(以字节为单位)。 如果不存在这样的约束,或者约束未知,则返回 undefined。 | 41 | 42 | 43 | 为什么要注意这个api呢,例如一般在64位操作系统。v8能使用的内存是1.4GB,但是linux的cgroup实现对资源的限制,可能拿不到1.4GB的内存。 44 | 45 | 46 | ## process.kill(pid[, signal]) 47 | | API 名称 | **API 介绍** | 48 | | -------- | -------------------------------------------------------------------------------------------------------------------- | 49 | | kill | process.kill() 方法将信号发送到对应第一个参数(pid) 的进程。
pid是信号名称是诸如“SIGINT”或“SIGHUP”之类的字符串 | 50 | 51 | 52 | ```javascript 53 | import process, { kill } from 'node:process'; 54 | 55 | process.on('SIGHUP', () => { 56 | console.log('Got SIGHUP signal.'); 57 | }); 58 | 59 | setTimeout(() => { 60 | console.log('Exiting.'); 61 | process.exit(0); 62 | }, 100); 63 | 64 | kill(process.pid, 'SIGHUP'); 65 | ``` 66 | 67 | 这里我会把信号的知识补充一下。
当 Node.js 进程收到信号时,则将触发信号事件。
注意:信号在 Worker 线程上不可用。
每个事件的名称将是信号的大写通用名称(例如 'SIGINT' 表示 SIGINT 信号)。案例如下: 68 | ```javascript 69 | import process from 'node:process'; 70 | 71 | // 从标准输入开始读取,因此进程不会退出。 72 | process.stdin.resume(); 73 | 74 | process.on('SIGINT', () => { 75 | console.log('Received SIGINT. Press Control-D to exit.'); 76 | }); 77 | 78 | // 使用单个函数处理多个信号 79 | function handle(signal) { 80 | console.log(`Received ${signal}`); 81 | } 82 | 83 | process.on('SIGINT', handle); 84 | process.on('SIGTERM', handle); 85 | ``` 86 | 87 | - 'SIGUSR1' 启动 node.js debuuger的信号。 88 | - 'SIGTERM' 和 'SIGINT' 在非 Windows 平台上具有默认处理的处理函数,如果你的其在使用代码 128 + signal number 退出之前重置终端模式。 如果这些信号之一安装了监听函数,则其默认行为将被删除(Node.js 将不再退出)。 89 | - 'SIGPIPE' 默认情况下忽略。 它可以安装监听函数。 90 | - 'SIGHUP' 在 Windows 上是在关闭控制台窗口时生成,在其他平台上是在各种类似条件下生成。 它可以安装监听函数,但是 Node.js 将在大约 10 秒后被 Windows 无条件地终止。 在非 Windows 平台上,SIGHUP 的默认行为是终止 Node.js,但一旦安装了监听函数,则其默认行为将被删除。 91 | - 'SIGTERM' Windows 上不支持,可以监听。 92 | - 所有平台都支持来自终端的 'SIGINT',通常可以使用 **Ctrl**+**C** 生成(但是这是可配置的)。 当启用[终端原始模式](http://url.nodejs.cn/Ts6uDc)并使用 **Ctrl**+**C** 时不会生成它。 93 | - 'SIGBREAK' 在 Windows 上,当按下 **Ctrl**+**Break** 时会发送。 在非 Windows 平台上,它可以被监听,但无法发送或生成它。 94 | - 'SIGWINCH' 当调整控制台大小时会发送。 在 Windows 上,这只会发生在当光标移动时写入控制台,或者当在原始模式下使用可读的终端时。 95 | - 'SIGKILL' 不能安装监听函数,它会无条件地终止所有平台上的 Node.js。 96 | - 'SIGSTOP' 不能安装监听函数。 97 | - 0 可以发送来测试进程是否存在,如果进程存在则没影响,如果进程不存在则抛出错误。 98 | 99 | Windows 不支持信号,因此没有等价的使用信号来终止,但 Node.js 提供了一些对 process.kill() 和 subProcess.kill() 的模拟: 100 | 101 | - 发送 SIGINT、SIGTERM、和 SIGKILL 会导致目标进程无条件的终止,之后子进程会报告进程被信号终止。 102 | - 发送信号 0 可以作为独立于平台的方式来测试进程是否存在。 103 | 104 | 105 | ## exit: [Function: exit] 106 | 107 | - code [](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) | [](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) | [](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Null_type) | [](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Undefined_type) 退出码. 如果传入的是字符串,必须是数字字符串 (e.g.,'1') . **默认是:** 0. 108 | 109 | process.exit() 通过一个退出状态码通知Node.js去同步终止进程,如果没有传参数,退出码要么是0,表示成功退出,要么是process.exitCode 设置的退出码,Node.js会等到所有的 exit 监听函数调用后终止。 110 | 111 | To exit with a 'failure' code: 112 | ```javascript 113 | const { exit } = require('node:process'); 114 | 115 | exit(1); 116 | ``` 117 | 118 | 调用 process.exit() 会让Node.js进程被强制尽快结束,即使仍然有异步操作在等待。
在大多数情况下,不需要直接调用 process.exit() ,node.js会在没有额外的任务在event loop时自己退出。
以下是一个错用 exit 的例子: 119 | ``` 120 | const { exit } = require('node:process'); 121 | 122 | // This is an example of what *not* to do: 123 | if (someConditionNotMet()) { 124 | printUsageToStdout(); 125 | exit(1); 126 | } 127 | ``` 128 | 问题在于 process.stdout 有可能是异步的,exit 会强制在这些异步调用前就让node.js进程退出了。 129 | 130 | 在node.js 发生错误时,throw 没有捕获的错误比调用 process.exit() 更安全 131 | 132 | 在worker 线程中,这个方法会终止当前的线程而不是进程,以下是一些对退出码的罗列(了解即可,一般用退出码1就行了)
当没有更多异步操作挂起时,NodeJS 通常会以 0 状态代码退出。 在其他情况下使用以下状态代码: 133 | 134 | - 1**未捕获的致命异常**:存在未捕获的异常,并且其没有被域或 'uncaughtException' 事件句柄处理。 135 | - 2: 未使用(由 Bash 保留用于内置误用) 136 | - 3**内部 JavaScript 解析错误**:NodeJS 引导过程中的内部 JavaScript 源代码导致解析错误。 这是极其罕见的,通常只能在 NodeJS 本身的开发过程中发生。 137 | - 4**内部 JavaScript eval失败**:NodeJS 引导过程中的内部 JavaScript 源代码在评估时未能返回函数值。 这是极其罕见的,通常只能在 NodeJS 本身的开发过程中发生。 138 | - 5**致命错误**:V8 中存在不可恢复的致命错误。 通常将打印带有前缀 FATAL ERROR 的消息到标准错误。 139 | - 6**非函数的内部异常句柄**:存在未捕获的异常,但内部致命异常句柄不知何故设置为非函数,无法调用。 140 | - 7**内部异常句柄运行时失败**:存在未捕获的异常,并且内部致命异常句柄函数本身在尝试处理时抛出错误。 例如,如果 'uncaughtException' 或 domain.on('error') 句柄抛出错误,就会发生这种情况。 141 | - 8: 未使用。 在以前版本的 NodeJS 中,退出码 8 有时表示未捕获的异常。 142 | - 9**无效参数**:指定了未知选项,或者提供了需要值的选项而没有值。 143 | - 10**内部 JavaScript 运行时失败**:NodeJS 引导过程中的内部 JavaScript 源代码在调用引导函数时抛出错误。 这是极其罕见的,通常只能在 NodeJS 本身的开发过程中发生。 144 | - 12**无效的调试参数**:设置了 --inspect 和/或 --inspect-brk 选项,但选择的端口号无效或不可用。 145 | - 13**未完成的顶层等待**:在顶层代码中的函数外使用了 await,但传入的 Promise 从未解决。 146 | - >128**信号退出**:如果 NodeJS 收到致命的信号,例如 SIGKILL 或 SIGHUP,则其退出码将是 128 加上信号代码的值。 这是标准的 POSIX 实践,因为退出码被定义为 7 位整数,并且信号退出设置高位,然后包含信号代码的值。 例如,信号 SIGABRT 的值是 6,因此预期的退出码将是 128 + 6 或 134。 147 | 148 | 149 | ## nextTick: [Function: nextTick] 150 | process.nextTick() 添加回调函数到"next tick 队列"。这个队列的回调会在当前js函数调用完成并且event loop没有结束的情况下一一调用。如果nextTick里嵌套调用nextTick,可能会造成无线循环。 151 | 152 | nextTick必须结合事件循环,你才能真正了解它的作用,所以建议大家去看我写的node.js 工作流详解,这篇文章。 153 | 154 | # API注意事项 155 | 首先,process是一个全局的对象,不需要require或者import引入。 156 | 157 | ### beforeExit 事件注意事项 158 | beforeExit 会在Node.js 的 event loop结束,并且没有额外的任务,会发出这个事件。 通常,当没有安排工作时,Node.js 进程将退出,但在“beforeExit”事件上注册的侦听器可以进行异步调用,从而使 Node.js 进程继续运行。 159 | 160 | 注意显示调用 process.exit() 退出进程的时候,不会触发 beforeExit 事件。
而且beforeExit可以在回调注册异步函数,相对的是在exit 事件里的异步函数不会被执行。 161 | 162 | 163 | ### exit 事件注意事项 164 | 165 | exit事件会在如下其中一种条件下触发: 166 | 167 | - 一是显示调用 process.exit() 168 | - 二是event loop 结束 169 | 170 | 注意事项,上面已经提到过了 exit 触发的回调函数必须执行的是同步操作,否则不会执行。 171 | 172 | 173 | ### uncaughtException 、unhandledRejection 和 rejectionHandled 的区别 174 | 同步代码中, 'uncaughtException' 事件在没有捕获的错误中触发(不包含promise,所以是同步代码触发).
在异步代码中,'unhandledRejection' 会在没有处理 rejections 的时候,例如promise的rejections触发,'rejectionHandled' 事件会在未处理的事件处理后触发。如下案例: 175 | ```javascript 176 | process.on("unhandledRejection", (reason, promise) => { 177 | console.log("Unhandled Rejection at:", promise); 178 | console.log("Reason:", reason); 179 | // 这里可以进行自定义的处理逻辑 180 | }); 181 | 182 | // 创建一个被拒绝的 Promise,但没有提供错误处理器 183 | const rejectedPromise = Promise.reject(new Error("Promise rejected")); 184 | 185 | process.on("rejectionHandled", (promise) => { 186 | console.log("Rejection rejectionHandled:", promise); 187 | // 这里可以进行自定义的处理逻辑 188 | }); 189 | 190 | setTimeout(() => { 191 | // 在一段时间后,我们提供了错误处理器 192 | rejectedPromise.catch((error) => { 193 | // 对错误进行处理 194 | }); 195 | }, 1000); 196 | 197 | ``` 198 | 199 | 200 | # cpuUsage 201 | process.cpuUsage()返回用户态和内核态当前node.js进程花费的时间,但是在多核cpu时,时间可能不准确 202 | 203 | # 不常用的API简单介绍 204 | 以下是举例,注释是对属性的说明 205 | ```javascript 206 | version: 'v18.17.1' , // node.js 版本 207 | versions: { // node.js和它的依赖包版本 208 | node: '18.17.1', 209 | acorn: '8.8.2', 210 | ada: '2.5.0', 211 | ares: '1.19.1', 212 | brotli: '1.0.9', 213 | cldr: '43.0', 214 | icu: '73.1', 215 | llhttp: '6.0.11', 216 | modules: '108', 217 | napi: '9', 218 | nghttp2: '1.52.0', 219 | nghttp3: '0.7.0', 220 | ngtcp2: '0.8.1', 221 | openssl: '3.0.10+quic', 222 | simdutf: '3.2.12', 223 | tz: '2023c', 224 | undici: '5.22.1', 225 | unicode: '15.0', 226 | uv: '1.44.2', 227 | uvwasi: '0.0.18', 228 | v8: '10.2.154.26-node.26', 229 | zlib: '1.2.13.1-motley' 230 | }, 231 | arch: 'arm64', // 架构 232 | platform: 'darwin', // 平台 233 | release: { // 当前发布版本的metadata,例如 sourceUrl 是一个指向.tar.gz文件的URL,这个压缩包包含当前版本的node安装包 234 | name: 'node', 235 | lts: 'Hydrogen', 236 | sourceUrl: 'https://nodejs.org/download/release/v18.17.1/node-v18.17.1.tar.gz', 237 | headersUrl: 'https://nodejs.org/download/release/v18.17.1/node-v18.17.1-headers.tar.gz' 238 | }, 239 | config: [Getter/Setter], // 编译可执行的node.js文件的配置信息 240 | dlopen: [Function: dlopen], // 加载 c++ addon的方法, 241 | uptime: [Function: uptime], // 当前node程序运行时间 242 | cpuUsage: [Function: cpuUsage], // 返回当前进程的用户和系统 CPU 时间使用情况 243 | resourceUsage: [Function: resourceUsage], 244 | hrtime: [Function: hrtime] { bigint: [Function: hrtimeBigInt] }, // 一般用于测量某段代码花费的时间 245 | getuid: [Function: getuid], // 返回当前进程的用户标识符(UID)。UID是一个唯一的整数,用于标识特定的用户。 246 | getgid: [Function: getgid], // 返回当前进程的组标识符(GID)。GID是一个唯一的整数,用于标识特定的用户组 247 | getgroups: [Function: getgroups],// 返回当前进程附加组id,这个需要具备基本linux权限基础才能理解 248 | allowedNodeEnvironmentFlags: [Getter/Setter],// 返回一组传入node.js启动命令的环境变量,例如--inspect-brk是用来debug node程序的 249 | setUncaughtExceptionCaptureCallback: [Function (anonymous)], // 函数设置一个函数,当发生未捕获的异常时将调用该函数 250 | hasUncaughtExceptionCaptureCallback: [Function: hasUncaughtExceptionCaptureCallback], // 监测是否设置了 setUncaughtExceptionCaptureCallback 251 | emitWarning: [Function: emitWarning], // 打印自定义的warning信息,并且可以被process的waring事件监听 252 | stdout: [Getter], // 连接标准可写流 253 | stdin: [Getter], // 连接标准可读流 254 | stderr: [Getter], // 连接标准错误流 255 | abort: [Function: abort], // Node.js process 立即退出 256 | chdir: [Function (anonymous)], // 更改 Node.js 进程的当前工作目录,如果失败(例如,如果指定的目录不存在),则抛出异常 257 | cwd: [Function: wrappedCwd], // 返回当前process运行的工作目录 258 | initgroups: [Function: initgroups], // 返回/etc/group 中该用户所属的所有组,但需要root权限运行node.js process 259 | env: { // 环境变量 260 | TERM_PROGRAM: 'Apple_Terminal', 261 | SHELL: '/bin/zsh', 262 | TERM: 'xterm-256color', 263 | TMPDIR: '/var/folders/4g/5wdk7dy56x76p6lkh4c0v6bm0000gn/T/', 264 | TERM_PROGRAM_VERSION: '445', 265 | TERM_SESSION_ID: '067246E3-2D6C-4797-BB3D-3178492AE3C0', 266 | USER: 'mengxiang', 267 | SSH_AUTH_SOCK: '/private/tmp/com.apple.launchd.CvBYNiisO3/Listeners', 268 | PATH: '/Users/mengxiang/.nvm/versions/node/v18.17.1/bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin', 269 | __CFBundleIdentifier: 'com.apple.Terminal', 270 | PWD: '/Users/mengxiang/Desktop/npm', 271 | XPC_FLAGS: '0x0', 272 | XPC_SERVICE_NAME: '0', 273 | SHLVL: '1', 274 | HOME: '/Users/mengxiang', 275 | LOGNAME: 'mengxiang', 276 | OLDPWD: '/Users/mengxiang/Desktop/npm', 277 | NVM_DIR: '/Users/mengxiang/.nvm', 278 | NVM_CD_FLAGS: '-q', 279 | NVM_NODEJS_ORG_MIRROR: 'https://nodejs.org/dist', 280 | NVM_IOJS_ORG_MIRROR: 'https://iojs.org/dist', 281 | MANPATH: '/Users/mengxiang/.nvm/versions/node/v18.17.1/share/man:/Library/Frameworks/Python.framework/Versions/2.7/share/man:/usr/local/share/man:/usr/share/man:/Library/Apple/usr/share/man:/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/share/man:/Library/Developer/CommandLineTools/usr/share/man', 282 | NVM_BIN: '/Users/mengxiang/.nvm/versions/node/v18.17.1/bin', 283 | LANG: 'zh_CN.UTF-8', 284 | _: '/Users/mengxiang/.nvm/versions/node/v18.17.1/bin/node', 285 | __CF_USER_TEXT_ENCODING: '0x1F5:0x19:0x34' 286 | }, 287 | argv: [ '/Users/mengxiang/.nvm/versions/node/v18.17.1/bin/node' ],// 返回运行时的参数 288 | pid: 3797, // 返回进程id 289 | ppid: 3555,// 返回父进程pid 290 | execPath: '/Users/mengxiang/.nvm/versions/node/v18.17.1/bin/node', // process.execPath 属性返回启动 Node.js 进程的可执行文件的绝对路径名 291 | debugPort: 9229, // 指定node.js的debugPort 292 | exitCode: undefined, // node.js process退出码,process.exit()不传入参数会默认用这个退出码 293 | report: [Getter], // node.js 自带的分析报告功能 294 | } 295 | ``` 296 | 297 | 298 | -------------------------------------------------------------------------------- /src/security.md: -------------------------------------------------------------------------------- 1 | # 安全 2 | 3 | * Crypto (加密) 4 | * HTTPS 5 | * XSS 6 | * CSRF 7 | * 中间人攻击 8 | * Sql/Nosql 注入攻击 9 | 10 | 11 | ## Crypto 12 | 13 | Node.js 的 `crypto` 模块封装了诸多的加密功能, 包括 OpenSSL 的哈希、HMAC、加密、解密、签名和验证函数等. 14 | 15 | Node.js 的加密貌似有点问题, 某些算法算出来跟别的语言 (比如 Python) 不一样. 具体情况还在整理中 (时间不定), 欢迎补充. 16 | 17 | 简单说几种常用的crypto的业务中的使用 18 | ```javascript 19 | const crypto = require('crypto'); 20 | const md5 = crypto.createHash('md5');//返回哈希算法 21 | const md5Sum = md5.update('hello');//指定要摘要的原始内容,可以在摘要被输出之前使用多次update方法来添加摘要内容 22 | const result = md5Sum.digest('hex');//摘要输出,在使用digest方法之后不能再向hash对象追加摘要内容。 23 | console.log(result); 24 | ``` 25 | 上面这种散列(哈希)算法,也可以加盐,升级一下破解难度,也就是HMAC算法。 26 | 27 | 这里简单写一下非对称加密rsa相关代码,面试常考的https就跟这个有关。 28 | 29 | 首先用openssl创建ras的公钥和私钥 30 | ```javascript 31 | openssl rsa -in ras_private.key -puhout -out rsa_public.key 32 | ``` 33 | 34 | 用起来,看如何用公钥加密,私钥解密 35 | ```javascript 36 | const crypto = require('crypto'); 37 | const fs = require('fs'); 38 | const key = fs.readFileSync(path.join(_dirname, 'rsa_private.key')); 39 | const cert = fs.readFileSync(path.join(_dirname, 'rsa_public.key')); 40 | // 公钥加密 41 | const secret = crypto.publicEncrypt(cert, buffer); 42 | // 私钥揭秘 43 | crypto.privateDecrypt(key, secret) 44 | ``` 45 | 46 | 顺便还可以问下面试者,什么是签名,签名有啥用。 47 | 48 | 在网络中,私钥的拥有者可以在一段数据被发送之前先对数据进行签名得到一个签名 通过网络把此数据发送给数据接收者之后,数据的接收者可以通过公钥来对该签名进行验证,以确保这段数据是私钥的拥有者所发出的原始数据,且在网络中的传输过程中未被修改 49 | 50 | ## HTTPS 51 | 52 | ### https解决http的哪些问题?https是如何解决 53 | #### 机密性 54 | - http使用明文传输,使得通信过程可能被窃听。 55 | - https在交换密钥阶段使用非对称加密,建立通信后使用对称加密。所以数据是经过加密的。 56 | #### 完整性 57 | - 由于HTTP协议无法验证报文的完整性,因此数据在传输过程中可能已经遭到中间人攻击,导致报文被篡改。 58 | - 摘要算法是常说的散列函数和哈希函数,可以为数据生成独一无二的指纹,用于校验数据的完整性。客户端在发送数据之前通过摘要算法算出明文的的指纹,发送的时候明文和指纹会一起发送,校验的时候会先把明文用相同的摘要算法算成指纹,对比前后指纹是否相同,看数据是否被篡改了。 59 | #### 身份认证 60 | - HTTP协议中不会对请求和应答的双方进行身份确认,所以身份有可能遭遇伪装。HTTPS的SSL不仅提供加密服务,还提供证书,用来确定通信方。证书是由值得信任的第三方机构办法,伪造证书异常困难,所以只要能够确认通信方持有的证书,则可以确认对方身份。 61 | 62 | #### https大致流程 63 | 64 | - 客户端发起一个http请求,告诉服务器自己支持哪些hash算法。 65 | 66 | - 服务端把自己的信息以数字证书的形式返回给客户端(证书内容有密钥公钥,网站地址,证书颁发机构,失效日期等)。证书中有一个公钥来加密信息,私钥由服务器持有。 67 | 68 | - 验证证书的合法性 69 | 70 | 客户端收到服务器的响应后会先验证证书的合法性(证书中包含的地址与正在访问的地址是否一致,证书是否过期)。 71 | 72 | - 客户端使用伪随机数生成器生成加密所使用的对称密钥,然后用证书的公钥加密这个对称密钥,发给Server。 73 | - 服务端使用自己的私钥(private key)解密这个消息,得到对称密钥。至此,Client和Server双方都持有了相同的对称密钥。 74 | 75 | ## XSS 76 | 77 | XSS精品文章参见美团技术部出品(https://tech.meituan.com/2018/09/27/fe-security.html) 78 | 79 | 我们这里提几个XSS面试题 80 | 81 | ### 1、 过滤 Html 标签能否防止 XSS? 请列举不能的情况? 82 | 答案肯定是不能的,比如我们常见的转义函数如下: 83 | ```javascript 84 | const escapeHTML = str => 85 | str.replace( 86 | /[&<>'"]/g, 87 | tag => 88 | ({ 89 | '&': '&', 90 | '<': '<', 91 | '>': '>', 92 | "'": ''', 93 | '"': '"' 94 | }[tag] || tag) 95 | ); 96 | ``` 97 | 为啥防不住呢,如下的案例: 98 | ```html 99 | 100 | ``` 101 | 这个src里的`javascript:`不会被转义,照样这个xss会执行。 102 | 103 | 用户除了上传 104 | 105 | ```html 106 | 107 | ``` 108 | 109 | 还可以使用图片 url 等方式来上传脚本进行攻击 110 | 111 | ```html 112 |
113 | 114 | ``` 115 | 116 | 还可以使用各种方式来回避检查, 例如空格, 回车, Tab 117 | 118 | ```html 119 | 121 | ``` 122 | 123 | 还可以通过各种编码转换 (URL 编码, Unicode 编码, HTML 编码, ESCAPE 等) 来绕过检查 124 | 125 | ``` 126 | 127 | 128 | ``` 129 | 130 | ## CSRF 131 | 132 | 跨站请求伪造 (Cross-Site Request Forgery, CSRF, https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet) 是一种伪造跨站请求的攻击方式. 例如利用你在 A 站 (攻击目标) 的 cookie / 权限等, 在 B 站 (恶意/钓鱼网站) 拼装 A 站的请求. 133 | 134 | 比如 Q 君是某论坛管理员. 已知这个论坛 A 删除的接口是 post 到某个地址, 并指定一个帖子的 id. 那么我可以在自己的博客 B 上组织一个 CSRF 请求. 然后诱使 Q 君来访问我的博客. 就可以在 Q 君不知情的情况下删除掉我想删的某个帖子. 135 | 136 | 钓鱼方式包括但不限于公开网站 (xss), 攻击者的恶意网站, email 邮件, 微博, 微信, 短信等及时消息. 137 | 138 | 同源策略是最早用于防止 CSRF 的一种方式, 即关于跨站请求 (Cross-Site Request) 只有在同源/信任的情况下才可以请求. 但是如果一个网站群, 在互相信任的情况下, 某个网站出现了问题: 139 | 140 | ``` 141 | a.public.com 142 | b.public.com 143 | c.public.com 144 | ... 145 | ``` 146 | 147 | 以上情况下, 如果 c.public.com 上没有预防 xss 等情况, 使得攻击者可以基于此站对其他信任的网站发起 CSRF 攻击. 148 | 149 | 另外同源策略主要是浏览器来进行验证的, 并且不同浏览器的实现又各自不同, 所以在某些浏览器上可以直接绕过, 而且也可以直接通过短信等方式直接绕过浏览器. 150 | 151 | 预防: 152 | 153 | 1. A 站 (预防站) 检查 http 请求的 header 确认其 origin 154 | 2. 检查 CSRF token 155 | 156 | ### 1.同源检查 157 | 158 | 通过检查来过滤简单的 CSRF 攻击, 主要检查一下两个 header: 159 | 160 | * Origin Header 161 | * Referer Header 162 | 163 | ### 2.CSRF token 164 | 165 | 简单来说, 对需要预防的请求, 通过特别的算法生成 token 存在 session 中, 然后将 token 隐藏在正确的界面表单中, 正式请求时带上该 token 在服务端验证, 避免跨站请求. 166 | 167 | 168 | ## 中间人攻击 169 | 170 | 中间人 (Man-in-the-middle attack, MITM) 是指攻击者与通讯的两端分别创建独立的联系, 并交换其所收到的数据, 使通讯的两端认为他们正在通过一个私密的连接与对方直接对话, 但事实上整个会话都被攻击者完全控制. 在中间人攻击中, 攻击者可以拦截通讯双方的通话并插入新的内容. 171 | 172 | 目前比较常见的是在公共场所放置精心准备的免费 wifi, 劫持/监控通过该 wifi 的流量. 或者攻击路由器, 连上你家 wifi 攻破你家 wifi 之后在上面劫持流量等. 173 | 174 | 对于通信过程中的 MITM, 常见的方案是通过 PKI / TLS 预防, 及时是通过存在第三方中间人的 wifi 你通过 HTTPS 访问的页面依旧是安全的. 而 HTTP 协议是明文传输, 则没有任何防护可言. 175 | 176 | 不常见的还有强力的互相认证, 你确认他之后, 他也确认你一下; 延迟测试, 统计传输时间, 如果通讯延迟过高则认为可能存在第三方中间人; 等等. 177 | 178 | ## SQL 注入 179 | 180 | 注入攻击是指当所执行的一些操作中有部分由用户传入时, 用户可以将其恶意逻辑注入到操作中. 当你使用 eval, new Function 等方式执行的字符串中有用户输入的部分时, 就可能被注入攻击. 上文中的 XSS 就属于一种注入攻击. 前面的章节中也提到过 Node.js 的 child_process.exec 由于调用 bash 解析, 如果执行的命令中有部分属于用户输入, 也可能被注入攻击. 181 | 182 | ### SQL 183 | 184 | Sql 注入是网站常见的一种注入攻击方式. 其原因主要是由于登录时需要验证用户名/密码, 其执行 sql 类似: 185 | 186 | ```sql 187 | SELECT * FROM users WHERE usernae = 'myName' AND password = 'mySecret'; 188 | ``` 189 | 190 | 其中的用户名和密码属于用户输入的部分, 那么在未做检查的情况下, 用户可能拼接恶意的字符串来达到其某种目的, 例如上传密码为 `'; DROP TABLE users; --` 使得最终执行的内容为: 191 | 192 | ```sql 193 | SELECT * FROM users WHERE usernae = 'myName' AND password = ''; DROP TABLE users; --'; 194 | ``` 195 | 196 | 防止的手段目前普遍都采用参数化查询。比如mysql,是本身就有的功能。 197 | 198 | 在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有指令,也不会被数据库运行。 199 | 200 | 我们来实际举一个例子: 201 | 202 | 假设我们有一个简单的登录表单,其中包含用户名和密码字段,并且我们需要在数据库中验证用户是否存在。我们可以使用以下查询语句来验证用户: 203 | 204 | sql 205 | Copy code 206 | SELECT * FROM users WHERE username = '$username' AND password = '$password' 207 | 其中,$username和$password是从表单输入中获得的变量。这个查询语句将用户输入的用户名和密码作为字符串直接插入到查询语句中,这种方式容易受到SQL注入攻击的影响。 208 | 209 | 现在假设攻击者在用户名输入框中输入了一个恶意的值,如下所示: 210 | 211 | ``` 212 | ' OR 1=1-- 213 | ``` 214 | 在这种情况下,查询语句将变成: 215 | 216 | ```sql 217 | SELECT * FROM users WHERE username = '' OR 1=1--' AND password = '$password' 218 | ``` 219 | 这个查询语句将返回所有用户记录,因为它使用了OR 1=1语句,这个条件将始终为真。攻击者现在可以通过尝试各种密码来登录任何用户账户。 220 | 221 | 为了避免这种情况,我们可以使用参数化查询,通过占位符将输入数据与查询语句分离,例如: 222 | 223 | ```sql 224 | SELECT * FROM users WHERE username = ? AND password = ? 225 | ``` 226 | 然后,在查询执行之前,我们将输入数据传递给数据库引擎,例如: 227 | 228 | ```sql 229 | $username = 'john'; 230 | $password = 'password123'; 231 | # 创建查询语句 232 | const ss = ("SELECT * FROM users WHERE username = ? AND password = ?"); 233 | # 绑定查询参数 234 | bind_param(ss, $username, $password); 235 | # 执行查询 236 | execute(); 237 | ``` 238 | 239 | 240 | 在这种情况下,如果攻击者输入了一个恶意的值,例如 ' OR 1=1--,那么它仍然会被视为一个普通的字符串值,并作为参数传递给查询语句,而不会被视为SQL代码。这样,即使攻击者使用了SQL注入攻击,也不会对数据库造成任何伤害。 241 | 242 | 243 | 244 | 245 | -------------------------------------------------------------------------------- /src/storage.md: -------------------------------------------------------------------------------- 1 | # 存储 2 | 3 | * `[Point]` Sql 4 | * `[Point]` NoSql 5 | * `[Point]` 数据一致性 6 | 7 | ## 简介 8 | 9 | 科班的同学可以了解一下[数据库范式](http://www.cnblogs.com/CareySon/archive/2010/02/16/1668803.html), 在 ElemeFe 面试不会问, 但是其他地方可能会问 (比如阿里). 10 | 11 | 12 | ## Mysql夺命连环问 13 | 14 | SQL (Structured Query Language) 是[关系式数据库管理系统](https://en.wikipedia.org/wiki/Relational_database)的标准语言, 关于关系型数据库这里主要带大家看一下 Mysql 的几个问题 15 | 16 | ## mysql 预算符连环问,请问以下输出什么,为什么呢 17 | ```SQL 18 | SELECT 100 + '1' FROM DUAL; 19 | SELECT 100 + ’a‘ FROM DUAL; 20 | SELECT 100 + NULL FROM DUAL; 21 | SELECT 1 = NULL FROM DUAL; 22 | ``` 23 | - 第一个输出101,原因是在SQL,+没有连接的作用,就表示运算,会讲字符串隐式转换为数值 24 | - 第二个输出100,原因是会把'a'看做是0 25 | - 第三个输出null, 因为null参与预算结果都是null 26 | - 第四个输出null,因为只要有null参与判断,都返回null 27 | 28 | 那逻辑判断如何等于null呢? 29 | 30 | 使用 IS NULL 31 | 32 | ## char和varchar字符宽度的区别 33 | 请问char(M)和varchar(M)中,两个M分别指什么 34 | 35 | - char和varchar最大的不同就是一个是固定长度,一个是可变长度.由于是可变长度,因此存储的是实际字符串再加上一个记录字符串长度的字节。如果分配给char或varchar列的值超过 列的最大长度,则对值进行裁剪. 36 | 37 | - char(size) 最大255字符 38 | - varchar(size) 最大65532字节,注意这里是字节,不同的编码,实际记录的字符是不一样的,而且这里不是65535,utf8编码最大21844字符,1-3个字节用于记录大小 39 | 40 | ## 字符集utf8和utf8mb4的区别,哪一个是mysql8的指定字符集 41 | 首先,mysql8官方默认字符集是utf8mb4 42 | 43 | - utf8介绍 44 | - 最大字字符长度为3字节,如果遇到4字节的字符就会出现错误,也就是覆盖了unicode码的基本平面 45 | - 无法存表情和不常用汉字(unicode不在基本平面) 46 | - 消耗空间比utf8mb4少 47 | 48 | - utf8mb4 49 | - 最大字符长度为4字节 50 | - 对于CHAR类型数据,存储会多消耗一些空间 51 | - 多了表情的支持 52 | 53 | 接着提问:对于排序,utf8mb4_unicode_ci与utf8mb4_general_ci如何选择 54 | 55 | 从准确性和性能两方面来看 56 | - utf8mb4_unicode_ci是基于Unicode来排序和比较,能够在个语言之间精确排序 57 | - utf8mb4_general_ci没有实现Unicode排序,在某些语言和特殊字符上,排序结果可能不如期望,但是在绝大数情况下,我们不需要这么精确的排序 58 | 从性能上来说 59 | - utf8mb4_general_ci在比较和排序时更快 60 | 61 | ## SQL子查询题目 62 | 63 | [参考这篇文章](https://juejin.cn/post/7083685848637505567),这几道题拿两个面试面试者,会的话,尤其是相关子查询能做出来,说明后渲染sql基本还行。 64 | 65 | ## 字符集乱码问题 66 | 67 | 你能从mysql的 68 | - 查询结果字符集(character_set_result) 69 | - 客户端(character_set_client) 70 | - 连接器(character_set_connection) 71 | - server(character_set_server) 72 | 来说明乱码的原因。 73 | 74 | 解答:他们的关系如下图 75 | ``` 76 | 客户端字符集 -------> 连接器字符集 ------> 77 | | ↑ server字符集 78 | 查询结果字符集 <----------| ↑------------ 79 | ``` 80 | 存数据: 81 | - 客户端字符集如果跟连接器字符集不一样,会将客户端字符集转换为连接器字符集 82 | - 连接器字符集如果跟server字符集不一致会转为server端字符集 83 | 取数据: 84 | - server端字符集转为连接器字符集(如果不一样) 85 | - 连接器字符集转为查询结果字符集(如果不一样) 86 | 87 | 所以在mysql5.7的默认字符集里,只有server和database是latin1,我们需要把server改为utf8就可以避免乱码了,但有时候这种修改没有用,举个例子。 88 | 89 | 1.如果客户端是 gbk 编码,而连接器是 latin1 编码,数据库是 utf8 编码,那么此时插入数据后查看是否乱码? 90 | 91 | 回答:是乱码的,因为在 gbk 编码转 latin1 编码时出现了丢失,这种丢失造成的乱码是不可修复的,所以数据库编码要大于连接器编码,连接器编码要大于客户端编码。 92 | 93 | ## mysql的逻辑结构 94 | 大致结构如下: 95 | !['](https://pic1.zhimg.com/80/v2-044841d86673fdf7db91883ea5bc931c_1440w.jpg) 96 | 97 | ### 第一层:connectors 98 | 99 | connectors,指的是不同语言与SQL的交互,MySQL首先是一个网络程序,在TCP定义了自己的应用层协议,所以要使用mysql,需要跟mysql server建立连接,按照协议交互。我们通常连接的客户端有很多,PHP、python、jdbc等等都有。 100 | 101 | ### 第二层:连接层 102 | 103 | 经过三次握手建立连接后,mysql对传输过来的账号密码做验证,获取权限,,此时mysql会创建一个连接池 + 长连接的方式管理连接 104 | 105 | ### 第三层: 服务层 106 | 107 | 主要是处理客户端请求的sql语句,如何处理呢?大致流程就是 108 | - 查询缓存,如果有就用缓存,没有就进入到解析器截断,mysql8放弃了缓存这一层,为什么呢,因为绝大多数情况缓存命中率非常低,原因如下: 109 | - 查询请求要求在任何字符上都必须相同(例如:空格,注释,大小写变化,缓存失效) 110 | - 请求包含某些系统函数,用户自定义变量,如NOW,缓存失效 111 | - 本身缓存失效,比如使用INSERT,UPDATE,DELETE等语句 112 | - 只有对静态表而言缓存非常好 113 | - 解析器:在解析器中对SQL语句进行语法分析,语义分析和ast抽象语法树 114 | - 优化器:优化sql语句 115 | - 执行器:没有真正去读写表,只是产生出了一个执行计划 116 | 117 | ### 第四层:引擎层 118 | 119 | 插件式的存储引擎,常见的有Inodb,myisam,它们真正负责了mysql中数据的存储和提取。 120 | 121 | 122 | ### 存储引擎 123 | 124 | INNODB 还是 MYISAM的区别,对于实际工作,主要有三点使我们考量使用哪一种存储引擎的关键: 125 | - 事务支持,INNODB支持,MYISAM不支持 126 | - 缓存, MYISAM之缓存索引,不缓存真实数据,INNODB缓存索引,还缓存真实数据,对内存要求较高,而且内存大小对性能有决定性影响 127 | - 行表锁,MYISAM支持表锁,不适合高并发操作。INNODB支持行锁,适合高并发场景。 128 | 129 | ### 索引 130 | 131 | 索引让数据查找很快,为啥不把数据的每一列都加上索引呢? 132 | 133 | 因为建立索引是有代价的: 134 | 135 | - 空间上的代价 136 | 137 | 每建立一个索引都要为它建立一棵B+树,每一棵B+树的每一个节点都是一个数据页,一个页默认会 占用 16KB 的存储空间,一棵很大的B+树由许多数据页组成,那就是很大的一片存储空间。 138 | - 时间上的代价 139 | 140 | 每次对表中的数据进行 增、删、改 操作时,都需要去修改各个B+树索引。而且我们讲过,B+树每 层节点都是按照索引列的值 从小到大的顺序排序 而组成了 双向链表 。不论是叶子节点中的记录,还 是内节点中的记录(也就是不论是用户记录还是目录项记录)都是按照索引列的值从小到大的顺序 而形成了一个单向链表。而增、删、改操作可能会对节点和记录的排序造成破坏,所以存储引擎需 要额外的时间进行一些 记录移位 , 页面分裂 、 页面回收 等操作来维护好节点和记录的排序。如果 我们建了许多索引,每个索引对应的B+树都要进行相关的维护操作,会给性能拖后腿。 141 | 142 | 你可以接着询问b+tree的数据结构,从而1是如何证明上面的言论,而是更加深入的了解面试者的mysql数据结构上的理解。 143 | 144 | 如下如就是b+tree的数据结构 145 | ![1](https://img-blog.csdnimg.cn/img_convert/36ca56387f65d7351dd5acebf8326b89.png) 146 | 147 | 148 | 这种数据结构的优缺点如下: 149 | 150 | #### 优点: 151 | 152 | - 数据访问更快 ,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非 聚簇索引更快 153 | - 聚簇索引对于主键的 排序查找 和 范围查找 速度非常快 154 | - 按照聚簇索引排列顺序,查询显示一定范围数据的时候,由于数据都是紧密相连,数据库不用从多 个数据块中提取数据,所以节省了大量的io操作 。 155 | #### 缺点: 156 | 157 | - 插入速度严重依赖于插入顺序 ,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影 响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键 158 | - 更新主键的代价很高 ,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为 不可更新 159 | - 二级索引访问需要两次索引查找 ,第一次找到主键值,第二次根据主键值找到行数据 160 | 161 | ### 索引 162 | 163 | 索引是用空间换时间的一种优化策略. 推荐阅读: [mysql索引类型](http://www.cnblogs.com/cq-home/p/3482101.html) 以及 [主键与唯一索引的区别](http://blog.mimvp.com/2015/03/the-difference-between-primary-key-and-unique-index/) 164 | 165 | 166 | ## 范式 167 | 168 | ### 为什么需要规范sql数据规范化? 169 | 170 | 数据设计不合理,会存在数据重复、更新插入异常等情况 171 | 172 | ### 三大范式 173 | 174 | - 第一范式(1NF):要求数据库的每一列都是不可分割的原子数据项,即原子性。 175 | 176 | 177 | - 第二范式(2NF):在满足第一范式的前提下,非码属性必须完全依赖于候选码,即表中的每一列都和主键相关,而不能至于主键的某一部分相关(主要针对联合主键而言),即每张表只描述一件事情。 178 | 179 | - 第三范式(3NF):在第二范式前提下,任何非主属性不依赖于其他非主属性(在2NF基础上,消除传递依赖)。即确保数据表中的每一列数据都和主键直接相关,而不能间接相关。 180 | 181 | 182 | ## Mongodb 183 | 184 | > Monogdb 连接问题(超时/断开等)有可能是什么问题导致的? 185 | 186 | * 网络问题 187 | * 任务跑不完, 超过了 driver 的默认链接超时时间 (如 30s) 188 | * Monogdb 宕机了 189 | * 超过了连接空闲时间 (connection idle time) 被断开 190 | * fd 不够用 (ulimit 设置) 191 | * mongodb 最大连接数不够用 (可能是连接未复用导致) 192 | * etc... 193 | 194 | 195 | Mongodb我不熟,主要还是用mysql,这块待社区的同学补充 196 | 197 | ## Replication 198 | 199 | > 备份数据库与 M/S, M/M 等部署方式的区别? 200 | 201 | 关于数据库基于各种模式的特点全部可以通过以下图片分清: 202 | 203 | ![storage](/assets/storage.jpeg) 204 | 205 | 图片出处:Google App Engine 的 co-founder Ryan Barrett 在 2009 年的 google i/o 上的演讲 [《Transaction Across DataCenter》](http://snarfed.org/transactions_across_datacenters_io.html)(视频: http://www.youtube.com/watch?v=srOgpXECblk) 206 | 207 | 根据上图, 我们可以知道 Master/Slave 与 Master/Master 的关系. 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 |
attrMaster/SlaveMaster/Master
一致性Eventually:当你写入一个新值后,有可能读不出来,但在某个时间窗口之后保证最终能读出来。比如:DNS,电子邮件、Amazon S3,Google搜索引擎这样的系统。
事务完整本地
延迟低延迟
吞吐高吞吐
数据丢失部分丢失
熔断只读读/写
218 | 219 | ### 读写分离 220 | 221 | 读写分离是在 query 量大的情况下减轻单个 DB 节点压力, 优化数据库读/写速度的一种策略. 不论是 MySQL 还是 MongoDB 都可以进行读写分离. 222 | 223 | 通常是 M/S 的情况, 使用 Master 专门写, 用 Slave 节点专门读. 使用读写分离时, 请确认读的请求对一致性要求不高, 因为从写库同步读库是有延迟的. 224 | 225 | 226 | ## 数据一致性 227 | 228 | 关于数据一致性推荐看陈皓的[分布式系统的事务处理](http://www.infoq.com/cn/articles/distributed-system-transaction-processing) 229 | 230 | > 什么情况下数据会出现脏数据? 如何避免? 231 | 232 | * 从 A 帐号中把余额读出来 233 | * 对 A 帐号做减法操作 234 | * 把结果写回 A 帐号中 235 | * 从 B 帐号中把余额读出来 236 | * 对 B 帐号做加法操作 237 | * 把结果写回 B 帐号中 238 | 239 | 为了数据的一致性, 这6件事, 要么都成功做完, 要么都不成功, 而且这个操作的过程中, 对A、B帐号的其它访问必需锁死, 所谓锁死就是要排除其它的读写操作, 否则就会出现脏数据 ---- 即数据一致性的问题. 240 | 241 | 这个问题并不仅仅出现在数据库操作中, 普通的并发以及并行操作都可能导致出现脏数据. 避免出现脏数据通常是从架构上避免或者采用事务的思想处理. 242 | 243 | ### 矛盾 244 | 245 | * 1)要想让数据有高可用性,就得写多份数据 246 | * 2)写多份的问题会导致数据一致性的问题 247 | * 3)数据一致性的问题又会引发性能问题 248 | 249 | 强一致性必然导致性能短板, 而弱一致性则有很好的性能但是存在数据安全(灾备数据丢失)/一致性(脏读/脏写等)的问题. 250 | 251 | 目前 Node.js 业内流行的主要是与 Mongodb 配合, 在数据一致性方面属于短板. 252 | 253 | ### 事务 254 | 255 | 事务并不仅仅是 sql 数据库中的一个功能, 也是分布式系统开发中的一个思想, 事务在分布式的问题中可以称为 "两阶段提交" (以下引用陈皓原文) 256 | 257 | 第一阶段: 258 | 259 | * 协调者会问所有的参与者结点,是否可以执行提交操作。 260 | * 各个参与者开始事务执行的准备工作:如:为资源上锁,预留资源,写undo/redo log…… 261 | * 参与者响应协调者,如果事务的准备工作成功,则回应“可以提交”,否则回应“拒绝提交”。 262 | 263 | 第二阶段: 264 | 265 | * 如果所有的参与者都回应“可以提交”,那么,协调者向所有的参与者发送“正式提交”的命令。参与者完成正式提交,并释放所有资源,然后回应“完成”,协调者收集各结点的“完成”回应后结束这个Global Transaction。 266 | * 如果有一个参与者回应“拒绝提交”,那么,协调者向所有的参与者发送“回滚操作”,并释放所有资源,然后回应“回滚完成”,协调者收集各结点的“回滚”回应后,取消这个Global Transaction。 267 | 268 | 异常: 269 | 270 | * 如果第一阶段中,参与者没有收到询问请求,或是参与者的回应没有到达协调者。那么,需要协调者做超时处理,一旦超时,可以当作失败,也可以重试。 271 | * 如果第二阶段中,正式提交发出后,如果有的参与者没有收到,或是参与者提交/回滚后的确认信息没有返回,一旦参与者的回应超时,要么重试,要么把那个参与者标记为问题结点剔除整个集群,这样可以保证服务结点都是数据一致性的。 272 | * 第二阶段中,如果参与者收不到协调者的commit/fallback指令,参与者将处于“状态未知”阶段,参与者完全不知道要怎么办。 273 | 274 | 275 | 276 | 277 | 278 | -------------------------------------------------------------------------------- /src/storage/mysql/image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/storage/mysql/image-1.png -------------------------------------------------------------------------------- /src/storage/mysql/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lio-mengxiang/Back-end-knowledge-for-front-end-developer/b50cb91085c2b68b6882c0532a1d56c3eef861cb/src/storage/mysql/image.png --------------------------------------------------------------------------------