页交换文件与内存映射文件
页交换文件与内存映射文件
内存的几种状态和类型
私有类型:
使用VitualAlloc申请分配/调拨内存后,申请的内存只能被当前进程使用。其他进程无法访问。这就是所谓的私有内存
……私有类型:
使用VitualAlloc申请分配/调拨内存后,申请的内存只能被当前进程使用。其他进程无法访问。这就是所谓的私有内存
……进程容器中4GB空间的内容分布
在所谓的4GB空间内,系统内核占据了高2GB的空间,普通进程看不见摸不着,而且高2GB的空间是全局共享。全局就那么一份,各个进程间共享
……//创建一个时间对象
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // SD 安全属性
BOOL bManualReset, // reset type 0自动复位(互斥)、1手动复位(通知模式)
BOOL bInitialState, // initial state 初始创建时时间是否具备信号
LPCTSTR lpName // object name 对象的名称
);
//将目标事件对象设置为有信号的(同时通知其他线程)
BOOL SetEvent(
HANDLE hEvent // handle to event //目标事件的句柄
);
//将目标事件对象设置为无信号的
BOOL ResetEvent(
HANDLE hEvent // handle to event 目标事件的句柄
);
回顾互斥模式
……cd /etc/sudoers.d
sudo touch nopasswd4sudo
sudo vi nopasswd4sudo
//输入
ubuntu ALL=(ALL) NOPASSWD : ALL
ESC :wq!
不可重入函数: 当这个函数返回前,不可以被其他线程调用
原因:
printf : 访问了引用全局变量stdout
malloc : 引用了全局内存分配表
free : 引用的全局内存分配表
类似的 假如我在我的线程中使用全局变量会不会出现类似问题?
……HY0XH-D508H-081U8-JA2GH-CCUM2
4C4WK-8KH8L-H85J0-UHCNK-8CKQ8
NV09R-2W007-08D38-CA956-33U28
JU400-6EK4L-080V9-QT8EP-2KAQ2
NC6HH-26J4N-48098-Y0AX0-1GA66
HY0J0-6L28H-081W8-4TCN0-32RP0
0V012-002DJ-480T1-UHAE0-9GULF
4G6WR-A0K4M-08420-J8CN6-8A2QA
MF00U-65K53-H8DF9-Q20ZH-26R40
JV6D2-6YLDN-088C0-Q92N2-8Z00A
HG49R-2234J-08EJ8-WC9E2-87H2D
NV6TR-D4HD1-M84L1-P19QM-0PK3D
JG2JK-DM01L-M8101-J8AZH-3LUH2
……进程和线程的关系:进程提供资源,线程使用资源完成工作
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD /安全属性
DWORD dwStackSize, // initial stack size //线程栈大小-
LPTHREAD_START_ROUTINE lpStartAddress, // thread function //线程代码
LPVOID lpParameter, // thread argument //线程参数
DWORD dwCreationFlags, // creation option //创建标识
LPDWORD lpThreadId // thread identifier //线程id
);
//线程等待
//等待一个
DWORD WaitForSingleObject(
HANDLE hHandle, // handle to object,监视对象的句柄
DWORD dwMilliseconds // time-out interval 指定超时等待时间 毫秒为单位
);
//等待多个
DWORD WaitForMultipleObjects(
DWORD nCount, // number of handles in array,句柄数量
CONST HANDLE *lpHandles, // object-handle array 句柄数组
BOOL fWaitAll, // wait option 是否全等待/TRUE 全部结束才返回/False 一个结束就返回
DWORD dwMilliseconds // time-out interval,超时时间
);
//获取线程的退出代码
BOOL GetExitCodeThread(
HANDLE hThread, // handle to the thread
LPDWORD lpExitCode // termination status
);
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD /安全属性
DWORD dwStackSize, // initial stack size //线程栈大小-
LPTHREAD_START_ROUTINE lpStartAddress, // thread function //线程代码
LPVOID lpParameter, // thread argument //线程参数
DWORD dwCreationFlags, // creation option //创建标识
LPDWORD lpThreadId // thread identifier //线程id
);
创建标志位:
指定一个标志来控制线程的创建,如果指定了 CREATE_SUSPENDED
标志,则线程是在一个挂起状态
下创建的,并且在调用了ResumeThread ()
函数之前不会运行,如果这个值为零,那么线程在创建之后立即运行
句柄代表着备操作的对象
句柄表可以看做一个非常大的结构体数组
句柄表的结构
索引值: 进程通过索引找到句柄表中对应的选项
内核对象地址: 通过地址直接找到对应的内核对象
访问掩码: 控制了访问权限
标志位: 标志改句柄能否被继承
//获取控件句柄
HWND GetDlgItem(
HWND hDlg,//获得控件所处的窗口的句柄
int nIDDlgItem //控件id
);
//初始化列表的列 (listview插入新的一列
int ListView_InsertColumn(
HWNDhwnd, //控件的句柄
int iCol, //第几列 (索引 index
const LPLVCOLUMNpcol //结构体指针 (包含新列的结构体
);
//插入新的一行条目
int ListView_InsertItem(
HWND hwnd,
const LPLVITEM pitem
);
//设置条目的属性
BOOL ListView_SetItem(
HWND hwnd,
const LPLVITEM pitem
);
//删除所有项目
BOOL ListView_DeleteAllItems(
HWND hwnd
);
//标准输出格式化字符串
swprintf(buffer,L"%s,哈哈",param);
//清空
ZeroMemory(buffer);
list属性:
……//获得进程所使用的堆,模块和线程的信息快照
HANDLE WINAPI CreateToolhelp32Snapshot
(
DWORD dwFlags,//标志位
DWORD th32ProcessID //进程ID
)
//dwFlags: 指定的快照中,指定需要拍的系统部分
TH32CS_INHERIT 声明快照句柄是可继承的。
TH32CS_SNAPALL 在快照中包含系统中所有的 进程和线程。
TH32CS_SNAPHEAPLIST 在快照中包含ID所指定的进程的所有的堆。
TH32CS_SNAPMODULE 在快照中包含在ID所指定的进程的所有的模块。
TH32CS_SNAPPROCESS 在快照中包含系统中所有的进程。
TH32CS_SNAPTHREAD 在快照中包含系统中所有的线程。
BOOL WINAPI Process32First(
HANDLE hSnapshot, //快照句柄
LPPROCESSENTRY32 lppe //获得的信息
);获得快照中的第一个成员的信息
BOOL WINAPI Process32Next(
HANDLE hSnapshot, //快照句柄
LPPROCESSENTRY32 lppe //获得的信息
);获得快照中后一个成员的信息
函数实现
……