网站建设价格情况,企业推广网,网页制作图片大小代码,网站建设 国外Unix/Linux的体系架构 如上图所示#xff0c;从宏观上来看#xff0c;Linux操作系统的体系架构分为用户态和内核态#xff08;或者用户空间和内核#xff09;。内核从本质上看是一种软件——控制计算机的硬件资源#xff0c;并提供上层应用程序运行的环境。用户态即上层应… Unix/Linux的体系架构 如上图所示从宏观上来看Linux操作系统的体系架构分为用户态和内核态或者用户空间和内核。内核从本质上看是一种软件——控制计算机的硬件资源并提供上层应用程序运行的环境。用户态即上层应用程序的活动空间应用程序的执行必须依托于内核提供的资源包括CPU资源、存储资源、I/O资源等。为了使上层应用能够访问到这些资源内核必须为上层应用提供访问的接口即系统调用。 系统调用是操作系统的最小功能单位这些系统调用根据不同的应用场景可以进行扩展和裁剪现在各种版本的Unix实现都提供了不同数量的系统调用如Linux的不同版本提供了240-260个系统调用FreeBSD大约提供了320个referenceUNIX环境高级编程。我们可以把系统调用看成是一种不能再化简的操作类似于原子操作但是不同概念有人把它比作一个汉字的一个“笔画”而一个“汉字”就代表一个上层应用我觉得这个比喻非常贴切。因此有时候如果要实现一个完整的汉字给某个变量分配内存空间就必须调用很多的系统调用。如果从实现者程序员的角度来看这势必会加重程序员的负担良好的程序设计方法是重视上层的业务逻辑操作而尽可能避免底层复杂的实现细节。库函数正是为了将程序员从复杂的细节中解脱出来而提出的一种有效方法。它实现对系统调用的封装将简单的业务逻辑接口呈现给用户方便用户调用从这个角度上看库函数就像是组成汉字的“偏旁”。这样的一种组成方式极大增强了程序设计的灵活性对于简单的操作我们可以直接调用系统调用来访问资源如“人”对于复杂操作我们借助于库函数来实现如“仁”。显然这样的库函数依据不同的标准也可以有不同的实现版本如ISO C 标准库POSIX标准库等。 Shell是一个特殊的应用程序俗称命令行本质上是一个命令解释器它下通系统调用上通各种应用通常充当着一种“胶水”的角色来连接各个小功能程序让不同程序能够以一个清晰的接口协同工作从而增强各个程序的功能。同时Shell是可编程的它可以执行符合Shell语法的文本这样的文本称为Shell脚本通常短短的几行Shell脚本就可以实现一个非常大的功能原因就是这些Shell语句通常都对系统调用做了一层封装。为了方便用户和系统交互一般一个Shell对应一个终端终端是一个硬件设备呈现给用户的是一个图形化窗口。我们可以通过这个窗口输入或者输出文本。这个文本直接传递给shell进行分析解释然后执行。 总结一下用户态的应用程序可以通过三种方式来访问内核态的资源 1系统调用 2库函数 3Shell脚本 下图是对上图的一个细分结构从这个图上可以更进一步对内核所做的事有一个“全景式”的印象。主要表现为向下控制硬件资源向内管理操作系统资源包括进程的调度和管理、内存的管理、文件系统的管理、设备驱动程序的管理以及网络资源的管理向上则向应用程序提供系统调用的接口。从整体上来看整个操作系统分为两层用户态和内核态这种分层的架构极大地提高了资源管理的可扩展性和灵活性而且方便用户对资源的调用和集中式的管理带来一定的安全性。 二、用户态和内核态的切换 因为操作系统的资源是有限的如果访问资源的操作过多必然会消耗过多的资源而且如果不对这些操作加以区分很可能造成资源访问的冲突。所以为了减少有限资源的访问和使用冲突Unix/Linux的设计哲学之一就是对不同的操作赋予不同的执行等级就是所谓特权的概念。简单说就是有多大能力做多大的事与系统相关的一些特别关键的操作必须由最高特权的程序来完成。Intel的X86架构的CPU提供了0到3四个特权级数字越小特权越高Linux操作系统中主要采用了0和3两个特权级分别对应的就是内核态和用户态。运行于用户态的进程可以执行的操作和访问的资源都会受到极大的限制而运行在内核态的进程则可以执行任何操作并且在资源的使用上没有限制。很多程序开始时运行于用户态但在执行的过程中一些操作需要在内核权限下才能执行这就涉及到一个从用户态切换到内核态的过程。比如C函数库中的内存分配函数malloc()它具体是使用sbrk()系统调用来分配内存当malloc调用sbrk()的时候就涉及一次从用户态到内核态的切换类似的函数还有printf()调用的是wirte()系统调用来输出字符串等等。 到底在什么情况下会发生从用户态到内核态的切换一般存在以下三种情况 1当然就是系统调用原因如上的分析。 2异常事件 当CPU正在执行运行在用户态的程序时突然发生某些预先不可知的异常事件这个时候就会触发从当前用户态执行的进程转向内核态执行相关的异常事件典型的如缺页异常。 3外围设备的中断当外围设备完成用户的请求操作后会像CPU发出中断信号此时CPU就会暂停执行下一条即将要执行的指令转而去执行中断信号对应的处理程序如果先前执行的指令是在用户态下则自然就发生从用户态到内核态的转换。 注意系统调用的本质其实也是中断相对于外围设备的硬中断这种中断称为软中断这是操作系统为用户特别开放的一种中断如Linux int 80h中断。所以从触发方式和效果上来看这三种切换方式是完全一样的都相当于是执行了一个中断响应的过程。但是从触发的对象来看系统调用是进程主动请求切换的而异常和硬中断则是被动的。 三、总结 本文仅是从宏观的角度去理解Linux用户态和内核态的设计并没有去深究它们的具体实现方式。从实现上来看必须要考虑到的一点我想就是性能问题因为用户态和内核态之间的切换也会消耗大量资源。