[操作系统]码农翻身要点总结

线程

  • 线程调度,线程开始时间未知,执行中可能被打断,有io操作需要让出cpu进行等待,从就绪态进入运行态仍然需要cpu调度处理
  • 线程池中的线程不会被kill,线程池中的线程一直运行直到系统重启
  • memcached线程缓存了很多数据,加快了io访问
  • 不同线程有不同的工作,jdbc线程需要从mencached或数据库线程中获取数据
  • 锁,实现进程之间的互斥
  • 死锁,通过限制锁的获取顺序来避免死锁,可以运用字符串的哈希值进行比较
  • 多个线程对同一临界资源的访问可以通过信号量解决(Dijkstra还创造了最短路径算法)
  • 像a++这类中断的实现是操作系统内核通过屏蔽中断实现的
  • 通过阻塞队列避免进程的忙等待
  • 生产者消费者问题需要两个不同的信号量
  • 用互斥锁和条件变量可是实现信号量
  • 平台和工具会对现成的同步进行封装,不需要考虑信号量的实现和使用(例如jdk)

TCP/IP

  • 信息的传输要建立连接通道
  • 发送失败后需要重新发送
  • 发送的信息被分成小块,在路径上有路由去判断传输路径,最后在终点处按照顺序组装
  • 传输双方通过三次握手建立连接,分别企鹅人双方的传输和接受能力是否正常
  • 滑动窗口协议保证多个数据可以同时传输

CPU

  • CPU的工作室运行指令,指令存放在内存中
  • BIOS存储了计算机开机启动的所有信息,启动时CPU需要准备好中断向量表
  • CPU将首扇区装载到内存中0X7C00处,检查后梁字节是否为0XAA00,通过bootloader将操作系统装入内存
  • 操作系统接手计算机,创建进程信息,包括进程描述,进程控制
  • CPU的主要工作内容是操作寄存器,寄存器是cpu内部的告诉存储器
  • 内存相对于CPU速度较慢,缓存利用局部性原理将内存中的信息缓存起来,加快了cpu的读写访问
  • 流水线(将每一条指令的执行进行细分),cpu同时执行多条指令时,将IF取指,ID译码,EX执行等重叠进行操作,不同指令需要的寄存器不同,保证所有寄存器始终处于忙碌状态
    [操作系统]码农翻身要点总结

进程

  • 冯诺依曼结构将数据和程序一视同仁,将计算机从逻辑上氛围五大部件:运算器、控制器、存储区、输入和输出设备
  • 单道批处理系统,每次运行一个程序,io操作室cpu空闲等待
  • 多道程序,内存中放入多个程序,一个进行io时,切换到另一个运行。为了控制不同程序,创造了PCB进程控制块,记录进程相关信息(运行时间,等待时间等)
  • 地址重定位,不同程序都运行在统一内存中,可能会产生覆盖,通过今天重定位直接修改程序指令完成区分。静态重定位在程序变化时需要频繁变动指令,通过增加寄存器(基址寄存器)实现了进程的动态重定位。真实地址=指令地址+基址寄存器
  • 为了控制不同进程的访问权限,避免进程数据的互访,增加寄存器记录进程的长度
  • 将基址寄存器,界限寄存器和内存计算方法封装形成MMU内存管理单元
  • 分时系统,为了避免用户交互进程的等待时间过长,通过时间片轮转的方式在不同进程间进行切换,实现多个进程同时运行的假象
  • 内存分块,将进程按照固定大小如4KB氛围若干块,并以块为单位装载到内存中,需要借助局部性原理进行优化
  • 虚拟内存分页,为每个进程都提供一个相同的虚拟空间例如大小为4G,程序指令使用虚拟空间中的地址,操作系统维护页表,实现虚拟空间像物理空间的映射。为了保持访问速度,CPU维持页表缓存TLB快表。内存中不存在进程要处理的页时,会发生缺页错误。
  • 不同进程的页表存储了进程所用到的页,以及页的状态。
  • 分段分页,为了保持不同进程分块的合理性(代码块,数据块,堆栈),方便表示只读段,对每个程序都进行标准化。操作系统维持段表,将程序的不同部分查找段表找到段基址,与偏移地址相加得到线性地址,并经过也标的转化得到最终的物理地址。当有进程访问无权限的段时,cpu会产生segmentation fault段错误
    [操作系统]码农翻身要点总结

程序装载

  • 程序需要通过loader装载到内存中
  • 装载器读取header信息,将代码和数据在硬盘上的位置记录下来,等待运行时装载
  • 装载器找到程勋的入口点,在装载入内存之前操作系统为进程建立虚拟空间和页表等数据结构
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eJWLSBzZ-1583735840840)(698C9499905949529166E9E7875A302F)]
  • cpu查找页表,将进程的虚拟地址转变为物理地址,如果页表存在位表示缺页,则产生缺页错误,有缺页处理程序将页加载到内存中,并修改页表
  • 猜测,进程初始页表项后x位为空,出现缺页错误时为进程块分配页,并记录在页表中。将已有的页调入时如果物理地址被占用则修改页表项并重新映射有待进一步学习
  • 程序在内存中被分割成不同的块
    [操作系统]码农翻身要点总结

线程

  • 将进程作为资源的容器(进程是计算机中资源分配的最小单元),在该容器中运行轻量级的线程,线程共享进程的所有资源。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X9oFIvoY-1583735840841)(821F90A0D1D34830BCE16216B7B920D4)]
  • 线程也需要记录自身状态
    [操作系统]码农翻身要点总结

硬盘

  • 硬盘的内部结构,包括多个盘片,每个盘片氛围多个磁道,每个磁道氛围多个扇区,每个扇区512KB
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-faVE2eKB-1583735840841)(9066CD4D3320466DBE7AD697115FB4AE)]
  • 硬盘读写需要寻道和旋转
    [操作系统]码农翻身要点总结

文件

  • LBA的寻址方式将磁盘分为不同的块,将柱面磁头扇区转换为不同的块号码。文件系统实现了这一点。
  • 文件是人类的最小存储单位
  • 文件存放在不同的磁盘块中,可以采用顺序存储和链式存储,但是检索速度较慢
  • 为每个磁盘建立索引块,存储文件所使用的磁盘块列表,每个索引节点inode存储了使用的磁盘块和大小等信息。(linux的文件系统即采用inode)
    [操作系统]码农翻身要点总结
  • 索引节点中空间有限,可以通过磁盘块嵌套的方式实现更大的索引空间
    [操作系统]码农翻身要点总结
  • 目录同样有inode节点,存储了目录的属性和存放该目录的磁盘块号
    [操作系统]码农翻身要点总结
  • 文件的查找过程即通过目录索引下级目录,通过目录索引文件节点
    [操作系统]码农翻身要点总结
  • 文件系统在删除文件是可能出现系统崩溃,需要考虑持久性问题。借鉴数据路的记录日志,将操作之前要做的操作记录下来形成日志,然后再正式操作。系统崩溃时检查日志,对操作进行修复,即日志文件系统。(详细见操作系统导论)
  • 空闲块的管理。可以通过链表和bitmap进行管理。
  • 文件系统有很多比如 NTFS、FAT、Ext2、Ext3等
    [操作系统]码农翻身要点总结
  • 硬盘首扇区由MBR主引导记录,分区表DPT和结束标志组成
  • 台区表中记录了每个分区的起始位置,以及哪个磁盘分区是活动分区,并装载引导块进行执行
  • 每个分区被分为多个块组
  • 超级快包括磁盘块综述,块大小,空闲块,inode个数等等

外设

  • 操作系统将外设划分为块设备和字符设备
  • 硬盘、CD-ROM、U盘是典型的块设备,数据存储在固定大小的块中,每个块都有一个地址
  • 鼠标、打印机等,是由一个个字符组成的流
  • 总线和端口是cpu和io设备通信的方式,不同设备以总线bus的方式相连接,不同设备有自身的编号,该标号称为io端口。一些cpu会将io端口映射到内存中,称为内存映射io
    [操作系统]码农翻身要点总结
  • 轮询和中断。cpu进行io操作时需要对io设备进行访问,访问的方式就是不断检查询问,为了避免cpu因此霸占总线,不同的io设备可以向cpu申请中断。
  • 中断的管理由中断控制器负责,进行不用中断优先级的判断。
  • 中断实际就是一种异步的、事件驱动的处理思想,nodejs和ajax都有体现(需要进一步学习)
  • 中断的数据传输方式对于小的数据量是可行的,但是对硬盘读写这种大量数据的操作,需要DMAA直接内存获取的机制进行。DMA相当于一个负责io设备和内存之间的专用处理器

数据库

  • 数据库实际上是通过在应用程序或用户与物理层或文件之间增加一个逻辑层,并用通用的结构化查询语言sql实现数据的增删改查(所有的计算机问题都可以通过增加一个中间层来解决)
    [操作系统]码农翻身要点总结
  • 使用分层结构后,物理层可以单独实现优化,增加缓存,索引和查询优化等手段。层内的变化不影响其它层的使用
  • 并发访问,通过采用CS架构,数据库可以在不同客户机之间共享服务器的数据。然而复杂度的大大增加,会产生并发访问的问题。
  • 事务管理。实际上为了保证数据库的操作能够原子性地完成,可以通过undo日志的方式实现数据库的安全。操作(事务)具有幂等性,undo日志记录了事务的开始结束,然而日志系统也会存在断电等意外事件导致的崩溃。所以1、在将数据写入硬盘前,首先要把对应的日志写入硬盘的日志文件。2、提交事务等标志事物结束的日志记录必须在所有数据写入硬盘后再写入日志文件。
  • 安全。为了实现不同用户对数据库的不同权限,需要增加权限控制系统。
  • 权限主要有三类:1、对数据的算则更新插入。2、对结构的操作,创建修改表。3、数据库管理,创建和备份数据。然后通过权限管理系统将不同的权限赋予不同的用户。
    [操作系统]码农翻身要点总结

socket

  • tcp链接的建立需要三次握手,传输过程需要确认和控制,断开连接要经过四次挥手。
  • 由于tcp协议的复杂性,程序员不需要靠自己实现连接的建立传输和断开,而是由操作系统内核实现,并未应用程序提供抽象的接口。
  • socket实际上连接了不同节点的端口port
    [操作系统]码农翻身要点总结
  • tcp是进程之间的通信,同一时刻可以有多进程访问多个服务器,需要通过端口号进行区分。
  • 服务器端的socket是被动地,启动后需要不断监听客户端发起的链接,并且需要将不同的客户端链接区分开来
  • 客户端的socket程序需要实现,建立socket对象,与指定ip和端口建立连接,发送和接受信息,断开连接。
  • 服务器端的socket程序需要实现,建立socket对象,绑定ip和端口,监听客户端请求,将请求转化为已连接对象,对已连接对象的信息收发。已连接对象都使用统一端口(例如80),通过客户机ip和端口进行区分(需要深入学习tcp/ip协议栈
    [操作系统]码农翻身要点总结
    [操作系统]码农翻身要点总结

程序运行

  • 内存可以抽象为线性结构,每个基本存储单元大小为1byte或8bit
  • cpu中的不同寄存器相互协作实现指令的运行。
  • cpu指令实际上就是取数据,存数据,数学和逻辑运算,跳转
  • 编程语言从机器语言到汇编语言再到高级语言,从二进制到助记符再到现在的编程语言,越来越便于人类的阅读
  • 高级语言向低价语言的转化就是编译
    [操作系统]码农翻身要点总结
  • 需要深入学习编译原理)高级语言经过词法分析进行分片,每个片段称为token,建立符号表表示不同token的类型。
  • 通过上下文无关的语法分析将token按照语法规则组件成树
    [操作系统]码农翻身要点总结
  • 语义分析检查标识符类型作用域的正确性,运算合法性,取值范围等,最终生成汇编语言
  • 程序的编译链接和装载(需要深入阅读程序员的自我修养

加法器

  • 进制的转化
  • 原码,反码和补码
  • 整数和浮点数(详见IEEE745标准)在计算机中的表示
  • 标志寄存器各位的意义

递归

  • 尾递归,避免了递归深度过大占用占空间。尾递归相当于在函数死亡后重新调用,而非产生新的函数。

java

  • 局部变量区,操作数栈
  • java函数栈(每个线程都有),栈帧
  • 不被GC roots类直接或间接引用的对象将被清理
  • JDBC是一个非常“低级”的接口,冗余代码太多,打开 Connection,创建Statement ,执行 SQL ,遍历 ResultSet ,关闭 Connection,不然资源会泄露
  • 中间件 ( Middleware ),专门负责底层操作系统和上层应用程序都不愿意做的事情
  • 轻量级 O/R Mapping 框架,叫做 Hibernate
  • java代码中的具体参数可以通过配置文件调整,避免了封装为jar后难以修改