MENU

涅槃计划 - 由 XMind ZEN 导出

September 16, 2019 • Read: 71 • 专业,后端,工作阅读设置

涅槃计划

操作系统

进程

  • 进程与线程
  • 进程同步与互斥
  • 协程
  • 死锁
  • 进程通讯
  • 调度
  • 同步异步

内存

  • 分段
  • 分页
  • 段页
  • 虚拟内存
  • 页面置换

编译

  • 动态链接
  • 静态链接

工具流

Linux

  • 基本操作

    • 文件和目录操作命令
      • ls
      • cd
      • mkdir
      • cp
      • mv
      • cat
      • more
      • les
      • pwd
      • ln
      • touch
      • vi
    • 用户与用户组管理命令
      • useradd
      • groupadd
      • userdel
      • groupdel
      • passwd
      • su
      • chmod
      • chown
    • 磁盘及文件系统管理命令
      • df
      • mount
      • unmount
    • 进阶命令
      • grep
      • man
      • find
      • zip
      • tar
      • fdisk
      • kill
      • top
      • systemctl
      • awk
      • sed
      • xargs
      • find
      • sort
      • alias
      • read
      • uniq
      • tee
      • cat
      • ps
  • 正则

    • 元字符

      • .
        • 匹配除换行符以外的任意字符
      • \w
        • 匹配数字或者下划线或汉子
          • 反义 \W 不匹配字母数字下划线
      • \s
        • 匹配任意的空白符
          • 反义 \S 不匹配空白符
      • \d
        • 匹配一位数字
          • 反义 \D 不匹配数字
      • \b
        • 匹配单词的开始或结束
          • 反义 \B 不是单词开头或者结束
      • ^
        • 匹配字符串的开始
          • 反义[^x] 除 x之外
      • $
        • 匹配字符串的结束
    • 重复 限定符

      • ?重复零次或者一次

        • 元字符 表示数量 表示*前面连续重复使用的次数

        • .*任意数量的不包含换行的字符

        • 重复一次或者多次
      • {n} 重复n次

      • {n,} 重复n次或更多次

      • {n,m} 重复n到m次

    • 字符转义

      • \
    • 字符类

      • [] 匹配其中之一
    • 分支

      • |
    • 分组-子表达式

      • ()
    • ()用法

      • 后向引用
        • () + \数字 表示重复使用前面使用过的分组
      • 捕获
      • 零宽断言
        • 负向零宽断言
      • 注释
        • (?#comment)来包含注释
    • 贪婪与懒惰

      • 没有? 是贪婪 尽可能多的匹配
      • 有? 是懒惰,尽量少的匹配
    • 平衡组/递归匹配

  • 脚本

    • python

    • shell

      https://www.cnblogs.com/rainman/archive/2011/09/16/2179313.html

      • 以 #! /bin/sh 开头

      • 变量都是字符串 以 $ 表示

      • 由export关键字处理过的变量叫做环境变量

      • 三种命令

        • Unix命令

          虽然在shell脚本中可以使用任意的unix命令,但是还是有一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。

          常用命令语法及功能

          echo “some text”: 将文字内容打印在屏幕上

          ls: 文件列表

          wc –l filewc -w filewc -c file: 计算文件行数计算文件中的单词数计算文件中的字符数

          cp sourcefile destfile: 文件拷贝

          mv oldname newname : 重命名文件或移动文件

          rm file: 删除文件

          grep ‘pattern’ file: 在文件内搜索字符串比如:grep ’searchstring’ file.txt

          cut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆,这是两个完全不同的命令

          cat file.txt: 输出文件内容到标准输出设备(屏幕)上

          file somefile: 得到文件类型

          read var: 提示用户输入,并将输入赋值给变量

          sort file.txt: 对file.txt文件中的行进行排序

          uniq: 删除文本文件中出现的行列比如: sort file.txt | uniq

          expr: 进行数学运算Example: add 2 and 3expr 2 “+” 3

          find: 搜索文件比如:根据文件名搜索find . -name filename -print

          tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile

          basename file: 返回不包含路径的文件名比如: basename /bin/tux将返回 tux

          dirname file: 返回文件所在路径比如:dirname /bin/tux将返回 /bin

          head file: 打印文本文件开头几行

          tail file : 打印文本文件末尾几行

          sed: Sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将结果输出到标准输出(屏幕)。该命令采用正则表达式(见参考)进行搜索。不要和shell中的通配符相混淆。比如:将linuxfocus替换为 LinuxFocus :cat text.file | sed ’s/linuxfocus/LinuxFocus/’ >newtext.file

          awk: awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。

          catfile.txt | awk -F, ‘{print $1 “,” $3}’这里我们使用“,”作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下: Adam Bor, 34, IndiaKerryMiller, 22, USA命令输出结果为:Adam Bor, IndiaKerry Miller, USA

        • 管道 重定向 backtick

          这些不是系统命令,但是他们真的很重要。

          1.管道(|)—–将一个命令的输出作为另外一个命令的输入。

          grep “hello” file.txt | wc -l

          在file.txt中搜索包含有”hello”的行并计算其行数。

          在这里grep命令的输出作为wc命令的输入。当然您可以使用多个命令。

          2.重定向—–将命令的结果输出到文件,而不是标准输出(屏幕)。

          3.>—– 写入文件并覆盖旧文件

          4.>>—– 加到文件的尾部,保留旧文件内容。

          5.反短斜线—–使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。

          命令:

          find . -mtime -1 -type f -print

          用来查找过去24小时(-mtime –2则表示过去48小时)内修改过的文件。如果您想将所有查找到的文件打一个包,则可以使用以下linux 脚本:

          # !/bin/sh

          # The ticks are backticks (`) not normal quotes (‘):

          tar -zcvf lastmod.tar.gz find . -mtime -1 -type f -print

        • 流程控制

          • case
          • selsect
          • 循环
            • for
            • do
            • done
          • 控制流
            • if
            • then
            • elif
            • else
            • fi
  • Makefile

    • 依赖关系
    • 目标文件
    • 选项
    • 配置
    • 关键字
      • all
      • main
      • clean
      • sources
      • include
      • $变量
      • %
      • cc gcc g++
      • 子主题 9
  • 重点

    • 库函数与系统调用

      • 在C函数库libc中大约 300 个程序,在 UNIX 中大约有 90 个系统调用
    • 进程

      • 六个进程ID

        • pid 进程ID
        • ppid 父进程ID
        • uid 实际用户ID
        • euid 有效用户ID
        • gid 实际组ID
        • egid 有效组ID
      • 进程状态

        • 创建
        • 就绪
        • 阻塞
        • 执行
        • 终止
      • Linux下进程状态

        • R 可执行
        • S 睡眠状态
        • D 不可中断状态
        • T 暂停状态
        • Z 僵尸状态
        • X 死亡、退出状态
      • 系统调用

        • fork创建子进程,自进程返回0,父进程返回子进程ID,出错返回-1。

          进程调用fork函数时,当控制转移到内核中fork代码后,内核做的事情有:
          分配新的数据块和数据结构给子进程

          将父进程的数据结构的部分内容拷贝到子进程中

          将子进程添加到系统进程列表

          fork返回。开始调度器调度

          fork之前,父进程独立执行,fork之后,父子进程两个执行流分别执行,谁先谁后不确定,完全由调度器决定的。

          通常情况下,父子代码共享,父子在不写入的情况下都是共享的。当有一方试图写入时,便以写实拷贝各自一份副本进行写入。

          错误码EAGAIN表示达到进程数上线,ENOMEM表示没有足够空间给一个新进程分配

          所有由父进程打开的文件描述符都被复制到子进程中,父子进程中相同编号的文件描述符在内核中指向同一个file结构体,也就是说file结构体的引用计数要增加

          fork常用的场景:
          父进程希望复制自己,父子进程同时执行不同代码段(比如:父进程等待客户端请求,生成子进程来处理请求)

          一个进程要执行不同的程序(比如:子进程从fork返回后调用exec函数)

        • vfork创建子进程,自进程返回0,父进程返回子进程ID,出错返回-1。

          产生一个子进程,但父子进程共享数据段(共享地址空间)

          vfork保证子进程先运行,等到子进程调用exec或者exit之后父进程才开始执行

          如果在调用exec或exit之前,子进程依赖于父进程进一步动作,则会造成死锁

          改变子进程变量的值,也是的父进程中的值发生改变,如果想改变共享数据段中的变量值,应该先拷贝父进程

          fork和vfork的区别

          fork产生子进程不共享地址空间,vfork产生子进程共享地址空间

          fork不阻塞,父子进程可以同时执行,vfork阻塞,父进程要等待子进程执行完才能执行

          fork后子进程和父进程的执行顺序不一定,vfork后子进程先执行,待到子进程退出后父进程才开始执行

        • wait

        • waitpid

      • 进程通信

        • 数据通信
          • 给另一个进程发送数据
        • 资源共享
          • 多个进程共享资源
        • 事件通知
          • 给另一个进程通知
        • 进程控制
          • 控制另一个进程
      • 如何通信

        • 最古老的方式 管道 pipe

          • 匿名管道

            特点:

            1. 单向传输(单工),只能在父子进程间或兄弟进程间使用
            2. 管道是临时对象
            3. 管道和文件的使用方法类似,都能使用read、write、open等普通IO函数
            4. 管道面向字节流,即提供流式服务
            5. 一般来讲,管道生命周期随进程,进程退出,管道释放
            6. 一般来讲,内核会对管道操作进行同步与互斥
            7. 本质上Linux上的管道是通过空文件夹实现的
            8. 事实上,管道使用的文件描述符、文件描述符、文件指针最终都会转化成系统内核中SOCKET描述符,都收到了SOCKET描述符的限制
            9. 补充:Linux中,用两个file数据结构来实现管道
          • 命名管道

            命名管道也是单向传输,但它可以在不相关的进程间使用
            命名管道不是临时对象,它们是文件系统真正的实体
            Linux下,在写进程打开命名管道之前,必须处理读进程对命名管道的打开,在写进程写数据之前,也必须处理处理读进程对管道的读
            除了以上的特点与管道不同,其他的都是都与管道一样,包括数据结构和操作
            匿名管道和命名管道的区别?

            答:匿名管道只能在父子进程间或兄弟进程间使用,命名管道可以在不相关的进程间使用;匿名管道是临时对象,命名管道是文件系统真正的实体;匿名管道和命名管道打开和关闭方式不同。

        • 系统IPC

          • 消息队列

            消息队列是随内核,只有重启和手动删除才会被真正的删除

            1. 每个数据块都被认为是有个类型,接受者进程接受的数据块可以是不同类型值
            2. 每个消息是有最大长度的上限的,每个消息队列的字节数也是有上限的,系统上消息队列数也有上限
            3. 可用于机器上的任何进程间通信

            消息队列与管道的区别:

            1. 提供有格式的字节流,减少开发人员的工作量
            2. 消息具有类型,实际应用中,可以当做优先级使用
            3. 消息队列随内核,生命周期比管道长,应用空间更大
          • 共享内存

            • 最快的IPC
            • 需要同步互斥
          • 信号量 主要是同步互斥

          • 套接字

      • 进程与文件

        • 文件描述符
        • file结构体
      • 守护进程

    • 线程

      • pthread 簇函数
        • pthread_create
        • pthread_exit
        • pthread_join
        • pthread_detach

工具

  • Markdown
  • Clion
  • IDEA
  • Pycharm
  • WebStom
  • Git
  • Mac

安全

网络安全

数据库

基本SQL语句

常用数据库

  • MongoDB
  • Redis
  • MySQL
  • SQLite

概念

  • 索引
  • 范式
  • 事务
  • 约束
  • 安全

设计模式

创建型模式

  • 单例
  • 工厂方法
  • 抽象工厂
  • 建造者模式
  • 原型模式

结构型模式

  • 适配器
  • 桥接
  • 组合
  • 装饰
  • 外观
  • 享元
  • 代理

行为型模式

  • 访问者
  • 模板
  • 策略
  • 状态
  • 观察者
  • 备忘录
  • 中介者
  • 迭代器
  • 解释器
  • 责任链

链接

http://c.biancheng.net/design_pattern/

https://www.cnblogs.com/pony1223/p/7608955.html

服务器

架构

网址

后端面经

收藏夹

缓冲区溢出

操作系统重点知识汇总

正则表达式

Shell脚本

JVM

进程与线程

网络

Socket

TCP

IP

UDP

HTTP(HTTPS)

FTP

DNS

ICMP

DHCP

数据结构

集合

  • 无序不重复

线性表

  • 数组
    • 固定数组
  • 链表
    • 单链表
    • 双向链表
  • 队列
    • 双端队列
    • 循环队列
  • 字符串

1-n

  • 优先队列
  • 普通二叉树
  • 二叉排序树
  • 平衡二叉树
  • 红黑树
  • B-树
  • B+树
  • 哈弗曼树
  • 字典树
  • 线段树

n-n

  • 其他

重点

  • 哈希
    • unorderedSet
    • unorderedMap
  • 红黑树
    • orderedSet
    • orderedMap

算法

贪心

  • 重复子问题
  • 且能得到最优解

动态规划

  • 最优子结构
  • 重复子问题

分治

  • 子问题不重叠
  • 最终问题的解可由子问题合并求得

数学

  • 数字游戏

递归

  • 递归终止条件
  • 递归子问题

搜索

  • DFS
  • BFS
  • 回溯
  • 剪枝

数据结构相关的

  • 数组
  • 哈希表
  • 位运算
  • 字符串
  • 队列
  • 链表
  • 并查集
  • 字典树
  • 线段树
  • 搜索树
  • 平衡树
  • 红黑树

排序

  • 交换排序
    • 快排
    • 冒泡
  • 插入排序
    • 插入
    • 希尔
  • 选择排序
    • 选择
    • 堆排
  • 归并排序
    • 二路
    • 多路
  • 非比较
    • 基数排序
    • 桶排序
    • 计数排序

方法

  • 多指针
  • 哈希
  • 字典
  • 二分 分治 DP 贪心
  • 数学
  • 排序
  • DFS BFS
  • 位运算

语言

共性-基本语法

  • 变量
  • 内置对象
  • 数据类型
  • 表达式
  • 操作符
  • 循环
  • 选择
  • 函数
  • 输入输出
  • 异常
  • 对象
  • 标准库
  • 继承
  • 多态
  • 泛型

C++

  • 内存对象模型

  • 指针

  • STL

    • 空间配置器

      new 操作步骤
      调用new操作符创建内存
      调用对象的构造函数并初始化
      delete操作步骤
      调用对象的析构函数
      调用delete释放内存
      内存分配、释放
      stl::alloc::allocate()
      stl::alloc::deallcate()
      对象构造/析构由
      stl::alloc::construct()
      stl::alloc::destroy()
      负责
      考虑到异常处理与内存池,处理内存碎片问题,与多线程的互斥访问。
      第一级配置器 异常处理
      第二级配置器 利用内存池进行管理小内存分配,多线程实现互斥访问

      空间配置函数 alloc() : 如果用户申请大于128kb,调用一级,如果小于128kb检查对应链表,如果有可用空间,直接使用否则refill重新填充空间。

      重新填充函数 refill():当自由链表不存在可用区块,默认申请20个节点,第一个给客户端,剩下给自由链表。

      空间释放函数 deallocate():判断区块大小,大于128kb直接调用第一级配置器,如果小于128kb找到对应链表,将其回收。

      内存池管理机制具体实现:
      20个区块内,直接配置该空间
      不能满足时,内存碎片编入自由空间链表,然后调用malloc()在heap申请空间补充内存池,空间不足则调用失败。
      查找free_list中尚有未用区块,调整以进行释放,将其编入内存池。然后递归调用chunk_alloc函数从内存池取空间供free_list备用。
      搜寻free_list释放空间也未能解决问题,这时候调用第一级配置器,利用out-of-memory机制尝试解决内存不足问题。
      在第二级配置器中,存在着多线程环境的内存池管理,解决多线程环境下内存池互斥访问,需在自由链表free_list中进行修改调整,我们从SGI STL第二级配置器源码中看到,嵌套一个类class _Lock ,该类的作用是解决互斥访问,并且只有两个函数:构造函数和析构函数;使用构造函数对内存池进行加锁,使用析构函数对内存池进行解锁。

    • Traits技术

      模板参数推导机制获得已知声明的类型
      使用内嵌型别技术就可以知道返回值的类型
      iterator_traits的偏特化版本解决了原生指针的问题。现在不管迭代器是自定义类模板, 还是原生指针(Tp, const Tp),struct iterator_traits都能萃取出正确的value type类型。

    • 迭代器

Java

  • 反射
  • 集合
  • 注解
  • 接口
  • 匿名内部类
  • 分布式
  • 消息队列
  • JVM
  • NIO
  • 垃圾回收

Python

JavaScript-TypeScript

Swift

Kotline

OC

链接

开源阅读计划

nginx

nodejs

stl

框架

前端

  • vue
  • react

后端

  • django
  • spring

XMind: ZEN - Trial Version

Archives QR Code Tip
QR Code for this page
Tipping QR Code
Leave a Comment