为什么Mac OSX一个程序不影响系统,而Win系统经常假死机半天没反应

内容摘自维基百科

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用于几乎所有的任务对性能产生了严重影响。

你可能感兴趣的:(IOS开发)