0%

日期文本转换

文本 $\Rightarrow$ 日期

可以使用DATE(year, month, day)函数来实现,具体如下:

A B
1 20170102 =DATE(LEFT(A1, 4), MID(A1, 5, 2), RIGHT(A1, 2))

结果为:

A B
1 20170102 2017/01/02

备注:

  • LEFT(text, [num_chars])表示从text中选取最__左侧__的num_chars个字符。
  • RIGHT(text, [num_chars])表示从text中选取最__右侧__的num_chars个字符。
  • MID(text, start_num, num_chars)表示从start_num开始返回num_chars个字符。
  • 可以点击这里查看关于__DATE函数__的更多用法。

日期 $\Rightarrow$ 文本

可以使用TEXT(text, format)函数来实现,具体如下:

A B
1 2017-01-02 =TEXT(A1, “yyyymmdd”)

结果为:

A B
1 2017-01-02 20170102

备注:可以点击这里查看关于TEXT函数的更多用法。

阅读全文 »

Cache缺失分类

Cache的缺失主要分为强制缺失(Compulsory Miss)**、容量缺失(Capacity Miss)以及冲突缺失(Conflict Miss),其中,强制缺失又称为冷缺失(Cold Miss)**。

概念

  • 强制缺失:CPU第一次访问相应Cache块,Cache中肯定没有该Cache块,引起的缺失叫做强制缺失。这是不可避免的
  • 容量缺失:有限的Cache容量导致Cache放不下而替换出Cache块,被替换出去的Cache块再被访问,引起的失效叫做容量失效。
  • 冲突缺失:在直接相联或组相联的Cache中,不同的Cache块由于Index相同相互替换,引起的失效叫做冲突失效。

强制缺失

在Cache的三种缺失中,强制缺失非常好区分,只要是CPU第一次访问相应的Cache块引起的缺失,就称作强制缺失。

容量缺失

在直接映射或组相联Cache的情况下,若该Cache行被替换出去时,Cache已经满了,就是容量缺失。

举一个例子说明一下:
如果有一个64KB大小的数组需要重复访问,而Cache大小只有16KB,这时数组的大小远远大于Cache大小,没办法全部放入Cache。第一次访问数组发生的失效是强制缺失。而之后再访问数组,再发生的缺失则全都是容量缺失,这时Cache已经存满,容量不足以存储全部数据。

冲突缺失

在直接映射或组相联Cache的情况下,若该Cache行被替换出去时,还有其他空闲的Cache行,则是冲突缺失。

同样也举一个例子说明:
如果有两个8KB大小的数据需要来回访问,但是这两个数组都映射到相同的地址,Cache的大小为16KB,足够存储全部的数据,但是因为相同地址发生了冲突需要来回替换,发生的缺失则全都是冲突缺失(第一次访问失效依旧是强制缺失),这时Cache并没有存满

降低Cache缺失的方法

  • 强制缺失:无法避免。
  • 容量缺失:增加Cache大小。
  • 冲突缺失:增加Cache相联度、优化替换策略、增大Cache大小等等。

实验目的

设计并实现用于列车售票的可线性化并发数据结构。

实验说明

给定Ticket类:

1
2
3
4
5
6
7
8
9
class Ticket {
long tid; // 车票编号
String passenger; // 乘客名字
int route; // 列车车次
int coach; // 车厢号
int seat; // 座位号
int departure; // 出发站编号
int arrival; // 到达站编号
}

给定TicketingSystem接口:

1
2
3
4
5
6
7
8
public interface TicketingSystem {
// 买票,即乘客passenger购买route车次从departure站到arrival站的车票一张。若购买成功,返回有效的Ticket对象;若失败(无余票),则返回null
Ticket buyTicket(String passenger, int route, int departure, int arrival);
// 查询余票,即查询route车次从departure站到arrival站的余票数
int inquiry(int route, int departure, int arrival);
// 退票,对有效的Ticket对象返回true,对无效的Ticket返回false
boolean refundTicket(Ticket ticket);
}

给定TicketingDS类的构造器接口:

1
TicketingDS(routenum, coachnum, seatnum, stationnum, threadnum)

其中:route是车次总数(缺省为5),coachnum是列车车厢数目(缺省为8),seatnum是每节车厢的座位数(缺省为100),stationnum是每个车次经停站数量(缺省为10,含始发站和终点站),threadnum是并发购票的线程数(缺省为16)。

阅读全文 »

实验目的

给定网络拓扑以及节点的网络地址配置(包含私网地址),实现NAT地址转换功能,使得左侧的私网H1节点能够连接H2节点并传输数据

实验拓扑

实验内容

  1. 运行给定网络拓扑(nat_topo.py)
1
sudo python2 topo/nat_topo.py
  1. 在n1中启动NAT服务
1
2
3
4
5
6
./scripts/disable_arp.sh
./scripts/disable_icmp.sh
./scripts/disable_ip_forward.sh # Archlinux中需要将-p ip改成-p ipv4
./scripts/disable_tcp_rst.sh
export LD_LIBRARY_PATH=.; # 设置lib路径
./nat # 启动NAT服务
  1. 在h2节点启动简易HTTP服务器
1
2
./scripts/disable_offloading.sh # 防止协议栈生成错误的checksum
python2 -m SimpleHTTPServer
  1. 在h1节点启动wget请求h2
1
2
./scripts/disable_offloading.sh # 防止协议栈生成错误的checksum
wget http://159.226.39.123:8000
阅读全文 »

实验目的

给定网络拓扑和节点配置,节点实现TCP最基本的连接管理和数据传输功能,使得节点之间能够在无丢包网络环境中传输数据。

实验拓扑

实验内容

  1. 运行给定网络拓扑(tcp_topo.py)

    1
    sudo python2 topo/tcp_topo.py
  2. 在节点h1上执行TCP程序

    执行脚本,禁止协议栈的相应功能,并在h1上运行TCP协议栈的服务器模式。

    1
    2
    3
    4
    5
    6
    ./scripts/disable_arp.sh
    ./scripts/disable_icmp.sh
    ./scripts/disable_ip_forward.sh
    ./scripts/disable_tcp_rst.sh
    export LD_LIBRARY_PATH=.;
    ./tcp_stack server 10001
  3. 在节点h2上执行TCP程序

    执行脚本,禁止协议栈的相应功能,并在h2上运行TCP协议栈的客户端模式,连接h1并从h1正确获得数据。

    1
    2
    3
    4
    5
    6
    ./scripts/disable_arp.sh
    ./scripts/disable_icmp.sh
    ./scripts/disable_ip_forward.sh
    ./scripts/disable_tcp_rst.sh
    export LD_LIBRARY_PATH=.;
    ./tcp_stack client 10.0.0.1 10001
阅读全文 »