1. 1.1 操作系统historical

    1. 操作系统功能 1.1. 进程管理 进程管理.md 1.2. 存储管理 存储管理.md 1.3. 设备管理 1.4. 文件管理 2. 操作系统实例 2.1. Linux Linux.md 3. 参考 - 操作系统(计算机管理控制程序)\ 百度百科 - 搞定操作系统面试,看这篇就够了(二) \-

  2. 1.2 Linuxhistorical

    1. Linux使用 1.1. 常用命令 Linux常用命令.md 2. Linux进程管理 线程.md 进程.md 3. Linux IO IO.md 4. Linux内存管理 内存管理.md 5. Linux系统调用 系统调用.md 6. Linux虚拟化 Linux AUFS.md Linux

  3. 2.1 线程historical

    1. 什么是线程 进程内的执行流 线程是进程的执行流。多线程指进程有多个执行流。 如果线程是在user level实现的,那么叫做用户态线程。如果是在kernel level实现的,那么叫做内核级线程。区别在于前者内核无法感知到线程的运行。 在Linux中,用的是内核级线程(LWP)。每个线程在内核

  4. 2.2 进程historical

    1. 进程 进程可以看作一个执行中的程序 使用ps aux可以查看进程 使用fork调用可以创建一个新的进程。创建出来的child进程和parent进程共享所有的segment:如text、stack、heap等,当child进程修改stack或heap的时候才会复制独有的一份stack和heap

  5. 2.3 进程管理historical

    1. 进程 1.1. IPC IPC.md 1.2. 死锁 死锁.md 1.3. 同步 同步.md 2. 进程 vs 线程 程序、进程、线程.md

  6. 2.4 IPChistorical

    1. 什么是进程通信 就是进程之间进行信息交换。 2. 为什么有进程通信 由于每个进程的地址空间都是独立的,操作系统为了安全起见不允许一个进程直接访问另一个进程的地址空间 3. 进程通信方式 3.1. 信号量 - 计数器。用于为多个进程提供对共享数据对象的访问 3.2. 共享存储 - 多个进程共享同

  7. 2.5 同步historical

    1. 同步和互斥 1.1. 同步 多个进程按一定顺序执行 1.2. 互斥 多个进程在同一时刻只有一个进程能进入临界区 1.2.1. 临界区 访问同一个资源的代码叫做临界区 2. 同步的方式 2.1. 信号量 一个整形变量,可以执行down和up操作 - down:如果信号量大于 0 ,执行 -1 操

  8. 2.6 死锁historical

    1. 死锁是什么 A占有了锁1,需要锁2,B占有了锁2,需要锁1 2. 死锁的必要条件 - 互斥:资源不可共享,即同一时间我占有了这个资源你就不能占有 - 占有和等待:我占有了资源A之后,还想去占有资源B - 不可抢占:此刻我占有了这个资源,你就不能抢占 - 循环等待:我占有了资源A等待资源B,你占

  9. 2.7 程序、进程、线程historical

    1. 是什么 程序是指令的集合,存放在硬盘上,是个静态的实体 进程指程序加载到内存,由CPU执行指令,是个动态的实体 线程是进程内的多个执行流 举例: 比如一个视频播放器,安装完后躺在硬盘上,此时就是一堆指令+数据; 播放一个视频的时候这个程序首先加载到内存中,由CPU读取指令并执行 一个视频既有画

  10. 3.1 内存管理historical

    1. buffer vs cache - A buffer is something that has yet to be "written" to disk. - A cache is something that has been "read" from the disk and stored

  11. 3.2 存储管理historical

    1. 什么是存储管理 管理计算机的内存 2. 内存分配回收 内存分配和回收.md 3. 存储管理方案 3.1. 段页式存储 段页式存储.md 3.2. 虚拟存储 虚拟内存.md

  12. 3.3 虚拟内存historical

    1. 为什么需要虚拟内存 为了解决物理内存不够用的问题。 比如我们有一个16GB游戏,但是物理内存只有4GB,这个怎么运行起来 传统的存储管理有两个问题: - 作业必须一次性全部调入内存 - 作业在运行期间必须常驻内存 说白了就是内存利用率不高,很多用不到的数据也会长期占用内存 2. 什么是虚拟内存

  13. 3.4 内存分配和回收historical

    1. 内存分配 有三个主要的分配方式: 1.1. 单一连续分配 只能在单用户、单进程的操作系统中使用。把内存分成系统区和用户区,系统区用于运行操作系统,用户区用于运行某个进程 1.2. 固定分区分配 支持多道程序。内存空间被划分为若干固定大小的区域,每个分区只提供给一个程序使用,互不干扰 1.3.

  14. 3.5 段页式存储historical

    1. 地址空间 1.1. 物理地址空间 为了更好的管理内存,操作系统将内存的的每个字节编址,形成了物理地址空间。 这个空间最大就是内存的大小 1.2. 虚拟地址空间 为了解决内存不够用的问题,操作系统的虚拟内存技术将所有的存储设备的每个字节编址,形成了虚拟地址空间,这也是进程看到的逻辑地址空间 这个

  15. 3.6 Linux的内存管理historical

    1. Linux的内存管理 2. 交换空间 是磁盘的一个分区,Linux内存满时,会把一些内存交换只Swap空间。 2.1. 交换空间 vs 虚拟内存 交换空间 虚拟内存 --- ------------- ------------- 存在于磁盘中 存在于磁盘中 与主存发生置换 与主存发生置换 操作

  16. 3.7 页面置换historical

    1. 是什么 页面置换算法和缓存淘汰策略类似,前者是为了解决容量问题,后者是为了解决速度问题。 - 缓存淘汰策略:可以将内存看成磁盘的缓存。需要把用得到数据保持到内存中来,把用不到的数据移出内存 - 页面置换算法:可以把磁盘看作内存的辅助空间。需要把将要用到的加载到内存中,用不到的放回辅存。 - 主

  17. 4.1 系统调用historical

    1. 系统调用是什么 使用类似函数调用的方式调用操作系统提供的API 2. 系统调用 vs 函数调用 系统调用 函数调用 ------- ----------------------------------------------- ------- CPU态 内核态 用户态 调用方式 整型编号 函数

  18. 4.2 IO模型historical

    1. 同步 vs 异步 - 应用程序调用系统调用,过程由谁处理 - 前者是我来询问你 同步是由应用程序自己处理 - 后者是你来通知我 异步是由操作系统处理,完成之后通过回调或者事件通知 2. 阻塞 vs 非阻塞 - 应用程序调用系统调用,没有结果怎么办? - 阻塞是应用程序会等待 - 非阻塞是应用程

  19. 4.3 select、poll、epollhistorical

    1. select - select的几大缺点: - 每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大 - 同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大 - select支持的文件描述符数量太小了,默认是1024 - 2

  20. 4.4 IOhistorical

    1. 什么是文件 文件是由字节序列组成的,在Linux下一切皆文件 所有的IO设备都是文件 - /dev/sda2 (/usr disk partition) - /dev/tty2 (terminal) 内核也是文件 - /boot/vmlinuz-3.13.0-55-generic (kerne

  21. 4.5 零拷贝机制historical

    1. 传统IO 正常的数据处理流程是这样的: 1. 使用DMA copy(不需要cpu参与)把磁盘中的数据copy到磁盘缓冲区 2. 使用cpu copy把磁盘缓冲区的数据复制到用户区 3. 用户区进行处理 4. 使用cpu copy把 用户区的数据拷贝到Socket缓冲区 5. 使用DMA cop

  22. 5.1 CPU调优historical

    1. CPU性能指标 1.1. CPU使用率 非空闲时间占总 CPU 时间的百分比。 根据 CPU 上运行任务的不同,又被分为用户 CPU、系统 CPU、等待 I/O CPU、软中断和硬中断等 - 用户CPU:应用程序 - 系统CPU:内核(不包括中断) - 等待IO CPU:系统与硬件设备交互 -

  23. 5.2 tophistorical

    1. 使用 - 敲下h查询帮助菜单 - - 查看某进程CPU使用率 2. 输出 3. 解析 - top - 13:57:40 up 1:47, 0 users, - 13:57:40:当前系统时间,可以用date获取 - up 1:47:此系统已经连续运行的时间,可以用last reboot获取系统

  24. 5.3 内存调优historical

    1. 内存性能指标 1.1. 系统内存使用情况 1.1.1. 已用内存 已经使用的内存 1.1.2. 剩余内存 还未使用的内存 1.1.3. 共享内存 tmpfs使用的内存大小,其实也是一种缓存 1.1.4. 可用内存 剩余内存+缓存和缓冲区 1.1.5. 缓存和缓冲区 缓存分为两部分 - 磁盘读取

  25. 5.4 vmstathistorical

    1. 使用 2. 结果 3. 解析 - buffer和cache:跟传统意义上的buffer和cache不同。内存管理.md - buffer:文件元数据 - cache:文件数据 - procs - r:运行和等待CPU时间片的进程数。一般不超过cpu总核数的两倍 - b:等待资源的进程数,比如等

  26. 5.5 磁盘调优historical

    1. 磁盘性能指标 1.1. 文件系统 I/O 性能指标 1.1.1. 存储空间使用情况 容量、使用量以及剩余空间等 1.1.2. 缓存使用情况 页缓存、目录项缓存、索引节点缓存以及各个具体文件系统(如 ext4、XFS 等)的缓存 1.2. 磁盘 I/O 性能指标 1.2.1. 使用率 磁盘忙处理

  27. 5.6 网络调优historical

    1. 网络性能指标 1.1. 网络层 - 它们主要负责网络包的封装、寻址、路由,以及发送和接收 - 性能指标: - 每秒可处理的网络包数 PPS。 - 可以用内核自带的发包工具 pktgen 测试 1.2. 传输层 - 它们主要负责网络传输 - 性能指标: - 吞吐量(BPS) - 连接数以及延迟

  28. 5.7 iostathistorical

    1. 使用 - 默认输出的不是当前IO状态,而是系统启动以来的 2. 输出 - 3. 解释 - avg-cpu - %user:用户模式花费的CPU时间 一般<60% - %nice:用户进程改变过优先级的进程占用的CPU时间 - %system:内核进程所花费的CPU时间。一般sy+us<80%

  29. 5.8 Linux性能调优historical

    1. CPU CPU调优.md 2. 内存 内存调优.md 3. 磁盘 磁盘调优.md 4. 网络 网络调优.md

  30. 5.9 火焰图historical

    1. perf命令 是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的函数名以及调用栈(stack) 1.1. 使用 - perf record表示记录 - -F 99表示每秒99次。如果99次都返回同一个函数名,那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题 -

  31. 5.10 ulimithistorical

    可以设置 当前shell 的 当前用户 的 所有进程 的资源 ulimit 有软限制和硬限制之分: - 软限制:任何进程都可以修改软限制,但是软限制不能超过硬限制; - 硬限制:普通进程可以降低硬限制,只有 root 进程可以提高硬限制;

  32. 5.11 tcpdumphistorical

    1. 使用 1.1. 获取网卡名 - tcpdump -D - ifconfig 1.2. 抓包 - 简单使用 - 高级语法 - 类型关键字:host port - 确认传输方向:src dst - 协议关键字:tcp、udp - 逻辑运算符:and or 1.3. 导出 1.4. 使用wiresh

  33. 5.12 Linux常用命令historical

    1. 进程 1.1. top - top.md 1.2. vmstat - vmstat.md 1.3. ps - ps.md 1.4. pstree - pstree.md 1.5. ulimit - ulimit.md 1.6. systemd - systemd.md 1.7. pidstat

  34. 5.13 sarhistorical

    1. 使用 每秒输出一次 2. 输出 3. 解析 - IFACE:网卡接口 - rxpck/s:每秒接收的包数目 - txpck/s:每秒发送的包数目 - rxkB/s:每秒接收的数据量,单位KB - txkB/s:每秒发送的数据量,单位KB

  35. 5.14 pidstathistorical

    使用 每个1秒输出 输出 解析 - 时间 - 用户id - 进程pid - 读吞吐 - 写吞吐

  36. 5.15 stracehistorical

    使用 查看进程的系统调用 输出

  37. 6.1 Linux Namespacehistorical

    1. Linux Namespace历史 - Linux 内核 2.4版本支持mount namespace - Linux 内核 2.6版本支持了大多数的namespace,比如 IPC、Network、PID、和 UTS - Linux 内核 3.8版本支持User namespace 2. 什

  38. 6.2 Linux cgrouphistorical

    1. Linux cgroup历史 - Google的工程师开发了process containers,之后重命名为control group - Linux 内核 2.6版本支持了cgroup 2. 什么是Linux cgroup limits how much you can use Linux

  39. 6.3 chroothistorical

    1. 什么是chroot Linux系统中的一个chroot,用于修改根目录 Linux系统中,默认的目录结构是以/开始,以指定的位置作为 / 位置 2. 为什么需要chroot 2.1. 安全 限制用户的权力 2.2. 隔离 建立一个与原系统隔离的系统目录结构,方便用户的开发: 3. 如何使用ch