当前位置: 首页 > news >正文

开一个新篇章 MIT 6.S081,实验一

 实习了三个多月,期间发生了很多事情。但是总的来说也是迈出了第一步。但是由于我本身太菜了,开始的又很晚,所以找暑期实习的过程又十分的坎坷。在6月初的时候,研究了一下MPSC和MPMC的无锁队列,对CAS和false sharing之间有了更多了解,也让我对操作系统产生了更多的兴趣。因此在搜索的过程中,发现了MIT 6.S081这门课程,打算了解一下,因此打算一边找实习一边学。
定一个小目标,一个月的时间做完相关实验。废话不多说let's go
说实话,我一直认为我还是比较了解linux系统的,就算不是使用很多的原理性的问题,我在使用编写C++程序的时候,尤其是简单程序的优化的时候,往往会想能不能减少系统调用从而减少用户态到内核态之间的转换来降低系统开销。但是一些实验依旧给我带来了很多麻烦,尤其是xargs这个实验,之前很少使用,但是在实现的时候给我造成了一些麻烦。

sleep

  easy难度,本质上来说,就是调用实现好的sleep做一层输入输出,类似于用户封装,我是这么理解的。很简单。

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"int main(int argc, char *argv[])
{if (argc != 2){fprintf(2, "something error in sleep");exit(1);}sleep(atoi(argv[1]));exit(0);
}

pingpong

 同样也是easy难度,是对于pipe的运用。也很简单。只要涉及到一些并发编程都会涉及到,毕竟不可能都用shm吧,哈哈

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"int main()
{int pid, fd1[2], fd2[2];if (pipe(fd1) < 0){fprintf(2, "someting error in pingppong(pipe1 error)");}if (pipe(fd2) < 0){fprintf(2, "someting error in pingppong(pipe2 error)");}pid = fork();if (pid < 0){fprintf(2, "someting error in pingppong(fork error)");}else if (pid == 0){close(fd1[0]);close(fd2[1]);char rec;read(fd2[0], &rec, 1);fprintf(1, "%d: received ping\n", getpid());write(fd1[1], &rec, 1);exit(0);}else{close(fd1[1]);close(fd2[0]);char send = 'a';write(fd2[1], &send, 1);wait(&pid);char rec;read(fd1[0], &rec, 1);if (rec != send){fprintf(2, "something error in pingpong : receive char is not equal send char\n");exit(1);}fprintf(1, "%d: received pong\n", getpid());}exit(0);
}

primes

 标注的是moderate/hard,但是难度实际上还可以。本质上就是一个递归算法,终止条件就是read() == 0,也就是父进程的fd关闭了。需要注意判断条件,要不然会无限递归

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"void mkpipe(int fdR)
{int mode = 0;if (read(fdR, &mode, 4) == 0){close(fdR);exit(0);}fprintf(1, "prime %d\n", mode);int cfd[2], pid;pipe(cfd);pid = fork();if (pid < 0){fprintf(2, "something error int primes , which pid is %d\n", getpid());exit(1);}else if (pid == 0){close(cfd[1]);mkpipe(cfd[0]);}else{close(cfd[0]);int num;while (read(fdR, &num, 4) != 0){if (num % mode != 0){write(cfd[1], &num, 4);}}close(cfd[1]);wait(0);exit(0);}
}int main()
{int fd[2], pid;pipe(fd);pid = fork();if (pid < 0){fprintf(2, "something error int primes , which pid is %d\n", getpid());exit(1);}else if (pid == 0){close(fd[1]);mkpipe(fd[0]);}else{close(fd[0]);for (int i = 2; i <= 35; ++i){write(fd[1], &i, 4);}close(fd[1]);wait(0);}exit(0);
}

find

 这个我个人认为还是有些难度的,但是有一点好处就是给出了ls的实现,实际上如果仿照ls的话还是比较好实现的。需要注意的是,如果当前的st.type依旧为T_DIR需要继续递归调用,要不然的话无法深层递归目录,会导致用例过去不,只停留在当前路径中。

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
#include "kernel/fs.h"char *fmtname(char *path)
{static char buf[DIRSIZ + 1];char *p;for (p = path + strlen(path); p >= path && *p != '/'; --p){}++p;int len = strlen(p);if (len >= DIRSIZ){return p;}memmove(buf, p, len);buf[len] = '\0';return buf;
}void find(char *path, char *name)
{char buf[512], *p;int fd;struct dirent de;struct stat st;if ((fd = open(path, 0)) < 0){fprintf(2, "find: cannot open %s\n", path);return;}if (fstat(fd, &st) < 0){fprintf(2, "find: cannot stat %s\n", path);close(fd);return;}switch (st.type){case T_FILE:if (!strcmp(name, fmtname(path))){fprintf(1, "%s\n", path);}break;case T_DIR:if (strlen(path) + 1 + DIRSIZ + 1 > sizeof buf){printf("find: path too long\n");break;}strcpy(buf, path);p = buf + strlen(buf);*p++ = '/';while (read(fd, &de, sizeof(de)) == sizeof(de)){if (de.inum == 0)continue;if (strcmp(de.name, ".") == 0 || strcmp(de.name, "..") == 0)continue;memmove(p, de.name, DIRSIZ);p[DIRSIZ] = 0;if (stat(buf, &st) < 0){printf("find: cannot stat %s\n", buf);continue;}if (!strcmp(name, fmtname(buf))){fprintf(1, "%s\n", buf);}if (st.type == T_DIR){find(buf, name);}}break;}close(fd);
}int main(int argc, char *argv[])
{if (argc < 2){fprintf(2, "usage: find [dir] filename\n");exit(1);}char *name = argv[argc - 1];for (int i = 1; i < argc - 1; i++){find(argv[i], name);}if (argc == 2){find(".", name);}exit(0);
}

xargs

 这个我之间很少接触,我的理解就是相比于直接用管道 | , | xargs 的好处就是可以将管道前的执行结果以参数的形式传递给后面的函数,因为直接 | 的话 ,本质上是直接从0来读前一个命令的执行结果,这样的话会有一个问题,对于像cat这类参数来说,不支持从stdin处读入数据作为自己的参数,xargs解决了这个问题,就比如 find xxx | cat 并不会读出对应文件中的数据而是会单纯打印路径。
还有一个,就是注意要循环读,因为find比较慢。

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
#include "kernel/fs.h"
#define MAXARGS 10
#define BUFSZ 512int main(int argc, char *argv[])
{char *buf[MAXARGS];int arg = 0;for (int i = 1; i < argc; ++i){buf[arg] = argv[i];++arg;}char args[BUFSZ];int len = 0, n;while ((n = read(0, args + len, BUFSZ)) != 0){len += n;}char *p = args;for (int i = 0; i < len; ++i){if (args[i] == '\n'){int pid = fork();if (pid < 0){fprintf(2, "something error in xargs  : fork() failed");exit(1);}else if (pid == 0){int xarg = arg;buf[xarg] = p;args[i] = 0;buf[++xarg] = 0;exec(buf[0], buf);exit(0);}else if (pid > 0){p = &args[i + 1];wait(0);}}}exit(0);
}
http://www.jsqmd.com/news/1014129/

相关文章:

  • 2026无锡苏易修缮防水:7 步标准化精工工艺 透明报价规避家装防水坑 - 苏易修缮
  • 如何快速掌握微信小程序反编译技术:wxapkg-convertor完全指南
  • 卡美德生物科普CD134(OX40):免疫调控靶点的生物学特性与研
  • 第24章:多模态 RAG——图片、PDF 与版面信息
  • 如何用 AI Agent Harness Engineering 重构客服体系:自动化闭环处理率与 NPS 提升路径
  • 免费开源!Mac Mouse Fix终极指南:让10美元鼠标秒变专业级触控板
  • FanControl:Windows电脑风扇智能控制终极指南
  • 五大哄睡治愈平台客观测评:匿名疗愈,安心解锁温柔睡眠 - 时时资讯
  • 如何轻松绕过Windows 11限制:Mac用户的终极启动盘制作方案
  • 抖音下载器技术解析:从API调用到智能下载的完整实现
  • FModel终极指南:深入解析虚幻引擎资源浏览器的5大核心技术模块
  • 人才测试系统专业度调研:三家机构的场景适配能力对比 - 资讯速览
  • ComfyUI IPAdapter终极指南:5分钟掌握AI图像风格迁移与人物控制
  • foobox-cn:为foobar2000注入灵魂的美化方案
  • Flashtool完整指南:拯救索尼Xperia设备的终极刷机解决方案
  • 2026苏州卫生间防水避坑指南:苏易修缮一口价报价 全程杜绝隐形增项 - 苏易修缮
  • 2026年10款论文降AIGC网站实测:从90%降至10%的宝藏之选
  • 2026芜湖黄金回收哪家最靠谱?多家家门市场景实测对比 - 鸿运名品
  • 高级HTML5视频播放控制技术深度解析:Video Speed Controller专业指南
  • 低代码平台兴起: democratizing AI Agent Harness Engineering 开发
  • 终极指南:如何快速解决Edge-TTS语音合成错误问题(免费完整教程)
  • 2026年中国工业电动球阀电动闸阀选型指南澳翔自控角行程方案解析 - 资讯速览
  • 2026年6月最新版庆阳正规房屋漏水防水补漏维修口碑名单:创维修缮机构等5家深度测评 - 一休咨询
  • 从零到一:用最新技术栈爬取51job“爬虫工程师”职位信息
  • 架构演进中的服务拆分策略:从单体到微服务的渐进式拆分路径
  • 2026 芜湖黄金回收靠谱商家汇总:正规资质,安全交易 - 鸿运名品
  • MySigMail:三分钟打造专业级邮件签名的终极免费解决方案
  • UI-TARS桌面版:用自然语言重新定义桌面自动化,5分钟开启智能工作新时代
  • 腾讯股票行情接口 http://qt.gtimg.cn/q=sh600000 完整格式解析
  • 汽车之家图片爬虫实战:从零下载完整车型图库