页交换文件与内存映射文件

页交换文件与内存映射文件

内存的几种状态和类型

私有类型:

使用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 目标事件的句柄
);

通知模式

回顾互斥模式

……

ubuntu sudo 免密码

ubuntu sudo 免密码

cd /etc/sudoers.d
sudo touch nopasswd4sudo
sudo vi nopasswd4sudo
//输入
ubuntu ALL=(ALL) NOPASSWD : ALL
ESC :wq!

临界区、线程锁和互斥体

临界区、线程锁和互斥体

不可重入函数

不可重入函数: 当这个函数返回前,不可以被其他线程调用

原因:

printf : 访问了引用全局变量stdout
malloc : 引用了全局内存分配表
free   : 引用的全局内存分配表

类似的 假如我在我的线程中使用全局变量会不会出现类似问题?

……

vmware 6 虚拟化 全系列 序列号

vmware 6 虚拟化 全系列 序列号

vSphere 6 Hypervisor

HY0XH-D508H-081U8-JA2GH-CCUM2

4C4WK-8KH8L-H85J0-UHCNK-8CKQ8

NV09R-2W007-08D38-CA956-33U28

JU400-6EK4L-080V9-QT8EP-2KAQ2

vSphere 6 Hypervisor for Embedded OEMs

NC6HH-26J4N-48098-Y0AX0-1GA66

HY0J0-6L28H-081W8-4TCN0-32RP0

0V012-002DJ-480T1-UHAE0-9GULF

4G6WR-A0K4M-08420-J8CN6-8A2QA

vSphere 6 Desktop Host

MF00U-65K53-H8DF9-Q20ZH-26R40

JV6D2-6YLDN-088C0-Q92N2-8Z00A

HG49R-2234J-08EJ8-WC9E2-87H2D

NV6TR-D4HD1-M84L1-P19QM-0PK3D

vSphere 6 for vCloud Service Provider Standard

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
);

更多的API

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 ()函数之前不会运行,如果这个值为零,那么线程在创建之后立即运行

……

句柄表和继承

句柄表和继承

句柄代表着备操作的对象

句柄的本质(handler)

句柄表可以看做一个非常大的结构体数组
句柄表的结构

索引值: 进程通过索引找到句柄表中对应的选项
内核对象地址: 通过地址直接找到对应的内核对象
访问掩码: 控制了访问权限
标志位: 标志改句柄能否被继承

……

ListView控件

ListView控件 实现简单进程管理

用到的相关api函数

//获取控件句柄
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    //获得的信息
);获得快照中后一个成员的信息

函数实现

……