发明内容
本发明的目的在于提供一种面向构件基于系统内核的进程/线程池管理及应用程序对象获得与执行的方法,能够实现进行快速地、安全地创建/运行/退出进程/线程,提高系统时间的利用率和网络服务的安全性。
本发明的另一目的在于提供一种面向构件基于系统内核的进程/线程池管理及应用程序对象获得与执行的方法,大大缩减创建/退出进程/线程的时间,减少占用的系统时间,提高运行效率。
本发明的目的还在于提供一种面向构件基于系统内核的进程/线程池管理及应用程序对象获得与执行的方法,它针对“进程对象/线程对象”的运行管理,严格区别于原有操作系统“进程/线程”的概念,前者是静态组件的概念,后者是运行程序的概念;利用池的缓存特点,在进程/线程虽已停止运行,但还没有释放其对象之前,可以访问进程对象/线程对象的属性。
本发明通过如下技术方案实现上述目的:一种面向构件基于系统内核的进程池/线程池管理方法,包括:
在计算机操作系统内核设置线程池管理组件,用于管理系统线程池中存放的构件化线程对象,管理包括对线程对象需要运行的环境进行配置;每个线程在面向构件的环境中运行的是一个工作例程对象;
在计算机操作系统内核中还有进程池管理组件,用于管理系统进程池中存放的进程对象,对进程对象需要运行的环境进行配置;
进程池管理组件管理进程需要的全部资源,创建进程,并记录各个进程的属性;在进程退出时,进行所用资源的回收,对于每一个进程对象,线程池管理组件负责创建线程对象,管理隶属于该进程的各个线程的资源利用情况,并记录各个线程对象的属性,在线程执行完成时,线程池管理组件负责资源的清理工作;
进程池或线程池管理组件至少包括分配、释放两个成员方法,系统通过相应的操作实现创建/退出进程/线程。
本发明还提供了一种基于构件进程/线程池模式管理应用程序对象获得与执行的方法,其特征在于:它包括应用程序的主进程或主线程创建新进程或线程的请求,调用系统的API或接口函数,获取当前系统对象的接口智能指针,通过该接口智能指针,调用相应接口方法,得到一实例化的对象,并返回其接口智能指针,进行参数设置,调用新创建对象的启动方法运行程序,调用其结束方法停止运行,但保留其对象,调用其释放资源方法则真正释放其对象,结束此子进程或子线程,主进程或主线程继续运行。
综上所述,本发明提供了一种在操作系统内核中实现进程池与线程池管理功能的计算机技术,能够实现快速地、安全地创建/运行/退出进程/线程,提高系统时间的利用率。
本发明提出的进程池与线程池管理技术,均在面向构件的编程环境中进行了实现。系统自动实现了对标准接口类的封装,屏蔽了调用COM构件对象过程的繁琐细节,简化了进行本地/远程创建/访问/退出进程/线程的用户编程,具有构件升级的独立性、本地/远程透明性、编程语言无关性。
具体实施方式
下面结合附图和具体实施例对本发明的技术方案与有益效果做进一步地说明。
本发明利用进程池与线程池的概念,改变用户程序原有的主导地位。由系统提供进程池这样的一个管理组件,用它来管理进程需要的全部资源,并记录各个进程的属性,在进程退出时,进行所用资源的回收。对于每一个进程对象,系统提供一个线程池管理组件,由它来管理隶属于该进程的各个线程的资源利用情况,并记录各个线程对象的属性,在线程执行完成时,线程池负责资源的清理工作。系统的进程池与线程池的管理功能的程序代码都在操作系统的内核中实现,这就大大增加了不法分子破解系统程序和密钥以便盗取网络数据的难度。在本地/远程进行线程的创建/访问/退出时,把提出的“工作例程”概念应用在面向构件的编程环境中进行实现,从而提高网络计算机的安全性,完善其计算模型。进程池管理组件/线程池管理组件自身是构件化的系统组件。
具体地,进程池管理组件和线程池管理组件是整个操作系统的基础性管理组件,与一般的系统组件和应用程序相比,具有一定的管理功能。进程池管理组件在操作系统内核初始化阶段被构造,在整个操作系统启动之后,系统已经拥有一个进程池管理组件实例。在这个进程池管理组件实例中,已经预先创建了一定个数的进程对象,并且对这些它们需要运行的环境进行了缺省方式的配置,主要包括申请一段地址空间,创建内存堆和开辟共享代码模块,同时对池中进程对象的基本属性进行了缺省的设置,如进程的调度优先级。这里的“个数”可以通过更改头文件或配置文件来静态设置,或调用系统函数来进行动态设置,在程序设计中称之为“进程池的容量”。进程池管理组件至少有分配与释放两个成员方法,以及池的容量与实际使用个数两个成员变量,在下面的叙述中将阐述。
进程池管理组件对池中对象的管理通过维护一个队列来实现,进程对象是队列的组成成员。当用户需要创建一个进程时,在本发明中提供了两种方式,一种是调用系统API函数(ZeeCreateProcess()),另一种则是通过当前系统对象的接口方法(ISystem∷CreateProcess())来创建。当用户程序执行到创建进程的函数/方法时,系统并不是直接去创建一个进程对象,而是通过进程池管理组件的分配方法来动态分配出一个可用的进程对象实例。这里的分配方法的实现方式是:首先检查进程池这个池中是否存在已经初始化但还没有真正使用的进程对象,如果有(当前池中已经分配的进程对象实例个数<池中的最大进程实例个数,即实际使用个数<池的容量),则不需要耗费时间去创建与初始化一个全新的进程对象实例,而是直接把进程池的一个进程对象分配給用户进程,并设置该进程对象的“是否来源于进程池的进程”(IsProcessPoolProcess)属性为TRUE,同时对实际使用个数变量执行加1操作,返回其接口智能指针。如果池中已经分配完毕预先创建好的进程对象,则此时分配方法转而去创建一个全新的进程对象实例,并把此进程对象的“是否来源于进程池的进程”(IsProcessPoolProcess)属性设置为FALSE,而实际使用个数与池的容量值均不变,且二者相等。在本发明中默认的容量值为15,在本说明书以下的叙述及其附图中,如无特别声明,创建的进程默认为均来自于进程池。当然,用户程序也可以先取得实际使用个数与池的容量值,根据需要可以重新设置池的容量值,以便决定创建的新的进程对象是否来源于进程池中。
利用上面的方法,在创建一个新的进程之后,用户程序可以得到一个指向某个进程对象实例的接口智能指针,此时已经有了一个干净的可运行进程的环境,然而此时的进程并没有真正开始运行,要真正运行进程,则需要利用这个接口智能指针来调用进程对象的启动方法,在具体实施例中将有阐述。
基于上述的思想与技术实现,解决了在目前公知的计算机操作系统中创建进程需要花费较长时间的问题,为什么呢?因为系统一开始就在进程池中创建了一定数量的进程对象实例,并初始化了相关环境,因此在用户程序调用创建进程(ISystem∷CreateProcess())的方法时就直接可以拿来用,而这里“拿来”的实质仅仅是一个指针的赋值与传出。在用户调用启动方法时,程序才开始真正运行,系统可以充分利用创建进程与运行进程这段间隔时间来处理别的任务,用户也可以在真正运行程序之前利用所得到的接口智能指针,根据需要进行运行环境的自定义,包括命令行参数、环境变量、私有密钥的设置。从而提高了系统的运行效率,同时满足用户对系统与进程运行的安全管理。
当用户需要停止进程运行时,则需要调用其接口智能指针的停止运行函数方法,此时系统仅仅停止了进程的运行,并没有立即释放进程对象的资源,用户仍可以访问其属性;要真正退出进程并交出所占资源,则调用结束对象函数方法,此时,系统将调用进程管理组件的释放方法来清理这个进程环境,释放相应的资源。释放方法首先判断当前池中拥有的进程对象的个数,如果实际使用个数=0,则需要释放整个进程对象所占用的系统资源,否则,不必花时间去释放整个进程对象,而是按默认方式清理一些环境参数,然后放入进程池中,并执行实际使用个数减1操作,以便以后再次使用这个相同的进程对象的环境来执行别的应用程序,这就节省了因反复创建/退出进程所占用的系统时间。
线程池管理组件的设计与实现思想与进程池是一致的。其关键不同之处在于:进程池是隶属于系统的,整个系统可以就是一个进程池管理组件,而线程池是隶属于进程的,对于每个具体的进程对象,均有一个且只有一个线程池管理组件。线程池管理组件在创建某个进程对象时被同时创建,它拥有池缓存的特点,管理着一个的线程对象缓存队列,负责对该进程对象之内的各个线程对象的资源与运行状态的管理。在这个线程池管理组件中,已经预先创建了一定个数的线程对象,并且对这些它们需要运行的环境进行了缺省方式的配置,主要包括创建一个栈、一个含上下文的控制块、分配其在进程中的地址空间与代码模块,同时对池中线程对象的基本属性进行了缺省的设置,如线程的调度优先级。这里的“个数”可以通过更改头文件或配置文件来静态设置,或调用系统函数来进行动态设置,在程序设计中称之为“线程池的容量”。与进程池管理组件类似,线程池管理组件至少也有分配与释放两个成员方法,以及池的容量与实际使用个数两个成员变量,在下面的叙述中将阐述。
线程池管理组件对池中对象的管理通过维护一个队列来实现,线程对象是队列的组成成员。当用户需要创建一个线程时,在本发明中提供了两种方式,一种是调用系统API函数(ZeeCreateThread()),另一种则是通过当前进程对象的接口方法(IProcess->CreateThread())来创建。当用户程序执行到创建线程的函数/方法时,系统并不是直接去创建一个线程对象,而是通过线程池管理组件的分配方法来动态分配出一个可用的线程对象实例。这里的分配方法的实现方式是:首先检查线程池中是否存在已经初始化但还没有真正使用的线程对象实例,如果有(当前池中已经分配的线程对象实例个数<池中的最大线程实例个数,即实际使用个数<池的容量),则不需要耗费时间去创建与初始化一个全新的线程对象实例,而是直接把线程池的一个线程对象实例分配給用户线程,并设置该线程对象的“是否来源于线程池的线程”(IsThreadPoolThread)属性为TRUE,同时对实际使用个数变量执行加1操作,返回其接口智能指针。如果池中已经分配完毕预先创建好的线程对象实例,则此时分配方法转而去创建一个全新的线程对象实例,并把此线程对象的“是否来源于线程池的线程”(IsThreadPoolThread)属性设置为FALSE,而实际使用个数与池的容量的值均不变,且二者相等。例如,默认的容量值为15。创建的线程默认为均来自于线程池。当然,用户程序也可以先取得实际使用个数与池的容量值,根据需要可以重新设置池的容量值,以便决定创建的新的线程是否来源于线程池中。
利用上面的方法,在创建一个新的线程之后,用户程序可以得到一个指向某个线程对象实例的接口智能指针,此时已经有了一个干净的可运行线程的环境,然而此时的线程并没有真正开始运行,要真正运行线程,则需要利用这个接口智能指针来调用线程对象的启动方法,在具体实施例中将有阐述。
基于上述的思想与技术实现,解决了在目前公知的计算机操作系统中创建线程需要花费较长时间的问题,为什么呢?因为在创建一个进程时就创建了一个与之对应的线程池管理组件,并在线程池中创建了一定数量的线程对象实例,并初始化了相关环境,因此在用户程序调用创建线程(IProcess∷CreateThread())的方法时就可以直接拿来用,而这里“拿来”的实质仅仅是一个指针的赋值与传出。在用户调用启动方法时,代码才开始真正执行,系统可以充分利用创建线程与执行代码这段间隔时间来处理别的任务,用户也可以在真正执行代码之前利用所得到的接口智能指针,根据需要进行执行环境的自定义,包括命令行参数、环境变量、私有密钥的设置。从而提高了系统的运行效率,同时满足用户对进程与线程运行的安全管理。
当用户需要停止线程执行时,则需要调用其接口智能指针的停止方法,此时系统仅仅停止了线程的执行,并没有立即释放线程对象的资源,用户仍可以访问其属性;要真正结束线程并交出所占资源,则调用结束线程对象的方法,此时,系统将调用线程管理组件的释放方法来清理这个线程环境,释放相应的资源。释放方法首先判断当前池中拥有的线程对象的个数,如果实际使用个数=0,则需要释放整个线程对象所占用的系统资源,否则,不必花时间去释放整个线程对象,而是按默认方式清理一些环境参数,然后放入线程池中,并执行实际使用个数减1操作,以便以后再次使用这个相同的线程对象的环境来执行别的应用程序,这就节省了因反复创建/退出线程所占用的系统时间。
参见图1,在任何操作系统中,进程与线程都在其中扮演着重要的角色,而对进程与线程的管理方式直接影响着系统的运行效率和能提供的系统功能。在本发明中,进程池管理组件/线程池管理组件就是为了提高系统时间的使用效率而提出的一种系统管理组件,它主要负责系统中进程对象/线程对象的创建与释放,在建立一个进程池/线程池的基础上,一方面可以在需要时直接从池中取出一个对象,从而提高效率;另一方面利用其缓存的特点,可以对已经停止运行,但还未释放其资源的进程对象/线程对象进行访问,以提供給用户需要的系统信息。
参见图2,进程池管理组件与线程池管理组件结构组类似,二者都至少具有分配与释放两个成员方法;实际使用个数与池的容量两个成员变量变量;以及一个进程池/线程池,池中拥有一定数量的进程对象实例/线程对象实例。
参见图3、图4,通过对在现有公知操作系统中与在利用了进程池管理组件的本发明创建/退出进程的工作步骤的比较,可以看出:创建进程时,如实际使用个数<池的容量时,无需花费时间去创建新的进程对象实例,而是直接从池中取出一个进程对象,返回其接口智能指;退出进程时,如实际使用个数>0时,也无需花时间去释放其对象,而是直接放回池中,以备复用。图4中创建/退出线程的原理与图3相同。
参见图5,本发明中的具体实施例:在本发明中创建/执行/退出进程。图5(a)为应用程序流程图部分,图5(b)表示了进程池管理组件在此过程中的作用。本实施例的主要程序如下:
从应用程序的角度来分析此过程为:
步骤1:用系统API函数获取当前系统的接口智能指针;
步骤2:调用系统接口的方法得到一个新进程对象,返回指向新创建进程对象的接口智能指针;
步骤3:对步骤2是否成功创建新进程对象进行判断,即hr值是否成功,除了系统异常之外,一般都会成功创建,这一步通常不影响程序的继续执行,但如是系统程序,为避免异常,还是有必要检查;
步骤4:设置密钥和/或参数,调用新创建进程对象的启动方法来真正运行程序,这里的启动包括新的进程需要加载运行的应用程序名称、执行程序的参数、启动进程的标志、指向一个构件对象的接口智能指针、程序工作目录,在这些参数的设计中,包含创建进程的一些标志,则是用于传入特定的私有密钥、命令参数、和/和环境变量。
步骤5:可以调用进程对象,确认其是否是来自进程池的进程对象;但是无论是否来自于池对象,在这里用户都可以根据需要调用进程对象所提供的任何方法来设置/获取相关数据;
步骤6:调用新创建进程对象的停止运行函数来停止该进程的运行,但并没有立即释放进程对象,仍可以访问其属性,如本实施例中在此时调用获取进程号方法,仍可获得其进程号;
步骤7:调用新创建进程对象的结束对象函数来退出该进程的运行,交出进程对象,此后不能再访问其属性。
从系统的角度来分析此过程,本发明的特征在于:在步骤2中不是直接创建一个新的进程对象,而是调用进程池管理组件的分配方法从进程池中直接取出一个可用的进程对象(当实际使用个数<池的容量时),这就节省了占用系统的时间。在步骤7中,结束对象函数也把控制权交给了进程池管理组件,不是直接释放其占用的系统资源,而是调用进程池管理组件的释放方法来处理,如果当前池中实际使用个数>0,则无需释放其所有资源,只需进行部分环境参数的清理,并放入池中以备以后使用,这也减少了其占用系统的时间。
参见图6,本发明线程创建/退出的具体实施例。图6(a)为应用程序流程图部分,图6(b)表示了线程池管理组件在此过程中的作用。本实施例的主要程序如下:
从用户的角度来分析此过程为:
步骤1:定义一个工作历程对象,它需要事先定义功能与结束两个函数,分别作为对象的两个成员方法,调用回调函数来初始化。一旦线程开始执行,也就是执行功能函数中的代码,在执行结束时则要执行结束函数中的代码。
步骤2:调用系统API函数获取当前进程对象的接口智能指针;
步骤3:调用进程接口的创建线程的方法,得到一个新的线程对象,返回指向新创建线程对象的接口智能指针;
步骤4:对步骤3是否成功创建新线程对象进行判断,即hr值是否成功,除了系统异常之外,一般都会成功创建,这一步通常不影响程序的继续执行;
步骤5:调用新创建线程对象的启动函数来真正执行代码,启动时开始运行相应的工作例程,并根据传入的密钥和/或参数进行系统验证,决定是否提供服务;
步骤6:可以调用新创建线程对象,确认其是否是来自线程池的线程对象,在这里用户可以根据需要调用线程对象所提供的任何方法来设置/获取相关数据;
步骤7:调用新线程对象的终止执行功能函数来终止线程的执行,此时系统保留了线程对象的一次引用,并没有立即释放线程对象,仍然可以访问其属性,如调用其获取线程号的方法仍然可以获得其线程号;
步骤8:调用新线程对象的结束函数,此时系统将真正结束线程的执行,并把线程对象交给线程池管理组件来处理,之后不能再访问其属性。
从系统的角度来分析此过程,本发明的特征在于:利用了这个对象,这个对象在步骤1中定义时就进行创建,在步骤3创建线程时,也不是直接创建一个新的线程对象,而是调用线程池管理组件的分配方法从线程池中直接取出一个可用的线程对象(当实际使用个数<池的容量时),这就节省了占用系统的时间。在步骤8中,结束函数也把控制权交给了线程池管理组件,不是直接释放其占用的系统资源,而是调用线程池管理组件的释放方法来处理,如果当前池中实际使用个数>0,则无需释放其所有资源,只需进行部分环境参数的清理,并放入池中以备以后使用,这也减少了其占用系统的时间。