进程和线程学习总结2008年2月17日

来源:互联网 发布:网站抓取软件 编辑:程序博客网 时间:2024/04/29 03:01
 
一、操作系统的发展(类型)及其架构
1、每种操作系统的架构不同导致它们对计算机资源管理方式也有所不同,这里主要探索它们对处理机和内存资源的管理
2、操作系统的发展过程:
无操作系统的计算机系统(经历了人工操作方式和脱机输入/输出方式两个阶段的发展过程)
单道批处理系统
多道批处理系统
分时系统
实时系统
3、操作系统的架构
无结构操作系统
模块化OS结构
分层式OS结构
微内核OS结构
4、微内核OS
微内核OS使用了微内核技术,它建立在模块化、层次化技术的基础上,采用了客户/服务器模式和面向对象的程序设计技术。它按照处理机管理、内存管理、设备管理等基本的管理功能来划分模块,同时又对每个模块使用了分层技术,如硬件驱动层、内核层、用户接口层等。
二、Windows应用程序
1、Windows应用程序的类型
按照用户接口划分可以分为GUI应用程序和CUI应用程序,它们在编程时可以通过链接选项开关(/SUBSYSTEM:CONSOLE和/SUBSYSTEM:WINDOWS)来指定应用程序的类型
按照程序运行的方式来分,可以划分为单线程应用程序和多线程应用程序,在编程时通过指定C/C++运行时库的类型来指定
2、应用程序的运行过程
对所有的GUI应用程序,如果是在explorer中启动,在启动时SW_SHOWNORMAL将作为nCmdShow的参数传递给(w)WinMain函数,如果是快捷方式,可以在快捷方式中指定窗口的显示方式,这时explorer首先要正确的准备STARTUPINFO结构,然后再调用CreateProcess来创建进程。应用程序可以调用GetStartupInfo来获取STARTUPINFO结构的拷贝。
3、创建进程和线程
在微内核操作系统的架构中,进程是系统进行资源分配的基本单位,而线程是处理机调度的基本单位,进程由操作系统管理的进程的内核对象和进程自身的地址空间组成,线程是由操作系统管理的线程内核对象和线程堆栈两部分组成。而传统的操作系统中,系统进行资源分配和独行的基本单位都是进程,操作系统的四大特征(并发,共享,虚拟和异步)也都是基于进程而形成的
a、创建进程
CreateProcess是操作系统提供的唯一一个创建进程的接口,在使用CreateProcess创建进程时,会使用BaseProcessStartup来进行内核态的进程内核对象的创建以及其他一些操作,然后会转到用户态运行C/C++运行期函数(w)WinMainCRTStartup或(w)mainCRTStartup,C/C++运行期函数会进行一些C/C++运行期库的一些初始化操作(堆栈、IO、参数、环境以及程序的全局和静态变量等),然后调用用户编写的程序入口函数((w)WinMain/(w)main)。
由上可见,创建进程其实是在内核态完成进程内核对象后便完成了,后面的过程是进程的执行过程。
b、创建线程
CreateThread也是操作系统提供的唯一的一个创建线程的接口,它和CreateProcess很相似,在使用CreateThread创建线程时,会使用BaseThreadStartup 来进行内核态的内核对象的创建,到此线程创建完毕,后面转到用户态执行线程函数。
在编程时应该使用C/C++运行期函数_beginthreadex来创建线程而不使用CreateThread,这是因为_beginthreadex会为每个线程绑定一个本地线程信息数据块(TLS),这是有些C/C++运行期函数所需要的,这是因为如果使用CreateThread来创建线程,在执行这些运行期函数时,如果这些函数发现没有为线程绑定这一数据,它们会生成这一数据块并绑定的线程,而这一数据库只有使用C/C++运行期函数_endthreadex来结束线程才能够释放。所以建议使用_beginthreadex和_endthreadex来创建和结束线程,这样C/C++运行期函数所生成的这一数据才能释放(并不表示其他资源能够正确释放,最好的方式是让线程自动返回结束)。
4、进程和线程的结束
进程和线程在创建后,内核对象的引用计数为2,只有当内核对象的引用计数为0时,系统才会撤消内核对象,所以,如果在进程和线程创建后,如果对它们的句柄不感兴趣,可以即刻关闭它们的句柄(使用CloseHandle),这样在进程和线程执行完毕后,系统便可以即刻释放内核对象。注意在创建进程后会同时创建进程的主线程,所以在关闭进程句柄,也不要忘记关闭它的主线程句柄。
A、关闭进程的方式
自动返回
使用ExitProcess,使用这种方式结束进程,你可以在结束之前进行进程的内存控制释放进程所占用的资源,当然即使你不进行这一操作,操作系统在撤消进程时也会自动进行理。但由于在进程中直接结束了进程,导致C/C++运行期函数无法对它们所占用的资源进行消除,可能会造成内存泄漏。这一泄漏直到内核对象被撤消后才会消失。
使用TerminateProcess,使用这种方式结束进程,进程会在没有任何通知的情况下被结束,虽然没有进行必要的资源释放操作,但操作系统会在撤消进程时进行清理,同样,这也会导致C/C++运行期函数库的内存泄漏,这一泄漏直到内核对象被撤消后才会消失
B、关闭线程
关闭线程和关闭进程有所区别,这是因为关闭线程后,线程所在的进程可能还会希望继续运行,所有操作系统只能对线程所占用的部分资源进行清理(线程堆栈),但不能对线程所使有用的动态存储区进行清理,所以如果线程不能人为进行动态存储区的资源释放,可能会造成严重的内存泄漏从而影响它所在的进程
方式:
自动返回
使用ExitThread,使用这种方式来结束线程,如果在线程内部进行了动态内存的申请,一定要在使用前进行内存的释放,除非你故意这样做,把这块内存的指针传到外边,以便在线程外访问这内存
使用TerminateThread,使用这种方式来结束线程,要保证在线程内部没有进行动态内存的申请,否则无疑会造成内存泄漏从而影响进程,除非你故意这样,把这块内存的指针传到外边,以便在线程外访问这部分内存
进程和线程关注的内容:
1、进程和线程的堆栈
2、进程和线程的动态内存
3、操作系统对进程和线程的管理
4、C/C++启动代码及其所占用的资源管理
5、进程和线程内核对象的创建和撤消
6、进程的线程的结束及其资源管理
 
原创粉丝点击