20140829 直接插入排序
#include<stdio.h> void InsertSort(int a[],int len) { int temp=0,i,j; for(i=1;i<len;i++) { temp=a[i]; for(j=i-1;j>=0&&temp<a[j];j--) { a[j+1]=a[j]; } a[j+1]=temp; } } Pint main() { int a[]={3,2,5,7,1,8}; int len=sizeof(a)/4; InsertSort(a,len); }
2、内存地址空间
比如,我们希望向显示器输出一段信息,那么必须将这段信息写到显存中,显卡才能将它输出到显示器上。要向显存中写入数据,必须知道显存在内存地址空间中的地址。
对CPU来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受CPU寻址能力的限制。这个逻辑存储器即是我们所说的内存地址空间。
http://blog.csdn.net/qingfeng_happy5/article/details/4322723分段、分页、虚拟内存
3、多线程理解
开在后台的算多线程吗?例如我开一个游戏,一个迅雷,一个浏览器,还有些杀毒软件之类的,但是桌面只有一个游戏窗口,其他都最小化了。
你说的那些,都是多进程,你可以理解为一个应用程序(软件)是一个进程,线程是在进程中的。一个进程可以有一个或多个线程,看起来就像某音频播放软件,一边在显示歌词、一边在显示音频柱、一边在放歌。
4、windows内存管理的知识
1. 机器的物理内存由两部分组成。一部分为机器的主存RAM,也就是我们内存条的大小;另一部分为虚拟内存,它就在机器的硬盘上,以页文件的形式存在。
2. 每个进程都有自己的虚拟地址空间,对于具有32位寻址能力的机器来说,这个虚拟空间的大小为4GB。现在我们使用的机器就是4GB。
3. 进程的4GB虚拟地址空间又可以分成几个部分,其中进程真正私有的空间少于2GB(这段地址空间被称作“用户方式分区”),其余的2GB多空间都是给操作系统的,且这部分空间被所有的进程共享。(参考Windows核心编程Chapter 13)
4. 为进程“分配内存”,这个概念可以细化:“保留一段地址空间”,“提交一段内存空间”,“将内存空间映射到主存”。在程序中我们通常所访问的地址都必须是进程地址空间中被保留和提交的那段地址空间。
4.1 “保留一段地址空间”:即从进程的4GB地址空间中保留一段地址空间,这个过程通过VirtualAlloc函数完成,并把分配类型参数设置为MEM_RESERVE。这段空间的起始地址必须是系统分配粒度的整数倍,大小必须是系统页面大小的整数倍。
4.2 “提交一段内存空间”:即为进程已保留的地址空间映射机器的物理内存,这里要特别注意,所谓物理内存一般并不是机器的主存,而只是机器的虚拟内存。这个过程同样又VirtualAlloc完成,只是把分配类型参数设置为MEM_COMMIT。这段空间的起始地址和大小都必须是页面大小的整数倍。这样进程的对应被提交的区域就被映射到机器的虚拟内存上。
4.3 “将内存空间映射到主存”:这点很重要,操作系统总是只有在进程提交的页面被访问时才将相应的页面加载到主存中,同时修改进程对应页面的地址空间映射。这时,进程的地址空间中的对应区域才和机器上的主存对应起来。
5、多线程编程
#include<windows.h> #include<iostream> using namespace std; DWORD WINAPI Fun1Proc(LPVOID lpParameter); DWORD WINAPI Fun2Proc(LPVOID lpParameter); int index=0; int tickets=100; HANDLE hMutex; void main() { HANDLE hThread1; HANDLE hThread2; hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); //hMutex=CreateMutex(NULL,FALSE,NULL); /*while(index++<1000) cout<<"main thread is running"<<endl; Sleep(10);*/ hMutex=CreateMutex(NULL,TRUE,(LPCWSTR)"tickets"); if(hMutex) { if(ERROR_ALREADY_EXISTS==GetLastError()) { cout<<"only instance can run!"<<endl; return; } } WaitForSingleObject(hMutex,INFINITE); ReleaseMutex(hMutex); ReleaseMutex(hMutex); Sleep(4000); Sleep(4000); } DWORD WINAPI Fun1Proc(LPVOID lpParameter) { /*while(index++<1000) cout<<"thread1 is running"<<endl;*/ while(true) { WaitForSingleObject(hMutex,INFINITE); if(tickets>0) cout<<"thread1 sell ticket : "<<tickets--<<endl; else break; ReleaseMutex(hMutex); } return 0; } DWORD WINAPI Fun2Proc(LPVOID lpParameter) { while(true) { WaitForSingleObject(hMutex,INFINITE); if(tickets>0) cout<<"thread2 sell ticket : "<<tickets--<<endl; else break; ReleaseMutex(hMutex); } return 0; }