📄 00000001.htm
字号:
<BR>本章末也介绍了一些被提出来的演算法,比较有趣的是three-level scheduler. <BR>要同时满足任意的time-sharing和real-time的需求是不太可能, 因为资 <BR>源有限.three-level scheduler引进了节制的观念, real-time process要先注册, <BR>kernel能够reserve足够的resource才允许执行.而kernel也会reserve适当的资源, <BR>确保time-sharing processes不会动弹不得. <BR> <BR>在网路负荷过重的时候,kernel只要处理network activity就来不及了, <BR>会导致receive livelock情形发生. 3-level scheduler可以把network <BR>的处理当成real-time task,给予适当的配额就好了.不够用就drop掉嘛. <BR>这样子保证大家有饭吃,不会活当机! [ real-time task有固定的priority, <BR>和固定的resource配额 -- kernel保证他会有这些东西,就像有人保证每天 <BR>都会给你一颗面包一样,不会说放一堆面包给大家抢(time-sharing),一天 <BR>有时候可以抢好几颗,有时一颗也抢不到,要是有一个人很会抢,那其他的 <BR>人就要饿死了!] <BR> <BR> <BR>Chapter 6 Interprocess Communications <BR> <BR>本章对IPC programming做了一些复习. <BR>传统的Unix IPC机制只有pipe. System V引进了SYSV IPC,包含semaphore, <BR>shared memory和message queue. System V的STREAMS架构也是Unix <BR>重要的IPC机制之一. 本书没有提到BSD socket介面,假设这个也是 <BR>IPC的话. Mach是一message passing为中心的kernel(message-passing <BR>kernel),大部分的系统服务都是靠交换讯息达成的,所以本章也花了 <BR>不少篇幅介绍之. <BR> <BR>特别的有: <BR>SVR4使用STREAMS来实作pipe,所以SVR4 pipe是bi-directional.一个 <BR>pipe两端都可读又可写.其他的UNIX则要用一对pipe才可达到相同目的.□ <BR> <BR>System V semaphore有一个缺点: allocation和initialization不是单一步骤, <BR>可以导致race condition发生. <BR> <BR>在System V STREAMS下, IPC的message queue几乎可以淘汰了. STREAMS <BR>功能强大(see最後一章) ,可以取代掉所有message queue的功能. <BR> <BR>本章最深奥的就是介绍Mach IPC了. 相信大家也最感兴趣. <BR>message := 一些有型别的data.型别分为两类, simple data,即一般的 <BR> 资料. 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> <BR>Chapter 8 File System Interface and Framework <BR> <BR>本节前半段讨论(复习)跟filesystem有关的系统呼叫. 後半段讨论mordern <BR>Unix的VFS (vnode)架构, 亦即, kernel处理file system的方法. 下一个chapter <BR>主要讨论file system在disk上的layout. <BR> <BR>s5fs是unix早期(System V r4以前)档案系统,特色是简单但功能尚可,最大 <BR>的缺点是有14个字的档名限制. 4.2BSD设计了Fast File System, FFS, <BR>提供了较优的performance和功能. FFS受到广大的欢迎, 最後被SVR4 <BR>所采用. FFS又称为UFS (UNIX File System) <BR> <BR>早期的Unix kernel不能同时支援两种以上的档案系统. 各家 <BR>都有解决之道. AT&T用file system switch, DEC用gnode/gfs, Sun <BR>所提出的vnode/vfs最广为接受, 最後赢得胜利,成为SVR4的 <BR>一部份. <BR> <BR>inode 是Unix特有的观念. Unix kernel利用inode来作为他对档案的介面. <BR>一个inode代表一个档案, 记录了kernel存取该档案所需要用到的资料, <BR>以及该档案的属性等等.名叫inode的原因是因为本资料结构的大部份 <BR>内容皆由on-disk的inode而来.Unix file system 在disk上的image不用档名 <BR>而用整数(i-number)来表示每一个档案. 目录只是一个较为特别的档案, <BR>记录i-number和档名的对照而已.有了i-number,kernel才找得到inode, <BR>也就是记录档案存放位置与属性的地方.一般称在disk上的inode为on-disk <BR>inode,被kernel读进记忆体,使用中的inode为in-core inode. <BR> <BR>vnode/vfs的概念是把原来in-core inode物件化成为 virtual class. <BR>vnode提供一个抽象化的介面. kernel要对档案的所有操作接 <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -