进程–操作系统的器官
现在的操作系统都是多进程的操作系统
1.什么是进程?
进程提供程序所需要的资源,如:数据、代码等等。
程序运行的状态和进程没有关系,可以看成是空间状态。
现实生活类比,进程相当于房子,房子里边有各种各样的资源(桌子、椅子、电脑)。线程相当于使用这些资源的人。
1. 验证进程是一个空间的概念
![1587614214080](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9naXRlZS5jb20vc210bGcvUGljR28vcmF3L21hc3Rlci9pbWcvMjAyMDA1MTMwMDA3MDcucG5n?x-oss-process=image/format,png)
打开一个程序,用DTDEBUG附加它。
2. 一个进程地址范围 0~FFFFFFFF = 4 GB 但是一个进程只用低2GB的进程空间 0~7FFFFFFF ,高2GB的进程空间80000000 ~ FFFF FFFF 是操作系统内核使用的。
2.进程内存空间的地址划分
- 空指针赋值区:从来没有人使用,操作系统也没有使用。
- 用户模式区:我们使用的拉~
- 64KB禁入区:我们代码跑不到哪儿,操作系统也没有使用。(用户空间的前后64KB都没有使用)
- 内核
在Windows里,这些内存空间是虚拟的内存,名义上有4GB,而实际上分配的远远没有4GB,只有线程真正使用的时候才会真正分配。(段和页的管理)。
4GB的进程 就 只由一个文件组成吗?
不是的,一个空间进程 由多个文件组成,exe和各种dll.
这些程序都遵守PE文件结构 DLL,EXE
3.一个程序如何变成进程?
### 进程创建的过程:
一个进程 都是由别的进程,创建出来的。 也就是说进程不可能平白无故的出来。
在windows下,双击运行程序,都是由explorer.exe 来创建你双击程序的进程的。
-
任何进程都是别的进程创建的:CreateProcess()
-
进程的创建过程
- 映射exe文件
- 创建内核对象EPROCESS
- 映射系统dll(ntdll.dll)
- 创建 线程内核对象ETHREAD
- 系统启动线程(一个进程必须有一个线程)
- 映射DLL(ntdll.LdrInitializeThunk)
- 线程开始执行
创建进程
-
进程的创建 CreateProcess()
BOOL CreateProcessA( LPCSTR lpApplicationName, //name of executable module LPSTR lpCommandLine, //command line string LPSECURITY_ATTRIBUTES lpProcessAttributes, //SD LPSECURITY_ATTRIBUTES lpThreadAttributes, //SD BOOL bInheritHandles, //handle inheritance option DWORD dwCreationFlags, //creation flags LPVOID lpEnvironment