diff --git a/.gitignore b/.gitignore index c9a45e5..4369cb2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules/ -_book/ \ No newline at end of file +_book/ +update.ps1 \ No newline at end of file diff --git a/labs/requirements/lab7.md b/labs/requirements/lab7.md index 89e41d1..ef2f71d 100644 --- a/labs/requirements/lab7.md +++ b/labs/requirements/lab7.md @@ -136,6 +136,7 @@ $ ./ph 2 > * `pthread_mutex_init(&lock, NULL); // initialize the lock` > * `pthread_mutex_lock(&lock); // acquire lock` > * `pthread_mutex_unlock(&lock); // release lock` +> > 当`make grade`说您的代码通过`ph_safe`测试时,您就完成了,该测试需要两个线程的键缺失数为0。在此时,`ph_fast`测试失败是正常的。 不要忘记调用`pthread_mutex_init()`。首先用1个线程测试代码,然后用2个线程测试代码。您主要需要测试:程序运行是否正确呢(即,您是否消除了丢失的键?)?与单线程版本相比,双线程版本是否实现了并行加速(即单位时间内的工作量更多)? diff --git a/labs/use_git/git1.md b/labs/use_git/git1.md index f512736..340f663 100644 --- a/labs/use_git/git1.md +++ b/labs/use_git/git1.md @@ -3,7 +3,7 @@ > [!DANGER] > MIT 6.S081 这门课程每个lab对应一个git分支,所以请不要擅自将***.git***目录删除或更改origin指向的仓库地址 -1. **首先将mit的实验代码克隆到本地** +(1). **首先将mit的实验代码克隆到本地** ```bash git clone git://g.csail.mit.edu/xv6-labs-2020 @@ -11,7 +11,7 @@ git clone git://g.csail.mit.edu/xv6-labs-2020 -2. **在github创建一个新的空仓库** +(2). **在github创建一个新的空仓库** 创建完成后会有提示代码,请**不要**根据提示代码操作,并且记下右图中红色标注的仓库地址 @@ -19,7 +19,7 @@ git clone git://g.csail.mit.edu/xv6-labs-2020 -3. **添加git仓库地址** +(3). **添加git仓库地址** 查看本地仓库的git配置文件,可以看到***origin***主机名下已经有了对应的上游仓库地址 @@ -41,7 +41,7 @@ cat .git/config -4. **`git push`命令** +(4). **`git push`命令** - **功能**:`git push`命令用于从将本地的分支版本上传到远程并合并。 - **命令格式**: @@ -60,7 +60,7 @@ git push <远程主机名> <本地分支名> -5. **将实验代码推送github仓库** +(5). **将实验代码推送github仓库** 例如:将实验1用到的***util***分支推送到github @@ -75,7 +75,7 @@ git push github util:util -6. **xv6实验git分支建议** +(6). **xv6实验git分支建议** 建议是每个实验创建一个测试分支,例如对于***util***来说 @@ -96,6 +96,6 @@ git push github util:util -7. **其他** +(7). **其他** 你还可以添加gitee,防止github有时无法访问的问题 \ No newline at end of file diff --git a/tranlate_books/book-riscv-rev1/c1/s0.md b/tranlate_books/book-riscv-rev1/c1/s0.md index fe7292b..ba15080 100644 --- a/tranlate_books/book-riscv-rev1/c1/s0.md +++ b/tranlate_books/book-riscv-rev1/c1/s0.md @@ -16,29 +16,29 @@ 内核提供的系统调用集合是用户程序看到的接口。Xv6内核提供了Unix内核传统上提供的服务和系统调用的子集。表1.2列出了xv6的所有系统调用。 -| **系统调用** | **描述** | -| ------------------------------------- | ------------------------------------------------------------ | -| int fork() | 创建一个进程,返回子进程的PID | -| int exit(int status) | 终止当前进程,并将状态报告给wait()函数。无返回 | -| int wait(int *status) | 等待一个子进程退出; 将退出状态存入`*status`; 返回子进程PID。 | -| int kill(int pid) | 终止对应PID的进程,返回0,或返回-1表示错误 | -| int getpid() | 返回当前进程的PID | -| int sleep(int n) | 暂停n个时钟节拍 | -| int exec(char *file, char *argv[]) | 加载一个文件并使用参数执行它; 只有在出错时才返回 | -| char *sbrk(int n) | 按n 字节增长进程的内存。返回新内存的开始 | -| int open(char *file, int flags) | 打开一个文件;flags表示read/write;返回一个fd(文件描述符) | -| int write(int fd, char *buf, int n) | 从buf 写n 个字节到文件描述符fd; 返回n | -| int read(int fd, char *buf, int n) | 将n 个字节读入buf;返回读取的字节数;如果文件结束,返回0 | -| int close(int fd) | 释放打开的文件fd | -| int dup(int fd) | 返回一个新的文件描述符,指向与fd 相同的文件 | -| int pipe(int p[]) | 创建一个管道,把write/read文件描述符放在p[0]和p[1]中 | -| int chdir(char *dir) | 改变当前的工作目录 | -| int mkdir(char *dir) | 创建一个新目录 | -| int mknod(char *file, int, int) | 创建一个设备文件 | -| int fstat(int fd, struct stat *st) | 将打开文件fd的信息放入*st | -| int stat(char *file, struct stat *st) | 将指定名称的文件信息放入*st | -| int link(char *file1, char *file2) | 为文件file1创建另一个名称(file2) | -| int unlink(char *file) | 删除一个文件 | +| **系统调用** | **描述** | +| --------------------------------------- | ----------------------------------------------------------- | +| `int fork()` | 创建一个进程,返回子进程的PID | +| `int exit(int status)` | 终止当前进程,并将状态报告给wait()函数。无返回 | +| `int wait(int *status)` | 等待一个子进程退出; 将退出状态存入*status; 返回子进程PID。 | +| `int kill(int pid)` | 终止对应PID的进程,返回0,或返回-1表示错误 | +| `int getpid()` | 返回当前进程的PID | +| `int sleep(int n)` | 暂停n个时钟节拍 | +| `int exec(char *file, char *argv[])` | 加载一个文件并使用参数执行它; 只有在出错时才返回 | +| `char *sbrk(int n)` | 按n 字节增长进程的内存。返回新内存的开始 | +| `int open(char *file, int flags)` | 打开一个文件;flags表示read/write;返回一个fd(文件描述符) | +| `int write(int fd, char *buf, int n)` | 从buf 写n 个字节到文件描述符fd; 返回n | +| `int read(int fd, char *buf, int n)` | 将n 个字节读入buf;返回读取的字节数;如果文件结束,返回0 | +| `int close(int fd)` | 释放打开的文件fd | +| `int dup(int fd)` | 返回一个新的文件描述符,指向与fd 相同的文件 | +| `int pipe(int p[])` | 创建一个管道,把write/read文件描述符放在p[0]和p[1]中 | +| `int chdir(char *dir)` | 改变当前的工作目录 | +| `int mkdir(char *dir)` | 创建一个新目录 | +| `int mknod(char *file, int, int)` | 创建一个设备文件 | +| `int fstat(int fd, struct stat *st)` | 将打开文件fd的信息放入*st | +| `int stat(char *file, struct stat *st)` | 将指定名称的文件信息放入*st | +| `int link(char *file1, char *file2)` | 为文件file1创建另一个名称(file2) | +| `int unlink(char *file)` | 删除一个文件 | ​ 表1.2:xv6系统调用(除非另外声明,这些系统调用返回0表示无误,返回-1表示出错)