进程——通常被定义为一个正在运行的程序的实例,是可以与其他程序并发执行的段程序的一次执行过程,是系统进行资源分配和调度的基本单位。
进程是运行中的程序,是程序的一次运行活动。进程是动态的概念,程序是静态的概念,是指令的集合。
进程由两个部分组成:
1是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。
2是地址空间。它包含所有可执行模块或动态链接库模块的代码和数据。它还包含动态内存分配的空间,如线程堆栈和堆分配空间。
进程状态的转换和控制:1就绪状态。2执行状态。3阻塞状态、4挂起状态。
若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线程,该线程负责执行包含在进程的地址空间中的代码。每个线程都有它自己的一组C P U寄存器和它自己的堆栈。每个进程至少拥有一个线程,来执行进程的地址空间中的代码。
建一个进程时,系统会自动创建它的第一个线程,称为主线程。然后,该线程可以创建其他的线程,而这些线程又能创建更多的线程。
进程从来不执行任何东西,它只是线程的容器。
线程——线程是进程中的一个实体,是系统实施调度的独立单位。
它也是由两个部分组成的:
1是线程的内核对象。操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。
2是线程堆栈。它用于维护线程在执行代码时需要的所有函数参数和局部变量。
线程在它的进程地址空间中执行代码,并且在进程的地址空间中对数据进行操作。因此,如果在单进程环境中,你有两个或多个线程正在运行,那么这两个线程将共享单个地址空间。这些线程能够执行相同的代码,对相同的数据进行操作。这些线程还能共享内核对象句柄,因为句柄表依赖于每个进程而不是每个线程存在。
由于进程需要很多的地址空间占用了很大的系统资源,而线程只有一个内核对象和一个堆栈,因此需要很少的系统资源,开销比进程少,因此始终都应该设法用增加线程来解决编程问题,而要避免创建新的进程,但也有些程序设计用多个进程来实现会更好些。应该懂得权衡利弊,经验会指导你的编程实践。
若要使所有这些线程都能运行,操作系统就要为每个线程安排一定的 C P U时间。它通过以一种循环方式为线程提供时间片(称为量程),造成一种假象,仿佛所有线程都是同时运行的一样。
当你的电脑有多个CPU时,OS就可以使用一些算法实现CPU上线程负载的平衡。如果OS不支持多核的话,系统每次安排一个线程运行,其他CPU处于空闲状态。
设计一个拥有多线程的应用程序,就会扩大该应用程序的功能。如果你的计算机拥有两个C P U,你的应用程序中有两个线程,那么两个C P U都将处于繁忙状态。实际上,你是让两个任务在执行一个任务的时间内完成操作。