Linux中的操作系统,重点在于管理计算机的所有活动以及驱动系统中的所有硬件
应用程序二进制接口 描述了应用程序和操作系统之间,一个应用和它的库之间,或者应用的组成部分之间的低接口。
应用程序编程接口 是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
用户程序的运行空间,只能执行简单的运算,不能直接调用系统资源,必须通过系统调用(system call),才能向内核发出指令
Linux内核的运行空间,可以执行任意命令,调用系统的一切资源。
运行在用户空间的应用程序向操作系统内核请求某些服务的调用过程。 系统调用提供了用户程序与操作系统之间的接口。一般来说,系统调用都在内核态执行。由于系统调用不考虑平台差异性,由内核直接提供,因而移植性较差(几乎无移植性)。
指CPU从一个进程或线程切换到另一个进程或线程。会牺牲CPU效率
是由用户或组织自己开发的,具有一定功能的函数集合,一般具有较好平台移植性,通过库文件(静态库或动态库)向程序员提供功能性调用。程序员无需关心平台差异,由库来屏蔽平台差异性。
函数库调用 | 系统调用 |
---|---|
在所有的ANSI C编译器版本中,C库函数是相同的。平台移植性好 | 各个操作系统的系统调用是不同的。依赖于内核,不保证移植性 |
它调用函数库中的一段程序(或函数) | 它调用系统内核的服务 |
与用户程序相联系 | 是操作系统的一个入口点 |
在用户地址空间执行 | 在内核地址空间执行 |
它的运行时间属于“用户时间” | 它的运行时间属于“系统时间” |
属于过程调用,调用开销较小 | 需要在用户空间和内核上下文环境间切换,开销较大 |
在C函数库libc中有大约300个函数 | 在UNIX中大约有90个系统调用 |
典型的C函数库调用:system fprintf malloc | 典型的系统调用:chdir fork write brk; |
str = “July” //用户空间
x = x+100 //用户空间
file.write(str) //切换到内核空间
y = x+200 //切换回用户空间
第一行和第二行都是简单的赋值运算,在用户空间执行。第三行需要写入文件,就要切换到内核空间,因为用户不能直接写入文件,必须通过内核安排。第四行又是赋值运算,就切换回用户空间。
原文地址:http://blog.51cto.com/13802727/2128681