0 min

0 min

Conditional Breakpoints, Execution Breakpoints 的设置. Conditional Breakpoints 对Intellij中的断点右键,会出现 在condition中输入条件表达式,当满足条件时,断点生效。 Execution Breakpoints Run->View Breakpoints, 选择Java Exception Breakpoints, 选择需要断点的异常类型.

1 min

lab4a 处理下面这种情况: 比如我们提交了 lab1 对 Collatz.java 的修改 commit,然后远程仓库更新了一个 commit,但仍然包含旧的 Collatz.java。 此时我们 git pull 就会冲突。 lab4b git checkout <commit-id> 进入 detached HEAD 状态,此时可以查看文件历史,但不要做任何修改。 git checkout master 回到 master 分支。 # 从某个提交或分支中恢复特定文件 git checkout branch-name -- file-name git checkout commit-hash -- file-name A Debugging Mystery 这个问题是因为 Java 中 Integer 对象的缓存机制导致的。 在 Java 中,== 运算符比较的是对象的引用(内存地址),而不是对象的值。当你使用 == 比较两个 Integer 对象时,你实际上是在比较它们是否是同一个对象实例。 Java 为了优化性能,对于范围在 -128 到 127 之间的整数,会预先缓存对应的 Integer 对象。这意味着: 当你创建值在 -128 到 127 范围内的 Integer 对象时,Java 会返回缓存中的对象 当值超出这个范围时(如 128),每次创建都会生成新的对象实例 因此,当你比较两个超出这个范围的 Integer 对象时,它们是不同的对象实例,== 运算符返回 false。...

1 min

Java and Compilation javac capers/Main.java java capers.Main story "this is a single argument" File & Directory Manipulation in Java File File f = new File("dummy.txt"); f.createNewFile(); // 创建文件 f.exists() // 检查文件是否存在 Utils.writeContents(f, "Hello World"); // 将字符串写入文件 Directory File d = new File("dummy"); d.mkdir(); // 创建目录 Serializable 如果有更复杂的 object 需要保存,可以利用 java.io.Serializable, 将 object 序列化成 byte stream 保存到文件中: import java.io.Serializable; public class Model implements Serializable { ... } 把对象序列化成 byte stream: Model m = ....

2 min

book 看浮点数实现。 浮点数汇编。 lab data lab 继续做以及笔记。 bomb lab phase6和secret bomb。

1 min

deivce interrupt 的入口在kernel/trap.c 的 devintr函数。 5.1 Code: Console input ns16550 uart driver 寄存器相关,每个占 1 个 byte: LSR: line status register, 保存 uart 硬件的状态。 RHR: receive holding register, 保存接收到的数据。 THR: transmit holding register, software 往里写,uart hardware 就会发送。 xv6 main 函数通过 kernel/console.c 中的 consoleinit 函数来初始化 uart 硬件,使能 uart 中断。 xv6 shell 通过在 init.c 中打开的 console file descriptor 从 console 中读取数据。通过 read system call 调用到 consoleread 回调函数。consoleread 函数等待 input, 并保存到 cons.buf. 如果 user 还没有输入完完整的一行,reading process 会进入 sleep....

2 min

6.1 Races 6.2 Code: Locks Xv6 有两种锁,spinlocks 和 sleep-locks. struct spinlock { uint locked; // 0 表示可以获取锁,1 表示锁被占用 char *name; // 锁的名称 struct cpu *cpu; // 持有锁的 CPU }; void acquire(struct spinlock *lk) { push_off(); // disable interrupts to avoid deadlock. if (holding(lk)) // 如果当前进程已经持有锁,则 panic,不可重入 panic("acquire"); while (__sync_lock_test_and_set(&lk->locked, 1) != 0) ; __sync_synchronize(); lk->cpu = mycpu(); } __sync_lock_test_and_set 是 C 库的一个原子操作,在 risc-v 上,它会被编译成 amoswap 原子指令。 __sync_lock_test_and_set(&lk->locked, 1) 的工作原理: 原子性地读取 lk->locked 的当前值 将 lk->locked 设置为 1(表示锁被占用) 返回 lk->locked 的原始值 如果返回 0:说明锁之前是空闲的(0),现在成功获取了锁,跳出循环 如果返回 1:说明锁之前就被占用(1),继续自旋等待 void release(struct spinlock *lk) { if (!...

1 min

File System 8.1 Overview File system 架构: disk layer: 读写磁盘 block buffer cache layer: 缓存和同步磁盘数据 logging layer: 把多个 blocks 打包到一个 transaction. inode layer: 包括 individual files, 每个都被表示为一个 inode. directory layer: 包括 directories, 每个都被表示为一个特殊的 inode. path name layer: 提供像/xv6/fs.c 这样的层级路径名。 file descriptor layer: 使用 file descriptor 抽象一些 unix 资源 (pipes, devices, files) disk hardware 一般以 block(或者叫 sector) 为单位,一个 block 通常是 512 bytes. 操作系统使用的 block size 可能与 disk 的 block size 不同,一般是 disk 的 block size 的整数倍。...

3 min

Q1 Uthread 为 users-level threading system 设计 context switch mechanism. Q2 Using threads 利用 threads 和 locks 来实现 parallel programming. 使用 UNIX pthread 库。 Q3 Barrier 实现 barrier, 即应用程序中的一个点,在这个点上,所有参与的线程都必须等待,直到所有其他参与的线程也到达这个点。 可以使用 pthread condition variables.

1 min