<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[weixin_45239587的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/weixin_45239587</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; weixin_45239587]]></copyright><item><title><![CDATA[程序员自我修养》系统调用与API]]></title><link>https://blog.youkuaiyun.com/weixin_45239587/article/details/120351170</link><guid>https://blog.youkuaiyun.com/weixin_45239587/article/details/120351170</guid><author>weixin_45239587</author><pubDate>Fri, 17 Sep 2021 16:06:00 +0800</pubDate><description><![CDATA[什么是系统调用
在现代的操作系统里,程序运行的时候,本身是没有权利访问多少系统资源的。由于系统有限的资源有可能被多个不同的应用程序同时访问,因此,如果不加以保护,那么各个应用程序难免产生冲突。所以现代操作系统都将可能产生冲突的系统资源给保护起来,阻止应用程序直接访问。这些系统资源包括文件、络、IO、各种设备等。
为了让应用程序有能力访问系统资源,也为了让程序借助操作系统做一些必须由操作系统支持的行为,每个操作系统都会提供一套接口,以供应用程序使用这些接口往往通过中断来实现,比如 Linux使用0x80号中.]]></description><category></category></item><item><title><![CDATA[《程序员自我修养》运行库]]></title><link>https://blog.youkuaiyun.com/weixin_45239587/article/details/120351045</link><guid>https://blog.youkuaiyun.com/weixin_45239587/article/details/120351045</guid><author>weixin_45239587</author><pubDate>Fri, 17 Sep 2021 16:02:31 +0800</pubDate><description><![CDATA[C语言运行库
一个C语言运行库大致包含了如下功能:
1. 启动与退出:包括入口函数及入口函数所依赖的其他函数等。
2. 标准函数:由C语言标准规定的C语言标准库所拥有的函数实现
3. I/O:I/O功能的封装和实现.
4. 堆:堆的封装和实现.
5. 语言实现:语言中一些特殊功能的实现。
6. 调试:实现调试功能的代码。
入口函数和程序初始化
运行的代码并不是main的第一行,而是某些别的代码,这些代码负责准备好main函数执行所需要的环境,并且负责调用main函数,这时候你才可以在main函数里放心大胆.]]></description><category></category></item><item><title><![CDATA[C/C++运行库简介]]></title><link>https://blog.youkuaiyun.com/weixin_45239587/article/details/120332553</link><guid>https://blog.youkuaiyun.com/weixin_45239587/article/details/120332553</guid><author>weixin_45239587</author><pubDate>Thu, 16 Sep 2021 16:47:32 +0800</pubDate><description><![CDATA[什么是C/C++运行库
任何一个C 程序，它的背后都有一套庞大的代码来进行支撑，以使得该程序能够正常运行。这套代码至少包括入口函数，及其所依赖的函数所构成的函数集合。另外包括各种标准库函数的实现。
这样的一个代码集合称之为运行时库（Runtime Library），C 语言的运行时库，称为 C 运行库（CRT）。
C 运行库大致包含的功能：
1. 启动与退出函数
2. 由C 语言标准规定的C 语言标准库所拥有的函数实现。
3. I/O 功能的封装与实现。
4. 堆的封装和实现
5. 语言中一些特殊功能的实现]]></description><category></category></item><item><title><![CDATA[与堆有关的API]]></title><link>https://blog.youkuaiyun.com/weixin_45239587/article/details/120328168</link><guid>https://blog.youkuaiyun.com/weixin_45239587/article/details/120328168</guid><author>weixin_45239587</author><pubDate>Thu, 16 Sep 2021 14:35:54 +0800</pubDate><description><![CDATA[进程初始化的时候，系统会在进程的地址空间中创建一个堆。这个堆被称为进程的默认堆。
除了进程的默认堆，我们可以在进程的地址空间中创建额外的堆。由于以下原因，我们可能希望在应用程序中创建额外的堆：
• 对组件进行保护
• 更有效地内存管理
• 局部访问
• 避免线程同步的开销
• 快速释放
HeapCreate
创建额外的堆
HANDLE WINAPI HeapCreate(
In DWORD  flOptions,
In SIZE_T dwInitialSize,
In SIZE_T dwMaximumSiz]]></description><category></category></item><item><title><![CDATA[基础算法学习]]></title><link>https://blog.youkuaiyun.com/weixin_45239587/article/details/120224976</link><guid>https://blog.youkuaiyun.com/weixin_45239587/article/details/120224976</guid><author>weixin_45239587</author><pubDate>Fri, 10 Sep 2021 16:29:48 +0800</pubDate><description><![CDATA[1.二叉树的层次遍历
描述
给定一个二叉树，返回该二叉树层序遍历的结果，（从左到右，一层一层地遍历）
示例
输入：{1,2,3,4,#,#,5}
返回值：[[1],[2,3],[4,5]]
题解：递归(前序遍历)
主要思路：前序遍历，中、左、右
左边的节点一定先于右边节点遍历到，加入至对应的数组中，满足层序遍历的要求；
要点：
1、利用一个level变量标记当前递归的深度，将节点的值push到当前深度的数组的后面；
2、level变量大于res数组的size，说明第一次进入二叉树本层，对res扩容；
//前]]></description><category></category></item><item><title><![CDATA[什么是内核对象]]></title><link>https://blog.youkuaiyun.com/weixin_45239587/article/details/120223379</link><guid>https://blog.youkuaiyun.com/weixin_45239587/article/details/120223379</guid><author>weixin_45239587</author><pubDate>Fri, 10 Sep 2021 15:38:49 +0800</pubDate><description><![CDATA[何为内核对象
作为 Windows软件开发人员,我们经常都要创建、打开和处理内核对象。系统会创建和处理几种类型的内核对象,比如访问令牌(access token)对象、事件对象、文件对象、文件映射对象、IO完成端口对象、作业对象、邮件槽(mailslot)对象、互斥量(mutex)对象、管道(pipe)对象、进程对象、信号量(semaphore)对象、线程对象、可等待的计时器(waitable timer)对象以及线程池工厂(thread pool worker factory)对象等。除了使用内核对象,.]]></description><category></category></item><item><title><![CDATA[C++基础知识（3）]]></title><link>https://blog.youkuaiyun.com/weixin_45239587/article/details/120205156</link><guid>https://blog.youkuaiyun.com/weixin_45239587/article/details/120205156</guid><author>weixin_45239587</author><pubDate>Thu, 09 Sep 2021 17:05:11 +0800</pubDate><description><![CDATA[析构函数为什么会定义为虚函数？
（1）析构函数定义为虚函数时：基类指针可以指向派生类的对象（多态性），如果删除该指针delete []p；就会调用该指针指向的派生类析构函数，而派生类的析构函数又自动调用基类的析构函数，这样整个派生类的对象完全被释放。
（2）析构函数不定义为虚函数时：编译器实施静态绑定，在删除基类指针时，只会调用基类的析构函数而不调用派生类析构函数，这样就会造成派生类对象析构不完全。
参考：https://blog.youkuaiyun.com/King_weng/article/details/892]]></description><category></category></item><item><title><![CDATA[《程序员的自我修养》内存]]></title><link>https://blog.youkuaiyun.com/weixin_45239587/article/details/120204997</link><guid>https://blog.youkuaiyun.com/weixin_45239587/article/details/120204997</guid><author>weixin_45239587</author><pubDate>Thu, 09 Sep 2021 17:02:48 +0800</pubDate><description><![CDATA[内容总结：

一般来讲,应用程序使用的内存空间里有如下“默认”的区域。
1. 栈:栈用于维护函数调用的上下文,离开了栈函数调用就没法实现。栈通常在用户空间的最高地址处分配,通常有数兆字节的大小。
2. 堆:堆是用来容纳应用程序动态分配的内存区域,当程序使用 malloc或new分配内存时,得到的内存来自堆里。堆通常存在于的下方(低地址方向),在某些时候,堆也可能没有固定统一的存储区域。堆一般比栈大很多,可以有几十至数百兆字节的容量。
3. 可执行文件映像:这里存储着可执行文件在内存里的映像,由装载器在装载时]]></description><category></category></item><item><title><![CDATA[《深入解析Windows操作系统》安全性]]></title><link>https://blog.youkuaiyun.com/weixin_45239587/article/details/120080690</link><guid>https://blog.youkuaiyun.com/weixin_45239587/article/details/120080690</guid><author>weixin_45239587</author><pubDate>Fri, 03 Sep 2021 14:15:48 +0800</pubDate><description><![CDATA[内容总结：

安全系统组件
以下是实现 Windows安全性的核心组件和数据库。
1.  安全引用监视器(SRM)
2. 本地安全权威子系统(LSASS)
3.  LSASS策略数据库
4. 安全账户管理器(SAM)服务
5. SAM数据库
6. 活动目录
7. 认证包
8. 交互式登录管理器
9. 登录用户界( LogonUI)
10. 凭证提供者
11. 网络登录服务( Netiogon
12. 内核安全设备驱动程序(KSecDD)
13.  AppLocker这是一种机制,它允许管理员指定哪些可执行文]]></description><category></category></item><item><title><![CDATA[《程序员的自我修养》Windows下的动态链接]]></title><link>https://blog.youkuaiyun.com/weixin_45239587/article/details/120080639</link><guid>https://blog.youkuaiyun.com/weixin_45239587/article/details/120080639</guid><author>weixin_45239587</author><pubDate>Fri, 03 Sep 2021 14:12:30 +0800</pubDate><description><![CDATA[内容总结：

导出表
当一个PE需要将一些函数或变量提供给其他PE文件使用时,我们把这种行为叫做符号导出(Symbol Exporting),最典型的情况就是一个DLL将符号导出给EXE文件使用。在 Windows PE中,所有导出的符号被集中存放在了被称作导出表(Export Table)的结构中。事实上导出表从最简单的结构上来看,它提供了一个符号名与符号地址的映射关系,即可以通过某个符号查找相应的地址基本上这些每个符号都是个ASCII字符串,我们知道符号名可能跟相应的函数名或者变量名相同,也可能不同,因]]></description><category></category></item><item><title><![CDATA[虚函数表与虚函数指针关系详解]]></title><link>https://blog.youkuaiyun.com/weixin_45239587/article/details/120080388</link><guid>https://blog.youkuaiyun.com/weixin_45239587/article/details/120080388</guid><author>weixin_45239587</author><pubDate>Fri, 03 Sep 2021 14:09:47 +0800</pubDate><description><![CDATA[虚函数表一个类一个吗?
1. 虚函数表属于类，类的所有对象共享这个类的虚函数表。
2. 不同对象虚函数表是一样的（虚函数表的第一个函数地址相同）；
3. 每个对象内部都保存一个指向该类虚函数表的指针vptr，每个对象的vptr的存放地址都不一样，但是都指向同一虚函数表。
如果一个类中含有虚函数，那么其虚函数表和虚函数指针的归属和存储位置如下所示

当一个对象调用了虚函数，实际的被调用函数通过下面的步骤确定：找到对象的 vptr 指向的 vtbl，然后在 vtbl 中寻找合适的函数指针。
虚函数表与虚函数指针]]></description><category></category></item><item><title><![CDATA[win32多线程编程之同步控制]]></title><link>https://blog.youkuaiyun.com/weixin_45239587/article/details/120045383</link><guid>https://blog.youkuaiyun.com/weixin_45239587/article/details/120045383</guid><author>weixin_45239587</author><pubDate>Wed, 01 Sep 2021 18:11:00 +0800</pubDate><description><![CDATA[临界区
在Win32程序中你可以为每一个需要保护的资源声明一个CRITICAL_SECTION类型的变量.这个变量扮演红绿灯的角色,让同一时间内只有一个线程进入 critical section， Critical section并不是核心对象.因此,没有所谓 handle这样的东西它和核心对象不同,它存在于进程的内存空间中.你不需要使用像Create这样的API函数获得一个 critical section handle.你应该做的是将一个类型为CRITICAL_SECTION的局部变量初始化方法是调用 ]]></description><category></category></item><item><title><![CDATA[C++开发基础知识（2）]]></title><link>https://blog.youkuaiyun.com/weixin_45239587/article/details/119948999</link><guid>https://blog.youkuaiyun.com/weixin_45239587/article/details/119948999</guid><author>weixin_45239587</author><pubDate>Fri, 27 Aug 2021 11:21:24 +0800</pubDate><description><![CDATA[volatile关键字一般出现在Java中，在C/C++中它的涵义是
volatile是java虚拟机提供的轻量级的同步机制，有三大特性：可见性，不保证原子性，禁止指令重排。
在C/C++中，volatile提醒编译器它后面所定义的变量随时都有可能改变，因此编译后的程序每次需要存储或读取这个变量的时候，都会直接从变量地址中读取数据。如果没有volatile关键字，则编译器可能优化读取和存储，可能暂时使用寄存器中的值，如果这个变量由别的程序更新了的话，将出现不一致的现象。
volatile的字面含义是易变的，]]></description><category></category></item><item><title><![CDATA[C++开发基础知识（1）]]></title><link>https://blog.youkuaiyun.com/weixin_45239587/article/details/119933556</link><guid>https://blog.youkuaiyun.com/weixin_45239587/article/details/119933556</guid><author>weixin_45239587</author><pubDate>Thu, 26 Aug 2021 16:05:31 +0800</pubDate><description><![CDATA[ping是什么原理?
ping 的原理
ping 程序是用来探测主机到主机之间是否可通信，如果不能 ping到某台主机，表明不能和这台主机建立连接。 ping 使用的是ICMP协议，它发送icmp回送请求消息给目的主机。ICMP协议规定：目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答，则认为主机可达。
ICMP协议是一种面向无连接的协议，用于传输出错报告控制信息.ICMP（Internet Control Message Protocol）Internet控制报文协议。它是TC]]></description><category></category></item><item><title><![CDATA[《深入解析Windows操作系统》第五章：进程，线程，作业]]></title><link>https://blog.youkuaiyun.com/weixin_45239587/article/details/119933448</link><guid>https://blog.youkuaiyun.com/weixin_45239587/article/details/119933448</guid><author>weixin_45239587</author><pubDate>Thu, 26 Aug 2021 15:55:22 +0800</pubDate><description><![CDATA[内容总结：

重难点笔记
进程的内部机理
数据结构
每个 Windows进程都是由一个执行体进程(EPROCESS)结构来表示的。 EPROCESS结构中除了包含许多与进程有关的属性以外还包含和指向了许多其他的相关数据结构。例如,每个进程都有一个或者多个线程,这些线程由执行体线程(ETHREAD)结构来表示， EPROCESS和相关的数据结构位系统空间中,不过,进程环境块(PEB)是个例外,它位于进程地址空间中(因为它包含一些需要由用户模式代码来修改的信息)。
受保护的进程
受保护进程可以由任何应用程序创建]]></description><category></category></item><item><title><![CDATA[《程序员的自我修养》之动态链接]]></title><link>https://blog.youkuaiyun.com/weixin_45239587/article/details/119933358</link><guid>https://blog.youkuaiyun.com/weixin_45239587/article/details/119933358</guid><author>weixin_45239587</author><pubDate>Thu, 26 Aug 2021 15:52:03 +0800</pubDate><description><![CDATA[内容总结：

重难点笔记
为什么要动态链接
内存和磁盘空间
静态链接这种方法的确很简单,原理上很容易理解,实践上很难实现,静态连接的方式对于计算机内存和磁盘的空间浪费非常严重。特别是多进程操作系统情况下,静态链接极大地浪费了内存空间。
程序开发和发布
空间浪费是静态链接的一个问题,另一个问题是静态链接对程序的更新、部署和发布也会带来很多麻烦。
动态链接
要解决空间浪费和更新困难这两个问题最简单的办法就是把程序的模块相互分割开来,形成独立的文件,而不再将它们静态地链接在一起。简单地讲,就是不对那些组成程序的目]]></description><category></category></item><item><title><![CDATA[牛客算法（１）]]></title><link>https://blog.youkuaiyun.com/weixin_45239587/article/details/119824744</link><guid>https://blog.youkuaiyun.com/weixin_45239587/article/details/119824744</guid><author>weixin_45239587</author><pubDate>Fri, 20 Aug 2021 15:38:08 +0800</pubDate><description><![CDATA[1.判断平衡二叉树
描述
输入一棵二叉树，判断该二叉树是否是平衡二叉树。
在这里，我们只需要考虑其平衡性，不需要考虑其是不是排序二叉树
平衡二叉树（Balanced Binary Tree），具有以下性质：它是一棵空树或它的左右两个子树的高度差的绝对值不超过1，并且左右两个子树都是一棵平衡二叉树。
注：我们约定空树是平衡二叉树。
示例1
输入：{1,2,3,4,5,6,7}
返回值：true
方法：自顶向下
判断一个数是否为平衡二叉树。平衡二叉树是左子树的高度与右子树的高度差的绝对值小于等于1，同样左子树是]]></description><category></category></item><item><title><![CDATA[力扣算法（2）]]></title><link>https://blog.youkuaiyun.com/weixin_45239587/article/details/119824546</link><guid>https://blog.youkuaiyun.com/weixin_45239587/article/details/119824546</guid><author>weixin_45239587</author><pubDate>Fri, 20 Aug 2021 15:29:14 +0800</pubDate><description><![CDATA[1.整数反转
给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ，就返回 0。
假设环境不允许存储 64 位整数（有符号或无符号）。
示例 1：
输入：x = 123
输出：321
解题：
只要能拿到这个整数的 末尾数字 就可以了。
以12345为例，先拿到5，再拿到4，之后是3，2，1，我们按这样的顺序就可以反向拼接处一个数字了，也就能达到 反转 的效果。
加载器负责的一些主要任务如下所列:
1.]]></description><category></category></item><item><title><![CDATA[《程序员的自我修养》可执行文件的装载与进程]]></title><link>https://blog.youkuaiyun.com/weixin_45239587/article/details/119807393</link><guid>https://blog.youkuaiyun.com/weixin_45239587/article/details/119807393</guid><author>weixin_45239587</author><pubDate>Thu, 19 Aug 2021 17:35:38 +0800</pubDate><description><![CDATA[内容总结：

重难点笔记：
可执行文件只有装载到内存以后才能被CPU执行。
进程虚拟地址空间
程序和进程：程序(或者狭义上讲可执行文件)是一个静态的概念,它就是一些预先编译好的指令和数据集合的一个文件;进程则是一个动态的概念,它是程序运行时的一个过程,很多时候把动态库叫做运行时( Runtime也有一定的含义。
我们知道每个程序被运行起来以后,它将拥有自己独立的虚拟地址空间(Virtual Address Space),这个虚拟地址空间的大小由计算机的硬件平台决定,具体地说是由CPU的位数决定的。硬件决定了]]></description><category></category></item><item><title><![CDATA[《深入解析Windows操作系统》之管理机制]]></title><link>https://blog.youkuaiyun.com/weixin_45239587/article/details/119807282</link><guid>https://blog.youkuaiyun.com/weixin_45239587/article/details/119807282</guid><author>weixin_45239587</author><pubDate>Thu, 19 Aug 2021 17:32:38 +0800</pubDate><description><![CDATA[内容总结：

内容重难点笔记：
注册表
注册表是windows操作系统、硬件设备以及客户应用程序得以正常运行和保存设置的核心“数据库”，也可以说是一个非常巨大的树状分层结构的数据库系统。
注册表记录了用户安装在计算机上的软件和每个程序的相互关联信息，它包括了计算机的硬件配置，包括自动配置的即插即用的设备和已有的各种设备说明、状态属性以及各种状态信息和数据。利用一个功能强大的注册表数据库来统一集中地管理系统硬件设施、软件配置等信息，从而方便了管理，增强了系统的稳定性。
注册表文件的数据信息保存在system.]]></description><category></category></item></channel></rss>