📄 00000002.htm
字号:
资料. complex data,可能为out-of-line memory或是port rights. <BR> (後述) <BR> <BR>port := a protected queue of messages. 简单的说就是message queue的id. <BR> 跟file descriptor差不多,为一个整数,代表一个message queue. <BR> message必须送到port(通信埠),而不是送给某个task或thread. <BR>port rights := 一个port的存取权限, send rights和receive rights.这种 <BR> 存取权是以task为控制对象,而不是thread. send rights允许 <BR> 一个task(的所有threads)对某个port传送讯息. receive rights <BR> 类推. 一个port可以把send rights给好几个tasks,但是只能有 <BR> 一个task有receive rights -- 拥有该port的task. 有receive <BR> right的task,就自动有send right) <BR>out-of-line memory := 传送大量的资料, message直接copy很没效率. 透过 <BR> virtual memory系统改memory mapping,用copy-on-write的方式可 <BR> 以改进. in-line memory传送是message从sender copy到kernel, <BR> 再由kernel copy-to receiver. out-of-line memory则是kernel <BR> 改一些virtual memory mapping, 只有在sender/receiver <BR> modify该资料时产生copy-on-write的page fault, 只发生 <BR> 了一次copy. <BR> <BR>complex data和simple data的不同是complex data需要kernel处理message的 <BR>内容,再翻译给receiver. simple data直接transfer就可以了. <BR> <BR>每个task拥有task_self port的send-right. task_self port是kernel <BR>拥有的. task透过task_self port与kernel沟通.task另外有一个task_notify <BR>port的receive rights,用来接收(kernel)来的message. thread有thread_self <BR>port,用来送message给kernel, reply用来接收kernel传回来的reply <BR>(比如system call, rpc...). thread用的port,其 port rights为task所有. <BR>另外还有exception port用来处理exception/signal/debug.前面讲过了. <BR> <BR>一个message内的资料结构有一栏为reply_port. 如果sender需要reply就在 <BR>此栏填入自己拥有的port.(所以自己就有receive right). message passing之中, <BR>kernel就会为receiver建立一个到reply_port的send right. <BR> <BR>Port Name Space <BR> <BR>port是一个整数,和file descriptor一样, 每个task拥有独自的命名空间. <BR>ie.不同task的port id如果一样, say,编号100,并不是指到相同的port. <BR> <BR>Port translations <BR> <BR>由於port name space是task间互相独立的. kernel必须建立一个translation <BR>来记住谁是谁. (Unix是用global file descriptor table达成的). <BR> <BR>研读本章最令人感到不解的是port right. 因为port的kernel data structure里面 <BR>没有port right的纪录. 那到底mach把port right资料藏到哪里去呢?搞了老半天, <BR>原来就是port translation. kernel的port translation就是port <BR>right.大胆一点说, <BR>就是mach kernel根本没有port right的观念.只要在port translation查的到的 <BR>port,就可以送message就对了. <BR> <BR>port translations的每个entry,代表的都是一个connection. <BR>一个entry包含下列资料: <task, local_name, kport, type>,代表的意义是 <BR>一个task的id是local_name的port, 拥有对kport (一个指向kernel的port data <BR>structure的指标)的port right. port right是receive还是send呢?由type决定. <BR>local_name就是所谓的port right的名字. <BR> <BR>msg_send()用 <task, local_name,*,*>找到kport,再由 <BR><port.owner_task,*,port,*>找到该port於task的local_name. <BR> <BR>task删掉一个port, kernel要找到kport,再除掉<*,*, kport, *>,并且 <BR>通知相关的task. <BR> <BR>task结束要清掉<task,*,*,*>的所有kports. <BR> <BR>Kernel用两个hash table来快速存取translation, TP_table (key=<task,port>) <BR>TL_table(key=<task,local_name>) <BR> <BR> <BR>Port Rights Transfer <BR> <BR>普通的port right transfer embed到message header里面,就是前面提 <BR>的reply port.这样子的port right transfer是把自己的port的send <BR>right送给别人用的.比较复杂的就要用complex message. message里面, <BR>告诉kernel要把他人的(send right)送给第三者. (本章没有提到详情). <BR>这是mach name server的功能:除了之前提到的port之外, mach的每个 <BR>task还有一个bootstrap port,透过此port, task可以送message到mach <BR>的name server. name server提供了存取其他server的机制.过程如下: <BR> <BR> 1. server向name server注册(透过bootstrap port) <BR> 2. client向name server询问如何与server沟通. <BR> 3. name server transfer一个到server的send right给client <BR> 4. client得到一个可以和server沟通的port,利用此port和server联系. <BR> <BR>Mach的理想是把许多Unix kernel的机制变成user level server. name server <BR>是开启这个机制的钥匙. <BR> <BR>Port Interpolation <BR> <BR>Port interpolation可以让别人偷走某task的send/receive rights. <BR>Mach提供task_extract_send(), task_insert_send(), task_extract_receive(), <BR>task_insert_receive()来干这档事. debugger就是这样拦截ipc message的. <BR> <BR>netmsgserver <BR> <BR>另外一个和Port interpolation很像的机制,就是Mach的remote IPC. 其实 <BR>说穿了, Mach remote IPC的达成只是靠netmsgserver作proxy而已. <BR>Mach可以这样做的原因有二, 第一个是send_msg()只要知道自己的 <BR>local_port_name就行了,他不需要知道这个port怎样连,连到哪里去.这是 <BR>port name server和netmsgserver的工作, task尽管往name server告诉他的 <BR>port送就可以了.第二点是senders是匿名的. receiver无法从message得知 <BR>sender是谁.所以netmsgserver可以提供完全透明的服务. <BR> <BR>Mach 3.0对IPC的问题做了一些改进,自己看吧. 这是Mach 2.5 IPC <BR>会遇到的问题. <BR> <BR> <BR>Chapter 7 Synchronization and Multiprocessors <BR> <BR>提到Kernel synchronization的演算法和资料结构.特别是multiprocessor <BR>下的问题. multiprocessor最大的问题在virtual memory的cache/tlb <BR>synchronize 的问题.本章没有提到, 延至virtual memory再讨论. <BR> <BR>Chapter 7讨论的内容颇为琐碎, 不适合摘要. <BR> <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -