操作系统基本概念

来源:互联网 发布:织梦系统被占用端口 编辑:程序博客网 时间:2024/05/13 22:28

一.进程的基本状态

     1.初始态

     2.就绪态

     3.执行态

     4.等待态

     5.终止

     相互转换关系如下:


二.线程和进程区别

        进程:是操作系统分配资源的最小单位

        线程:是调度的基本单元,共享所在进程的文件数据代码,有自己的栈和程序计数器

        一般对于许多相同或相似的任务,倾向于将他们设计为多线程模型。因为进程占用的资源较多限制并发量,并且的切换有上下

文的切换,所以较慢,而线程占用资源少的较快。

      

三.系统运行栈       

        一份主工作流程中经常包含很多分支流程,不仅主工作流程经常引用分支流程,分支流程之间也经常相互引用。当CPU遇到引用分支流程的情况,就会暂停本流程的执行,先跳转到被引用的分支流程,执行完那个分支流程之后,才回到之前的流程继续执行。那么,之前那个暂停的流程的当前工作状态存放在哪里呢?没错,就是我们前面讲过的运行栈。 

        CPU先把之前流程的当前工作状态存放到运行栈中,然后跳转到一个分支流程,开始执行。CPU在执行当前这个分支流程的过程中,也使用同一个运行栈来存放当前工作状态,而且是放在之前那个工作流程的工作状态的上面。当完成当前分支流程之后,CPU就会移走运行栈中当前分支流程的工作状态,这时候,上一个没完成的工作流程的工作状态就浮出水面,出现在运行栈的最顶层。CPU正好就接着上次未完成的工作状态继续进行。 
我们可以看到,运行栈这种“先进后出,后进先出”的特点,恰好就是“栈”这个数据结构的特点,因而得名“运行栈”。 
如果你有过调试程序的经验,幸运的话,你可能会遇到这样一个错误——Stack Overflow(栈溢出)。这里的Stack(栈),指的就是运行栈。 
关于“Stack”这个英文名词的译法,还有些说道。在一些技术书籍里,Stack被翻译成“堆栈”。这种译法还挺常见。但我认为,“堆栈”这种说法是不准确的。因为,“堆”和“栈”是两种不同的数据结构。 
        “堆”这种数据结构主要用于内存的分配、组织、管理,结构比“栈”结构复杂得多,本书不会展开详述,因为对于应用程序员来说,并不需要掌握“堆”这个结构的具体原理。不过,应用程序员还是应该掌握一些内存管理的基本概念。 
        我们可以把内存想象成一个巨大无比的木架,上面有无数的大小相同的格子。那些格子就是内存单元。如同信箱一样,每一个小格子(内存单元)都有自己的地址编号,叫做内存地址,由操作系统进程统一管理和编制。 
       小格子的数量就是内存容量。同样,操作系统进程所管理的虚拟内存容量并不一定和内存卡的物理内存容量一致。操作系统进程有可能在硬盘上开辟一块空间,作为虚拟内存的备用空间,当内存卡的物理内存容量不够时,就把内存中一些暂时不用的内容暂存道硬盘上,然后把需要的内容导入腾出的内存空间。这种技术叫做虚拟内存置换。 
        在“虚拟内存”这个巨大的木架上,每一个小格子的大小都是完全一致的,每个小格子都有自己唯一的内存地址。我们可以把各种数据存放到小格子里面。如果数据尺寸足够小的话,自然没问题。如果数据尺寸超过了小格子的大小怎么办?不用担心,相邻的小格子之间都是相通的,我们可以把大尺寸的数据放在相邻的多个小格子里面。 
        乍看起来,一个数据放在一个小格子里面和多个小格子里面,并没有太大的区别。但是,在某些情况下,却会产生微妙的差别,甚至会对我们的程序设计产生影响。 
        CPU工作的时候,经常需要把数据从内存这个大木架中取到自己的“寄存器”工作台上。当数据存放在一个小格子里面的时候,CPU只需要取一次就够了。这种操作叫做原子操作,即不会被打断的最小工作步骤。 
        在物理学中,原子,这个词的含义就是最本原的粒子,不可能再被分割。当然,后来物理学家又发现了更小的粒子。但原子这个词的本意却是不可分割的。原子操作也是这个意思,即不可分割的操作。 
当数据存放在多个小格子里面的时候,CPU有可能需要分几次从内存中取出数据,这样就分成了几个步骤,中间有可能被打断,在某些特殊的情况下,         可能发生不可预知的后果,这种操作就叫做非原子操作。 
        从程序设计的角度来讲,原子操作自然是比非原子操作安全的。因此,我们在设计程序时,脑子里应该有这个意识,尽量避免引起的非原子操作。这类非原子操作通常由长数据类型引起。至于数据类型是什么,什么又是“长”数据类型,非原子操作又可能产生怎么样的意外,后面会有专门的章节讲解这方面的内容,我们现在不必关心。 
从这里我们看出,操作系统的内存单元的尺寸对于原子操作的意义。内存单元越大,就能够容纳更大的数据,就越容易保证原子操作。 
我们常听到,32位操作系统或64位操作系统之类的说法。这里的32位或者64位的说法,指的就是CPU的工作台(寄存器)的位数。 
64位操作系统的内存单元32位操作系统大了一倍,那么,原子操作能够容纳的数据尺寸也大了一倍。这意味着,在取用某些“长”数据类型的时候,CPU按照64位操作系统的规则,只需要取一次,就可以把数据取到寄存器中。而CPU按照32位操作系统的规则,却分两次把数据取到寄存器中。因此,从处理长数据类型的速度上来说,64位操作系统是优于32位操作系统的。 
        内存单元是操作系统定义的,原子操作自然也是操作系统来保证的,同时也需要CPU的相应支持。至少,CPU的“寄存器”工作台尺寸不能小于内存单元,CPU才能一次就把一个内存单元中的数据取到寄存器中。现代的CPU已经进入多核时代,都已经支持64位宽度的内存单元,从而支持64位操作系统。