计算机网络和因特网
计算机网络和因特网InternetInternet,中文正式译名为因特网,又叫做国际互联网。它是由那些使用公用语言互相通信的计算机连接而成的全球网络。一旦你连接到它的任何一个节点上,就意味着您的计算机已经连入Internet网上了。Internet目前的用户已经遍及全球,有超过几亿人在使用Internet,并且它的用户数还在以等比级数上升。
从服务的角度来看:
Internet就是使用通信设施进行通信的分布式应用,其中通信基础设施为apps提供编程接口(通信服务),为app应用提供无连接不可靠服务和面向连接的可靠服务。
具体构成
节点:
主机及其上运行的应用程序
路由器、交换机等网络交换设备
边:通信链路
接入网链路:主机连接到互联网的链路
主干链路:路由器间的链路
协议:对等层实体在通信交换过程中应该遵守的规则协议。协议定义了在两个或多个通信实体之间交换的报文格式和次序,以及在报文传输和/或接收或其他事件方面所采取的动作
网络边缘边缘系统:如果要用现有的技术术语描述的话,边缘网络包括汇聚层网络和接入层网络的一部分或全部, 是接入用户的最后一段网络。由主机和应用程序(客户端 ...
死锁
死锁死锁的条件死锁的产生需要如下4 个条件:
互斥:线程对于需要的资源进行互斥的访问(例如一个线程抢到锁)。
持有并等待:线程持有了资源(例如已将持有的锁),同时又在等待其他资源(例如,需要获得的锁)。
非抢占:线程获得的资源(例如锁),不能被抢占。
循环等待:线程之间存在一个环路,环路上每个线程都额外持有一个资源,而这个资源又是下一个线程要申请的。
如果这4 个条件的任何一个没有满足,死锁就不会产生。
破坏互斥:如果把只能互斥使用的资源改造为允许共享使用,则系统不会进入死锁状态。比如: SPOOLing技术。操作系统可以采用SPOOLing技术把独占设备在逻辑上改造成共享设备。类似于在两者之间加了一个中间层输出进程来进行接收 进程请求。
破坏持有并等待:可以采用静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不让它投入运行。一旦投入运行后,这些资源就一直归它所有,该进程就不会再请求别的任何资源了。
破坏非抢占:方案一:当某个进程请求新的资源得不到满足时,它必须立即释放保持的所有资源,待以后需要时再重新申请。也就是说,即使某些资源尚未使用完,也需要主动 ...
内存管理(三)
内存管理(三)超越物理内存:机制操作系统如何利用大而慢的设备,透明地提供巨大虚拟地址空间的假象?
不仅是一个进程,增加交换空间让操作系统为多个并发运行的进程都提供巨大地址空间的假象。
交换空间我们要做的第一件事情就是,在硬盘上开辟一部分空间用于物理页的移入和移出。在操作系统中,一般这样的空间称为交换空间(swap space),因为我们将内存中的页交换到其中,并在需要的时候又交换回去。
交换空间的大小是非常重要的,它决定了系统在某一时刻能够使用的最大内存页数。
存在位硬件(或操作系统,在软件管理TLB 时)判断是否在内存中的方法,是通过页表项中的一条新信息,即存在位(present bit)。如果存在位设置为1,则表示该页存在于物理内存中,并且所有内容都如上所述进行。如果存在位设置为零,则页不在内存中,而在硬盘上。访问不在物理内存中的页,这种行为通常被称为页错误(page fault)。
当TLB 未命中发生的时候有3 种重要情景:
第一种情况,该页存在(present)且有效(valid)(第18~21 行)。在这种情况下,TLB 未命中处理程序可以简单地从PTE 中获取PFN,然 ...
内存管理(二)
内存管理(二)分页概述第一种是将空间分割成不同长度的分片,就像虚拟内存管理中的分段。遗憾的是,这个解决方法存在固有的问题。具体来说,将空间切成不同长度的分片以后,空间本身会碎片化(fragmented),随着时间推移,分配内存会变得比较困难。
因此,值得考虑第二种方法:将空间分割成固定长度的分片。在虚拟内存中,我们称这种思想为分页。
分页不是将一个进程的地址空间分割成几个不同长度的逻辑段(即代码、堆、段),而是分割成固定大小的单元,每个单元称为一页。相应地,我们把物理内存看成是定长槽块的阵列,叫作页帧(pageframe)。每个这样的页帧包含一个虚拟内存页。
组成部分
为了记录地址空间的每个虚拟页放在物理内存中的位置,操作系统通常为每个进程保存一个数据结构,称为页表(page table)。页表的主要作用是为地址空间的每个虚拟页面保存地址转换(address translation),从而让我们知道每个页在物理内存中的位置。为了转换(translate)该过程生成的虚拟地址,我们必须首先将它分成两个组件:虚拟页面号(virtual page number,VPN)和页内的偏移量(off ...
内存管理(一)
内存管理(一)地址空间操作系统需要提供一个易用(easy to use)的物理内存抽象。这个抽象叫作地址空间(address space),是运行的程序看到的系统中的内存。
一个进程的地址空间包含运行的程序的所有内存状态。比如:程序的代码(code,指令)必须在内存中,因此它们在地址空间里。
在程序运行时,地址空间有两个区域可能增长(或者收缩)。它们就是堆(在顶部)和栈(在底部)。堆在代码(1KB)之下开始并向下增长(当用户通过malloc()请求更多内存时),栈从16KB 开始并向上增长(当用户进行程序调用时)。
虚拟化内存
虚拟内存系统负责为程序提供一个巨大的、稀疏的、私有的地址空间的假象,其中保存了程序的所有指令和数据。操作系统在专门硬件的帮助下,通过每一个虚拟内存的索引,将其转换为物理地址,物理内存根据获得的物理地址但获取所需的信息。
当我们描述地址空间时,所描述的是操作系统提供给运行程序的抽象(abstract)。程序不在物理地址0~16KB 的内存中,而是加载在任意的物理地址。
当操作系统这样做时,我们说操作系统在虚拟化内存(virtualizing memory),因为运 ...
进程管理(二)
进程管理(二)进程调度我们还不知道操作系统调度程序采用的上层策略(policy)。接下来会介绍一系列的调度策略(sheduling policy)。
调度指标
相关指标:周转时间(turnaround time)、响应时间(response time)。
T 周转时间= T 完成时间−T 到达时间
T 响应时间= T 首次运行−T 到达时间
基础调度算法先进先出(FIFO)
我们可以实现的最基本的算法,被称为先进先出(First In First Out 或FIFO)调度,有时候也称为先到先服务(First Come First Served 或FCFS)。
优点:
它很简单,而且易于实现。
缺点:
存在护航效应:一些耗时较少的潜在资源消费者被排在重量级的资源消费者之后,会等很长时间。
最短任务优先(SJF)
策略:先运行最短的任务,然后是次短的任务,如此下去。
优点:
改善了平均周转时间和平均带权周转时间,缩短作业的等待时间。
提高系统的吞吐量。
缺点:
存在护航效应:一些耗时较多的潜在资源消费者被排在轻量级的资源消费者之后,会等很长时间。
未能依据作业的紧迫程度来划分 ...
进程管理(一)
进程管理(一)进程概述进程的非正式定义非常简单:进程就是运行中的程序。程序本身是没有生命周期的,它只是存在磁盘上面的一些指令(也可能是一些静态数据)。是操作系统让这些字节运行起来,让程序发挥作用。
进程状态:
简而言之,进程可以处于以下3 种状态之一:
运行(running):在运行状态下,进程正在处理器上运行。这意味着它正在执行指令。
就绪(ready):在就绪状态下,进程已准备好运行,但由于某种原因,操作系统选择不在此时运行。
阻塞(blocked):在阻塞状态下,一个进程执行了某种操作,直到发生其他事件时才会准备运行。一个常见的例子是,当进程向磁盘发起I/O 请求时,它会被阻塞,因此其他进程可以使用处理器。
虚拟化CPU虽然只有少量的物理CPU 可用,但是操作系统如何提供几乎有无数个CPU 可用的假象?
操作系统通过虚拟化(virtualizing)CPU 来提供这种假象。通过让一个进程只运行一个时间片,然后切换到其他进程,操作系统提供了存在多个虚拟CPU 的假象。这就是时分共享(time sharing)CPU 技术,允许用户如愿运行多个并发进程。潜在的开销就是性能损失 ...
设计模式总结
设计模式设计原则
模式分类
创建型: 在创建对象的同时隐藏创建逻辑,不使⽤ new 直接实例化对象,程序在判断需要创建哪些对象时更灵活。包括⼯⼚/抽象⼯⼚/单例/建造者/原型模式。
结构型: 通过类和接⼝间的继承和引⽤实现创建复杂结构的对象。包括适配器/桥接模式/过滤器/组合/装饰器/外观/享元/代理模式。
⾏为型: 通过类之间不同通信⽅式实现不同⾏为。包括责任链/命名/解释器/迭代器/中介者/备忘录/观察者/状态/策略/模板/访问者模式。
创建型:
单例模式
注意双重检查锁里面的volatile(提供可⻅性、禁⽌指令重排序)
各种工厂模式(简单工厂、工厂方法、抽象工厂)
简单工厂模式:根据参数不同,创建不同的类(类属于同一大类即同一接口或者父类)
例子:java中的DateFormat
工厂方法模式:与简单工厂相比,具体商品交给子工厂去完成,将产品实例化操作延迟到工厂子类去做。好处在于需要新增商品就新增子工厂即可。
例子:Collection中的Iterator迭代器对象的生产过程
抽象工厂模式:对工厂方法模式再优化,不像工厂方法只能生产一大类的产品 ...
Class字节码文件
Class字节码文件概述Java源代码的编译结果是字节码,那么肯定需要有一种编译器能够将Java源码编译为字节码,承担这个重要责任的就是配置在path环境变量中的javac编译器。javac是一种能够将Java源码编译为字节码的前端编译器。
源代码经过编译器编译之后便会生成一个字节码文件,字节码是一种二进制的类文件,它的内容是JVN的指令,而不像C、C+t经由编译器直接生成机器码。
Java的跨平台性:
Java虚拟机不和包括 Java 在内的任何语言绑定,它只与“Class 文件”这种特定的二进制文件格式所关联。无论使用何种语言进行软件开发,只要能将源文件编译为正确的Class文件,那么这种语言就可以在Java虚拟机上执行。
class字节码文件可以通过JDK自带的javap命令来反编译查看
字节码文件结构Class文件的总体结构如下:
魔数
类型:u4(4个字节的无符号整数)
名称:magic
说明:用于识别Class文件格式
Class文件版本
类型:u2+u2(4个字节的无符号整数)
名称:minor_version+major_version
说明:包 ...
垃圾回收器
垃圾回收器概述垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。
由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。
垃圾回收器分类:
按线程数分:可以分为串行垃圾回收器和并行垃圾回收器。
按工作模式分:可以分为并发式垃圾回收器和独占式垃圾回收器。
并发式垃圾回收器与应用程序线程交替工作,以尽可能减少应用程序的停顿时间。
独占式垃圾回收器(Stop the world)一旦运行,就停止应用程序中的所有用户线程,直到垃圾回收过程完全结束。
按碎片处理方式分:可分为压缩式垃圾回收器和非压缩式垃圾回收器。
压缩式垃圾回收器会在回收完成后,对存活对象进行压缩整理,消除回收后的碎片。
再分配对象空间使用:指针碰撞
非压缩式的垃圾回收器不进行这步操作。
再分配对象空间使用:空闲列表
按工作的内存区间分,又可分为年轻代垃圾回收器和老年代垃圾回收器。
-XX:+PrinrCommandLineFlags:查看命令行相关参数(包含使用的垃圾收集器)
性能指标
吞吐量:运 ...