为什么Mac OSX一个程序不影响系统,而Win系统经常假死机半天没反应
2013-12-05 02:53
302 查看
内容摘自维基百科
Mac OSX 是XNU核心 ,而XNU核心 是 Mach 3.0 开发出来的
Mach与UNIX的一大区别即在于,除了操作文件,Mach更可以操作一切“任务”。这一来大量的内核代码可以转移到用户空间,使内核变得更小,从此领发了微内核的思潮。与传统的系统不同,Mach下的进程(或者说“任务”)之下是多个线程。这在今天自已屡见不鲜,可是要知道,Mach正是如此定义任务与线程关系的第一人。内核的责任从总揽大局者精简为基础设施的提供者,并为其提供有限的调度。
Port机制在IPC中的应用该是Mach与其他传统内核的一大分野。
在UNIX下,用户进程调用内核只能通过系统调用或陷入(trap)。用户进程使用一个库安排好数据的位置,然后软件触发一个中断,内核在初始化时会为所有中断设置handler,因此程序触发中断的时候,控制权就转移到了内核,在一些必要的检查之后即可得以进一步操作。
在Mach下,这就交给了IPC系统。与直接系统调用不同,这里的用户进程是先向内核申请一个port的访问许可,然后利用IPC机制向这个port发送消息。虽说发送消息的操作同样是系统调用,但Mach内核的工作形式有些不同——handler的工作可以交由其他进程实现。
IPC消息传递机制的应用为线程和并发提供了很好的支持。进程之下是多个线程,线程作为IPC机制的单元,Mach得以在消息被处理时控制线程睡眠或唤醒。这就允许系统将进程分布于多个处理器之上,消息直接通过共享内存实现也可,必要时为其它处理器复制一份也可。在传统内核中这很难实现:系统必须保证不同处理器上的的不同程序不会在同时访问同一块内存,在Mach中则要更容易的多。不同进程的内存访问互不干涉,一切交由port通信。
早期的IPC系统有些性能问题,必须正视。同其前辈Accent一样,Mach使用一个共享内存机制以避免消息传递中低效的内存拷贝。它利用硬件的MMU实现数据共享,只在数据被修改的时候才执行拷贝,即写时复制。
内核也必须检查消息的正确性。Port在设计上即取了UNIX文件系统的概念,这一来就允许用户使用现成的文件系统概念即可,权限、访问许可之类就都有了。
这样设计也简化了开发。传统的程序依然可以拿来,也可以再设计。单内核系统的一个bug就得让整个系统崩溃从而不得不重启,而Mach仅仅需要重新运行出问题的那个进程。操作系统即一组程序的集合,用户得以选择其系统的功能——只需管理当前运行的进程即可。
Mach的一些更高级功能也是基于这个相同的IPC机制。例如,Mach能够轻松支持多处理器的机器。对于传统内核,大量的工作需要进行时,使其重入或中断 ,在不同的处理器上运行的程序可以同时被内核调用。而在Mach内核中,位的操作系统能像任何其他程序一样,独立地运行在任何处理器上,因为它们是被隔离在服务器中的。虽然在理论上Mach内核也必须是可重入的,在实际中,这是不是一个问题,因为它的响应时间是如此之快,它可以简单地等待服务请求转。Mach还包括一个服务器,不仅可以在程序之间将消息转发,甚至是在网络上,这在20世纪80年代末和90年代初是一个蓬勃发展的领域。不幸的是,将IPC用于几乎所有的任务对性能产生了严重影响。
Mac OSX 是XNU核心 ,而XNU核心 是 Mach 3.0 开发出来的
Mach与UNIX的一大区别即在于,除了操作文件,Mach更可以操作一切“任务”。这一来大量的内核代码可以转移到用户空间,使内核变得更小,从此领发了微内核的思潮。与传统的系统不同,Mach下的进程(或者说“任务”)之下是多个线程。这在今天自已屡见不鲜,可是要知道,Mach正是如此定义任务与线程关系的第一人。内核的责任从总揽大局者精简为基础设施的提供者,并为其提供有限的调度。
Port机制在IPC中的应用该是Mach与其他传统内核的一大分野。
在UNIX下,用户进程调用内核只能通过系统调用或陷入(trap)。用户进程使用一个库安排好数据的位置,然后软件触发一个中断,内核在初始化时会为所有中断设置handler,因此程序触发中断的时候,控制权就转移到了内核,在一些必要的检查之后即可得以进一步操作。
在Mach下,这就交给了IPC系统。与直接系统调用不同,这里的用户进程是先向内核申请一个port的访问许可,然后利用IPC机制向这个port发送消息。虽说发送消息的操作同样是系统调用,但Mach内核的工作形式有些不同——handler的工作可以交由其他进程实现。
IPC消息传递机制的应用为线程和并发提供了很好的支持。进程之下是多个线程,线程作为IPC机制的单元,Mach得以在消息被处理时控制线程睡眠或唤醒。这就允许系统将进程分布于多个处理器之上,消息直接通过共享内存实现也可,必要时为其它处理器复制一份也可。在传统内核中这很难实现:系统必须保证不同处理器上的的不同程序不会在同时访问同一块内存,在Mach中则要更容易的多。不同进程的内存访问互不干涉,一切交由port通信。
早期的IPC系统有些性能问题,必须正视。同其前辈Accent一样,Mach使用一个共享内存机制以避免消息传递中低效的内存拷贝。它利用硬件的MMU实现数据共享,只在数据被修改的时候才执行拷贝,即写时复制。
内核也必须检查消息的正确性。Port在设计上即取了UNIX文件系统的概念,这一来就允许用户使用现成的文件系统概念即可,权限、访问许可之类就都有了。
这样设计也简化了开发。传统的程序依然可以拿来,也可以再设计。单内核系统的一个bug就得让整个系统崩溃从而不得不重启,而Mach仅仅需要重新运行出问题的那个进程。操作系统即一组程序的集合,用户得以选择其系统的功能——只需管理当前运行的进程即可。
Mach的一些更高级功能也是基于这个相同的IPC机制。例如,Mach能够轻松支持多处理器的机器。对于传统内核,大量的工作需要进行时,使其重入或中断 ,在不同的处理器上运行的程序可以同时被内核调用。而在Mach内核中,位的操作系统能像任何其他程序一样,独立地运行在任何处理器上,因为它们是被隔离在服务器中的。虽然在理论上Mach内核也必须是可重入的,在实际中,这是不是一个问题,因为它的响应时间是如此之快,它可以简单地等待服务请求转。Mach还包括一个服务器,不仅可以在程序之间将消息转发,甚至是在网络上,这在20世纪80年代末和90年代初是一个蓬勃发展的领域。不幸的是,将IPC用于几乎所有的任务对性能产生了严重影响。
相关文章推荐
- 今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在Win中见过的/r回车符号。由于编辑软件的编码问题,某些IDE的编辑器在编辑完文件之后会自动加上这个^M符号。看起来对我们的源代码没有任何影响,其实并不然,当我们把源代码文件Check In到svn之类
- 写一个小程序实现win系统定时锁屏
- Android系统休眠对程序的影响以及处理
- 编写一个模拟航空客运定票系统的程序
- 生成一个系统托盘程序
- 很久以前写的一个应用于51上面的多功能控制采集系统的..学习板内核程序
- 同样一个程序,为什么我的VS2010调试很慢
- 低配电脑重装win7 系统假死程序无反应优化技巧
- 一段简单程序为什么在linux终端与win控制台下运行效果不同?(望高手指点)
- 广泛使用的一个对特定在线用户发送系统消息的程序
- 在Linux 系统中,在运行一个程序时,程序中未初始化的全局变量会被加载到以下哪个内存段中?
- 急求高手指点!程序修改之后,点击button按钮,为什么没有反应??
- 经尉迟方兄提点,终于明白为什么不是一个简单的26进制程序了
- 一个系统引导程序的简单示例1
- 你用VC调试程序时经常死机吗
- 如何查看一个系统程序(TCODE)的所有OKCODE
- 通过分析exevc系统调用处理过程来理解Linux内核如何装载和启动一个可执行程序
- Android系统休眠对程序的影响以及处理
- 一个带系统托盘的VC++程序编写方法
- 当您备份一个较大的系统卷时,备份程序将失败