程序是计算机指令集合,以文件形式存储在磁盘
进程:程序运行的一个实例,在其私有虚拟地址空间的一次执行活动
进程是资源申请、调度、独立运行的单位,使用系统的运行资源。程序不能申请资源,不能被系统调度、运行,不占用系统运行资源(cpu,存储器)
进程是不活泼的,不执行任何东西,只是线程的容器。如要执行某种操作,必须拥有在其环境中运行的线程,线程负责执行包含在进程地址空间的代码。
单个进程可包含若干线程,多核系统这些线程可执行进程地址空间中的代码。
每个进程至少拥有一个线程,执行地址空间的代码。
当创建一个进程时,操作系统会自动创建进程的第一个线程,即主线程(main、winmain即主线程进入点函数)。该线程可以创建其他线程。
进程组成
分2部分:
1、内核对象:被os创建、管理,用来存放关于进程统计信息的地方。os分配一块内存块,存放内核对象的数据结构,其成员负责维护内核对象各种信息。对应用程序是不可见的,但是应用程序可以通过OS API操作。
2、地址空间:包含可执行模块或dll代码和数据、动态分配的内存(堆和栈)。
进程的内存模型:
进程地址空间:
系统赋予每个进程独立虚拟地址空间(对32位进程,编址0~4GB-1),进程之间不能相互访问。内存不足时,进程出现非法访问前,必须被赋予物理存储器,映射到部分地址空间(虚拟内存)。
4GB虚拟地址空间中,2GB是内核分区,供内核代码、设备驱动程序、设备I/O高速缓冲、非页面内存池分配和进程页面表等使用。用户使用的分区约2GB,是进程私有空间。
线程组成
分2部分:
线程内核对象:被os创建、管理,存放线程统计信息的地方。
线程堆、栈:维护线程执行代码时需要的参数、局部变量。
创建线程时,系统创建内核对象,即用于管理线程的较小的数据结构。
线程在某个环境中创建,线程从进程的地址空间中分配内存,供线程堆栈使用。新线程运行环境与创建环境相同,所以可以访问进程内核对象的所有句柄、进程中所有内存和该进程中其他线程的堆栈,使得单进程的多个线程容易相互通信。
线程只有一个内核对象和一个堆栈,保留的记录很少,因此需要的内存很少。
线程需要的开销比进程少,编程通常采用多线程解决多任务问题,尽量避免创建新进程。
1.多线程共享一个进程内存地址空间,通信容易
2.进程创建需4GB虚拟地址空间,进程切换需要交换整个地址空间,效率低;线程切换只需执行环境改变(cpu寄存器现场保留)
线程运行
os 为每一个运行的线程安排一定的cpu时间(时间片)。系统通过一种循环的方式为线程提供时间片,线程在自己的时间片内运行,由于时间片相当短,给用户的感觉是同时运行一样。
如果计算机拥有多个cpu,线程就能真正意义的运行。
随想笔记:
用户眼力视觉时间>0.1s,所以系统延迟0.1s就可能给用户延迟的感觉
*引用计数标识每个线程、线程内核对象、分片执行、同步与互斥访问