(一天两更,肝?)
进程和程序: 进程是程序的对象
进程组成: 内核对象:系统管理进程的地方
地址空间:包含DLL和代码数据,进程本身不执行什么,代码的执行是线程,在进程构造的环境中。每个进程可以包含多线程,系统在进程中创建的
第一个线程称之为主线程。
进程地址空间: 对应32位系统而言,一个进程有4GB的虚拟地址空间,其中2GB为内核分区,剩余2GB中一部分作为NULL指针分区,该分区负责维护进程大部分数据
线程的组成: 内核对象:系统管理线程地方
线程栈:维护线程执行中函数参数和局部变量
线程的创建: 系统创建线程内核对象(该对象不是线程本身,而是管理线程的较小的数据结构)>进程的地址空间中分配内存供线程栈使用>新线程能够轻易的访问进程内核对象,进程内存和该进程中其他线程的堆栈
线程只有一个内核对象和一个栈,保留信息和需要内存少,线程的开销缘由小于进程,所有尽量采用多线程编程少创建进程。
多线程运行方式: 时间片划分,给每个线程分配一定时间,循环执行
创建线程:
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, //线程初始栈大小 LPTHREAD_START_ROUTINE lpStartAddress, //新线程起始地址 LPVOID lpParameter, //传递参数 DWORD dwCreationFlags, //线程创建标记 LPDWORD lpThreadId //线程接收ID );
互斥对象(mutex): 同时只有一个线程能够访问该对象,被访问时,对象处于未通知状态;未访问时,对象处于通知状态;
创建互斥对象:CreateMutex(安全性,创建者是否访问,对象名)返回值为对象句柄
GetLastError:对象曾创建,返回ERROR_ALREADY_EXISTS
释放对象所有权:ReleaseMutex(句柄)
获取对象所有权:WaitForSingleObject(句柄,等待时间(毫秒))返回值:对象有信号,等待超时无信号,对象所有者线程已结束,抢占所有权。
应用程序只有一个实例: 通过在创建互斥对象识别是否曾创建来确定该对象是否的第二个对象