计算机系统基础实验须知

特别注意:所有的提交都以 Git HEAD 为准——这意味着如果你本地的修改没有被 make 自动提交 (或是手动提交),将不会被 Online Judge 评测。请大家使用我们提供的 Makefile 编译而非手工编译,确保你的代码被正确提交。

1. 学术诚信 (Academic Integrity)

所有课程作业都需要独立完成

详情请参考 MIT 对学术诚信的解释。如果你对做某件事是否合理感到困惑,可以参考第一次课程的 slides 或询问老师。此外,请不要将你的代码以任何形式公开发布或给他人传阅,这么做可能导致代码相似被判定为抄袭。

2. 实验提交

在实验的目录中执行 make submit 将会自动完成提交。

设置正确的 TOKEN

我们为每个同学分配了唯一的 TOKEN (8 个字符),已发送至你的 smail.nju.edu.cn 邮箱,请查收。你需要确保这个字符串在提交时处于 TOKEN 环境变量中。如何设置环境变量请 STFW。前期请自行开始实验所需环境安装(详情请参考PA0实验)。

在9月7日10点前选课的同学,请查看smail邮箱妥善保存TOKEN,在9月7日11点后选课的同学,请在此表格中登记你的TOKEN获取需求,我们后续会统一发送。

2.1 PA 提交方法

脚本会自动根据你的 git 分支提交到对应的实验上,例如 pa0 分支会自动提交到 PA0。提交成功后会返回提交的文件 ID:

[SUCC ✓] Received ... ics2022.tar.bz2 at 13:51:36

提交到系统的代码会进一步经过 Online Judge 的检查,包括:

  • Git 记录检查
  • 代码相似度检查
  • 编译、运行测试用例。特别注意:Online Judge 编译运行的是 Git repo HEAD 中的代码。因此请确保你的代码最后的修改被编译且被追踪。未提交到 Git repo 中的代码将不会被评测。

2.2 Lab 提交方法

在 Lab 对应的目录中 make submit。如 Lab1 的工作目录为 multimod/,则在 multimod 目录中执行 make submit。需要设置 STUID (学号) 和 STUNAME (中文姓名) 环境变量。

2.3 PA与Lab的OJ查询

在相应的oj页面查看 Online Judge 的返回结果,页面地址为:http://why.ink:8080/oj/ICS2023/拼接实验项目与邮件给每人自己发的TOKEN。 例如:对PA1实验,TOKEN为AABB的同学可于http://why.ink:8080/oj/ICS2023/PA1/AABB页面查看该实验的实时提交OJ结果。对Lab1实验来说,该页面地址为:http://why.ink:8080/oj/ICS2023/Lab1/AABB。

3. 评测与评分须知

3.1 截止时间

每个 PA/Lab 实验都设有两种 deadlines:

  • Deadline: 为正常实验的提交ddl,分别在每个实验对应页面上公布,按照110%系数算分。
  • Hard Deadline: 所有实验在 Hard deadline (通常是期末考试后的一小段时间) 时截止,不接受过期提交,为了公平,最终延期的提交成绩会乘以系数0.8。

所有提交时间以服务器时间为准。请大家注意:本课程的实验即便对于最优秀的同学来说也具有一定的挑战性。因此请不要把开始的时间拖到 deadline 临近。建议按照Deadline要求提交每一次实验,把控进度,最终每次实验成绩择优记录。

本课程中 PA 和 Labs 分别计分,100% 封顶 (即 PA 部分的加分不能代入到 Lab 部分)。

3.2 实验评分标准

如被发现有违反学术诚信的行为 (抄袭他人代码等),将会被扣分。注意 Online Judge 会编译运行你的代码,并且我们将使用我们的脚本/Makefile、在我们的环境下进行评测。因此如果你在本地修改了编译选项 (如去掉了 -Wall -Werror 等)、硬编码了路径 (例如直接打开绝对路径文件 "/home/log.txt") 等,提交后可能会发生编译/运行错误。

本学期每一次实验Deadline后,会开展抄袭检测,检测结果将以匿名方式发布在课程主页或OJ查询界面,若存在质疑,请单独邮件联系王慧妍老师并面谈。

一次抄袭,仅本次实验不得分但允许Deadline后重新提交; 两次抄袭,本次不得分且最终实验总分降至系数0.6; 三次抄袭,最终实验总分为0。请务必重视!

3.2.1 PA: 几乎完全客观评分

  • Rejected, 编译错误或没有通过任何测试用例: 10% (诚信分)
  • Partial Accepted, 部分 easy 测试通过 (此时不运行 hard 用例): 10%~60%,根据比例加权换算
  • Partial Accepted, 全部 easy 测试通过,部分hard测试通过:60%~80%,根据比例加权换算
  • Accepted, 通过全部 easy/hard 测试: ≥ 80%,剩余部分由人工评价给出
  • 没有通过全部 easy 测试用例的作业将没有人工评分的机会 (即意味着实验报告不得分。但我们会阅读你的反馈)。

3.2.2 Labs: 完全客观评分

  • Rejected, 编译错误或没有通过任何测试用例: 10% (诚信分)
  • Partial Accepted, 部分 easy 测试通过 (此时不运行 hard 用例): 50%
  • Partial Accepted, 全部 easy 测试通过 (hard 用例没有全部通过): 75%
  • Accepted, 通过全部 easy/hard 测试: 100%

3.2.3 Homework: 提交即得分

  • 不论正确与否。请大家独立完成作业。

4. 遇到困难?

这时候,两个反复提到的词再次出现:

  • RTFM: Read The Friendly Manual
  • STFW: Search The Friendly Web

其中的 “F” 让它们更具有传奇色彩。

## 在线评测 在线评测基于计算机系云平台。程序在容器中编译、运行,并由机器自动判定结果是否正确。在此基础上,最终实验的评分仍有一部分由助教决定。你的程序将在以下环境运行: * 虚拟机中的 Ubuntu 18.04 容器 ([Docker](https://www.docker.com/))。容器中仅有最小的必要系统工具。使用以下 Dockerfile 配置与在线评测一致的环境;我们开放了容器的 `SYS_PTRACE` 权限; FROM ubuntu:18.04 RUN bash /tmp/change-source.sh RUN apt-get update RUN apt-get install -y build-essential gcc-multilib qemu-system strace gdb sudo python3 RUN apt-get upgrade -y RUN useradd -ms /bin/bash oj USER oj WORKDIR /home/oj * Mini Labs 直接在容器中执行 (non-root user);OS Labs 在容器中的 QEMU 虚拟机 (tcg 模式) 运行; * 容器总内存限制 512 MiB,超过内存限会导致进程被杀死。超过一定时限未执行完的容器也将被杀死。
#### 被 Online Judge 支配的恐惧? Online Judge 的最大特点就是.red[严格]。有任何差错 (因为环境/配置等引发的编译错、细小的输出错误) 都将被 Online Judge 捕捉到。这有助于帮助大家摆脱 “糊弄” 的习惯,编写正确的程序。 ![](compile-error.jpg){.center width=140px} 系统课程的 labs 和 OJ 题有一点不同:大部分问题没有 “绝对正确” 的标准输出。因此我们并不是简单地运行程序检查结果,而是有一定系统化地测试你的程序: * 在多个环境下运行你的程序,如 i386 (32 位) 和 x86-64 (64位),因此不可移植的代码可能无法编译; * 在模拟出的环境中执行程序,例如在线程调度时插入一些随机的 delays,从而提高某些并发 bug 触发的概率; * 链接我们修改过的库函数,例如 (在某些 lab 中) 使 `malloc()` 随机返回 `NULL`; * 解析程序的 log,并观察其中是否有 bug 出现的迹象。例如.red[程序 crash 将被判定为不正确]、.red[缺少某个重要输出也将被判定为不正确]。