应用层协议
应用层协议HTTPHTTP:超文本传输协议,并且HTTP是无状态的(不需要维护客户端状态 ),使用TCP建立连接,客户发起一个与服务器的TCP连接(建立套接字) ,端口号为80;HTTP/1.1 默认使用持久连接以及流水线请求方式。
客户/服务器模式:
客户:请求、接收和显示Web对象的浏览器
服务器:对请求进行响应,发送对象的Web服务器
请求报文:
请求方式:
GET:发送一个请求来取得服务器上的某一资源。
POST:向 url 指定的资源提交数据或附加新的数据。
HEAD:只请求页面的首部。
PUT:数据发送到服务器以创建或更新资源,侧重于创建数据,对应insert操作。
DELETE:删除服务器上的某资源。
响应报文:
响应状态码:
1XX:表示【临时响应】并需要请求者继续执行操作的状态代码
2XX:代表请求已成功被服务器接收、理解、并接受。
200(成功)服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。
201(已创建)请求成功并且服务器创建了新的资源。
202(已接受)服务器已接受请求,但尚未处理。
203(非授权信息)服务器已成功处理了请求,但返 ...
应用层基础
应用层基础应用层也称为应用实体,它由若干个特定应用服务元素和一个或多个公用应用服务元素组成。
网络应用的实例:互联网流行的应用层协议
HTTP
FTP
SMTP / POP3 /IMAP
DNS
编程:网络应用程序
Socket API
体系结构客户-服务器(C/S)体系结构服务器:
一直运行
固定的IP地址和周知的端口号(约定)
扩展性差
客户端:
主动与服务器通信
与互联网有间歇性的连接
可能是动态IP 地址
不直接与其它客户端通信
对等体(P2P)体系结构特点:
(几乎)没有一直运行的服务器
任意端系统之间可以进行通信,并且每一个节点既是客户端又是服务器
参与的主机间歇性连接且可以改变IP 地址
缺点:
难以管理
也有C/S和P2P体系结构的混合体:
Napster
相关概念
数据丢失率
有些应用则要求100%的可靠数据传输(如文件)
有些应用(如音频)能容忍一定比例以下的数据丢失
吞吐
一些应用(如多媒体)必须需要最小限度的吞吐,从而使得应用能够有效运转
一些应用能充分利用可供使用的吞吐(弹性应用)
延迟
一些应用出于有效性 ...
计算机网络和因特网
计算机网络和因特网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迭代器对象的生产过程
抽象工厂模式:对工厂方法模式再优化,不像工厂方法只能生产一大类的产品 ...