悟云

let it be

0%

打开文件的内核数据结构

两个独立进程各自打开同一个文件

内核使用3种数据结构表示打开文件,它们的关系决定了在文件共享方面一个进程对另一个进程的可能产生的影响。

进程表项

每个进程在进程表中都有一个记录项,记录项中包含一张打开的文件描述表,可将其视为一个矢量,每个描述符占用一项。与每个文件描述符关联的是:
a.文件描述符标志
b.指向一个文件表项的指针

文件表项

内核为所有打开文件维持一张文件表。每个文件表项包含:
a.文件状态标志(读、写、添写、同步和非阻塞等)
b.当前文件偏移量
c.指向该文件v节点表项的指针

v节点项

每个打开文件都有一个v节点结构。v节点包含了文件类型和对此文件进行各种操作函数的指针。

历史上,Unix系统使用过不同的时间值。
(1)日历时间。该值是自协调世界时1970年1月1日00:00:00这个特定时间以来所经过的秒数累计值。系统基本数据类型time_t用于保存这种时间值。
(2)进程时间。Unix系统为一个进程维护了3个进程时间值。
时钟时间:又称为墙上时钟时间,它是进程运行的时间总量。
用户cpu时间:执行用户指令所用的时间量。
系统cpu时间:为该进程执行内核程序所经历的时间。
要取得任一进程的时钟时间、用户时间和系统时间可通过执行命令time(1),其参数是要度量其执行时间的命令。例如:time ls

1
2
3
time ls
Desktop Documents Downloads Library Movies Music Pictures Public oh-my-zsh solarized workspace
ls -G 0.00s user 0.00s system 82% cpu 0.008 total

标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的可移植性。标准IO库处理很多细节。例如缓存分配,以优化长度执行IO等。标准的IO提供了三种类型的缓存。
(1)全缓存:当填满标准IO缓存后才进行实际的IO操作。
(2)行缓存:当输入或输出中遇到新行符时,标准IO库执行IO操作。
(3)不带缓存:stderr就是了。

文件I/O:文件I/O称之为不带缓存的IO(unbuffered I/O)。不带缓存指的是每个read,write都调用内核中的一个系统调用。也就是一般所说的低级I/O——操作系统提供的基本IO服务,与os绑定,特定于linix或unix平台。

之前在vps上面搭了一个博客,后面服务器到期了也没管。最近比较闲,重新搭建博客,这次懒得折腾了,直接挂在github上面算了,尽管有时候会被墙。
说来也巧,上次的博客最后一片博文是辞职的时候写的,这次亦然。
回顾第一次出来实习,那时跟打了鸡血似的,想到第二天就要开始上班彻夜难眠。如今几经波折,面试了十来家公司,待了四个公司。现实总是跟理想有出入,不过除了工作以外也遇到了一些有趣的·人,经历了一些有趣的事。
岂能尽如人意? 继续走,继续看,是结局也是开始。


从严格意义上来说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kernel),因为它相对较小,而且位于环境的核心。
内核的接口被称为系统调用(system call)。公用函数库构建在系统调用接口之上,应用程序既可使用公用函数库,也可使用系统调用。shell是一个特殊的应用程序,为运行其他程序提供了一个接口。
从广义上来说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特性。这里所说的其他软件包括实用程序、应用程序、shell以及公用函数库等。

这学期开学刚刚换了新工作之后,汤老师群里发来职位邀请。去了,不合适,走了。
今天办理完最后的离职手续,回想这份工作经历,除了工作内容不符合我的职业规划之外其他什么都好。在公司呆这么久,都是干一些打杂的内容,诸如写写脚本、购买服务器之类的。
辞职之后回到母校,刚开始觉得挺轻松的,终于不用早九晚九的上班了。然而,自从今年三月份出来实习之后,再也回不到那种无忧无虑打游戏的日子了。
仔细想想,还是好好提升下自己的技术。从明天开始,还是去图书馆打磨下自己的技术吧。
这条路早已没有回头路。