0%

GDB使用手册

编译时加上-g选项

命令名称 命令缩写 命令说明
run r 运行一个待调试的程序
continue c 让暂停的程序继续运行
next n 运行到下一行
step s 单步执行,遇到函数会进入
until u 运行到指定行停下来
finish fi 结束当前调用函数,回到上一层调用函数处
return return 结束当前调用函数并返回指定值,到上一层函数调用处
jump j 将当前程序执行流跳转到指定行或地址,不运行跳过的代码
print p 打印变量或寄存器值
backtrace bt 查看当前线程的调用堆栈
frame f 切换到当前调用线程的指定堆栈
thread thread 切换到指定线程
break b 添加断点
tbreak tb 添加临时断点
delete d 删除断点
enable enable 启用某个断点
disable disable 禁用某个断点
watch watch 监视某一个变量或内存地址的值是否发生变化
list l 显示源码
info i 查看断点 / 线程等信息
ptype ptype 查看变量类型
disassemble dis 查看汇编代码
set args set args 设置程序启动命令行参数
show args show args 查看设置的命令行参数
Read more »

我的疑问

  1. header中防御式声明的目的
  • 防止两个头文件相互include时的循环include
  • 防止cpp在include不同头文件时可能产生的重复定义
  1. inline

将函数声明为inline可以避免函数调用的开销,空间换时间

常规的函数调用需要用到栈,需要返回地址和参数压栈,但通过inline展开后就为普通的顺序执行

与define的区别

  • define无类型检查,inline有
  • define编写时运算符的优先级较难处理
  • define在预处理时展开,inline由编译器实现展开
  1. const

const对象的值创建后值不能再改变,所以必须初始化

Read more »

第三章 内存管理

程序重定位

在编译形成可执行程序时,用到的地址都是从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 »