0%

第三章 内存管理

程序重定位

在编译形成可执行程序时,用到的地址都是从0开始的相对地址,也被称为逻辑地址。但被加载到内存后可能使用任意一块空闲地址,所以需要将逻辑地址转化成内存中实际的物理地址,即重定位

有以下几种解决方法:

  1. 编译时重定位:需要在编译时确定哪块内存空间空闲,且在装入前不允许使用(用于执行固定任务的计算机系统,如嵌入式系统)

  2. 载入时重定位:在程序载入时,根据初始内存地址修改程序里的逻辑地址,但如果进程阻塞换出内存后换入时的地址不一定是之前的地址,造成错误

  3. 运行时重定位(PC机使用):在指令执行时才将逻辑地址转化为物理地址,取出指令—修改地址(存储管理部件MMU计算)—执行指令

    基地址存在PCB中,在内存基地址修改时更新,在执行时加载到寄存器中使MMU修改地址

分段

程序由若干段组成,每段都有各自的用途

  • 代码段:程序指令形成的段,只读
  • 数据段:存放程序使用的数据,可读可写
  • 栈:实现函数调用,通常只能向下(低地址)增长
  • 函数库:include的函数库,可有可无

由于各个段有不同的语义及限制操作,所以需要进行区分。

Read more »

进程

运行中的程序(区别于未运行的静态程序),需要有数据结构保存当前运行的信息(PCB),便于切换不同进程

进程的状态

process_state

进程的切换

操作系统切换进程(宏观)

例子为进程运行到磁盘读写操作后与其他进程的切换

process

操作系统切换进程的PCB(微观)

PCB_use
Read more »

概述和传输层服务

可靠的、保序的传输:TCP

  • 多路复用,解复用
  • 拥塞控制
  • 流量控制(防止接收方缓存区满造成的分组丢失)
  • 建立连接

不可靠、不保序的传输:UDP

  • 多路复用,解复用
  • 没有为尽力而为的IP服务添加更多的其他服务

都不提供的服务:

  • 延时保证
  • 带宽保证

可靠数据传输原理

RDT协议(递进关系)

  1. rdt1.0:不提供反馈信息(假设所有数据包都正确从发送端传送到接收端)

  2. rdt2.0:停止等待协议,引入差错检验,接收方反馈,重传机制。接收方在检验后向发送方返回ACK(正确)/NCK(错误),这里的重传是对于NCK的重传,没有考虑对于丢失处理的超时重传(假设所有反馈消息都能正确送到发送端,没有消息分组的丢弃)

  3. rdt2.1:ACK/NCK对于接受到的消息编号,由于为停止等待协议,发送方若未收到消息的确认则不发下个消息,所以只需要一个位表示序号0/1

  4. rdt2.2:通过对于上个消息序号的确认替代对于本次消息的NCK(基于rdt2.1的小升级)

  5. rdt3.0:引入超时重传机制,可能在接收端会出现冗余分组,但rdt2.2已可以应对(应对消息分组的丢失,但由于为停止等待,网络利用率很低)

Read more »

UDP编程

udpprocess

UdpClient

1
2
3
4
5
6
7
8
9
from socket import *
serverName = "hostname"
severPort = 12000
clientSocket = socket(AF_INET,SOCK_DGRAM) # ipv4,udp
message = "Hello World"
clientSocket.sendto(message.encode(),(serverName,severPort))
modifiedMessage,serverAddress = clientSocket.recvfrom(2048)
print(modifiedMessage.decode)
clientSocket.close()

Udpserver

1
2
3
4
5
6
7
8
9
from socket import *
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_DGRAM) # ipv4,udp
serverSocket.bind(('', serverPort))
print("The server is ready to receive")
while True:
message, clientAddress = serverSocket.recvfrom(2048)
modifiedMssage = message.decode().upper()
serverSocket.sendto(modifiedMssage.encode(), clientAddress)

TCP编程

tcpprocess

TcpClient

1
2
3
4
5
6
7
8
9
from socket import *
serverName = "servername"
serverPort = 12000
clientSocket = socket(AF_INET,SOCK_STREAM) #ipv4,tcp
clientSocket.connect((serverName,serverPort))
sentence = "Hello World"
clientSocket.send(sentence.encode()) # tcp three-way handshake to welcomesocket
modifiedSentence = clientSocket.recv(1024)
clientSocket.close()
Read more »

应用层协议原理

传输层向应用层提供的服务为socket API

socket

简化本主机应用层向传输层发送的非有效信息,通过socket代表一组信息

TCP socket包含源IP,源端口,目标IP,目标端口,连接状态

UDP socket包含源IP,源端口

但是传输报文时必须提供对方IP,port。接收报文时传输层需要上传对方的IP,port

socket

Web和HTTP

http为无状态协议,状态通过cookies实现

Read more »

基础概念

网络:由节点和边组成的结构

计算机网络:由主机节点(主机)和数据交换结点(数据的转发,如路由器交换机)构成的网络,边称为数据链路。

还可分为网络边缘(主机),网络核心(数据交换),接入(连接网络边缘和网络核心)

P2P(peer):分布式处理,客户端也可以是服务端

吞吐量:在源主机和目标主机之间的有效传输速率

网络核心

电路交换:独享资源,保证性能(计算机之间的通信有突发性,使用该方法则浪费的片较多)

分组交换:不独占资源,数据分组,存储转发(存在排队延迟和丢失,维护队列,超过长度则丢弃分组)

网络资源(如带宽)分成片:时分,频分,波分,码分

Read more »

传输层:进程到进程

网络层:端到端(end to end),网络设备到网络设备

数据链路层:点到点(point to point)

物理层:数字信号与物理信号的转换

Read more »

状态转移和复制状态机

状态转移(State Transfer):Primary将自己的完整状态(例如内存中的内容),拷贝发给Backup

复制状态机(Replicated State Machine):将来自客户端的操作或其他外部事件,从Primary传到Backup。由于外部操作比服务的状态要小得多,所以大多采用该方法,缺点是同步会比较复杂

架构

主虚拟机(Primary VM)简称为主机,Backup VM 简称为备机

VMware FT 需要两台物理服务器,主机与备机保持同步,虚拟机的虚拟磁盘在共享存储上。

所有的输入(如网络、鼠标、键盘等)都会输入到主机,然后通过 Logging channel 转发到备机,对于非确定性的操作,还将发送额外的信息,确保备机以确定性的方式执行这些操作。

两台虚拟机都会执行输入操作,但只有主机的输出会返回客户端,备机的输出会被管理程序丢弃

非确定性事件

Read more »

摘要

GFS是一个可以支持上千个机器和硬盘,上百用户同时访问的文件系统

介绍

问题或现象 解决办法
机器错误 持续监控,错误发现,错误处理,自动恢复
文件过大 设计IO操作和block大小
大部分文件写为append而不是overwrite 只优化append保证性能和原子性
引入GFS特有文件读写方式 复用部分文件系统API

设计概述

假设
  • 系统通过廉价机器组成
  • 日常处理GB级的文件
  • 写大部分为append
  • 多个用户看到的同一个文件必须相同
  • 保证高频使用的准确性
接口

GFS不使用类似于POSIX的标准API

架构

Read more »

记得小学阅读课上,我在读一本悬疑小说并写到了读后感作业中,结果第二天就被老师批评,并以“开卷有益”这个成语来教导我说,你这种书以后少读读。当时,我就觉得老师这种说法一定是错的,但限于那时的表达能力和逻辑能力并不能给出完整的反驳,现写下此文以表述自己的想法。
“以后少读读”这句话一直在我脑海中,我不理解曾几何时,书之间也有了贵贱之分,难道读四大名著的就是好学生,读《福尔摩斯》的就是差学生吗?“开卷有益”指的是读书总有好处,并非告诉我们先对于书是否有益有了定性之后再去读。老师说的这些话显然是没有道理的。
那她又是出于什么原因这样说呢?说到底,四个字,功利主义。什么书对于学习有帮助那就是有益的,没帮助就是浪费时间。我们中的很多人从小被灌输这样一个观念:只有努力学习才能上好大学,只有上好大学才能找到好工作,才能有幸福的生活。曾经我也认为这句话是对的,为了以后能开心地生活现在必须努力学习。但真的是这样吗?从学校到工作到生话并非完全是后者依赖前者的先序关系,其中某一环节的丢失并不一定能影响到之后的生活。这种观点只是指出人生中几个重要结点,并对每一个结点提出要求。上了好大学能就能仕途一帆风顺,有了好工作真能天天开开心心享受生活?不尽然。
前段时间,“鸡娃”一度成为社会热点问题,家长给孩子报了各种补课班,兴趣班,以求孩子能领先他人一步。我想,他们也许都是上文观点的拥趸,生怕自己孩子因为没补课而落后其他同学。其实,我小时候也是个“鸡娃”,从幼儿园开始补课直到高中毕业,周末只是换了个地方上课。现在看来,报那么多班其实未必有用,现在的我也只是刚从普通大学毕业,过着平淡的生话。每个人学习能力不同,那假设补课班是有用的,能让所有上课的孩子成绩提升,考上好大学,但那之后呢,补课班除了能培养出优秀的做题家外并不会给孩子带来什么。
好大学并不是人生的终点,拥有幸福快乐的人生也不是名校生的特权,否则怎么会有某大学投毒案,某大学弑母案呢?这一切的一切都是功利主义在作祟,他们认为人生只需要为那几个重要结点去准备就行了,达到目的则视为成功,在他们的眼中,世界是线性的,必须要完成一个个小目标,追求利益最大化,否则就是失败。但他们不知道的是人生并不是一蹴而就的,阶段性的成功并不意味着什么。事物之间也在不断变化发展,幸福的人生并不是公式化的结果,在这之中更重要的是我们对为人处世的态度,以及对于个人,社会,以及世界的看法,这会贯穿人的一生,而非学校,工作等短暂的光环。
冯友兰先生将人生分为四种境界:自然镜界,功利境界,道德境界和天地境界。你我皆为凡人,虽难以达到“敬天爱人,天人合一”,但也不应在功利境界一直徘徊,为了眼前的利益患得患失。“开卷”何必“有益”,看自己想看的书,做自己想做的事,何必要按照公式走完自己的人生呢。

Read more »