c++的kinect的获取分布式系统 全局唯一IDID程序,求高手改成用C#写

深度介绍Linux操作系统内核的工作原悝

牛津字典中对"kernel"一词的定义是:"较软的、通常是一个坚果可食用的部分"当然还有第二种定义:"某个东西核心或者最重要的部分。"对Linux来说它的Kernel无疑属于第二种解释。让我们来看看这个重要的东西是如何工作的先从一点理论说起。

广义地来说kernel就是一个软件它在硬件和运荇在计算机上的应用程序之间提供了一个层。严格点从计算机科学的角度来说Linux中的Kernel指的是Linus Torvalds在90年代初期写的那点代码。

所有的你在Linux各版本Φ看到的其他东西--Bash shell、KDE窗口管理器、web浏览器、X服务器、Tux Racer以及所有的其他都不过是运行在Linux上的应用而已,而不是操作系统自身的一部分为叻给大家一个更加直观的感觉,我来举个例子比如RHEL5的安装大概要占据2.5GB的硬盘空间(具体多大当然视你的选择安装来定),在这其中kernel以忣它的各个模块组件,只有47MB所占比例约为2%。

那么kernel到底是如何工作的呢?如下面的图表Kernel通过许多的进入端口也就是我们从技术角度所说的系统调用,来使得运行在它上面的应用程序可用Kernel使用的系统调用比如"读"和"写"来提供你硬件的抽象(abstraction)。

从程序员的视角来看这些看起來只是普通的功能调用,然而实际上系统调用在处理器的操作模式上从用户空间到Kernel空间有一个明显的切换。同时系统调用提供了一个"Linux虛拟机",可以被认为是对硬件的抽象

Kernel提供的更明显的抽象之一是文件系统。举例来说这里有一段短的程序是用C写的,它打开了一个文件并将内容拷贝到标准的输出:

在这里你可以看到四个系统调用的例子:打开、读、写和关闭。不谈这段程序语法的细节重点是:通過这些系统调用Linux Kernel提供了一个文件的"错觉",而实际上它不过是一堆数据有了个名字这样一来你就不必去与硬件底层的堆栈、分区、头和指針、分区等交涉了,而是直接以例子中的方式与硬件"交流"这也就是我们所说的抽象(abstraction),将底层的东西以更易懂的方式表达出来

系统攵件是Kernel提供的较为明显的一种抽象。还有一些特性不是这么的明显比如进程调度。任何一个时间都可能有好几个进程或者程序等待着運行。Kernel的时间调度给每个进程分配CPU时间所以就一段时间内来说,我们会有种错觉:电脑同一时间运行好几个程序这是另外一个C程序:

茬这个程序中创建了一个新进程,而原来的进程(父进程)和新进程(子进程)都编写了标准输出然后结束注意系统调用fork(), exit() 以及 wait()执行程序嘚创建、结束和各自同步。这是进程管理和调度中最典型的简单调用

Kernel还有一个更加不易见到的功能,连程序员都不易察觉那就是存储管理。每个程序运行得都好像它有个自己的地址空间来调用一样实际上它跟其他进程一样共享计算机的物理存储,如果系统运行的存储過低它的地址空间甚至会被磁盘的交互区暂时寄用。存储管理的另外一个方面是防止一个进程访问其他进程的地址空间--对于多进程操作系统来说这是很必要的一个防范措施

Kernel同样还配置网络链接协议比如IP、TCP和UDP等,它们在网络上提供机器对机器(machine-to-machine)和进程对进程(process-to-process)的通信这里又会造成一种假象,即TCP在两个进程之间提供了一个固定连接--就好像连接两个电话的铜线一样实际中却并没有固定的连接,特殊的引用协议比如FTP、DNS和HTTP是通过用户级程序来实施的而并非Kernel的一部分。

Linux(像之前的Unix)在安全方面口碑很好这是因为Kernel跟踪记录了每个运行进程嘚user ID和group ID,每次当一个应用企图访问资源(比如打开一个文件来写入)的时候Kernel就会核对文件上的访问许可然后做出允许/禁止的命令。这种访問控制模式最终对整个Linux系统的安全作用很大

Kernel还提供了一大套模块的集合,其功能包括如何处理与硬件设备交流的诸多细节、如何从磁盘讀取一个分区、如果从网络接口卡获取数据包等有时我们称这些为设备驱动。

现在我们队Kernel是做什么的已经有了一些了解让我们再来简單看下它的物理组成。早期版本的Linux Kernel是整体式的也就是说所有的部件都静态地连接成一个(很大的)执行文件。

相比较而言现在的Linux Kernel是模塊化的:许多功能包含在模块内,然后动态地载入kernel中这使得kernel的内核很小,而且在运行kernel时可以不必reboot就能载入和替代模块

大部分情况下,Linux管理它的模块不需要你的帮忙但是如果必要的时候有命令行可以来手动检查和管理模块。比如为了查清楚当前到底哪个模块在载入kernel。這里有一个输出的例子:

输出的内容包括:模块的名字、大小、使用次数和依赖于它的模块列表使用次数对防止卸载当前活跃的模块非瑺总要。Linux只允许使用次数为零的模块被移除

你可以使用modprobe来手动加载和卸载模块,(还有两个命令行叫做insmod和rmmod但modprobe更易于使用因为它自动移除了模块依赖)。比如lsmod的输出在我们的电脑上显示了一个名叫isofs的卸载模块它的使用次数是零而且没有依赖模块,(isofs是一个模块它支持CD仩使用的ISO系统文件格式)这种情况下,kernel会允许我们卸载模块:

现在isofs不再显示在Ismod的输出中,kernel由此节省了36,284字节的存储如果你放入CD并且让它洎动安装,kernel将自动重新载入isofs模块而且isofs的使用次数增加到1次。如果这时候你还试图移除模块就不会成功了因为它正在被使用:

Lsmod只是列出叻当前被载入的模块,modprobe则将列出所有可用的模块它实际上输出了/lib/modules/KERNELVERSION目录下所有的模块,名单会很长!

实际上使用modprobe来手动加载一个模块并鈈常见,但确实可以通过modprobe命令行来对模块设置参数例如:

那么如何知道一个模块会接受什么参数呢?一个比较好的方法是使用modinfo命令它列出了关于模块的种种信息。这里有一个关于模块snd-hda-intel的例子

对我们来说比较有兴趣的以"parm"开头的那些部分:显示了模块所接受的参数这些描述都比较简明,如果想要更多的信息那就安装kernel的源代码,在类似于/usr/src/KERNELVERSION/Documentation的目录下你会找到

前几天在Ubuntu论坛有一个例子,说的是如何将参数传遞到一个模块(详见)实际上问题的关键是snd-hda-intel参数在正确驱动声音硬件时需要一点操作,而且在boot time加载时会中止解决方法的一部分是将probe_mask=1选項赋给模块,如果你是手动加载模块你需要输入:

Linux kernel同样通过/proc系统文件来展示了许多细节。为了说明/proc我们首先需要扩展我们对于文件的悝解。除了认为文件就是存储在硬盘或者CD或者存储空间上的持久信息之外我们还应当把它理解为任何可以通过传统系统调用如:打开、讀、写、关闭等访问的信息,当然它也可以被常见的程序访问

/proc之下的"文件"完全是kernel虚拟的一个部分,给我们一个视角可以看到kernel内部的数据結构实际上,许多Linux的报告工具均能够很好地呈现在/proc下的文件中寻到的格式化版本的信息比如,一列/proc/modules将展示一列当前加载的模块

同样嘚,/proc/meminfo提供了关于虚拟存储系统当前状态的更多细节信息而类如vmstat的工具则是以一种更加可理解的方式提供了相同的一些信息;/proc/net/arp显示了系统ARP cache嘚当前内容,从命令行来说arp -a显示的也是相同的信息。

尤其有意思的是/proc/sys下的"文件"/proc/sys/net/ipv4/ip_forward下的设置告诉我们kernel是否将转发IP数据包,也就是说是否扮演网关的作用现在,kernel告诉我们这是关闭的:

当你发现你可以对这些文件写入的时候你会觉得更加有意思。继续举例来说:

除了使用cat和echo來检查和更正/proc/sys下的设置以外你也可以使用sysctl命令:

需要注意的是,以这种方式你所做的设置改变只能影响当前运行的kernel的当reboot的时候就不再囿效。如果想让设置永久有效将它们放置在/etc/sysctl.conf文件中。在boot time时sysctl将自动重新确定它在此文件下找到的任何设置。

有这样一个说法:/proc/sys下可写入嘚参数孕育了整个Linux性能调优的亚文化我个人觉得这种说法有点过夸,但这里会有几个你确实很想一试的例子:Oracle 10g的安装说明()要求你设置一组参数包括:kernel.shmmax= 这将公用存储器的大小设置为2GB。(公用存储器是处理期内的通信机制允许存储单元在多个进程的地址空间内同时可鼡)

IBM 'Redpaper'在Linux性能和调优方面的说明()在调教/proc/sys下的参数方面给出了不少建议,包括:vm.swappiness=100 这个参数控制着存储页如何被交换到磁盘

那么有没有一個说明能涵盖这所有的参数?好吧这有一行命令:# sysctl -a 它将展示所有的参数名字和当前值。列表很长但是你无法知道这些参数是做什么的。另外比较有用的参考是Red Hat Enterprise Linux Reference Guide对此有整章节的描述,你可以从上下载
本篇文章来源于:开发学院    原文链接:

}

我要回帖

更多关于 分布式系统 全局唯一ID 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信