盛大游戏笔试题引发的思考?为什么?

铭毅天下
大数据领域优质创作者
博客专家认证
2012-08-26 09:55:16
盛大游戏笔试题引发的思考?为什么?
3、在win32平台下,以下哪种方式无法实现进程同步?

A、Critical Section B、Event C、Mutex D、Semaphore

个人理解:
线程间的同步可以使用:ABCD;
但进程间的同步知道可以使用:Mutex、Sempahore、Critical Section。
所以选择B吗?答案是B。
看了《核心编程》里也没有很区别开来说这块内容?
学习下大家的思路,请指点,谢谢!
...全文
356 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lactoferrin 2012-08-26
  • 打赏
  • 举报
回复
进程同步需要不止一个进程能用那个东西,CRITICAL_SECTION做不到,虽然它内部用了内核对象
jackson35296 2012-08-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 1 楼 的回复:
楼主选错了,Event属于内核对象,非常强大的对象,不仅能做应用层的进程同步,还可以做驱动和应用层的同步.Critical Section 不是内核对象,不能做进程同步。应该选A
很简单的判断方式是,CreateXXXX函数里需要lpName的参数的,就说明可以跨进程,另一个进程可以通过这个名字来打开。Event Mutex Semaphore都可以指定一个名字,而……
[/Quote]
要弄清楚这个关系,要知道什么是内核对象。
内核对象是操作系统内核维持的一个全局对象,对所有进程有效。系统内核及驱动程序运行在system进程里,system进程是windows启动的第一个进程,具有最高权限,system进程的任何bug导致的崩溃都会造成系统蓝屏。
windows系统的内核文件是ntoskrnl.exe,system进程就是通过该文件加载的,然后会加载其他的驱动(驱动程序是可以访问system内存的,驱动程序的任何bug也会导致系统蓝屏),最后启动其他的系统进程和系统服务。
应用程序是无法直接访问system进程的内存的,主要是安全考虑,如果直接访问system的进程的内存,那随便写入一些导致崩溃的数据,就会让系统蓝屏崩溃,由于win98对内核访问限制不严格,所以win98下,经常会发生蓝屏现象。
应用程序无法直接访问system进程的内存,因此应用程序只能通过api和内核进行交互。调用api创建内核对象的过程,实际上是向内核请求创建一个对象,内核会创建该对象的所有数据结构,这些数据结构并不在你的应用程序内存里,内核仅仅告诉你一个句柄,就是该对象在操作系统内的唯一标识。然后你的应用程序对该句柄的任何操作,都是通过api提交到内核里进行处理的。
内核对象何时销毁呢?进程也是内核对象,内核记录了进程所使用的内核对象,俗称进程的句柄表。 当内核发现没有任何进程使用该内核对象时,就会销毁内核对象所占的内存。这个销毁可能发生在两种情况下,一个是你调用CloseHandle时,如果只有一个引用计数,就会销毁内核对象。如果其他进程还有在使用该内核对象的,是不会销毁的。另一个销毁时机在进程结束时,内核会遍历进程的句柄表,替你CloseHandle()以便回收内核对象,那些已经手动CloseHandle()的句柄会从句柄表中移除,因此不会重复移除。
内核对象和普通的进程内对象的区别就在于内核对象占的内存空间和操作都在内核里,你的应用程序里只有它的一个标识(句柄),而普通的类对象的内存空间都在自身的进程里。
由于在内核里内核对象和进程对象是关联的,因此操作系统可以协调他们之间的关系。而每种内核对象有不同的数据结构和功能,例如event就被设计为具有同步的功能。当一个进程调用了WaitFor函数时,内核会查询event的状态来决定是否把调用Waitfor的线程挂起。在应用程序里,我们要协调两个不同的类对象,可能需要同时访问一个全局的对象,或者由一个全局类对象来协调。要协调进程一样,必须由更高层次的全局对象来协调,这个更高层次的全局对象其实就是内核。
如果让你自己写一个操作系统,你要管理进程及它们之间的关系,肯定也要有个全局管理的类对象,这就是内核。全局区内有各种用于全局管理的类对象,就是内核对象。当然实际的操作系统要复杂的多,但原理都一样,按照树状结构往下拓扑,一级管理下一级,协调下一级。
铭毅天下 2012-08-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
楼主选错了,Event属于内核对象,非常强大的对象,不仅能做应用层的进程同步,还可以做驱动和应用层的同步.Critical Section 不是内核对象,不能做进程同步。应该选A
很简单的判断方式是,CreateXXXX函数里需要lpName的参数的,就说明可以跨进程,另一个进程可以通过这个名字来打开。Event Mutex Semaphore都可以指定一个名字,而Critical Sectio……
[/Quote]
这个自己还总结过,答案的确是A。
但是还是理解的不深,你从函数的角度分析了,对。
那内核对象和进程同步的关系?这样看,内核对象的(Mutex,Event,Semphore)都可以实现进程同步。
傻X 2012-08-26
  • 打赏
  • 举报
回复
进程同步啊
Critical Section同步同进程的现成
jackson35296 2012-08-26
  • 打赏
  • 举报
回复
楼主选错了,Event属于内核对象,非常强大的对象,不仅能做应用层的进程同步,还可以做驱动和应用层的同步.Critical Section 不是内核对象,不能做进程同步。应该选A
很简单的判断方式是,CreateXXXX函数里需要lpName的参数的,就说明可以跨进程,另一个进程可以通过这个名字来打开。Event Mutex Semaphore都可以指定一个名字,而Critical Section是不行的
dickbarry 2012-08-26
  • 打赏
  • 举报
回复
《核心编程》上有奖用户模式下的同步和内核模式下的同步
CRITICAL_SECTION、InterLock、SlimRWLock都是用户模式下的同步方法
铭毅天下 2012-08-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
进程同步需要不止一个进程能用那个东西,CRITICAL_SECTION做不到,虽然它内部用了内核对象
[/Quote]
我再好好研读下这块内容吧,谢谢!

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧