操作系统中的几个重要概念

先看一个完整的场景,以下的场景和解释主要解释大致的原理。


Linux
在操作系统运行中运行一个程序,首先,系统会先起一个进程,此时进程会首先处在用户态,运行自己的代码,然后随着程序的不断执行,到了需要通过系统调用使用操作系统内核的阶段,此时进程就要进入内核态。此时有个最主要的事情要做,就是从用户态向内核态传送数据(进程上下文)。然后执行完内核程序,又回到用户态。如果执行完毕,进程进入睡眠状态。
里面涉及几个重要的概念
1、进程:执行一段代码,管理资源,但是线程的话,只是执行代码,不会管理资源。
2、用户态:进程执行用户自己编写的代码时,称为处于用户(运行)态。
3、内核态:当一个进程执行系统调用时,会进入内核代码运行,此时称进程处于内核(运行)态。
4、进程上下文:包含了一系列的进程用到的参数、数据和环境变量(包括了硬件和软件的)。

扩展:
内核空间(栈)和用户空间(栈)
这两种空间在Linux的虚拟空间中,对于32位Linux其寻址能力为(0×00000000~0xFFFFFFFF)其实就是4G的空间。这个大小也决定了32位Linux支持的内存大小,对于64位能支持的内存就大多了(可以自己算)。这里我们假定内存为4G,Linux中会把高位的1G(0xC0000000~0xFFFFFFFF)作为内核空间(栈),余下的3G作为用户空间栈。这里在操作系统的角度看,每个进程都共用了这4G的内存,大家共享资源。对于进程来说,他们看起来是每个都有一个4G的虚拟空间。这里说虚拟空间,是指,实际上是没有这么多的,因为是共享的。所以在使用很多Service程序时,在意其用户态和内核态的资源使用情况也是很重要的。因为过高的话,会影响其他的程序运行,并且这两个态会有短板效应,要兼顾。

地址
逻辑地址 —-(段表)—> 线性地址 — (页表)—> 物理地址
            启用分段时               启用分页时

注意:Linux在2.6时,实现了真正意义上的线程,但针对PHP来说,并没有办法使用线程。这边,为了利于PHP理解,就没有体现线程。


Windows
在操作系统运行中运行一个程序,首先,系统会先起一个进程,此时进程会创建一个主线程,主线程开始执行程序,根据程序的代码,会决定是否创建其他的辅助线程。首先进程处在用户态,然后随着程序的不断执行,到了需要通过系统调用使用内核程序的阶段,同时还会用户态会向内核态传递数据(进程上下文),此时进程就处在内核态。然后执行完内核程序,又回到用户态。如果执行完毕,进程进入睡眠状态。
里面涉及几个重要的概念
1、进程:进行资源管理,创建线程。
2、线程:执行代码片断。
3、用户态:进程执行用户自己编写的代码时,称为处于用户(运行)态。
4、内核态:当一个进程执行系统调用时,会进入内核代码运行,此时称进程处于内核(运行)态。
5、进程上下文:包含了一系列的进程用到的参数、数据和环境变量(包括了硬件和软件的)。

这里有一幅不错的图,用来说明windows的用户态和内核态的结构


内核态和用户态的产生原因
为了更好的进行安全分离,特地划分出了两个层次。
内核态顾名思义是内核的状态,他拥有很大的访问权限,可以修改很多用户态不能修改的东西。也因为对使用内核态的代码(作为系统调用),有着很高的安全性和可靠性要求,因为权限太大,改一些地方不对就完蛋了。用户态,就没有内核态这么大的安全性和可靠性要求,但是相应的权限也小了很多。所以一般情况下,能在用户态执行的就别放到内核态。一般内核态出错时操作系统崩溃,用户态出错只是程序崩溃。所以,系统调用可不是随随便便写的。





 » 订阅本站:RSS订阅

发表评论

您也可以使用微博账号登陆

无觅相关文章插件,快速提升流量