第一个线程程序的创建:
进程是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源;而程序不能申请系统资源,不能被系统调度,也不能作为独立的运行的单位, 因此,他不占用系统的运行资源。
- 进程由两个部分组成:
1、操作系统用来管理进程的内核对象。内核对象是操作系统内部分配的一个内存块,内核对象也是系统用来存放关于进程的统计信息的地方。
2、地址空间。它包含所有可执行模块或DLL模块的代码和数据。他还包含动态内存分配的空间。如线程堆栈和堆分配空间。
内核对象:是操作系统内部分配的一个内存块,它是一种只能被内核访问的数据结构, 其成员负责维护该对象的各种信息,应用程序无法找到并直接改变它们的内容,只能通过Windows提供的函数对内核对象进行操作。
- 进程
进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。
若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线程,此线程负责执行包含在进程的地址空间中的代码。
单个进程可能包含若干个线程,这些线程都“同时”执行进程地址空间中的代码。
每个进程至少拥有一个线程,来执行进程的地址空间中的代码。
当创建一个进程时,操作系统会自动创建这个进程的一个线程,称为主线程。此后,该线程可以创建其他的线程
- 线程
线程有两个部分组成:
1。线程的内核对象,操作系统用它来对线程实施管理,内核对象也是系统用来存放线程统计信息的地方。
2。线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量。
当创建线程时,系统创建一个线程内核对象。
该线程内核对象不是线程本身,而是操作系统用来管理线程的较小的数据结构。
可以将线程内核对象视为由关于线程的统计信息组成的一个小型数据结构。
线程总是在某个进程环境中创建。
系统从进程的地址空间中分配内存,供线程的堆栈使用。
新线程运行的进程环境与创建线程的环境相同。
因此,新线程可以访问进程的内核对象的所有句柄、进程中的所有内存和在这个相同的进程中的所有其他线程的堆栈。这使得单个进程中的多个线程确实能够非常容易的互相通信。
线程只有一个内核对象和一个堆栈,保留的记录很少,因此所需要的内存也很少。
因为线程需要的开销比进程少,因此在编程中经常采用多线程来解决编程问题,而尽量避免创建新的进程。
创建线程函数:
HANDLE WINAPI CreateThread(
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,//进程是否被继承
_In_ SIZE_T dwStackSize,//线程初始化堆栈大小
_In_ LPTHREAD_START_ROUTINE lpStartAddress,//线程入口函数
_In_opt_ LPVOID lpParameter,//传入线程入口函数的参数
_In_ DWORD dwCreationFlags,//控制线程创建的标志
_Out_opt_ LPDWORD lpThreadId//返回子线程的ID号
);
具体的程序如下:
#include "stdafx.h"
//#include <WinBase.h>
#include <Windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI FuncProc(
_In_ LPVOID lpParameter
);
int index=0;
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread1;
//对于多核的CPU,可以通过这条语句来设定单核运行;通过这条语句的使用可以明显的看出区别
//SetProcessAffinityMask(GetCurrentProcess(),2);
//DWORD* lpThreadId=new DWORD();//用来返回线程ID号
hThread1=CreateThread(NULL,0,FuncProc,NULL,0,/*lpThreadId*/NULL);
CloseHandle(hThread1);
while(index++<=1000)
cout<<"Main thread is running!"<<endl;
Sleep(20);
return 0;
}
DWORD WINAPI FuncProc(
_In_ LPVOID lpParameter
)
{
while(index++<=100000)
cout<<"The hThread1 is running!"<<endl;
return 0;
}
说明:对于线程、进程的知识还有些疑问,有待深入!
对于虚拟内存与物理内存的区别:
当多个进程在运行时,暂时不用的进程数据被放在虚拟内存(即硬盘中),这是进程被挂起;当前使用的进程的数据会被优先放在内存中使用。不同的进程使用时,会交叉的搬运数据至内存与虚拟内存间,这样进程不断的被挂起与唤醒!