操作系统:用户编程接口(概念)

来源:互联网 发布:win10网络重置后怎么办 编辑:程序博客网 时间:2024/04/28 23:22

对于计算机系统而言,操作系统充当着基石的作用,它是连接计算机底层硬件与上层应用软件的桥梁,控制其他程序的运行,并且管理系统相关资源,同时提供配套的系统软件支持。对于专业的程序员而言,掌握一定的操作系统知识比不可少,因为不管面对的是底层嵌入式开发,还是上层的云计算开发,都需要使用到一定的操作系统相关知识。


  • 库函数与系统调用有什么不同
  • 静态链接与动态链接有什么区别
  • 静态链接库与动态链接库有什么区别
  • 用户态和核心态有什么区别
  • 用户栈和内核栈有什么区别

库函数与系统调用有什么不同

库函数调用是语言或应用程序额一部分,它是高层的,完全运行在用户空间,为程序员提供调用真正的在幕后完成实际事务的系统调用接口,属于系统的一部分。函数库调用是语言或应用程序的一部分,而系统调用是操作系统的一部分。 
这里写图片描述

库函数调用通常比行内展开的代码慢,因为它需要付出函数调用的开销。但系统调用比库函数调用还要慢很多,因为它需要把上下文环境切换到内核模式。。

静态链接与动态链接有什么区别

静态链接是指把调用的函数或者过程直接链接到可执行文件中,称为可执行文件的一部分。换句话说,函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。静态链接的缺点是当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了内存资源。

动态链接是相对于静态链接而言的,动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在操作系统的管理下,才在应用程序与响应的动态链接库(dynamic link library,dll)之间建立链接关系。当要执行所调用dll中的函数时,根据链接产生的重定位信息,操作系统才转去执行dll中相应的函数代码。

静态链接的执行程序能够在其他同类操作系统的机器上直接运行。例如,一个exe文件是在windows2000系统上静态链接的,那么将该文件直接拷贝到另一台windows2000的机器上,是可以运行额。而动态链接的执行程序则不可以,除非把该exe文件所需的dll文件都一并拷贝过去,或者对方机器上也有所需的相同版本的dll文件,否则是不能保证正常运行的。。。

静态链接库与动态链接库有什么区别

静态链接库就是使用的.lib文件,库中的代码最后需要链接到可执行文件中去,所以静态链接的可执行文件一般比较大一些。

动态链接库是一个包含可由多个程序同时使用的代码和数据的库,它包含函数的数据的模块集合。程序文件(如.exe文件或.dll文件)在运行时加载这些木块(也即所需的模块映射到调用进程的地址空间)。

静态链接库和动态链接库的相同点是它们都实现了代码的共享。不同点是静态链接库lib中的代码被包含在调用的exe文件中,该lib中不能再包含其他动态链接库或者静态链接库了。而动态链接库dll可以被调用的exe动态地“引用”和“卸载”,该dll中可以包含其他动态链接库或者静态链接库。

用户态和核心态有什么区别

核心态与用户态是操作系统的两种运行级别,它用于区分不同程序的不同权利。核心态就是拥有资源多的状态,或者说访问资源多的状态,也称之为特权态。相对来说,用户态就是非特权态,在此中状态下访问的资源将受到限制。如果一个程序运行在特权态,则该程序就可以访问计算机的任何资源,即它的资源访问权限不受限制。如果一个程序运行在用户态,则其资源需求将受到各种限制。例如,如果要访问操作系统的内核数据结构,如进程表,则需要在特权态下才能办到。如果要访问用户程序里的数据,则在用户态下就可以了。。

用户栈和内核栈有什么区别

内核在创建进程的时候,在创建task_struct的同时,会为进程创建相应的堆栈。每个进程会有两个栈,一个用户栈,存在于用户空间;一个内核栈,存在于内核空间。当进程在用户空间运行时,CPU堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈;当进程在内核空间时,CPU堆栈指针寄存器里面的内容是内核栈空间地址,使用内核栈。

当进程因为中断或者系统调用而陷入内核态时,进程所使用的堆栈也要从用户栈转到内核栈。进程陷入内核态后,先把用户态堆栈的地址保存在内核栈中,然后设置堆栈指针寄存器的内容为内核栈的地址,这样就完成了用户栈向内核栈的转换;当进程从内核态恢复到用户态之后时,在内核态之后的最后将保存在内核栈里面的用户栈额地址恢复到堆栈指针寄存器即可。这样就实现了内核栈和用户栈的互转。

那么,知道从内核转到用户态时用户栈的地址是陷入内核的时候保存在内核栈里面的,但是在陷入内核的时候,如何知道内核栈的地址?关键在进程从用户态转到内核态的时候,进程的内核栈总是空的。这是因为当进程在用户态运行时,使用的是用户栈,当进程陷入到内核态时,内核栈保存进程在内核态运行的相关信息,但是一旦进程返回到用户态后,内核栈中保存的信息无效,会全部恢复,因此每次进程从用户态陷入内核的时候得到的内核栈都是空的,所以在进程陷入内核的时候,直接把内核栈的栈顶地址给堆栈指针寄存器就可以了。

原创粉丝点击