随笔 - 60  文章 - 5  trackbacks - 0
<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(2)

随笔分类(42)

随笔档案(60)

文章档案(2)

我收藏的博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜

资料来源:http://www.cnpaf.net/Class/Ethernet/200408/403.html,中国协议分析网
一、什么是网桥?


网桥工作在数据链路层,将两个LAN连起来,根据MAC地址来转发帧,可以看作一个“低层的路由器”(路由器工作在网络层,根据网络地址如IP地址进行转发)。


 

远程网桥通过一个通常较慢的链路(如电话线)连接两个远程LAN,对本地网桥而言,性能比较重要,而对远程网桥而言,在长距离上可正常运行是更重要的。

网桥与路由器的比较

网桥并不了解其转发帧中高层协议的信息,这使它可以同时以同种凡是处理IP、IPX等协议,它还提供了将无路由协议的网络(如NetBEUI)分段的功能。

由于路由器处理网络层的数据,因此它们更容易互连不同的数据链路层,如令牌环网段和以太网段。网桥通常比路由器难控制。象IP等协议有复杂的路由协议,使网管易于管理路由;IP等协议还提供了较多的网络如何分段的信息(即使其地址也提供了此类信息)。而网桥则只用MAC地址和物理拓扑进行工作。因此网桥一般适于小型较简单的网络。

二、使用原因


许多单位都有多个局域网,并且希望能够将它们连接起来。之所以一个单位有多个局域网,有以下6个原因:

首先,许多大学的系或公司的部门都有各自的局域网,主要用于连接他们自己的个人计算机、工作站以及服务器。由于各系(或部门)的工作性质不同,因此选用了不同的局域网,这些系(或部门)之间早晚需相互交往,因而需要网桥。

其次,一个单位在地理位置上较分散,并且相距较远,与其安装一个遍布所有地点的同轴电缆网,不如在各个地点建立一个局域网,并用网桥和红外链路连接起来,这样费用可能会低一些。

第3,可能有必要将一个逻辑上单一的LAN分成多个局域网,以调节载荷。例如采用由网桥连接的多个局域网,每个局域网有一组工作站,并且有自己的文件服务器,因此大部分通信限于单个局域网内,减轻了主干网的负担。

第 4,在有些情况下,从载荷上看单个局域网是毫无问题的,但是相距最远的机器之间的物理距离太远(比如超过802.3所规定的2.5km)。即使电缆铺设不成问题,但由于来回时延过长,网络仍将不能正常工作。唯一的办法是将局域网分段,在各段之间放置网桥。通过使用网桥,可以增加工作的总物理距离。

第5,可靠性问题。在一个单独的局域网中,一个有缺陷的节点不断地输出无用的信息流会严重地破坏局域网的运行。网桥可以设置在局域网中的关键部位,就像建筑物内的放火门一样,防止因单个节点失常而破坏整个系统。

第6,网桥有助于安全保密。大多数LAN接口都有一种混杂工作方式(promiscuousmode),在这种方式下,计算机接收所有的帧,包括那些并不是编址发送给它的帧。如果网中多处设置网桥并谨慎地拦截无须转发的重要信息,那么就可以把网络分隔以防止信息被窃。

三、兼容性问题


有人可能会天真地认为从一个802局域网到另一个802局域网的网桥非常简单,但实际上并非如此。在802.x到802.y的九种组合中,每一种都有它自己的特殊问题要解决。在讨论这些特殊问题之前,先来看一看这些网桥共同面临的一般性问题。

首先,各种局域网采用了不同的帧格式。这种不兼容性并不是由技术上的原因造成的,而仅仅是由于支持三种标准的公司(Xerox,GM和IBM),没有一家愿意改变自己所支持的标准。其结果是:在不同的局域网间复制帧要重排格式,这需要占用CPU时间,重新计算校验和,而且还有可能产生因网桥存储错误而造成的无法检测的错误。

第二个问题是互联的局域网并非必须按相同的数据传输速率运行。当快速的局域网向慢速的局域网发送一长串连续帧时,网桥处理帧的速度要比帧进入的速度慢。网桥必须用缓冲区存储来不及处理的帧,同时还得提防耗尽存储器。即使是10Mb/s的802.4到10Mb/s的 802.3的网桥,在某种程度上也存在这样的问题。因为802.3的部分带宽耗费于冲突。802.3实际上并不是真的10Mb/s,而802.4(几乎) 确实为10Mb/s。

与网桥瓶颈问题相关的一个细微而重要的问题是其上各层的计时器值。假如802.4局域网上的网络层想发送一段很长的报文(帧序列)。在发出最后一帧之后,它开启一个计时器,等待确认。如果此报文必须通过网桥转到慢速的802.5网络,那么在最后一帧被转发到低速局域网之前,计时器就有可能时间到。网络层可能会以为帧丢失而重新发送整个报文。几次传送失败后,网络层就会放弃传输并告诉传输层目的站点已经关机。

第三,在所有的问题中,可能最为严重的问题是三种802LAN有不同的最大帧长度。对于802.3,最大帧长度取决于配置参数,但对标准的10M/bs系统最大有效载荷为1500字节。802.4的最大帧长度固定为8191字节。802.5没有上限,只要站点的传输时间不超过令牌持有时间。如果令牌时间缺省为10ms,则最大帧长度为5000字节。一个显而易见的问题出现了:当必须把一个长帧转发给不能接收长帧的局域网时,将会怎么样?在本层中不考虑把帧分成小段。所有的协议都假定帧要么到达要么没有到达,没有条款规定把更小的单位重组成帧。这并不是说不能设计这样的协议,可以设计并已有这种协议,只是 802不提供这种功能。这个问题基本上无法解决,必须丢弃因太长而无法转发的帧。其透明程度也就这样了。

由于各种802LAN的特殊性,如:802.4帧带有优先权位、802.5帧字节中有A和C位等,九种网桥都有其特殊的问题,见下表:

  目的LAN
  802.3(CSMA/CD)802.4(令牌总线)802.5(令牌环)
源LAN802.3 1,41,2,4,8
802.41,5,8,9,1091,2,3,8,9,10
802.51,2,5,6,7,101,2,3,6,76,7

1、重新格式化帧,并计算新的校验和。
2、反转比特顺序。
3、复制优先权值,不管有无意义。
4、产生一个假想的优先权。
5、丢弃优先权。
6、流向环(某种程度上)。
7、设置A位和C位。
8、担心拥塞(快速LAN至慢速LAN)。
9、担心令牌因为交换ACK延迟或不可能而脱手。
10、如果帧对目的LAN太长,则将其丢弃。

设定的参数:
802.3:1500字节帧10Mb/s(减去碰撞次数)
802.4:8191字节帧10Mb/s
802.5:5000字节帧4Mb/s

当 IEEE802委员会开始制订LAN标准时,未能商定一个统一的标准,却产生了3个互不兼容的标准,这一失策已受到了严厉的抨击。后来,在制定互联这3种 LAN的网桥的标准时,该委员会决心干得好一些。这一次确实较为成功,他们提出了2种互不兼容的网桥方案。直到目前为止,还无人要求该委员会制订连接它的 2个不兼容网桥的网关标准。

四、两种网桥

1、透明网桥


第一种802网桥是透明网桥 (transparentbridge)或生成树网桥(spanningtreebridge)。支持这种设计的人首要关心的是完全透明。按照他们的观点,装有多个LAN的单位在买回IEEE标准网桥之后,只需把连接插头插入网桥,就万事大吉。不需要改动硬件和软件,无需设置地址开关,无需装入路由表或参数。总之什么也不干,只须插入电缆就完事,现有LAN的运行完全不受网桥的任何影响。这真是不可思议,他们最终成功了。

透明网桥以混杂方式工作,它接收与之连接的所有LAN传送的每一帧。当一帧到达时,网桥必须决定将其丢弃还是转发。如果要转发,则必须决定发往哪个LAN。这需要通过查询网桥中一张大型散列表里的目的地址而作出决定。该表可列出每个可能的目的地,以及它属于哪一条输出线路(LAN)。在插入网桥之初,所有的散列表均为空。由于网桥不知道任何目的地的位置,因而采用扩散算法(floodingalgorithm):把每个到来的、目的地不明的帧输出到连在此网桥的所有 LAN中(除了发送该帧的LAN)。随着时间的推移,网桥将了解每个目的地的位置。一旦知道了目的地位置,发往该处的帧就只放到适当的LAN上,而不再散发。

透明网桥采用的算法是逆向学习法(backwardlearning)。网桥按混杂的方式工作,故它能看见所连接的任一LAN上传送的帧。查看源地址即可知道在哪个LAN上可访问哪台机器,于是在散列表中添上一项。

当计算机和网桥加电、断电或迁移时,网络的拓扑结构会随之改变。为了处理动态拓扑问题,每当增加散列表项时,均在该项中注明帧的到达时间。每当目的地已在表中的帧到达时,将以当前时间更新该项。这样,从表中每项的时间即可知道该机器最后帧到来的时间。网桥中有一个进程定期地扫描散列表,清除时间早于当前时间若干分钟的全部表项。于是,如果从LAN上取下一台计算机,并在别处重新连到LAN上的话,那么在几分钟内,它即可重新开始正常工作而无须人工干预。这个算法同时也意味着,如果机器在几分钟内无动作,那么发给它的帧将不得不散发,一直到它自己发送出一帧为止。

到达帧的路由选择过程取决于发送的LAN(源LAN)和目的地所在的LAN(目的LAN),如下所示:

1、如果源LAN和目的LAN相同,则丢弃该帧。
2、如果源LAN和目的LAN不同,则转发该帧。
3、如果目的LAN未知,则进行扩散。

为了提高可靠性,有人在LAN之间设置了并行的两个或多个网桥,但是,这种配置引起了另外一些问题,因为在拓扑结构中产生了回路,可能引发无限循环。其解决方法就是下面要讲的生成树(spanningtree)算法。

生成树网桥

解决上面所说的无限循环问题的方法是让网桥相互通信,并用一棵到达每个LAN的生成树覆盖实际的拓扑结构。使用生成树,可以确保任两个LAN之间只有唯一一条路径。一旦网桥商定好生成树,LAN间的所有传送都遵从此生成树。由于从每个源到每个目的地只有唯一的路径,故不可能再有循环。

为了建造生成树,首先必须选出一个网桥作为生成树的根。实现的方法是每个网桥广播其序列号(该序列号由厂家设置并保证全球唯一),选序列号最小的网桥作为根。接着,按根到每个网桥的最短路径来构造生成树。如果某个网桥或LAN故障,则重新计算。

网桥通过BPDU(BridgeProtocolDataUnit)互相通信,在网桥做出配置自己的决定前,每个网桥和每个端口需要下列配置数据:

网桥:ID(唯一的标识)
端口:端口ID(唯一的标识)
端口相对优先权
各端口的花费(高带宽=低花费)


配置好各个网桥后,网桥将根据配置参数自动确定生成树,这一过程有三个阶段:

1、选择根网桥
具有最小网桥ID的网桥被选作根网桥。网桥ID应为唯一的,但若两个网桥具有相同的最小ID,则MAC地址小的网桥被选作根。

2、在其它所有网桥上选择根端口
除根网桥外的各个网桥需要选一个根端口,这应该是最适合与根网桥通信的端口。通过计算各个端口到根网桥的花费,取最小者作为根端口。

3、选择每个LAN的“指定(designated)网桥”和“指定端口”
如果只有一个网桥连到某LAN,它必然是该LAN的指定网桥,如果多于一个,则到根网桥花费最小的被选为该LAN的指定网桥。指定端口连接指定网桥和相应的LAN(如果这样的端口多于一个,则低优先权的被选)。

一个端口必须为下列之一:

1、根端口
2、某LAN的指定端口
3、阻塞端口

当一个网桥加电后,它假定自己是根网桥,发送出一个CBPDU(ConfigurationBridgeProtocolDataUnit),告知它认为的根网桥ID。一个网桥收到一个根网桥ID小于其所知ID的CBPDU,它将更新自己的表,如果该帧从根端口(上传)到达,则向所有指定端口(下传)分发。当一个网桥收到一个根网桥ID大于其所知ID的CBPDU,该信息被丢弃,如果该帧从指定端口到达,则回送一个帧告知真实根网桥的较低ID。

当有意地或由于线路故障引起网络重新配置,上述过程将重复,产生一个新的生成树。

2、源路由选择网桥


透明网桥的优点是易于安装,只需插进电缆即大功告成。但是从另一方面来说,这种网桥并没有最佳地利用带宽,因为它们仅仅用到了拓扑结构的一个子集(生成树)。这两个(或其他)因素的相对重要性导致了802委员会内部的分裂。支持CSMA/CD和令牌总线的人选择了透明网桥,而令牌环的支持者则偏爱一种称为源路由选择(sourcerouting)的网桥(受到IBM的鼓励)。

源路由选择的核心思想是假定每个帧的发送者都知道接收者是否在同一LAN上。当发送一帧到另外的LAN时,源机器将目的地址的高位设置成1作为标记。另外,它还在帧头加进此帧应走的实际路径。

源路由选择网桥只关心那些目的地址高位为1的帧,当见到这样的帧时,它扫描帧头中的路由,寻找发来此帧的那个LAN的编号。如果发来此帧的那个LAN编号后跟的是本网桥的编号,则将此帧转发到路由表中自己后面的那个LAN。如果该LAN编号后跟的不是本网桥,则不转发此帧。这一算法有3种可能的具体实现:软件、硬件、混合。这三种具体实现的价格和性能各不相同。第一种没有接口硬件开销,但需要速度很快的CPU处理所有到来的帧。最后一种实现需要特殊的 VLSI芯片,该芯片分担了网桥的许多工作,因此,网桥可以采用速度较慢的CPU,或者可以连接更多的LAN。

源路由选择的前提是互联网中的每台机器都知道所有其他机器的最佳路径。如何得到这些路由是源路由选择算法的重要部分。获取路由算法的基本思想是:如果不知道目的地地址的位置,源机器就发布一广播帧,询问它在哪里。每个网桥都转发该查找帧(discoveryframe),这样该帧就可到达互联网中的每一个LAN。当答复回来时,途经的网桥将它们自己的标识记录在答复帧中,于是,广播帧的发送者就可以得到确切的路由,并可从中选取最佳路由。

虽然此算法可以找到最佳路由(它找到了所有的路由),但同时也面临着帧爆炸的问题。透明网桥也会发生有点类似的状况,但是没有这么严重。其扩散是按生成树进行,所以传送的总帧数是网络大小的线性函数,而不象源路由选择是指数函数。一旦主机找到至某目的地的一条路由,它就将其存入到高速缓冲器之中,无需再作查找。虽然这种方法大大遏制了帧爆炸,但它给所有的主机增加了事务性负担,而且整个算法肯定是不透明的。

3、两种网桥的比较





透明网桥一般用于连接以太网段,而源路由选择网桥则一般用于连接令牌环网段。

五、远程网桥


网桥有时也被用来连接两个或多个相距较远的LAN。比如,某个公司分布在多个城市中,该公司在每个城市中均有一个本地的LAN,最理想的情况就是所有的LAN均连接起来,整个系统就像一个大型的LAN一样。

该目标可通过下述方法实现:每个LAN中均设置一个网桥,并且用点到点的连接(比如租用电话公司的电话线)将它们两个两个地连接起来。点到点连线可采用各种不同的协议。办法之一就是选用某种标准的点到点数据链路协议,将完整的MAC帧加到有效载荷中。如果所有的LAN均相同,这种办法的效果最好,它的唯一问题就是必须将帧送到正确的LAN中。另一种办法是在源网桥中去掉MAC的头部和尾部,并把剩下的部分加到点到点协议的有效载荷中,然后在目的网桥中产生新的头部和尾部。它的缺点是到达目的主机的校验和并非是源主机所计算的校验和,因此网桥存储器中某位损坏所产生的错误可能不会被检测到。
posted @ 2009-06-10 15:44 黄剑父 阅读(250) | 评论 (0)编辑 收藏
资料来源:http://www.cnpaf.net/Class/Ethernet/200512/10646.html,中国协议分析网

用过NetXray之类的抓包软件的人,可能经常会被一些  不同的Frame Header搞糊涂,为何用的Frame的Header
 是这样的,而另外的又不一样。这是因为在Ethernet  中存在几种不同的帧格式,下面我就简单介绍一下几种
 不同的帧格式及他们的差异。

 一。Ethernet帧格式的发展

 1980 DEC,Intel,Xerox制订了Ethernet I的标准
 1982 DEC,Intel,Xerox又制订了Ehternet II的标准
 1982 IEEE开始研究Ethernet的国际标准802.3
 1983 迫不及待的Novell基于IEEE的802.3的原始版开发了专用的Ethernet帧格式
 1985 IEEE推出IEEE 802.3规范
      后来为解决EthernetII与802.3帧格式的兼容问题推出折衷的Ethernet SNAP格式

 (其中早期的Ethernet I已经完全被其他帧格式取代了所以现在Ethernet只能见到后面几种Ethernet的帧格式现在大部分的网络设备都支持这几种Ethernet的帧格式如:cisco的路由器再设定Ethernet接口时可以指定不同的以太网的帧格式:arpa,sap,snap,novell-ether)

 二.各种不同的帧格式
 下面介绍一下各个帧格式  

  •  Ethernet II
       就是DIX以太网联盟推出的,它由6个字节的目的MAC地址,6个字节的源MAC地址,2个字节的类型域(用于标示封装在这个Frame、里面数据的类型)以上为Frame Header,接下来是46--1500 字节的数据,和4字节的帧校验)
  • Novell Ethernet
       它的帧头与Ethernet有所不同其中EthernetII帧头中的类型域变成了长度域,后面接着的两个字节为0xFFFF
       用于标示这个帧是Novell Ether类型的Frame 由于前面的0xFFFF站掉了两个字节所以数据域缩小为44-1498个字节,帧校验不变。
  • IEEE 802.3/802.2
       802.3的Frame Header和Ethernet II的帧头有所不同EthernetII类型域变成了长度域。其中又引入802.2协议(LLC)在802.3帧头后面添加了一个LLC首部,由 DSAP(Destination Service Access Point)
       1 byte,SSAP(Source SAP),一个控制域--1 byte!
       SAP用于标示帧的上层协议
  • Ethernet SNAP
       SNAP Frame与802.3/802.2 Frame的最大区别是增加了一个5 Bytes的SNAP ID其中前面3个byte通常与源mac地址的前三个bytes相同为厂商代码!有时也可设为0,后2 bytes 与Ethernet II的类型域相同。。。

 
 三.如何区分不同的帧格式
  
   Ethernet中存在这四种Frame那些网络设备又是如何识别的呢? 如何区分EthernetII与其他三种格式的Frame 如果帧头跟随source mac地址的2 bytes的值大于1500 则此Frame为EthernetII格式的。
   
   接着比较紧接着的两bytes如果为0xFFFF则为Novell Ether 类型的Frame
   如果为0xAAAA则为Ethernet SNAP格式的Frame ,如果都不是则为Ethernet 802.3/802.2格式的帧

posted @ 2009-06-10 15:35 黄剑父 阅读(280) | 评论 (0)编辑 收藏
资料来源:http://baike.baidu.com/view/750250.htm
1.UAC(User Account Control : 用户帐户控制)是微软为提高系统安全而在Windows Vista中引入的新技术,它要求用户在执行可能会影响计算机运行的操作或执行更改影响其他用户的设置的操作之前,提供权限或管理员‌密码。
  通过在这些操作启动前对其进行验证,UAC 可以帮助防止恶意软件和间谍软件在未经许可的情况下在计算机上进行安装或对计算机进行更改。
  当需要权限或密码才能完成任务时,UAC 会用下列消息之一警告用户:
Windows 需要您的许可才能继续
  可能会影响本计算机其他用户的 Windows 功能或程序需要您的许可才能启动。请检查操作的名称以确保它正是您要运行的功能或程序。
  程序需要您的许可才能继续
  不属于 Windows 的一部分的程序需要您的许可才能启动。它具有指明其名称和发行者的有效的数字签名,该数字签名可以帮助确保该程序正是其所声明的程序。确保该程序正是您要运行的程序。
  一个未能识别的程序要访问您的计算机
  未能识别的程序是指没有其发行者所提供用于确保该程序正是其所声明程序的有效数字签名的程序。这不一定表明有危险,因为许多旧的合法程序缺少签名。但是,应该特别注意并且仅当其获取自可信任的来源(例如原装 CD 或发行者网站)时允许此程序运行。
  此程序已被阻止
  这是管理员专门阻止在您的计算机上运行的程序。若要运行此程序,必须与管理员联系并且要求解除阻止此程序。
  建议您大多数情况下使用标准用户帐户登录计算机。可以浏览 Internet,发送电子邮件,使用字处理器,所有这些都不需要管理员帐户。当您要执行管理任务(如安装新程序或更改会影响其他用户的设置)时,不必切换到管理员帐户。在执行该任务之前,Windows 会提示您进行许可或提供管理员密码。
  为了帮助保护计算机,可以为共享该计算机的所有用户创建标准用户帐户。当拥有标准帐户的人试图安装软件时,Windows 会要求输入管理员帐户的密码,以便在您不知情和未经您许可的情况下无法安装软件。
  2.UAC(User Agent Client) 用户代理客户端
posted @ 2009-06-04 11:08 黄剑父 阅读(216) | 评论 (0)编辑 收藏

资料来源:http://blog.chinaunix.net/u1/38576/showart_367985.html
内核同步措施

    为了避免并发,防止竞争。内核提供了一组同步方法来提供对共享数据的保护。 我们的重点不是介绍这些方法的详细用法,而是强调为什么使用这些方法和它们之间的差别。
    Linux 使用的同步机制可以说从2.0到2.6以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随 Linux从单处理器到对称多处理器的过度;伴随着从非抢占内核到抢占内核的过度。锁机制越来越有效,也越来越复杂。
    目前来说内核中原子操作多用来做计数使用,其它情况最常用的是两种锁以及它们的变种:一个是自旋锁,另一个是信号量。我们下面就来着重介绍一下这两种锁机制。


自旋锁
------------------------------------------------------
    自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,不需要自旋锁)。
    自旋锁最多只能被一个内核任务持有,如果一个内核任务试图请求一个已被争用(已经被持有)的自旋锁,那么这个任务就会一直进行忙循环——旋转——等待锁重新可用。
要是锁未被争用,请求它的内核任务便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于一个的内核任务同时进入临界区,因此这种锁可有效地避免多处理器上并发运行的内核任务竞争共享资源。
    事实上,自旋锁的初衷就是:在短期间内进行轻量级的锁定。一个被争用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋(特别浪费处理器时间),所以自旋锁不应该被持有时间过长。如果需要长时间锁定的话, 最好使用信号量。
自旋锁的基本形式如下:
    spin_lock(&mr_lock);
    //临界区
    spin_unlock(&mr_lock);

    因为自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许存在于临界区中。这点很好地满足了对称多处理机器需要的锁定服务。在单处理器上,自旋锁仅仅当作一个设置内核抢占的开关。如果内核抢占也不存在,那么自旋锁会在编译时被完全剔除出内核。
    简单的说,自旋锁在内核中主要用来防止多处理器中并发访问临界区,防止内核抢占造成的竞争。另外自旋锁不允许任务睡眠(持有自旋锁的任务睡眠会造成自死锁——因为睡眠有可能造成持有锁的内核任务被重新调度,而再次申请自己已持有的锁),它能够在中断上下文中使用
    死锁:假设有一个或多个内核任务和一个或多个资源,每个内核都在等待其中的一个资源,但所有的资源都已经被占用了。这便会发生所有内核任务都在相互等待,但它们永远不会释放已经占有的资源,于是任何内核任务都无法获得所需要的资源,无法继续运行,这便意味着死锁发生了。自死琐是说自己占有了某个资源,然后自己又申请自己已占有的资源,显然不可能再获得该资源,因此就自缚手脚了。


信号量
------------------------------------------------------
    Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。
    信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;只能在进程上下文中使用,因为中断上下文中是不能被调度的;另外当代码持有信号量时,不可以再持有自旋锁。

信号量基本使用形式为:
static DECLARE_MUTEX(mr_sem);//声明互斥信号量
if(down_interruptible(&mr_sem))
    //可被中断的睡眠,当信号来到,睡眠的任务被唤醒
    //临界区
up(&mr_sem);


信号量和自旋锁区别
------------------------------------------------------
    虽然听起来两者之间的使用条件复杂,其实在实际使用中信号量和自旋锁并不易混淆。注意以下原则:
    如果代码需要睡眠——这往往是发生在和用户空间同步时——使用信号量是唯一的选择。由于不受睡眠的限制,使用信号量通常来说更加简单一些。如果需要在自旋锁和信号量中作选择,应该取决于锁被持有的时间长短。理想情况是所有的锁都应该尽可能短的被持有,但是如果锁的持有时间较长的话,使用信号量是更好的选择。另外,信号量不同于自旋锁,它不会关闭内核抢占,所以持有信号量的代码可以被抢占。这意味者信号量不会对影响调度反应时间带来负面影响。


自旋锁对信号量
------------------------------------------------------
需求                     建议的加锁方法

低开销加锁               优先使用自旋锁
短期锁定                 优先使用自旋锁
长期加锁                 优先使用信号量
中断上下文中加锁          使用自旋锁
持有锁是需要睡眠、调度     使用信号量

posted @ 2009-06-02 11:49 黄剑父 阅读(346) | 评论 (0)编辑 收藏
资料来源:http://cisco.chinaitlab.com/Cisco/38689.html
  网络互连设备可以将网络划分为不同的冲突域、广播域。但是,由于不同的网络互连设备可能工作在OSI模型的不同层次上。因此,它们划分冲突域、广播域的效果也就各不相同。如中继器工作在物理层,网桥和交换机工作在数据链路层,路由器工作在网络层,而网关工作在OSI模型的上三层。而每一层的网络互连设备要根据不同层次的特点完成各自不同的任务。
  
  下面我们讨论常见的网络互连设备的工作原理以及它们在划分冲突域、广播域时各自的特点。
  
  1、传统以太网操作
  
  传统共享式以太网的典型代表是总线型以太网。在这种类型的以太网中,通信信道只有一个,采用介质共享(介质争用)的访问方法(第1章中介绍的 CSMA/CD介质访问方法)。每个站点在发送数据之前首先要侦听网络是否空闲,如果空闲就发送数据。否则,继续侦听直到网络空闲。如果两个站点同时检测到介质空闲并同时发送出一帧数据,则会导致数据帧的冲突,双方的数据帧均被破坏。这时,两个站点将采用"二进制指数退避"的方法各自等待一段随机的时间再侦听、发送。
  
  在图1中,主机A只是想要发送一个单播数据包给主机B。但由于传统共享式以太网的广播性质,接入到总线上的所有主机都将收到此单播数据包。同时,此时如果任何第二方,包括主机B也要发送数据到总线上都将冲突,导致双方数据发送失败。我们称连接在总线上的所有主机共同构成了一个冲突域。
  
  当主机A发送一个目标是所有主机的广播类型数据包时,总线上的所有主机都要接收该广播数据包,并检查广播数据包的内容,如果需要的话加以进一步的处理。我们称连接在总线上的所有主机共同构成了一个广播域。
  
  
 
  图1  传统以太网

  
  2、中继器(Repeater)
  
  中继器(Repeater)作为一个实际产品出现主要有两个原因:
  
  第一,扩展网络距离,将衰减信号经过再生。
  
  第二,实现粗同轴电缆以太网和细同轴电缆以太网的互连。
  
  通过中继器虽然可以延长信号传输的距离、实现两个网段的互连。但并没有增加网络的可用带宽。如图2所示,网段1和网段2经过中继器连接后构成了一个单个的冲突域和广播域。
  
  
 
  图2  中继器连接的网络

  
  3、集线器(HUB)
  
  集线器实际上相当于多端口(在本章,我们常用"端口"一词代替"接口"这个术语)的中继器。集线器通常有8个、16个或24个等数量不等的接口。
  
  集线器同样可以延长网络的通信距离,或连接物理结构不同的网络,但主要还是作为一个主机站点的汇聚点,将连接在集线器上各个接口上的主机联系起来使之可以互相通信。
  
  如图3所示,所有主机都连接到中心节点的集线器上构成一个物理上的星型连接。但实际上,在集线器内部,各接口都是通过背板总线连接在一起的,在逻辑上仍构成一个共享的总线。因此,集线器和其所有接口所接的主机共同构成了一个冲突域和一个广播域。
  
  
 
  图3  集线器连接的网络

  
  4、网桥(Bridge)
  
  网桥(Bridge)又称为桥接器。和中继器类似,传统的网桥只有两个端口,用于连接不同的网段。和中继器不同的是,网桥具有一定的"智能"性,可以"学习"网络上主机的地址,同时具有信号过滤的功能。
  
  如图4所示,网段1的主机A发给主机B的数据包不会被网桥转发到网段2。因为,网桥可以识别这是网段1内部的通信数据流。同样,网段2的主机X发给主机 Y的数据包也不会被网桥转发到网段1。可见,网桥可以将一个冲突域分割为两个。其中,每个冲突域共享自己的总线信道带宽。
  
  
 
  图4  网桥连接的网络

  
  但是,如果主机C发送了一个目标是所有主机的广播类型数据包时,网桥要转发这样的数据包。网桥两侧的两个网段总线上的所有主机都要接收该广播数据包。因此,网段1和网段2仍属于同一个广播域。
  
  5、交换机(Switch)
  
  交换机(Switch)也被称为交换式集线器。它的出现是为了解决连接在集线器上的所有主机共享可用带宽的缺陷。
  
  交换机是通过为需要通信的两台主机直接建立专用的通信信道来增加可用带宽的。从这个角度上来讲,交换机相当于多端口网桥。
  
  如图5所示,交换机为主机A和主机B建立一条专用的信道,也为主机C和主机D建立一条专用的信道。只有当某个接口直接连接了一个集线器,而集线器又连接了多台主机时,交换机上的该接口和集线器上所连的所有主机才可能产生冲突,形成冲突域。换句话说,交换机上的每个接口都是自己的一个冲突域。
  
  
 
  图5  交换机连接的网络

  
  但是,交换机同样没有过滤广播通信的功能。如果交换机收到一个广播数据包后,它会向其所有的端口转发此广播数据包。因此,交换机和其所有接口所连接的主机共同构成了一个广播域。
  
  我们将使用交换机作为互连设备的局域网称为交换式局域网。
  
  6、路由器(Router)
  
  路由器工作在网络层,可以识别网络层的地址-IP地址,有能力过滤第3层的广播消息。实际上,除非做特殊配置,否则路由器从不转发广播类型的数据包。因此,路由器的每个端口所连接的网络都独自构成一个广播域。如图6所示,如果各网段都是共享式局域网,则每网段自己构成一个独立的冲突域。
  
  
 
  图6  路由器连接的网络

  
  7、网关(Gateway)
  
  网关工作在OSI参考模型的高三层,因此,并不使用冲突域、广播域的概念。网关主要用来进行高层协议之间的转换。例如,充当LOTUS 1-2-3邮件服务和Microsoft Exchange邮件服务之间的邮件网关。
  
  注意,这里网关的概念完全不同于PC主机以及路由器上配置的默认网关(default gateway)。
posted @ 2009-06-02 10:56 黄剑父 阅读(173) | 评论 (0)编辑 收藏

集线器--集线器也叫Hub,工作在物理层(最底层),没有相匹配的软件系统,是纯硬件设备。集线器主要用来连接计算机等网络终端。集线器为共享式带宽,连接在集线器上的任何一个设备发送数据时,其他所有设备必须等待,此设备享有全部带宽,通讯完毕,再由其他设备使用带宽。正因此,集线器连接了一个冲突域的网络。所有设备相互交替使用,就好象大家一起过一根独木桥一样。
  集线器不能判断数据包的目的地和类型,所以如果是广播数据包也依然转发,而且所有设备发出数据以广播方式发送到每个接口,这样集线器也连接了一个广播域的网络。

  交换机-- 交换机Switch,工作在数据链路层(第二层),稍微高端一点的交换机都有一个操作系统来支持。和集线器一样主要用于连接计算机等网络终端设备。交换机比集线器更加先进,允许连接在交换机上的设备并行通讯,好比高速公路上的汽车并行行使一般,设备间通讯不会再发生冲突,因此交换机打破了冲突域,交换机每个接口是一个冲突域,不会与其他接口发生通讯冲突。并且有系统的交换机可以记录MAC地址表,发送的数据不会再以广播方式发送到每个接口,而是直接到达目的接口,节省了接口带宽。但是交换机和集线器一样不能判断广播数据包,会把广播发送到全部接口,所以交换机和集线器一样连接了一个广播域网络。  字串2
  高端一点的交换机不仅可以记录MAC地址表,还可以划分VLAN(虚拟局域网)来隔离广播,但是VLAN间也同样不能通讯。要使VLAN间能够通讯,必须有三层设备介入。

  路由器--路由器Router,工作在网络层(第三层),所有的路由器都有自己的操作系统来维持,并且需要人员调试,否则不能工作。路由器没有那么多接口,主要用来进行网络与网络的连接。
  简单的说路由器把数据从一个网络发送到另一个网络,这个过程就叫路由。路由器不仅能像交换机一样隔离冲突域,而且还能检测广播数据包,并丢弃广播包来隔离广播域,有效的扩大了网络的规模。在路由器中记录着路由表,路由器以此来转发数据,以实现网络间的通讯。路由器的介入可以使交换机划分的VLAN实现互相通讯。

 

总结


集线器:纯硬件、用于连接网络终端、不能打破冲突域和广播域。

交换机:拥有软件系统、用于连接网络终端、能够打破冲突域,但是不能分割广播域。

路由器:拥有软件系统、用于连接网络、可以打破冲突域也可以分割广播域,是连接大型网络的必备设备

posted @ 2009-06-02 10:49 黄剑父 阅读(142) | 评论 (0)编辑 收藏

文章来源:http://xyzhao.javaeye.com/blog/218372

1.排他锁和共享锁有什么区别?

 

共享锁(S锁) :如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。
排他锁(X锁) :如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。


2.Windows是不是只有排他锁?

 

Windows中可以有共享锁


3.共享锁有什么用?

 

其它用户可以并发读取,查询数据。但不能修改,增加,删除数据。资源共享.

posted @ 2009-06-02 10:36 黄剑父 阅读(708) | 评论 (0)编辑 收藏
前两天看到一个故事——
有一天,一位其貌不扬的男士,带着一位十分艳丽的OL,来到Causeway Bay一家LV店。他为OL选了一价值6万5元的LV handbag。
  付款时,男士掏出支票本,十分潇洒地签了一张支票。店员有些为难,因为这对夫妇是第一次来店购物。
  男士看穿了店员的心思,十分冷静地对店员说: "我感觉到,您担心这是一张是空头支票,对吗?今天是周六,银行关门。我建议您把支票和handbag都留下。等到星期一支票兑现之后,再请你们把 handbag 送到这位小姐的府上。您看这样行不行?"
  店员放了下心来,欣然地接受了这个建议,并且大方的承诺,递送handbag的费用由该店承担,他本人将会亲自把这件事情给办妥。
  星期一,店员拿着支票去银行入账,支票果真是张空头支票!愤怒的店员打电话给那位顾客,客户对他说: "这没有什么要紧啊!你和我都没有损失。上星期六的晚上我已经同那个女孩上床了!哦,多谢您的合作。"


这 个故事揭示了次贷危机的本质。人们在对未来收益充满良好预期的时候,对于可能加大风险缺乏防范意识。美女认为周一六万多LV就到家了,自然也就放松了警 惕,认为ONS的投资是值得的,对于投入产出的预期是建立在一个具有巨大不确定风险的情况下的。而对未来收益预期的包装则是这些投资机构最擅长的事情。中 国的股民大多跟这个美女一样,所以亏钱基本上是活该,没有这些人,股市赚谁的钱呢。而媒体和分析家们,往往在其中扮演了LV店员的配合角色。
posted @ 2009-06-01 20:46 黄剑父 阅读(90) | 评论 (0)编辑 收藏
QoS
        QoS的英文全称为"Quality of Service",中文名为"服务质量"。QoS是网络的一种安全机制, 是用来解决网络延迟和阻塞等问题的一种技术。
  在正常情况下,如果网络只用于特定的无时间限制的应用系统,并不需要QoS,比如Web应用,或E-mail设置等。但是对关键应用和多媒体应用就十分必要。当网络过载或拥塞时,QoS 能确保重要业务量不受延迟或丢弃,同时保证网络的高效运行。
资料来源:http://baike.baidu.com/view/20897.htm
posted @ 2009-06-01 14:41 黄剑父 阅读(1122) | 评论 (0)编辑 收藏

朋友帖了如下一段代码:
  #pragma pack(4)
  class TestB
  {
  public:
    int aa;
    char a;
    short b;
    char c;
  };
  int nSize = sizeof(TestB);
  这里nSize结果为12,在预料之中。

  现在去掉第一个成员变量为如下代码:
  #pragma pack(4)
  class TestC
  {
  public:
    char a;
    short b;
    char c;
  };
  int nSize = sizeof(TestC);
  按照正常的填充方式nSize的结果应该是8,为什么结果显示nSize为6呢?

事实上,很多人对#pragma pack的理解是错误的。
#pragma pack规定的对齐长度,实际使用的规则是:
结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
也就是说,当#pragma pack的值等于或超过所有数据成员长度的时候,这个值的大小将不产生任何效果。
而结构整体的对齐,则按照结构体中最大的数据成员 和 #pragma pack指定值 之间,较小的那个进行。

具体解释
#pragma pack(4)
  class TestB
  {
  public:
    int aa; //第一个成员,放在[0,3]偏移的位置,
    char a; //第二个成员,自身长为1,#pragma pack(4),取小值,也就是1,所以这个成员按一字节对齐,放在偏移[4]的位置。
    short b; //第三个成员,自身长2,#pragma pack(4),取2,按2字节对齐,所以放在偏移[6,7]的位置。
    char c; //第四个,自身长为1,放在[8]的位置。
  };
这个类实际占据的内存空间是9字节
类之间的对齐,是按照类内部最大的成员的长度,和#pragma pack规定的值之中较小的一个对齐的。
所以这个例子中,类之间对齐的长度是min(sizeof(int),4),也就是4。
9按照4字节圆整的结果是12,所以sizeof(TestB)是12。


如果
#pragma pack(2)
    class TestB
  {
  public:
    int aa; //第一个成员,放在[0,3]偏移的位置,
    char a; //第二个成员,自身长为1,#pragma pack(4),取小值,也就是1,所以这个成员按一字节对齐,放在偏移[4]的位置。
    short b; //第三个成员,自身长2,#pragma pack(4),取2,按2字节对齐,所以放在偏移[6,7]的位置。
    char c; //第四个,自身长为1,放在[8]的位置。
  };
//可以看出,上面的位置完全没有变化,只是类之间改为按2字节对齐,9按2圆整的结果是10。
//所以 sizeof(TestB)是10。

最后看原贴:
现在去掉第一个成员变量为如下代码:
  #pragma pack(4)
  class TestC
  {
  public:
    char a;//第一个成员,放在[0]偏移的位置,
    short b;//第二个成员,自身长2,#pragma pack(4),取2,按2字节对齐,所以放在偏移[2,3]的位置。
    char c;//第三个,自身长为1,放在[4]的位置。
  };
//整个类的大小是5字节,按照min(sizeof(short),4)字节对齐,也就是2字节对齐,结果是6
//所以sizeof(TestC)是6。

感谢Michael 提出疑问,在此补充:

当数据定义中出现__declspec( align() )时,指定类型的对齐长度还要用自身长度和这里指定的数值比较,然后取其中较大的。最终类/结构的对齐长度也需要和这个数值比较,然后取其中较大的。

可以这样理解, __declspec( align() ) 和 #pragma pack是一对兄弟,前者规定了对齐的最小值,后者规定了对齐的最大值,两者同时出现时,前者拥有更高的优先级。
__declspec( align() ) 的一个特点是,它仅仅规定了数据对齐的位置,而没有规定数据实际占用的内存长度,当指定的数据被放置在确定的位置之后,其后的数据填充仍然是按照#pragma pack规定的方式填充的,这时候类/结构的实际大小和内存格局的规则是这样的:
在 __declspec( align() )之前,数据按照#pragma pack规定的方式填充,如前所述。当遇到__declspec( align() )的时候,首先寻找距离当前偏移向后最近的对齐点(满足对齐长度为 max(数据自身长度,指定值) ),然后把被指定的数据类型从这个点开始填充,其后的数据类型从它的后面开始,仍然按照#pragma pack填充,直到遇到下一个__declspec( align() )。
当所有数据填充完毕,把结构的整体对齐数值和__declspec( align() )规定的值做比较,取其中较大的作为整个结构的对齐长度。
特别的,当__declspec( align() )指定的数值比对应类型长度小的时候,这个指定不起作用。

posted @ 2009-05-31 17:51 黄剑父 阅读(123) | 评论 (0)编辑 收藏
仅列出标题
共6页: 1 2 3 4 5 6