最近面试遇到的Windows相关的题目
上周准备在公司内部转岗,面了3个部门windows客户端相关的工作,最终拿到3个Offer,主要涉及C++和Windows两大块内容,C++的题目基本都答上了,Windows一直都是我的弱项,在这里记录一下Windows相关的题目。有些答不上的问题就没列出来,还有些问题忘了,下面的答案有些大部分是我自己的理解,有些是直接从网上copy的,有问题大家可以讨论。
1:GetMessage和PeekMessage的区别?
GetMessage:获取消息队列中的一个消息,存入MSG中,并从消息队列中移除,如果消息队列中没有消息就会阻塞;
PeekMessage:查看消息,有消息,就将数据存入MSG结构中,没有消息就返回FALSE,不会阻塞,但如果没有更新区,可以移除WM_PAINT消息,还可以通过最后一个参数来决定是否从队列中移除查看的消息;
2:SendMessage和PostMessage的区别?怎么跨线程发消息?怎么跨进程发消息?SendMessage在进程间发消息要注意什么?SendMessage能将消息发送到消息队列吗?PostMessage可以在进程间发消息吗?两个线程互相SendMessage会出问题吗?
SendMessage:将一个消息发送到指定窗口的窗口过程中,等窗口过程执行完了再返回;
PostMessage:将消息发送到指定窗口所在线程的消息队列中,直接返回,消息是否被处理完全不知道;
SendMessage直接调用窗口过程,那它是否可以将消息发送到发送到线程的消息队列中呢?
可以啊,比如发送一个WM_PAINT消息,这是一个队列消息,只有存在无效区域的情况下,才会处理WM_PAINT消息;
线程间SendMessage,由于它基本就是调用指定窗口的窗口过程,当跨线程发消息的时候,无法调用指定窗口的窗口过程,在跨线程发送;
消息的时候,发送线程会先挂起,由系统线程将消息发送到接收线程的另一个队列中,并设置QS_SENDMESSAGE标志,当系统检测到这个标志后,就会处理这个队列的消息,当这个消息被处理之后,调用SendMessage的线程就会被唤醒,就继续执行。
SendMessage是可以跨进程发消息的,通过FindWindow找到对方进程的窗口句柄,发一个消息过去就行了,由于两个进程间的内存是完全独立的,不能发指针,如果要发数据,就用WM_COPYDATA。
PostMessage可以在进程间发消息,但不能结合WM_COPYDATA使用,WM_COPYDATA通过内存映射在进程间传递数据,PostMessage后映射文件的句柄就无效了。
两个线程互相SendMessage可能会导致死锁,A线程锁住一个资源,向B线程发一个消息,A线程挂起,这时如果B线程在处理A线程的消息需要A线程锁住的资源,A由于发给B的消息还没有处理完就一直不能返回,锁也没有打开,B线程又用不了,消息也就处理不完,结果就死锁了。
3:Windows是怎么实现窗口刷新的?怎么实现窗口的立即刷新?
Update Region不为空时,系统就会自动产生WM_PAINT消息,通过InvalidateRect和InvalidateRgn可把指定的区域加到窗口的Update Region中,通过处理WM_PAINT消息来实现窗口的刷新。 系统为什么不在调用Invalidate时发送WM_PAINT消息呢?又为什么非要等应用消息队列为空时才发送WM_PAINT消息呢?这是因为系统把在窗口中的绘制操作当作一种低优先级的操作,于是尽可能地推后做。不过这样也有利于提高绘制的效率:两个WM_PAINT消息之间通过InvalidateRect和InvaliateRgn使之失效的区域就会被累加起来,然后在一个WM_PAINT消息中一次得到更新,不仅能避免多次重复地更新同一区域,也优化了应用的更新操作。
如果窗口更新的区域不为空,UpdateWindow函数通过发送一个WM_PAINT消息来更新指定窗口的客户区。函数绕过应用程序的消息队列,直接发送WM_PAINT消息给指定窗口的窗口过程,如果更新区域为空,则不发送消息。
WM_PAINT一般在消息队列中没有消息的时候才处理,有时候我们需要立即刷新窗口,那么就需要UpdateWindow函数了,直接绕过消息循环,只要更新区域不为空,将WM_PAINT消息直接发送到指定窗口过程即可。
Invalidate(hwnd); //将窗口设为不可用,导致更新区域不为空
UpdateWindow(hwnd); //立即刷新窗口
4:Windows消息循环有哪几个函数,各自的作用是什么?消息循环是怎么退出的?
while(GetMessage(&msg, NULL, 0, 0)) //获取一个消息,成功后会放在msg中。
{
TranslateMessage(&msg); //消息进行必要的处理转换。
DispatchMessage(&msg); //调用WinProc,将msg的各项信息传递给WinProc
}
当GetMessage获取到的消息是WM_QUIT,返回的就是FALSE,while循环就退出了,消息循环也就终止了。
5:句柄是什么?
句柄就是一个整数,Windows为每一个控件指定了一个唯一的整数,通过这个整数和相关函数操作控件。
6:Windows实现线程间同步有哪些方法?实现进程间同步又有哪些方法?读写锁的实现原理是什么?
1:volatile
2:关键段
3:旋转锁
4:读写锁
5:事件对象
6:信号量
7:互斥量
只要是内核对象,就能用于进程间的同步,内核对象不属于任何进程,由系统管理。
读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数。写者是排他性的,一个读写锁同时只能有一个写者或多个读者
(与CPU数相关),但不能同时既有读者又有写者。我觉得他其实就是对关键段和内核事件对象的封装。写的时候独占,读的时候共享。
7:模态窗口的实现原理?模态窗口会导致崩溃吗?
模态窗口其实就是在当前窗口调用系统的消息循环,响应用户的操作,将相关的消息发送到对应的窗口。将父窗口设为不可用,即不能响应用户的操作,在关闭当前窗口的时候,将父窗口设为可用,并退出消息循环。
可能导致窗口崩溃,模态窗口显示的时候,除了父窗口不可用之外,其他的窗口都是可用的,如果需要的一个资源在别的地方被释放了,而在模态窗口中使用的时候,没有判断可能就会导致崩溃。
8:你了解沙箱,UAC相关的知识吗?
不了解
9:怎么实现线程间发消息?线程的消息队列默认会创建吗?
SendMessage可以再线程间发消息,PostThreadMessage通过线程ID可以在线程间发消息,将消息发送到指定线程的消息队列中。线程的消息队列默认是不会创建的,因为线程的消息队列并不是必须的。通过ResumeThread(threadHwnd);可以创建线程的消息队列。
10:说说Windows的内存管理,怎么实现内存共享?
FileMapping用于将存在于磁盘的文件放进一个进程的虚拟地址空间,并在该进程的虚拟地址空间中产生一个区域用于“存放”该文件,这个空间就叫做 File View,系统并同时产生一个File Mapping Object(存放于物理内存中)用于维持这种映射关系,这样当多个进程需要读写那个文件的数据时,它们的File View其实对应的都是同一个File Mapping Object,这样做可节省内存和保持数据的同步性,并达到数据共享的目的。
第四轮面试官:如果加班严重你来吗?
阿汉:不来
第四轮面试官:你确定吗?
阿汉:确定
第四轮面试官:我没有问题了,你还有什么要问的吗?
接下来是第五轮面试……我只是内部转岗啊,面了五轮整整四个小时,最后哥还是从了这个部门。
最近面试遇到的Windows相关的题目的更多相关文章
- 面试10大算法汇总+常见题目解答(Java)
原文地址:http://www.lilongdream.com/2014/04/10/94.html(为转载+整理) 以下从Java的角度总结了面试常见的算法和数据结构:字符串,链表,树,图,排序,递 ...
- Windows相关
PE WIndows 相关知识 windows 主机防护
- 【系统】Windows相关软件下载
Windows相关软件下载 Visual Studio Windows SQL Server https://my.visualstudio.com/Downloads/Featured?mkt=zh ...
- PHP面试出场率较高的题目<转载>
--------------------PHP部分--------------------- PHP中几个输出函数echo,print(),print_r(),sprintf(),var_dump() ...
- 【转】SVN linux命令及 windows相关操作(三)
TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具.通过使用它,我们可以可视化的管理我们的版本库.不过由于它只是一个客户端,所以它不能对版本库进行权限管理. TortoiseS ...
- 【转】SVN linux命令及 windows相关操作(二)
转自这里:http://www.uml.org.cn/pzgl/200904246.asp 1 安装及下载client 端 2 什么是SVN(Subversion)? 3 为甚么要用SVN? 4 怎么 ...
- Python使用wmi获取Windows相关信息
在使用Python获取Windows系统上的相关的信息可以使用WMI接口来获取, 什么是wmi? WMI是一项核心的Windows管理技术,WMI作为一种规范和基础结构,通过它可以访问.配置.管理和监 ...
- 面试 -- 关于Activity的相关知识
本篇文章就是记录关于简单的Activity中的问题 问题一:当Activity中存在两个注册的Activity都是主界面的话,应用程序会报错吗?如果不报错,会把那个Activity当做主界面执行 &l ...
- java面试(2)--大数据相关
第一部分.十道海量数据处理面试题 1.海量日志数据,提取出某日访问百度次数最多的那个IP. 首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中.注意到IP是32位的,最多有个2^ ...
随机推荐
- ASP.NET 获取不同frame中的控件
最近在做网站时遇到一个问题,需要获取不同frame中的控件,请教了一些同事,他们都说是无法取到的, 在网上查找了很多资料,找到了解决方法,现在整理一下当初的解决思路: 1.我需要在mainFrame中 ...
- N皇后
#include <stdio.h> #include <math.h> ], a[]; /*int place(int k) { for(int i = 1; i < ...
- Debian 8 最小化系统安装muduo
最近开始学习陈硕的muduo C++ Linux多线程网络库,首先当然是要安装.其间遇到过不少问题,最后不能说都解决了,只能说找到了一条不会遇到什么问题的路线.总结起来是两点: 注意各软件之间要版本匹 ...
- [php-composer] how to install composer in windows
Composer Setup 1. Choose the command-line PHP you want to use.选择使用可以命令行的PHP程序 2. proxy Settings - ch ...
- plsql基础
语法:declare-->声明变量 begin-->执行部分 exception-->异常 end-->结束 / 最简单的程序:begin null; end; 输出语句:DB ...
- Asp.Net Web API 2第七课——Web API异常处理
前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文主要来讲解Asp.Ne ...
- Html5前端框架
BootCss bootcss.com amazeui http://amazeui.org/
- ConcurrentHashMap--锁的分段技术
ConcurrentHashMap是Java 5中支持高并发.高吞吐量的线程安全HashMap实现. HashTable容器在竞争激烈的并发环境下表现出效率低下的原因,是因为所有访问HashTable ...
- 三国杀3v3心法——总述篇
昔日,独孤求败前辈精研剑法,将其中奥妙化为独孤九剑,破尽天下武功.其中开篇总诀式提纲挈领,从宏观的层面阐述剑道,是领悟后面八式的基石,而之后各式则深入微观,可各破一类具体的武功.笔者亦曾苦心研究三国杀 ...
- textarea内部换行实现
当在使用textarea的时候,有一次需求,需要做到自定义换行,而不是通过textarea定宽来自动换行,其实在html中可以直接通过<br/>来换行,同时也想到用\n来实现换行,其结果是 ...