尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

360 Windows开发笔试题解析:从C++内存到消息循环的考点地图

360 Windows开发笔试题解析:从C++内存到消息循环的考点地图 1. 这套2019年的笔试题为什么今天还有人翻出来刷每年校招季都能在牛客网、应届生论坛看到有人发帖问“360公司-2019校招笔试-Windows开发工程师客观题合集还值得刷吗”我的回答通常很直接值得而且不是让你背答案是让你拿它当一张考点地图。你可能会奇怪2019年的题放到今天微信都换了几个版本了一套老笔试怎么还有参考价值原因是Windows开发工程师这个岗位的考察框架特别稳定。C内存布局、进程线程同步、消息循环、PE结构、TCP状态变迁这些底层机制只要Windows体系还在就永远是笔试的核心考点。技术框架会过时但操作系统和语言底层的规律不会。这套题适合谁主要是两类人。一类是准备校招或暑期实习的应届生方向是Windows客户端、桌面应用、系统工具、安全开发另一类是社招刚转岗、基础知识有点生疏的工程师拿它做一次快速体检。它的优点是客观题占比高覆盖面广做完一遍你对“自己哪里不会”会有一个非常清晰的认知。缺点也很明显——如果只记答案不追原因做完等于没做。先说清楚360的Windows开发工程师在做什么你才能理解这套题的出题逻辑。360的客户端产品线很庞大安全卫士、浏览器、软件管家、驱动和内核组件每一块都需要有人做开发维护。这些岗位的共同点是对C基础、Windows底层机制、操作系统原理要求极高。所以笔试不考花哨的框架不考最新的语言特性而是大量用选择题探你的地基深度。客观题多说明他们想在有限时间内快速刷掉一批基础不扎实的人筛人的逻辑是靠覆盖面而不是单点深挖。1.1 一份笔试合集背后的岗位画像从岗位JD反推360对Windows开发工程师的期待大概是这样的能熟练使用C/C写客户端逻辑理解Windows消息机制和UI线程模型能处理多线程并发问题对进程内存模型和PE加载流程有概念还要有基本的网络和安全素养。这五点几乎直接映射到笔试的各个模块里。所以你会发现这套题的考察矩阵非常规整大体可以分成六个方向考察领域高频考点客观题常见出题形式C/C指针与引用、内存对齐、虚函数表、构造析构顺序、STL给一段代码问输出或问sizeof结果操作系统进程线程区别、同步互斥、死锁、调度算法场景判断、信号量计算Windows编程消息循环、SendMessage/PostMessage、虚拟内存、DLL问机制差异考理解不考记忆数据结构与算法复杂度、排序、查找、链表操作复杂度计算、边界情况判断网络基础TCP三次握手/四次挥手、Socket模型状态变迁顺序、API调用顺序安全基础缓冲区溢出原理、PE结构、Hook方式原理解析型选择题这张表是复习时的索引。做完一套题把错题标记到对应方向基本就能定位出你的薄弱模块。我个人刷这份合集的时候最深的感受是这套题不搞偏题怪题几乎每一道都能在经典教材里找到出处但如果你只背了结论没理解推导过程做的时候会非常难受。1.2 客观题不只是考API所有选择题背后都有一串知识链客观题容易给人一种错觉——不就是选ABCD吗实际上Windows开发方向的客观题大多数是“披着选择题外衣的简答题”。它不满足于你知道某个API叫什么名字而是要求你理解它背后的机制。举个例子考消息循环的时候题目可能只问SendMessage和PostMessage的区别但如果你想答对至少要把“队列消息、非队列消息、线程消息队列、窗口过程”这一整条链路搞清楚。这就是知识链。所以我的建议是刷这套题时换一个姿势不要先看答案先尝试自己说服自己每个选项为什么对、为什么错。如果你能用两三句话解释清楚这道题才是真会了如果只能凭感觉选那这个知识点就是你的盲区赶紧回去翻书。这套2019年的客观题合集本质上是在帮你画知识地图而不是给你押题。2. C对象模型与内存类选择题看似送分实际是筛人的第一道闸C是Windows开发的绝对主力语言笔试里C相关题目通常占四分之一以上而且往往排在前面。这类题表面上是“基础题”实际上是最先拉开差距的板块。有一部分人靠语感能做出五六成但剩下那四五道关于内存布局、虚函数调用、构造析构顺序的题才是真正筛选高手的地方。2.1 高频考点拆解结构体对齐、虚表、构造析构顺序我在整理这套笔试题的错题笔记时把C客观题的高频考点分成了五类指针和引用const修饰、指针自增自减、引用是否可重新绑定内存布局结构体/类的大小、成员变量偏移、虚函数表指针位置构造与析构继承体系下构造析构顺序、拷贝构造、移动语义虚函数动态绑定条件、析构函数是否虚函数、构造函数中调用虚函数STL容器vector扩容机制、map底层红黑树、迭代器失效场景这套题的特点是不会直接问“虚函数是什么”而是给一段代码、一个场景让你判断输出或内存布局。它考的是你有没有真正写过、调试过C程序而不是背过八股文。结构体对齐是几乎每年必考的题因为它既考察C对象模型又能顺带看出你有没有处理过网络协议、二进制文件的实战经验。另一个高频点是“构造函数中调用虚函数”这个我在后面会单独讲。2.2 代表题解析一次内存对齐计算的完整推导这类题在客观题里的典型样式如下按当年笔试题风格整理非原题复现// 32位系统默认4字节对齐 struct Node { char a; // 1 byte int b; // 4 bytes short c; // 2 bytes char* p; // 4 bytes };问 sizeof(Node) 等于多少。选项通常是 A. 11 B. 12 C. 16 D. 20。这道题的完整推导过程是这样的。结构体成员从偏移0开始布局char a占1字节偏移0int b要求4字节对齐所以a后面填充3个字节b从偏移4开始占4字节结束于偏移8short c占2字节从偏移8开始占2字节结束于偏移10char* p在32位系统下是4字节要求4字节对齐而当前偏移是10不满足4的倍数必须填充2字节到偏移12然后p占4字节结束于偏移16。结构体总大小要等于最大对齐数这里是4的整数倍16正好满足。所以答案是C16。如果你按自然字节数去算142411会误选A这是出题人最想看到的错误。真实开发中很多人自定义协议结构体时忘了对齐导致收发双方解析不一致踩过的都会懂。如果换成64位系统char*变成8字节最大对齐数也变成8重新演算后结果会变成24。笔试里经常把“32位/64位”和“默认对齐/pragma pack”组合起来出题做题时一定要先看清位数和对齐方式。2.3 容易被忽略的陷阱构造函数里调用虚函数这道题我每次讲C笔试都会拿出来说因为正确率特别低class A { public: A() { foo(); } virtual void foo() { std::cout A; } }; class B : public A { public: void foo() override { std::cout B; } }; int main() { A* p new B(); p-foo(); return 0; }问程序输出什么。很多人一看“p指向B对象foo是虚函数动态绑定”直接选输出“BB”。正确答案是“BA”。原因是构造B对象时会先构造基类部分也就是调用A的构造函数。在A的构造函数执行期间派生类B还没有构造完成对象的动态类型被认为是A虚表指针指向的是A的虚表。所以在基类构造函数中调用虚函数会被静态解析为当前类的实现不会下转到派生类。构造完成之后p-foo()才真正走虚表调用B::foo()。这个知识点之所以是经典陷阱是因为它要求你同时理解“对象构造过程”和“虚函数动态绑定的实际机制”两者缺一不可。同样的道理也适用于析构函数——基类析构函数中调用虚函数同样不会进入派生类版本。备考时把这个点记牢选择题只要出现“构造/析构中调用虚函数”的选项基本可以直接锁定答案。3. 进程线程与同步机制笔试里的操作系统题十有八九是换皮考法操作系统这一块校招笔试题的出题风格非常统一概念题少场景题多。它很少直接问你“进程和线程的区别是什么”而是给你一个并发场景问哪里会出问题、怎么解决。刷这套客观题合集时操作系统题几乎可以看成“数据结构题”——核心考点就那么几个换着包装反复出。3.1 进程、线程、纤程的区别是选择题常客先说基础。进程是资源分配的基本单位每个进程有独立的虚拟地址空间包括代码段、数据段、堆、栈、内核句柄表等。线程是CPU调度的基本单位同一进程内的线程共享进程的地址空间、文件句柄、全局变量但每个线程有自己独立的栈和寄存器上下文。纤程Fiber是用户态管理的执行单元由程序自己调度内核完全不感知笔试里偶尔出现知道它“用户态调度、切换开销最小”就够了。选择题经常这样出关于进程和线程下列说法正确的是正确选项通常是“同一进程内线程切换不需要切换页表因此比进程切换开销小”。错误选项会故意写成“线程拥有独立的地址空间”“线程之间不能共享全局变量”“进程切换不需要进入内核态”等等。这个考点很基础但如果对“线程切换为什么比进程切换快”背后的机制理解不深很容易被选项绕进去。这里可以类比一下进程就像一家公司线程就像公司的员工。公司共用同一栋楼地址空间、同一个财务系统全局变量但每个员工有自己的工位和抽屉栈。换一家公司办公要重新搬家、重新布置切换地址空间员工换工位就简单多了不用搬整栋楼。这个类比能帮你快速建立画面感。3.2 同步机制对比CriticalSection、Mutex、Semaphore、Event多线程同步是Windows开发笔试的重点也是实际开发中的高频问题。Windows下的同步手段很多我建议用一张表记住它们的本质区别机制是否内核对象是否可跨进程支持超时典型用途CriticalSection否否有限支持可设置自旋同进程内短临界区保护Mutex是是是进程间互斥比如单实例程序Semaphore是是是资源计数控制比如连接池Event是是是事件通知比如线程唤醒Condition Variable否否是配合锁实现复杂等待条件选择题经常问“下列哪个同步对象可以跨进程使用”。答案通常是Mutex、Semaphore、Event而CriticalSection和Condition Variable不行。另一个常见问法是“多个线程需要互斥访问一段临界区且要求等待超时应该使用什么”。这种就需要选带内核对象的Mutex或Semaphore因为CriticalSection在内核模式下也支持超时但严格来说它在用户态没有完整超时机制笔试通常不会选它。信号量这个考点要单独说因为它考的是计数逻辑。你可以把信号量想象成一个餐厅的座位数初始有N个座位资源数每来一位客人可用座位减1客人走了座位数加1。如果座位已经满了新客人就要等。对应到Windows APIWaitForSingleObject就是在“等座位”ReleaseSemaphore就是在“释放座位”。笔试里的信号量题基本都是这个模型只不过把座位换成缓冲区空位、数据库连接、打印机任务等。3.3 代表题解析生产者消费者信号量怎么设计才不死锁生产者和消费者问题是客观题里的长青树。典型题目是这样的一个容量为N的缓冲区生产者往里面放产品消费者从里面取产品需要用信号量实现同步问以下哪组P/V操作顺序是正确的或者问“如果消费者把P操作顺序反过来会发生什么”。正确的写法是// 伪代码重点看P/V顺序 Semaphore empty N; // 缓冲区还有多少空位 Semaphore full 0; // 缓冲区有多少产品 Semaphore mutex 1; // 保护缓冲区本身的互斥锁 // 生产者 P(empty); // 等空位 P(mutex); // 进入临界区 // 放入产品 V(mutex); // 离开临界区 V(full); // 产品数1 // 消费者 P(full); // 等产品 P(mutex); // 进入临界区 // 取出产品 V(mutex); // 离开临界区 V(empty); // 空位1关键的坑在顺序必须“先P资源信号量再P互斥信号量”。如果把消费者这边改成“先P(mutex)再P(full)”缓冲区为空时会发生什么消费者拿到mutex进入临界区然后发现full为0开始等产品。与此同时生产者想放产品必须先P(empty)但如果缓冲区没满empty是大于0的这一步能过接着生产者尝试P(mutex)发现mutex被消费者拿着于是生产者等待消费者释放mutex。消费者在等产品生产者又在等mutex双方互不相让死锁。一个大厂笔试题经常把这个过程包装成“消费者把P操作顺序反了生产者会卡在哪一步”答案就是“卡在P(mutex)”。另一道同样经典的题是“多个线程对共享变量int x执行x一万次理论上最终结果可能是多少”正确答案是“可能小于10000”。原因是x不是原子操作它在汇编层面至少对应“读取x到寄存器、寄存器加1、写回x”三条指令线程可能执行完“读取”后被切走另一个线程也读了旧值结果两个线程各加一次但只写回一次。这道题在Windows笔试中出现频率极高因为它是“竞态条件”最直观的例子也直接关联到Windows开发里volatile的作用边界——volatile并不能解决这个问题它只保证编译器不优化重排不保证原子性。3.4 死锁四条件的变形考法死锁的四个必要条件——互斥、持有并等待、不可剥夺、循环等待——几乎年年考。题目一般不会让你背诵而是给一个具体措施问它破坏了哪个条件。比如“要求进程一次性申请所有需要的资源否则就等待”破坏的是“持有并等待”“允许系统强行抢占已分配的资源”破坏的是“不可剥夺”“所有资源按编号顺序申请”破坏的是“循环等待”。这种题要想拿满分做题时不要只盯着“选对”要顺手把四个条件都对照一遍哪怕题目只问了一个。因为很多笔试题是多选题选项可能同时包含“破坏持有并等待”和“破坏循环等待”这种组合。“互斥”这个条件是大多数资源无法避免的所以真题很少以“破坏互斥”作为正确答案。如果你看到某个选项声称“通过共享资源来破坏互斥”基本可以判断是错的。银行家算法偶尔也会在选择题里出现一般考“安全性检测”的思路不考具体运算步骤。复习时知道它属于“死锁避免”能区分死锁预防、死锁避免、死锁检测三类手段就够了。4. 消息循环、虚拟内存和PE结构Windows特色题的重灾区如果说出题人想从C和操作系统题里看到你的“通用基础”那Windows特色题就是用来区分“学过Windows编程”和“真正做过Windows开发”的。这套客观题合集里消息循环、虚拟内存、PE结构这几块是重头戏而且难度梯度很清晰。4.1 消息循环不是玄学队列消息与非队列消息Windows窗口程序的消息机制是笔试选择题最喜欢出细节的地方。最经典的一道题就是问SendMessage和PostMessage的区别正确理解是这样SendMessage是同步调用。如果目标窗口属于当前线程它会直接调用该窗口的窗口过程不经过消息队列如果目标窗口属于其他线程当前线程会阻塞直到目标线程处理完消息。所以SendMessage的“发送”本质上是跨线程同步调用。PostMessage是异步投递。它把消息放到目标线程的消息队列后立即返回不等待消息被处理。GetMessage从消息队列取消息但如果队列为空它会阻塞。PeekMessage则是立即返回适合做后台循环。选择题里常出现的错误选项有“SendMessage和PostMessage都会阻塞”、“PostMessage只能由UI线程调用”、“SendMessage一定比PostMessage慢”、“GetMessage只有在收到WM_QUIT时才返回”。其中“GetMessage只有在收到WM_QUIT时才返回”是从返回值角度说的严格讲GetMessage收到WM_QUIT时返回0表示退出消息循环但收到其他消息时返回非0所以这个表述本身有细微区分做题时要注意看题目问的是“返回值是否为0”还是“是否阻塞等待”。笔试还会考消息类型鼠标键盘消息是从系统消息队列分发到线程消息队列的WM_PAINT和WM_TIMER是低优先级消息PostMessage投递的是普通队列消息。窗口过程对消息的处理是串行的所以任何耗时的操作都不应该直接放在窗口过程里否则UI会卡死。这个知识点在选择题里经常以“如何避免界面卡顿”的形式出现正确答案一般涉及“使用工作线程处理耗时任务再PostMessage回传结果”而不是“在窗口过程中加一个死循环等结果”。4.2 虚拟内存与Windows内存模型地址空间怎么分布Windows的每个进程都有自己独立的虚拟地址空间。32位系统下默认用户态2GB内核态2GB64位系统下用户态空间大幅扩大。经典选择题是“以下哪些数据存放在栈上哪些存放在堆上哪些存放在全局区”局部变量在栈上动态分配的内存在堆上全局变量/静态变量在全局区字符串字面量通常在只读数据区代码段放指令。这个考点虽然基础但和真实的Windows内存管理结合起来就会出现一些稍复杂的变体。比如内存映射文件Memory-Mapped File它是Windows里非常实用的机制把一个文件映射到进程的地址空间读写文件就像读写内存。笔试里它常被用来“埋坑”题目问“两个进程之间高效共享大量数据应该选哪种方式”正确答案是内存映射文件而不是全局变量或本地Socket。这里还顺带考Windows的内存保护属性PAGE_NOACCESS、PAGE_READONLY、PAGE_READWRITE、PAGE_EXECUTE、PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITE。DEP数据执行保护相关的选择题几乎必出题干一般是“现代Windows默认不允许栈上执行代码是为了防御哪种漏洞”答案就是缓冲区溢出类攻击。我刷这套题时的一个体会是虚拟内存这块如果只是看书很容易飘不如在WinDbg里实际敲一遍 !address 或 !vprot看看进程地址空间里各种区域是怎样排布的。笔试选择题里那些“栈向下增长、堆向上增长”的说法只有亲眼见过才记得牢。4.3 PE结构为什么出现在Windows开发笔试里很多人第一次看到PE结构相关题目会愣一下这不是安全岗才考的吗实际上Windows下做任何“稍微底层一点”的开发都会碰到PE。DLL加载、Hook、反调试、崩馈转储分析、软件保护全部依赖PE结构。PE文件的基本结构是这样一条链DOS头MZ签名- e_lfanew字段指向PE头 - PE签名 - COFF文件头 - 可选头Optional Header- 节表 - 各个节的数据.text代码、.data数据、.rdata只读数据、.reloc重定位信息等。加载器把PE文件映射到内存时会按节表描述把每个节的原始数据复制到内存中对齐到页面边界然后处理重定位和导入表最后跳转到入口点。选择题最常考的字段有两个AddressOfEntryPoint程序入口点RVA通常指向.text节和ImageBase模块加载的优先基址。另一道高频题是“DLL的入口函数是哪个”答案是DllMain。在这套题里PE结构通常和进程加载机制一起考比如问你“Windows程序启动时系统按什么顺序加载DLL”答案涉及导入表、静态依赖和动态加载LoadLibrary的区别。我的建议是复习PE结构不要死记字段名而是打开一个真实的exe或dll看一眼。Visual Studio自带dumpbin工具命令行执行 dumpbin /headers 或者 dumpbin /imports就能看到DOS头、PE头、导入表等实际信息。CFF Explorer这类图形工具也可以。看了真实结构之后再做选择题会轻松很多因为你脑子里有图。4.4 工具辅助理解用Process Explorer和WinDbg亲眼验证备考刷题时很多人只背结论导致选择题一变场景就懵。Windows开发笔试里的机制题最好配合工具做一轮实际验证。我的做法是本地装一个Process Explorer做崩溃分析时用WinDbg打开dump文件用 !analyze -v 看崩溃发生在哪个模块再回溯调用栈。这个过程能帮你把消息机制、虚拟内存、PE加载这些零散知识点串成一条完整的知识链。比如你可以在WinDbg里开一个notepad.exe的dmp看它的模块加载地址、栈分布、堆信息再对比题目里那些“地址空间分布”选项印象会深很多。刷题刷累了做这些实操既是休息也是加深理解。5. 网络协议与安全基座360笔试里那股不一样的味道360是一家以安全起家的公司所以它的Windows开发工程师笔试里安全和网络基础题的比例比一般客户端公司要高。这类题不难但带着明显的安全视角备考时不能忽略。5.1 TCP状态题主动关闭方会走哪些状态TCP状态变迁图是网络基础题的常客。最典型的一道题是“在TCP四次挥手中主动关闭连接的一方会经历哪些状态顺序如何”正确的状态序列是ESTABLISHED - FIN_WAIT_1 - FIN_WAIT_2 - TIME_WAIT - CLOSED。这里有几个常被选项构造的错误点。第一CLOSE_WAIT是被动关闭方收到FIN后进入的状态不是主动方的状态第二LAST_ACK也是被动方在发送完FIN后等待最终ACK的状态主动方不会进入第三TIME_WAIT停留时间是2MSL目的是确保最后一个ACK能到达对端以及让旧的连接数据包在网络中消逝。选择题经常会问“TIME_WAIT为什么需要等2MSL”或“哪个状态由被动关闭方进入”答对的前提是把四次挥手的完整流程画出来。另一个高频题是三次握手的序列号语义SYN消耗一个序号ACK不消耗序号。做题的时候可以当场推演一遍客户端发送SYN序号为x服务端回复SYNACK序号为y确认号x1客户端再发ACK确认号y1。如果选项里出现“确认号是x”或“SYN不消耗序号”就能立刻排除。5.2 Socket选择题阻塞、非阻塞、异步之间的区别Windows网络编程笔试题绕不开Socket模型。选择题通常有两种出法一种是考API调用顺序比如TCP服务端必须先bind再listen再accept选项里故意把listen和bind对调另一种是考IO模型区别比如阻塞Socket、非阻塞Socket、异步Socket、完成端口IOCP。关于IOCP你不需要知道每个API的具体参数但要能回答“它为什么在高并发下性能好”。核心原因是IOCP把IO完成通知交给内核通过线程池处理完成包避免了“一个连接一个线程”这种模型的线程频繁创建和上下文切换开销。选择题里出现“下哪种模型最适合处理大规模并发连接”优先选IOCP。还要知道IOCP是Windows专属Linux对应的是epoll这个对比也常常出现在笔试中。涉及阻塞和非阻塞要能分清错误处理方式阻塞Socket在没数据时read会一直等待非阻塞Socket会立即返回错误码通常是WSAEWOULDBLOCK代码里需要继续等待可读事件或者配合select/WSAEventSelect/WSAAsyncSelect使用。5.3 安全特色题栈缓冲区溢出是怎么发生的安全题是这套笔试里的“点睛”。最重要的是栈缓冲区溢出的原理栈在内存中向下增长但缓冲区是向上填充的。函数栈帧里局部变量缓冲区位于栈较低地址保存的返回地址位于栈较高地址。当程序向缓冲区写入超长数据时数据从低地址向高地址覆盖就可能覆盖到保存的返回地址和EBP。函数结束返回时CPU会跳转到攻击者篡改后的地址从而执行任意代码。选择题常问“现代Windows编译器开启/GS参数后缓冲区与返回地址之间会插入什么”答案是随机Cookie也叫安全校验值函数返回前会校验Cookie是否被篡改。另一个变形题是“DEP为什么能缓解栈溢出”正确答案是DEP不让栈上的数据作为代码执行所以即使返回地址被覆盖攻击者也很难直接在栈上执行shellcode。这两道题都是安全方向的必背点。DLL注入也是安全向选择题的常见方向问你以下哪种方式不属于DLL注入手段。常见的方式包括SetWindowsHookEx注入、CreateRemoteThread LoadLibrary、AppInit_DLLs注册表项、以及通过消息钩子或COM劫持等。这个知识点对理解Windows客户端安全防护机制有帮助复习时知道每种方式的触发条件就能应对选择题。6. 我的备考清单与踩坑复盘从刷真题到接Offer的实操路径最后这部分不是讲知识点而是讲怎么把这份笔试合集转化成实战能力。毕竟刷题不是目的通过笔试拿到面试机会才是。6.1 备考环境在Windows上搭一套完整的刷题与实验环境很多人备考Windows开发却只在浏览器里做选择题这远远不够。我建议你提前把本地环境搭好笔试前至少在上面跑过一轮实验。操作系统层面Windows 10或11都行。装一个Visual Studio选上“使用C的桌面开发”工作负载用cl.exe编译C题。如果笔试的在线OJ是Linux环境建议再装一个WSL 2练Linux下的g编译和gdb调试。命令行操作要熟练到至少能完成目录切换、查看进程、查看网络状态这些基础操作。记住几个常用命令tasklist查看进程、netstat查看端口、ipconfig查看网卡信息、sfc /scannow检查系统文件。命令行的熟练度在笔试里不会直接考但在面试手写代码时能侧面体现功底。中间件这层可以用Docker Desktop在Windows上快速搭一套Redis和MySQL。虽然笔试不直接考Redis安装但Windows开发工程师多少要了解进程间通信和高并发缓存的基本玩法。Docker在Windows上运行在WSL 2后端本地调试验证端口映射时要注意容器端口和Windows宿主端口的区别。万一笔试或面试聊到中间件你有真实环境用过Redis、MySQL比只背面试题要有说服力。调试工具是Windows开发的必修课。至少要学会用Visual Studio的断点调试看变量、调用栈用WinDbg打开崩溃dump文件用Process Explorer查看进程的模块列表、句柄和线程信息。这套工具链配合4.3提到的dumpbin和CFF Explorer基本能覆盖笔试涉及的所有Windows底层机制验证。6.2 三轮复习时间线从基础到真题到模拟我帮身边的学弟学妹规划过类似备考通常按三到四周设计每周一个阶段。第一周是基础夯实C重点过结构体对齐、虚函数、构造析构、智能指针操作系统重点过进程线程、同步互斥、死锁Windows编程重点过消息机制、虚拟内存、DLL。《Windows核心编程》不需要全读挑第4章进程、第6章线程、第7章同步、第9章内存管理、第20章DLL这几章精读就够了。太多人一上来就想
返回列表