课后学习-xv6-Lab1 | 青训营笔记

123 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第十三天,今天继续学习xv6操作系统课程。今天主要内容是完成Lab1实验内容。

提交方式

每个需要完成的任务会指定创建的文件名与文件地址,在该目录文件下完成代码后,在Makefile文件中找到UPROGS=位置,仿照格式加入编译项即可。比如sleep实验,在user/下新建sleep.c文件并在其中的main中进行代码逻辑编写,且在Makefile文件中UPROGS=位置末尾新增一行加入$U/_sleep\即可,下次编译运行时即可用命令sleep运行该.c程序。

Sleep

题目描述:实现xv6的UNIX程序sleep ,您的sleep应该暂停到用户指定的计时数。一个滴答(tick)是由xv6内核定义的时间概念,即来自定时器芯片的两个中断之间的时间。您的解决方案应该在文件user/sleep.c

实现:直接调用系统的sleep即可,注意参数数量的错误处理以及将字符串转int类型传入

pingpong

题目描述:编写一个使用UNIX系统调用的程序来在两个进程之间“ping-pong”一个字节,请使用两个管道,每个方向一个。父进程应该向子进程发送一个字节;子进程应该打印“<pid>: received ping”,其中<pid>是进程ID,并在管道中写入字节发送给父进程,然后退出;父级应该从读取从子进程而来的字节,打印“<pid>: received pong”,然后退出。您的解决方案应该在文件user/pingpong.c中。

实现:定义两个管道即可,注意读取方要关闭自己的写入端,否则会阻塞卡住

Primes

题目描述:使用管道编写prime sieve (筛选素数)的并发版本。这个想法是由Unix管道的发明者Doug McIlroy提出的。请查看这个网站,该网页中间的图片和周围的文字解释了如何做到这一点。您的解决方案应该在user/primes.c文件中。

实现:主要是理解算法,其实就是每个子进程代表一个素数,并且筛掉该素数的倍数,剩下的数继续传入下一个子进程,注意wait和pipe的使用

find

题目描述:写一个简化版本的UNIX的find程序:查找目录树中具有特定名称的所有文件,你的解决方案应该放在user/find.c

实现:主要从ls.c文件中学习读取目录的方法等,理解并修改即可

xargs

题目描述:编写一个简化版UNIX的xargs程序:它从标准输入中按行读取,并且为每一行执行一个命令,将行作为参数提供给命令。你的解决方案应该在 user/xargs.c

实现:主要是c处理字符串的内容,先处理好从标准输入流读入多行多单词的内容,注意指针与数组的差别,然后再处理每行对应一个子进程,注意处理一个子进程时父进程就要wait一次,否则多个子线程会并行导致输出错误。