大部分操作系统(如Windows、Linux)的任务调度是采用时间片轮转的抢占式调度方式,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。任务执行的一小段时间叫做时间片
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程一般由程序、数据集合和进程控制块三部分组成。
程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块(Program Control Block,简称PCB),包含进程的描述信息和控制信息。进程特征:
动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;并发性:任何进程都可以同其他进程一起并发执行;独立性:进程是系统进行资源分配和调度的一个独立单位;结构性:进程由程序、数据和进程控制块三部分组成。进程占有的资源
地址空间 全局变量 打开的文件 子进程 信号量 账户信息是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元
critical section是每个线程中访问临界资源的那段代码,不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问
线程占有的资源
栈 :是个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,操作系统在切换线程的时候会自动的切换栈,栈空间不需要在高级语言里面显式的分配和释放。寄存器 状态 程序计数器某进程内的线程在其它进程不可见
进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号)
线程的状态:
创建:一个新的线程被创建,等待该线程被调用执行;就绪:时间片已用完,此线程被强制暂停,等待下一个属于它的时间片到来;运行:此线程正在执行,正在占用时间片;阻塞:也叫等待状态,等待某一事件(如IO或另一个线程)执行完;退出:一个线程完成任务或者其他终止条件发生,该线程终止进入退出状态,退出状态释放该线程所分配的资源CreateThread用于创建一个线程
HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, //线程安全相关的属性,常置为NULL SIZE_T dwStackSize, //新线程的初始化栈在大小,可设置为0 LPTHREAD_START_ROUTINE lpStartAddress, //被线程执行的回调函数,也称为线程函数 LPVOID lpParameter, //传入线程函数的参数,不需传递参数时为NULL DWORD dwCreationFlags, //控制线程创建的标志 LPDWORD lpThreadId //传出参数,用于获得线程ID,如果为NULL则不返回线程ID );CloseHandle关闭创建的线程句柄
BOOL WINAPI CloseHandle(HANDLE hObject); //关闭一个被打开的对象句柄CreateMutex使用互斥量进行线程同步
HANDLE WINAPI CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, //线程安全相关的属性,常置为NULL BOOL bInitialOwner, //创建Mutex时的当前线程是否拥有Mutex的所有权 LPCTSTR lpName //Mutex的名称 );ReleaseMutex释放所拥有的互斥量锁
BOOL WINAPI ReleaseMutex(HANDLE hMutex);ThreadProc线程函数,是线程执行的起始地址,线程函数是一个回调函数,由操作系统在线程中调用
DWORD WINAPI ThreadProc(LPVOID lpParameter); //lpParameter是传入的参数,不需传递参数时为NULL参考文献: 编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程