全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com)
这本书最初看名字以为是对早期unix的一个解读,但是看了开篇发现 不完全是,只是针对JOS教学OS系统来做的一些讲解。
Xv6是对UNIX v6的重新实现,但是在Intel的x86平台上而且考虑了多核的设计。这样看起来的确是很不错,因为现在x86的电脑到处都是而了解一下多核的使用也是很有意思的一个尝试。
1. 操作系统的几个典型作用:对底层的硬件进行抽象复用、让进程之间有一定的隔离且能够交互。
2. 目前Linux、BSD以及MAC OS X等操作系统都还沿用了很多UNIX最初的设计理念。
1. shell利用了OS的接口来实现的,而这个教学系统中也在一定程度上实现了bash。
2. fork对于父进程来说返回PID,对于子进程来说返回0。Exit能够让当前的进程停止并且释放资源。而wait返回当前进程退出子进程的PID,如果当前进程的子进程没有退出的那么wait会等待到有退出的之后返回退出子进程的PID。
1. 这里给出来了一组OS的常用接口,其实这些类似的功能在学习perl或者python脚本语言的时候就接触过一些类似的功能,也有一个类似的组合。
2. 父子进程之间会有一定的隔离手段,可以做到让两个进程之间不会互相影响。
3. exec执行的文件是ELF类型的文件。
1. 程序传递的参数中,首参数一般会被忽略,这个参数一般是程序文件名。这个我其实在之前使用脚本文件的时候测试到过类似的问题,但是这还是第一次看到明确的说明。
2. xv6中没有提供用户之间的隔离,从UNIX的角度来讲就是:所有的进程都是以root权限来执行的。
3. 文件、管道、设备文件等全都是字节流的形式。
4. 标准的输入、标准的输出以及错误输出都是特殊文件,其文件描述符分别是0、1、2。
1. 读文件操作一般有一个偏移的概念,类似C语言中的指针操作。
2. 如果一个文件的内容读不到了的时候返回0,代表读取结束。
3. 中间简单说明了一下cat功能的实现,这里借用了1个巧妙的约定,那就是0、1、2三个文件描述符的作用是特殊的,并且在进程之间也是可以遵循相同标准的。Cat仅仅是从标准输入读取,然后在标准输出输出。
1. 上面用代码描述的方式简述了cat < input.txt的实现,也用到了一些设计的技巧。比如说,先关闭标准输入再打开,确保数据流一定走这个文件描述符。
2. 中间的代码利用了wait来等待子进程先结束,保证了输出的顺序。而后面的设计,则是说明了文件描述符的复制功能。
1. pip提供了进程间通信的功能。
2. 在使用pip的时候,通过父子进程来实现一个通道的链接。而pip创建的文件描述符在父子进程间相同,如果就可以实现数据流的转换。在父子进程之间额外的关闭不用的文件描述符,可以理解为一种安全性考虑。而把数据流转入到标准输入输出,则是一个比较巧妙运用文件描述符规则的玩法。另外,子进程的写入描述符必须关也考虑到了另一点:不关的话,文件读不到结尾。
在不会用管道的时候,我经常用临时文件的方式来实现类似的功能。但是相比之下,管道有自己的优点:1,不像临时文件需要人工清除,管道是自动的;2,没有数据流大小的限制,但是临时文件受限于磁盘大小;3,允许并行;4,在阻塞设计上更有优势。
1. mknod可以创建设备文件,fstat可以提取文件的属性。
2. 文件属性中的inode是文件在底层的唯一识别身份,而nlink可以理解为这个文件有几个名字。
3. 一个文件可以有多个名字,感觉类似windows的快捷方式。但是,两者在删除的时候行为不同。删除掉所有的文件名在unix下会触发文件磁盘回收,但是在Widnows下,很显然的是快捷方式可以单独存在,只是文件无效了而已。
4. 可以借助于文件名全都没了之后文件自动回收的特性,创建完文件之后接着ulink,以此完成临时文件的自动删除。
1. cd命令的设计比较特殊,其实远离了用户代码一点,直接实现在了bash中。一定程度上来说,cd更加贴近于内核。
2. xv6并不完全兼容POSIX。
这样,第0章节就看完了,还是很有收获的。