精华内容
下载资源
问答
  • 任务:Clojure的简单功能并行并发原语
  • 进程同步与互斥:P、V原语操作

    千次阅读 2019-06-16 21:44:31
    同步:用户多个进程相互协作,共同完成任务,是进程的直接制约问题 互斥:多个进程分别使用有限的资源 临界资源:一次只允许一个进程使用的共享资源 临界区:一个访问临界资源的程序段。同一时刻,只允许一个...

    1. 名词解释

    • 多个进程并发执行时,进程间必然存在共享资源和相互合作的问题
    • 同步:用户多个进程相互协作,共同完成任务,是进程间的直接制约问题
    • 互斥:多个进程分别使用有限的资源
    • 临界资源:一次只允许一个进程使用的共享资源
    • 临界区:一个访问临界资源的程序段。同一时刻,只允许一个进程进入临界区,进入后,不允许其他进程进入
    • 信号量:进程间同步及互斥工具
      在操作系统中实现时一般作为一个整数变量,这种信号量称为整型信号量。信号量S的物理含义:
      S >= 0表示某资源的可用数
      S<0 其绝对值表示阻塞队列中等待该资源的进程数目
      信号量可以用来保证两个或多个关键代码段不被并发调用。一个进程在进入一个关键代码段之前,进程(或线程)必须获取一个信号量;一旦关键代码段完成了,那么该进程(或线程)必须释放信号量。其它想进入该关键代码段的进程(或线程)必须等待直到第一个进程(或线程)释放信号量

    2. P、V原语

    • PV原语:是信号量的两个操作方法,在执行期间不允许由中断发生
      P操作:S=S-1,表示申请一个空闲资源;如果S-1后仍大于等于0,则该进程继续执行,直到S小于0,该进程由运行状态进入阻塞状态
    P{
    	S = S - 1;//如果S>=0,表示该进程可以进入临界区	
    	if(S < 0)
    		Wait(s);//当前进程进入等待队列
    }
    

    V操作:S=S+1,表示释放一个被占用的资源;如果S+1大于0,则该进程继续执行,如果S+1小于等于0,则从该信号的等待队列中唤醒一个线程,然后再返回原进程继续执行或转进程调度

    V{
    	S = S + 1;//如果S<=0,表示等待队列中有等待的线程,可以唤醒
    	if(S < =0)
    		Resume(S);//唤醒等待队列中的一个线程
    }
    

    3. P、V原语对信号量操作的三种情况

    • 把信号量视为一个加锁标志位,实现对一个共享变量的互斥访问
      实现过程:
      P(S);//S初始值为1,访问该共享数据
      V(S);
      非临界区;

    • 把信号量视为是某种类型的共享资源的剩余个数,实现对一类共享资源的访问
      P(S);//S初始值为剩余共享资源的个数N,访问该共享资源
      V(S);
      非临界区;

    • 把信号量作为进程间的同步工具
      临界区C1;
      P(S);
      V(S);
      临界区C2;

    4. 实现进程互斥

    用于互斥的信号量S与所有的并发进程有关,所以称之为公有信号量
    初始化信号量S为1,当进入临界区时执行P操作,退出临界区时执行V操作
    P(S)
    临界区代码;
    V(S)

    注意:

    • 每个程序中实现互斥的P、V操作必须成对出现,先做P操作(进临界区),后做V操作(出临界区)。若有多个分支,要保证其成对出现
    • P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环
    • 互斥信号量的初值一般为1

    示例:
    一、 生产围棋的工人不小心把相等数量的黑子和白子混装载一个箱子里,现要用自动分拣系统把黑子和白子分开,该系统由两个并发执行的进程组成,功能如下:
    (1)进程A专门拣黑子,进程B专门拣白子;
    (2)每个进程每次只拣一个子,当一个进程在拣子时不允许另一个进程去拣子;

    • 由(2)知互斥
    • 有一个共享资源(一个箱子),则设置一个信号量S;共享资源的数目为1(只有一个箱子),则S的初始值为1

    二、某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时,厅外的购票者可立即进入,否则需要在外面等待。每个购票者可看成一个进程。

    • 当售票厅中人数超过20,购票者需要在厅外等待,则互斥
    • 有一个共享资源(一个售票厅),则设置一个信号量S;共享资源的实体数为20,则S初始化为20

    5. 实现进程同步

    进程同步时的信号量只与制约进程及被制约进程有关而不是与整组并发进程有关,所以称该信号量为私有信号量

    注意:
    P操作不一定在V操作的前面

    示例:
    一、 4中的示例一加上下面条件(3)
    (3)当一个进程拣了一个棋子(黑子或白子)以后,必让另一个进程拣一个棋子(黑子或白子)

    • 确定进程间关系:由(1)、(2)、(3)知,进程之间是同步关系
    • 确定信号量和其值:共享资源一个(一只箱子),但是进程A、B需要轮流取棋子,它们之间需要通信,所以进程A设置一个私有信号量S1,用于判断A能否去捡黑子,进程B设置一个私有信号量S2,用于判断B能否去捡白子;由于每次取一颗棋子,所以S1初始化为1且S2初始化为0(或者S1初始化为0且S2初始化为1)

    二、生产者进程P1不断地生产产品送入缓冲区,消费者进程P2不断地从缓冲区中提取产品消费。(单缓冲区的生产者和消费者问题)

    • 进程间为同步关系
    • 共享资源一个(单缓冲区),需要进程P1放,进程P2取,轮流执行;进程P1设置一个信号量S1,且初始化为1,表示缓冲区为空,可以将产品放入缓冲区;进程P2设置一个信号量S2,初始值为0,表示缓冲区有产品,可以提取产品消费

    P1(生产):P(S1)测试缓冲区是否为空----->产品送缓冲区---->V(S2)设置有产品---->重复
    P2(消费):P(S2)测试是否有产品----->从缓冲区取出产品------->V(S1)设置缓冲区为空—>重复

    三、设有一个生产者和一个消费者,缓冲区可以存放n件物品,生产者进程P1不断地生产产品,消费者进程P2不断地消费产品。(多缓冲区同步问题)

    • 设置3个信号量,S、S1、S2
    • S是一个互斥信号量初值为1(只有一个缓冲区),对缓冲区资源进行互斥控制
    • S1表示进程P1是否可以将物品放入缓冲区,初值为n(缓冲区的容量为n)
    • S2表示缓冲区中是否有物品,初值为0

    P1(生产):P(S1)—>P(S)—>产品送缓冲区—>V(S)---->V(S2)
    P2(消费):P(S2)------>P(S)—>从缓冲区取出一个产品----->V(S)----->V(S1)
    其中P(S)—>缓冲区—>V(S)是实现进程间的互斥,必须满足PV实现互斥操作的原则

    参考:https://blog.csdn.net/smstong/article/details/5607416
    https://blog.csdn.net/henrya2/article/details/2334455
    https://blog.csdn.net/qq_39750835/article/details/78597976

    展开全文
  • 1 进程通信   进程通信至少可以通过传送打开文件来实现,不同的进程通过一个或多个文件来传递信息,事实上,在很多应用系统里,都使用了这种方法。但一般说来, 进程通信(IPC:InterProcess Communication...

     

    1 进程间通信

     

    进程间通信至少可以通过传送打开文件来实现,不同的进程通过一个或多个文件来传递信息,事实上,在很多应用系统里,都使用了这种方法。但一般说来, 进程间通信(IPC:InterProcess Communication)不包括这种似乎比较低级的通信方法。Unix系统中实现进程间通信的方法很多,而且不幸的是,极少方法能在所有的Unix系 统中进行移植(唯一一种是半双工的管道,这也是最原始的一种通信方式)。而Linux作为一种新兴的操作系统,几乎支持所有的Unix下常用的进程间通信 方法:管道、消息队列、共享内存、信号量、套接口等等。

     

     

     

     

     

    2 进程的同步与互斥

    (1) 进程同步: 多个进程需要相互配合共同完成一项任务。

    (2) 进程互斥: 由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥;系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源, 而在进程中涉及到互斥资源的程序段叫临界区.

    对于多个进程的并发状态,进程是基于CPU时间片轮转的。

    我们可以从下面司机和售票员的关系理解进程间的同步:


    司机和售票员是合作的关系,售票员先关门,然后司机启动车辆,正常运行时间售票,然后到站停车,售票员开门,这是进程间同步的例子。

    我们可以利用后面提到的信号量解决进程间的同步和互斥的问题。

     

    3 进程间通信的目的

    (1) 数据传输:一个进程需要将它的数据发送给另外一个进程。
    (2) 资源共享:多个进程之间共享同样的资源。
    (3) 进程事件:一个进程需要向另一个或一组进程发送消息,通知他(他们)发生了某种事件(如进程终止时要通知父进程)。
    (4) 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变(可使用SIGTRAP信号实现)。

    在进程间通信的发展中:管道->System V(系统基本都支持)->POSIX进程间通信,其中System V使用的很广泛。


    4 进程间通信分类

    注意:进程间通信是通过操作系统,而线程间通信是基于进程的,不需要经过操作系统。 

    (1) 文件
    (2) 文件锁

    (3) 管道(pipe), 管道可用于具有亲缘关系进程间的通信,允许一个进程和另外一个与它有共同祖先的进程之间进行通信。

    (4) 命名管道(FIFO), 命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间通信,命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。 

    (5) 信号, 信号是比较复杂的通信方式,用于通知接收进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身。

    (6) 套接字(socket), 套接字(socket)更为一般的进程间通信机制,可用于不同机器之间的进程通信。

    (7) System V IPC
        System V 消息队列, System V 共享内存, System V 信号量
         
    (8) POSIX IPC
        消息队列, 共享内存, 信号量, 互斥量, 条件变量, 读写锁
        
     消息队列是消息的连接表,包括Posix消息队列、systern V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读队列中的消息、消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓存区大小受限等缺陷。
     
     共享内存:使得多个进程可以访问同一块内存空间,是最快可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其他通信机制,如与信号量结合使用,来达到进程间的同步及互斥。

     内存映射;内存映射允许多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。
     
     信号量:主要作为进程间以及同一进程不同线程之间的同步手段。
      


    4.1 进程间共享信息的三种方式

     

    4.2 IPC对象的持续性

     

    (1) 随进程持续:一直存在直到打开的最后一个进程结束。(如pipe和FIFO(进程结束,数据删除))

    (2) 随内核持续:一直存在直到内核自举(重启)或显式删除(如System V消息队列、共享内存、信号量)

    (3) 随文件系统持续:一直存在直到显式删除,即使内核自举还存在。(POSIX消息队列、共享内存、信号量如果是使用映射文件来实现)  

     

     

    5 进程死锁及处理

    死锁是指多个进程之间相互等待对方的资源,而在得到对方资源之前又不释放自己的资源,这样,造成循环等待的一种现象。如果所有进程都在等待一个不可能发生的事,则进程就死锁了。

    死锁产生的四个必要条件

    (1) 互斥条件

        进程对资源进行排它性使用,即在一段时间内某资源仅为一个进程所占用。 

    (2) 请求和保持条件

        当进程因请求资源而阻塞时,对已获得的资源保持不放。 

    (3) 不可剥夺条件

        进程已获得的资源在未使用完之前,不能被剥夺,只能在使用完时由自己释放。 

    (4) 环路等待条件

        各个进程组成封闭的环形链,每个进程都等待下一个进程所占用的资源

     

    5.1 死锁预防

    上面四个条件缺一不可,只要我们随意破坏2,3,4就可以避免死锁。

    (1) 资源一次性分配:(破坏请求和保持条件)
    (2) 可剥夺资源:破坏不可剥夺条件)
    (3) 资源有序分配法:(破坏循环等待条件)

          

    5.2 死锁避免

    但是上面预防死锁的几种策略,会严重地损害系统性能。因此在避免死锁时,要施加较弱的限制,从而获得较满意的系统性能。

    由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。

     

    5.2.1 银行家算法

    为保证资金的安全,银行家规定: 

    (1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客; 

    (2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量

    (3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款

    (4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金. 

     

    5.2.2 哲学家就餐问题

    五个哲学家围在一个圆桌就餐,每个人都必须拿起两把叉子才能用餐;

    哲学家就餐问题解法:

    (1)服务生解法: 将服务生看作是一个管理者, 哲学家在拿叉子之前需要征得服务生的同意;

    (2)最多4个哲学家;

    (3)仅当一个哲学家两边筷子都可用时才允许他拿筷子;

    (4)给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之;

     

     

    6 信号量


    信号量和P、V原语由Dijkstra(迪杰斯特拉)提出, 迪杰斯特拉的三大贡献: goto有害, PV原语, 迪杰斯塔拉最短路算法; 

    信号量值含义

       S>0:S表示可用资源的个数

       S=0:表示无可用资源,无等待进程

       S<0:|S|表示等待队列中进程个数

    下面代码是原子性的,硬件中通过关闭中断来实现,软件通过关闭中断实现。   

     

    // 信号量定义  
    typedef struct{  
       int value;  
       struct process_control_block *list;  
    }semaphore;  

     

     

    PV操作:

     

    // P原语  
    // P(semaphore *S)  
    wait(semaphore *S)  
    {  
        -- S->value;  
        if (S->value < 0)  
        {  
            // 将当前进程设置为阻塞状态  
            // 将当前进程的PCB插入相应的阻塞队列S->list末尾  
            block(S->list);  
        }  
    } 

     

    // V原语  
    // V(semaphore *S)  
    signal(semaphore *S)  
    {  
        ++ S->value;  
        if (S->value <= 0)  // 表示有进程处于阻塞状态  
        {  
            // 唤醒阻塞队列S->list中等待的一个进程,将其置为就绪态;  
            // 将其插入就绪队列;  
            wakeup (S->list);  
        }  
    }  

     

     

     

    使用PV原语解决开篇提到的问题:

     

     

    注意:

    PV 原语分布在不同的进程中一般是为了解决同步问题的,在同一进程中一般是解决互斥的问题。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    本文转自:

    https://blog.csdn.net/NK_test/article/details/49475379

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 计算机网络谢希仁第七版 课后答案

    万次阅读 多人点赞 2019-09-03 23:13:25
    数据链路层 数据链路层的任务是在两个相邻结点的线路上无差错地传送以帧(frame)为单位的数据。每一帧包括数据和必要的控制信息。网络层 网络层的任务就是要选择合适的路由,使 发送站的运输层所传下来的分组能够...

    谢希仁计算机网络第七版课后答案

    第一章 概述

    1-01 计算机网络向用户可以提供那些服务?答: 连通性和共享
    1-02 简述分组交换的要点。答:(1)报文分组,加首部(2)经路由器储存转发(3)在目的地合并
    1-03 试从多个方面比较电路交换、报文交换和分组交换的主要优缺点。
    在这里插入图片描述
    答: (1)电路交换:端对端通信质量因约定了通信资源获得可靠保障,对连续传送大量数据效率高。(2)报文交换:无须预约传输带宽,动态逐段利用传输带宽对突发式数据通信效率高,通信迅速。(3)分组交换:具有报文交换之高效、迅速的要点,且各分组小,路由灵活,网络生存性能好。
    1-04 为什么说因特网是自印刷术以来人类通信方面最大的变革?谢希仁计算机网络第七版课后答案
    答: 融合其他通信网络,在信息化过程中起核心作用,提供最好的连通性和信息共享,第一次提供了各种媒体形式的实时交互能力。
    谢希仁计算机网络第七版课后答案
    1-05 因特网的发展大致分为哪几个阶段?请指出这几个阶段的主要特点。
    答:从单个网络APPANET向互联网发展;TCP/IP协议的初步成型  建成三级结构的Internet;分为主干网、地区网和校园网;形成多层次ISP结构的Internet;ISP首次出现。
    1-06 简述因特网标准制定的几个阶段?
    答:(1)因特网草案(Internet Draft) ——在这个阶段还不是 RFC 文档。(2)建议标准(Proposed Standard) ——从这个阶段开始就成为 RFC 文档。(3)草案标准(Draft Standard)(4) 因特网标准(Internet Standard)
    1-07小写和大写开头的英文名internet 和Internet在意思上有何重要区别?
    答:(1) internet(互联网或互连网):通用名词,它泛指由多个计算机网络互连而成的网络。;协议无特指(2)Internet(因特网):专用名词,特指采用 TCP/IP 协议的互联网络。区别:后者实际上是前者的双向应用
    1-08 计算机网络都有哪些类别?各种类别的网络都有哪些特点?
    答:按范围:(1)广域网WAN:远程、高速、是Internet的核心网。
    (2)城域网:城市范围,链接多个局域网。
    (3)局域网:校园、企业、机关、社区。
    (4)个域网PAN:个人电子设备
    按用户:公用网:面向公共营运。专用网:面向特定机构。
    谢希仁计算机网络第七版课后答案
    1-09 计算机网络中的主干网和本地接入网的主要区别是什么?
    答:主干网:提供远程覆盖\高速传输\和路由器最优化通信。本地接入网:主要支持用户的访问本地,实现散户接入,速率低。
    1-10 试在下列条件下比较电路交换和分组交换。要传送的报文共x(bit)。从源点到终点共经过k段链路,每段链路的传播时延为d(s),数据率为b(b/s)。在电路交换时电路的建立时间为s(s)。在分组交换时分组长度为p(bit),且各结点的排队等待时间可忽略不计。问在怎样的条件下,分组交换的时延比电路交换的要小?(提示:画一下草图观察k段链路共有几个结点。)
    答:线路交换时延:kd+x/b+s, 分组交换时延:kd+(x/p)(p/b)+ (k-1)(p/b),其中(k-1)(p/b)表示K段传输中,有(k-1)次的储存转发延迟,当s>(k-1)(p/b)时,电路交换的时延比分组交换的时延大,当x>>p,相反。
    1-11 在上题的分组交换网中,设报文长度和分组长度分别为x和(p+h)(bit),其中p为分组的数据部分的长度,而h为每个分组所带的控制信息固定长度,与p的大小无关。通信的两端共经过k段链路。链路的数据率为b(b/s),但传播时延和结点的排队时间均可忽略不计。若打算使总的时延为最小,问分组的数据部分长度p应取为多大?(提示:参考图1-12的分组交换部分,观察总的时延是由哪几部分组成。)答:总时延D表达式,分组交换时延为:D= kd+(x/p)((p+h)/b)+ (k-1)(p+h)/b D对p求导后,令其值等于0,求得p=[(xh)/(k-1)]^0.5
    1-12 因特网的两大组成部分(边缘部分与核心部分)的特点是什么?它们的工作方式各有什么特点?
    答:边缘部分:由各主机构成,用户直接进行信息处理和信息共享;低速连入核心网。核心部分:由各路由器连网,负责为边缘部分提供高速远程分组交换。
    谢希仁计算机网络第七版课后答案
    1-13 客户服务器方式与对等通信方式的主要区别是什么?有没有相同的地方?
    答:前者严格区分服务和被服务者,后者无此区别。后者实际上是前者的双向应用。
    1-14 计算机网络有哪些常用的性能指标?
    答:速率,带宽,吞吐量,时延,时延带宽积,往返时间RTT,利用率
    1-15 假定网络利用率达到了90%。试估计一下现在的网络时延是它的最小值的多少倍?
    解:设网络利用率为U。,网络时延为D,网络时延最小值为D0U=90%;D=D0/(1-U)---->D/ D0=10 现在的网络时延是最小值的10倍
    1-16 计算机通信网有哪些非性能特征?非性能特征与性能特征有什么区别?
    答:征:宏观整体评价网络的外在表现。性能指标:具体定量描述网络的技术性能。
    1-17 收发两端之间的传输距离为1000km,信号在媒体上的传播速率为2×108m/s。试计算以下两种情况的发送时延和传播时延:
    (1) 数据长度为107bit,数据发送速率为100kb/s。
    (2) 数据长度为103bit,数据发送速率为1Gb/s。
    从上面的计算中可以得到什么样的结论?
    解:(1)发送时延:ts=107/105=100s传播时延tp=106/(2×108)=0.005s
    (2)发送时延ts =103/109=1µs传播时延:tp=106/(2×108)=0.005s
    结论:若数据长度大而发送速率低,则在总的时延中,发送时延往往大于传播时延。但若数据长度短而发送速率高,则传播时延就可能是总时延中的主要成分。
    1-18 假设信号在媒体上的传播速度为2×108m/s.媒体长度L分别为:
    (1)10cm(网络接口卡)(2)100m(局域网)
    (3)100km(城域网)(4)5000km(广域网)
    试计算出当数据率为1Mb/s和10Gb/s时在以上媒体中正在传播的比特数。
    谢希仁计算机网络第七版课后答案
    解:(1)1Mb/s:传播时延=0.1/(2×108)=5×10-10比特数=5×10-10×1×106=5×10-4 1Gb/s: 比特数=5×10-10×1×109=5×10-1
    (2)1Mb/s: 传播时延=100/(2×108)=5×10-7比特数=5×10-7×1×106=5×10-1 1Gb/s: 比特数=5×10-7×1×109=5×102
    (3) 1Mb/s: 传播时延=100000/(2×108)=5×10-4比特数=5×10-4×1×106=5×1021Gb/s: 比特数=5×10-4×1×109=5×105
    (4)1Mb/s: 传播时延=5000000/(2×108)=2.5×10-2比特数=2.5×10-2×1×106=5×1041Gb/s: 比特数=2.5×10-2×1×109=5×107
    1-19 长度为100字节的应用层数据交给传输层传送,需加上20字节的TCP首部。再交给网络层传送,需加上20字节的IP首部。最后交给数据链路层的以太网传送,加上首部和尾部工18字节。试求数据的传输效率。数据的传输效率是指发送的应用层数据除以所发送的总数据(即应用数据加上各种首部和尾部的额外开销)。若应用层数据长度为1000字节,数据的传输效率是多少?
    解:(1)100/(100+20+20+18)=63.3%
    (2)1000/(1000+20+20+18)=94.5%
    1-20 网络体系结构为什么要采用分层次的结构?试举出一些与分层体系结构的思想相似的日常生活。答:分层的好处:①各层之间是独立的。某一层可以使用其下一层提供的服务而不需要知道服务是如何实现的。②灵活性好。当某一层发生变化时,只要其接口关系不变,则这层以上或以下的各层均不受影响。③结构上可分割开。各层可以采用最合适的技术来实现④易于实现和维护。⑤能促进标准化工作。与分层体系结构的思想相似的日常生活有邮政系统,物流系统。
    谢希仁计算机网络第七版课后答案
    1-21 协议与服务有何区别?有何关系?答:网络协议:为进行网络中的数据交换而建立的规则、标准或约定。由以下三个要素组成:
    (1)语法:即数据与控制信息的结构或格式。
    (2)语义:即需要发出何种控制信息,完成何种动作以及做出何种响应。
    (3)同步:即事件实现顺序的详细说明。协议是控制两个对等实体进行通信的规则的集合。在协议的控制下,两个对等实体间的通信使得本层能够向上一层提供服务,而要实现本层协议,还需要使用下面一层提供服务。
    协议和服务的概念的区分:
    1、协议的实现保证了能够向上一层提供服务。本层的服务用户只能看见服务而无法看见下面的协议。下面的协议对上面的服务用户是透明的。
    2、协议是“水平的”,即协议是控制两个对等实体进行通信的规则。但服务是“垂直的”,即服务是由下层通过层间接口向上层提供的。上层使用所提供的服务必须与下层交换一些命令,这些命令在OSI中称为服务原语。

    1-22 网络协议的三个要素是什么?各有什么含义?谢希仁计算机网络第七版课后答案
    答:网络协议:为进行网络中的数据交换而建立的规则、标准或约定。由以下三个要素组成:
    (1)语法:即数据与控制信息的结构或格式。
    (2)语义:即需要发出何种控制信息,完成何种动作以及做出何种响应。
    (3)同步:即事件实现顺序的详细说明。
    1-23 为什么一个网络协议必须把各种不利的情况都考虑到?
    答:因为网络协议如果不全面考虑不利情况,当情况发生变化时,协议就会保持理想状况,一直等下去!就如同两个朋友在电话中约会好,下午3点在公园见面,并且约定不见不散。这个协议就是很不科学的,因为任何一方如果有耽搁了而来不了,就无法通知对方,而另一方就必须一直等下去!所以看一个计算机网络是否正确,不能只看在正常情况下是否正确,而且还必须非常仔细的检查协议能否应付各种异常情况。
    1-24 论述具有五层协议的网络体系结构的要点,包括各层的主要功能。谢希仁计算机网络第七版课后答案
    答:综合OSI 和TCP/IP 的优点,采用一种原理体系结构。各层的主要功能:物理层 物理层的任务就是透明地传送比特流。(注意:传递信息的物理媒体,如双绞线、同轴电缆、光缆等,是在物理层的下面,当做第0 层。) 物理层还要确定连接电缆插头的定义及连接法。数据链路层 数据链路层的任务是在两个相邻结点间的线路上无差错地传送以帧(frame)为单位的数据。每一帧包括数据和必要的控制信息。网络层 网络层的任务就是要选择合适的路由,使 发送站的运输层所传下来的分组能够
    正确无误地按照地址找到目的站,并交付给目的站的运输层。运输层 运输层的任务是向上一层的进行通信的两个进程之间提供一个可靠的端到端服务,使它们看不见运输层以下的数据通信的细节。应用层 应用层直接为用户的应用进程提供服务。
    1-25 试举出日常生活中有关“透明”这种名词的例子。
    答:电视,计算机视窗操作系统、工农业产品
    1-26 试解释以下名词:协议栈、实体、对等层、协议数据单元、服务访问点、客户、服务器、客户-服务器方式。
    答:实体(entity) 表示任何可发送或接收信息的硬件或软件进程。协议是控制两个对等实体进行通信的规则的集合。客户(client)和服务器(server)都是指通信中所涉及的两个应用进程。客户是服务的请求方,服务器是服务的提供方。客户服务器方式所描述的是进程之间服务和被服务的关系。 协议栈:指计算机网络体系结构采用分层模型后,每层的主要功能由对等层协议的运行来实现,因而每层可用一些主要协议来表征,几个层次画在一起很像一个栈的结构.对等层:在网络体系结构中,通信双方实现同样功能的层.
    协议数据单元:对等层实体进行信息交换的数据单位.服务访问点:在同一系统中相邻两层的实体进行交互(即交换信息)的地方.服务访问点SAP是一个抽象的概念,它实体上就是一个逻辑接口.
    1-27 试解释everything over IP 和IP over everthing 的含义。谢希仁计算机网络第七版课后答案
    TCP/IP协议可以为各式各样的应用提供服务 (所谓的everything over ip)

    答:允许IP协议在各式各样的网络构成的互联网上运行(所谓的ip over everything)
    在这里插入图片描述

    计算机网络答案 下载地址在这里 https://www.cnblogs.com/leetcodetijie/gallery/image/340363.html

    展开全文
  • 配置FileRead节点后,返回“待办事项”任务列表,并将与“查找”原语有关的任务标记为已完成:完成此操作后,待办事项任务列表条目的剩余数量为11。 消息过滤器原语 转换工具在结果的IBM Integration Bus消息流中用...

    进程原语和线程原语是啥意思

    本文向您展示如何将WebSphere ESB StockQuote样本(IBM Integration Designer随附)中的资源转换为IBM Integration Bus资源。 StockQuote示例使用带有SOAP / JMS Web服务绑定的导出。 由StockQuote中介流记录输入的JMS消息,然后该中介流使用来自输入的客户ID值,并基于文件中的查找确定客户的订阅级别为“常规”还是“高级”。 使用XML映射将输入消息本身转换为不同的消息格式,可以使用带有绑定到两个后端服务之一的SOAP / HTTP Web服务的导入来发送输入消息。 来自Premium客户的消息被路由到RealtimeService ,而来自普通客户的消息被路由到DelayedService 。 无论调用哪种服务,从标注返回的响应消息都将转换为响应消息,然后StockQuote将其返回给JMS客户端。 下面的组装图中显示了WebSphere ESB组件之间的关系:

    WebSphere ESB StockQuote示例的组装图
    WebSphere ESB StockQuote示例的组装图

    本文底部的“下载”部分提供了一个名为PI_WESB_StockQuote.zip项目交换文件。 它包含两个未转换的项目,如下表1所示:

    PI_WESB_StockQuote.zip中用于转换的WebSphere ESB资源的描述
    IID项目 项目类型 目的
    资源资源 图书馆 该库包含业务对象定义,这些定义为与StockQuote和StockQuoteProvider中介流交换的消息建模。
    股票报价 调解模块 此中介模块包含将转换为IBM Integration Bus资源的导出,导入和中介流组件。

    本系列文章的第1部分讨论了如何运行IBM Integration Bus转换工具,因此此处将不详细介绍这些步骤。 启动IBM Integration Bus集成工具包,并从一个空的工作空间开始。 导入可下载的WebSphere ESB项目交换文件PI_WESB_StockQuote.zip并启动转换工具。 在默认项目位置WESB_Conversions创建一个命名转换会话。

    接下来,遵循转换工具的五个步骤,以生成IBM Integration Bus资源。 如果在转换过程中选择默认设置,则该工具将生成消息流和相关资源,在该工具运行后会留下一些手动任务。 本文的其余部分详细描述了这些待办事项。 该讨论将显示WebSphere ESB和IBM Integration Bus在方法上的一些概念上的差异,并且在您转换自己的WebSphere ESB资源时应该会有所帮助。 在转换工具的最后一步中,审阅页上列出了15个待办事项,乍一看似乎要做很多,其中一些任务可以一起解决。

    转换工具待办事项

    消息记录器原语

    StockQuote中介流的“请求”部分中的第一个原语是名为Log的消息记录器原语。 消息记录器中介原语用于在消息通过中介流时将其记录在关系数据库中。 IBM Integration Bus提供了几个可以将数据插入到关系数据库中的节点。 “计算”和“数据库”节点使用与数据库的ODBC通信来执行此操作,而“ JavaCompute”和“映射”节点使用与数据库的JDBC通信来执行此操作。

    一项待办事项说明,缺省情况下,转换工具会将在WebSphere ESB中介流中找到的Message Logger原语转换为IBM Integration Bus占位符子流。 然后,由用户决定将此子流中的Passthrough节点替换为他们想要使用的特定IBM Integration Bus消息流节点。 那些熟悉Message Logger原语的人通常喜欢继续使用JDBC,这将IBM Integration Bus的选择范围缩小到在JavaCompute节点中编写代码,或使用映射以图形方式完成任务。 本文演示了一种图形解决方案,如图2所示:

    表示WebSphere ESB Message Logger原语的替换节点的日志子流
    表示WebSphere ESB Message Logger原语xxx的替换节点的日志子流

    插入数据的主要工作是由“映射”节点完成的。 IBM Integration Bus映射对他们期望接收的输入数据进行建模。 为了使此解决方案无论传入数据的格式如何都适用,该映射被设计为在BLOB消息域中接收数据。 该映射将BLOB数据转换为文本,该文本可插入定义为CLOB(字符大对象)的数据库列中。 通过使用DB2命令行处理器或DB2控制中心从数据库中进行选择,将列定义为CLOB数据类型使其易于阅读。 映射之前的名为RCD的Reset Content Descriptor节点的目的是将入站消息更改为BLOB消息域。 这使得解决方案可以重用,而与到达Log子流输入的消息域无关。 例如,它可以是JMS消息,DFDL消息或XMLNSC消息。 在RCD节点之前的Flow Order节点的目的是确保在将原始输入消息发送到子流的out终端之前,尝试将子流的分支插入数据库。 此设计还确保可以将原始消息在其原始消息域中发送到子流的输出。 如果数据库插入发生异常,则TryCatch节点将捕获问题并将异常路由到子流的Failure终端。

    运行转换工具后,用户可以手动添加此子流,但是转换工具还提供了扩展机制,该机制允许在转换过程中自动创建所需的节点或节点集,以替换所有调解原语中的所有示例。发生特定类型的 这是在转换工具的第三步中配置的,如下图3所示:

    为中介原语添加自定义转换器类
    图03

    以下说明通过使用上面讨论的子流解决方案替换MessageLogger的示例,演示了如何配置扩展中介原始转换器。 本文在Java项目WESB_ConversionExtensions中的MessageLoggerConverterClass.java提供了创建子流解决方案的转换器类。 该项目位于随附的名为PI_ConversionExtension.zip项目交换文件中。 继续之前,将此项目交换文件导入到您的工作区。

    1. 默认情况下,MessageLogger原语由名为Placeholder converter的Converter类转换为Subflow占位符。 单击Converter class列中的Placeholder converter,如上面的图3所示,以启动Select Converter Class对话框。
    2. Converter Java class字段旁边,单击“选择”按钮。
    3. 在出现的“ Open Type对话框中,选择MessageLoggerConverterClass ,然后单击“确定”按钮。
    4. 您将返回上一个对话框,并且现在已填充Converter Java class字段。 单击确定按钮。
    5. 除了现在已将MessageLogger原语的Converter类列条目设置为使用提供的扩展名之外,您将返回到原始的转换工具。

    像以前一样,完成转换工具的其余步骤。 在第四步中,当您单击“ Start Conversion按钮时,将警告您,首次运行该工具时创建的项目将被覆盖。 很好,因此只需在对话框上单击“确定”即可。

    重新运行该工具后,您应该发现“待办事项”任务列表中不再包含警告您有关MessageLogger原语的条目,并且剩余的“待办事项”任务数应为14。

    失败原语

    待办事项列表中的两个任务说明了转换工具如何不具有内置功能来转换位于WebSphere ESB中介流中的Fail原语的实例。 缺省情况下,转换工具将用包含IBM Integration Bus Passthrough消息流节点的子流替换此中介原语的示例。 IBM Integration Bus中最接近的等效节点是Throw节点。 Throw节点用于在流的当前分支上生成(抛出)异常。 然后,异常将由最近的TryCatch节点或具有Catch终端的最近的先前节点(例如SOAPInput节点)捕获并处理。 IBM Integration Bus会将异常信息插入系统日志。 用Throw节点替换代替原始Fail原语生成的两个占位符子流。 完成此操作后,返回“待办事项”任务列表,并将与“失败”原语相关的两个任务标记为已完成。 现在,剩余的待办任务列表条目数为12。

    XSL Transformation原语查找图

    StockQuote中介流包含一个名为Lookup的XSL Transformation原语。 该原语使用映射通过查找转换将值分配到SMO上下文中。 Lookup转换从入站消息中获取CustomerId值,并将其用作在包含逗号分隔值的预定义文件内执行查找的键。 该文件包含有关所讨论的customerID是归类为具有高级还是常规订阅级别的规范 。 高级客户享有特权,因此可以致电更快的实时服务。 普通客户必须以较慢的速度致电延迟服务。 清单1中显示了Lookup转换访问的CSV文件的示例:

    查找文件CustomerType.csv的内容
    CustomerA,premium CustomerB,premium CustomerC,premium CustomerD,regular CustomerE,premium CustomerF,regular CustomerG,premium CustomerH,regular

    不幸的是,IBM Integration Bus映射节点使用的映射没有与WebSphere ESB查找转换直接等效的映射。 出于这个原因,在生成的IBM Integration Bus映射中,通过一个Task将Lookup转换替换为Conversion工具,如图4所示:

    从IBM Integration Bus映射Lookup_req_1中摘录,其中显示了一个代替WebSphere ESB Lookup Transform的任务
    图04

    IBM Integration Bus映射可以使用数据库表中的SELECT来实现这种功能需求。 IBM Integration Bus信息中心记录了在IBM Integration Bus映射中使用数据库的信息,但是在这里,我们将考虑IBM Integration Bus中的另一种替代方法,该替代方法继续使用文件进行查找。 FileRead节点可用于此目的。 您可以使用FileRead节点从消息流的中间读取一条记录或文件的全部内容,从而允许您基于文件中的查找来路由或丰富通过该流的消息。 删除转换工具生成的名为Lookup的Mapping节点,并将FileRead节点作为替换节点拖放到StockQuote_MediationFlow_getQuote_request.subflow占据的位置。 将FileRead节点加入到子流的其余部分:

    • 将Log子流的Output端子连接到FileRead节点的In端子
    • 将FileRead节点的Out端子连接到Filter节点的In端子
    • 将FileRead节点的No match端子连接到Filter节点的In端子

    配置FileRead节点的“基本”选项卡的属性。 将输入目录设置为C:\Resources并将File name or pattern属性设置为CustomerType.csv 。 接下来,切换到FileRead节点属性的“结果”选项卡。 此选项卡上的属性说明应如何从CSV文件中提取所需的数据。 IBM Integration Bus将使用DFDL消息模型来解析CSV文件。 名为库CSVModel提供用于此目的,其被命名为附带的项目交换文件中PI_CSVModel.zip 。 继续之前,将此项目交换文件导入到您的工作区中。 右键单击IIB_StockQuote项目,然后选择“ Manage Library References ,然后将引用添加到CSVModel库。

    FileRead节点还将使用XML模式描述LocalEnvironment树中的字段,这些字段将用于承载有关特定请求消息的发送者有权获得的订阅级别的信息。 在配置FileRead节点之前,我们需要稍微更改此模式(这是源自WebSphere ESB的转换资源之一)。 IIB_Resources project的更改会将全局元素定义添加到位于IIB_Resources project的命名空间包http://Resourse的Subscription模式中。 打开SubscriptionInformation.xsd并进行以下两个小更改。 进行了描述的更改之后,结果清单如下清单2所示:

    • 为targetNamespace添加名称空间前缀声明。
    • 添加一个名为SubscriptionInformation的全局元素,并使complexType(最初也称为SubscriptionInformation )在新的全局元素内成为匿名定义
    进行必要的更改后列出SubscriptionInformation.xsd
    &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsd:schema targetNamespace="http://Resourse" xmlns:sub="http://Resourse" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt; &lt;xsd:element name="SubscriptionInformation"&gt; &lt;xsd:complexType&gt; &lt;xsd:sequence&gt; &lt;xsd:element minOccurs="0" name="subscriptionLevel" type="xsd:string"&gt; &lt;/xsd:element&gt; &lt;/xsd:sequence&gt; &lt;/xsd:complexType&gt; &lt;/xsd:element&gt; &lt;/xsd:schema&gt;

    保存架构,然后返回到FileRead节点的“结果属性”选项卡。 Result data location属性指定应从CSV文件中获取哪个字段。 用于此字段的XPath表达式导航到逻辑树结构中文件CSV数据解析到的所需位置。 Output data location属性指定将从CSV文件获取的值放置在逻辑消息树结构中的位置,该逻辑消息树结构将从文件读取节点传递出去。 要编辑这两个属性,请单击Edit ,然后使用XPath Expression builder ,如图5所示:

    使用XPath Expression Builder设置结果数据位置
    图05

    “ XPath表达式”构建器对话框的目的是通知IBM Integration Bus如何为逻辑树的可变部分建模。 通过单击添加数据类型链接,然后选择相关的XML模式元素来完成此操作。 这两个字段的最终值应为:

    • 结果数据位置: $ResultRoot/DFDL/CustomerType/record/field2
    • 输出数据位置: $OutputLocalEnvironment/Variables/sub:SubscriptionInformation/subscriptionLevel

    我们一直在编辑的LocalEnvironment树是逻辑消息树的暂存区,该逻辑区在内存中在IBM Integration Bus消息流的节点之间传递。 它在概念上与WebSphere ESB使用的SMO树的关联部分非常相似。

    在FileRead节点的“结果”选项卡上设置的最终属性称为“记录选择”表达式。 此处定义的表达式告诉FileRead节点如何决定应使用CSV文件中的哪个记录。 这是基于使用customerID字段的值作为执行查找的键:

    记录选择表达式:
    $InputRoot/XMLNSC/tns:getQuote/request/customerID = $ResultRoot/DFDL/CustomerType/record/field1

    “输入消息解析”选项卡指定FileRead节点应如何尝试解析文件中的数据。 如前所述,将DFDL解析器用于此任务。 设置属性:

    消息域: DFDL
    讯息: {}:CustomerType

    IBM Integration Bus提供了一个向导来帮助您生成DFDL消息模型,该模型可用于解析许多不同种类的非XML数据,例如固定长度消息,带标签的定界格式,当然还有许多复杂的行业标准格式。 本文提供了DFDL模型,但是如果您对它的创建方式感兴趣,则可以在IBM Integration Bus信息中心中阅读有关此内容的更多信息。 配置FileRead节点后,返回“待办事项”任务列表,并将与“查找”原语有关的任务标记为已完成:完成此操作后,待办事项任务列表条目的剩余数量为11。

    消息过滤器原语

    转换工具在结果的IBM Integration Bus消息流中用Route节点替换Message Filter原语的实例。 找到“路由”节点(名为Filter )并检查其“基本”属性。 过滤器模式是指WebSphere ESB(SMO)树的上下文部分。 您将需要更改表中两个条目的过滤器模式,以引用IBM Integration Bus逻辑树的“本地环境”部分中的subscriptionLevel元素。 在“过滤器”表中依次选择每一行,然后单击“编辑”按钮并按如下所示设置值,然后保存子流:

    名为Filter的Route节点的属性
    过滤模式 路由输出端子
    $ LocalEnvironment / Variables / sub:SubscriptionInformation / subscriptionLevel ='premium' 即时的
    $ LocalEnvironment / Variables / sub:SubscriptionInformation / subscriptionLevel ='默认' 延迟时间

    消息元素设置器原语

    转换工具在所得IBM Integration Bus消息流中用Java Compute节点替换了Message Element Setter基本实例。 有两种可供选择的API格式,可以与IBM Integration Bus中的Java Compute节点一起使用。 IBM Integration Bus Java集成API提供了在消息消息传递的逻辑树中导航的方法。 自多年前将Java Compute节点首次引入该产品以来,这种方法就一直可用。 第二种方法是将IBM Integration Bus逻辑树转换为XML DOM树,然后使用JAXB get和set方法(从XML模式生成)来更改树的结构和值。 转换工具生成的Java Compute节点配置为使用JAXB方法。 故意采取了这种设计决策,以便用户可以以任何顺序应用在原始消息元素设置器原语上配置的(可能有很多)设置器指令。 因为节点了解输出数据格式,所以将应用设置程序指令,并且将以更正的顺序生成输出消息的字段。 如果使用了其他形式的Java Compute节点,则将按语句的执行顺序生成字段。

    转换工具为SetCustomerType原语创建一个Java Compute节点,但是开发人员有责任使用XML模式生成JAXB get和set方法,然后将代码手动添加到节点的Java模板中以执行设置。语句复制为注释。 以下说明介绍了如何执行此操作:

    1. 从“开始”菜单中,打开IBM Integration Console 9.0.0.0,并将目录更改为Java Integration Kit的bin文件夹,该文件夹包含在IBM Integration Bus Toolkit安装中。 如果您使用了缺省安装位置,则该位置将位于C:\Program Files (x86)\IBM\IntegrationToolkit90\jdk\bin
    2. XML模式StockQuoteRequest.xsd对进入和离开SetCustomerType节点的数据进行SetCustomerType 。 该节点的目的是在LocalEnvironment树中设置默认的subscriptionLevel,但消息本身保持不变。 为此,我们只需要从描述预订级别的模式中生成Java对象类即可:
      xjc.exe -d &lt;workspace_location&gt;\IIB_StockQuoteJava -p jaxb_classes &lt;workspace_location&gt;\IIB_Resources\SubscriptionInformation.xsd
    3. 返回IBM Integration Toolkit,切换到Java透视图并刷新IIB_StockQuoteJava项目,您现在应该看到刚刚生成的jaxb_classes软件包。
    4. IIB_StockQuoteJava项目中,打开StockQuote_MediationFlow_getQuote_request_SetCustomerType.java ,它将在默认程序包中找到。 查看代码模板,您会发现转换工具添加了注释,描述了所需的set语句:
      // SET /context/correlation/subscriptionLevel to "regular"

      用清单3中的以下代码替换整个文件的内容:
    StockQuote_MediationFlow_getQuote_request_SetCustomerType.java的Java代码
    import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import org.w3c.dom.Document; import com.ibm.broker.javacompute.MbJavaComputeNode; import com.ibm.broker.plugin.MbException; import com.ibm.broker.plugin.MbMessage; import com.ibm.broker.plugin.MbMessageAssembly; import com.ibm.broker.plugin.MbOutputTerminal; import com.ibm.broker.plugin.MbUserException; import com.ibm.broker.plugin.MbXMLNSC; import jaxb_classes.SubscriptionInformation; public class StockQuote_MediationFlow_getQuote_request_SetCustomerType extends MbJavaComputeNode { protected static JAXBContext jaxbContext = null; public void onInitialize() throws MbException { try { // Initialize the JAXB context with the Java object // classes that were generated by a JAXB binding compiler jaxbContext = JAXBContext.newInstance("jaxb_classes"); } catch (JAXBException e) { // This exception will cause the deploy of this Java compute node to fail // Typical cause is the JAXB package above is not available throw new MbUserException(this, "onInitialize()", "", "",e.toString(), null); } } public void evaluate(MbMessageAssembly assembly) throws MbException { MbOutputTerminal out = getOutputTerminal("out"); MbMessage localEnvironment = assembly.getLocalEnvironment(); try { // ---------------------------------------------------------- // Add user code below to build the new output data by updating // your Java objects or building new Java objects SubscriptionInformation outputLocalEnvironmentJavaObject = new SubscriptionInformation(); outputLocalEnvironmentJavaObject.setSubscriptionLevel("regular"); // End of user Java object processing // ---------------------------------------------------------- // Marshal the new or updated output Java object class into the Broker tree Document outDocumentLocalEnvironment = localEnvironment.createDOMDocument(MbXMLNSC.PARSER_NAME); jaxbContext.createMarshaller().marshal(outputLocalEnvironmentJavaObject, outDocumentLocalEnvironment); localEnvironment.getRootElement().getFirstElementByPath (MbXMLNSC.PARSER_NAME).setName("Variables"); // Propagate the output message assembly out.propagate(assembly); } catch (JAXBException e) { throw new MbUserException(this, "evaluate()", "", "", e.toString(), null); } } }

    配置完此节点后,返回“待办事项”任务列表,并将与SetCustomerType原语有关的两个任务标记为已完成。 完成此操作后,剩余的待办任务列表条目数为9。

    XSL Transformation原语TransformToRealtime映射

    原始WebSphere ESB中介流中TransformToRealtime映射的目的是将StockQuote请求消息转换为Realtime服务的请求格式。 转换工具将自动将WebSphere ESB XML映射转换为IBM Integration Bus映射。 自动转换已成功完成,但是转换工具仍提供警告待办事项任务,以检查是否有任何错误或警告,但在此示例中没有任何错误或警告,因此您可以返回转换中存储的待办事项列表会话文件并将任务标记为完成。 完成此操作后,剩余的待办任务列表条目数为8。

    XSL Transformation原语TransformToDelayed映射

    StockQuote请求消息和“延迟服务”的请求格式之间的转换与我们刚刚处理的任务任务非常相似。 再次,对地图的快速比较显示自动转换工具已完美转换了映射,并且没有验证或警告消息。 返回存储在转换会话文件中的“待办事项”列表,并将任务标记为完成。 完成此操作后,剩余的待办任务列表条目数为7。

    标注原始RealtimeService导入

    转换工具会在生成的IBM Integration Bus消息流中用SOAPRequest节点自动替换WebSphere ESB Callout中介原语的实例。 在生成的名为StockQuote_MediationFlow_getQuote_Request.subflow子流中,找到名为RealtimeService的SOAPRequest节点,您将看到它的Basic属性已被自动配置。 转换工具会警告您,已在SOAPRequest节点的“ HTTP传输”属性选项卡上找到的端点地址已基于原始Callout原语分配了一个值。 该警告提醒您,如果调用的服务也是在WebSphere ESB中实现的,那么您很可能希望更改此URL。 本文提供了示例存根以模拟实时服务和延迟服务-作为IBM Integration Bus Services实现。 提供了这些存根服务,以便您可以在运行时成功测试转换后的消息流,而无需安装WAS或WebSphere ESB环境。 将Web服务URL属性中的端口号更改为7800。新的Web服务URL应为:

    http://localhost:7800/StockQuoteProviderWeb/sca/RealtimeServicePortTypeExport1

    返回到转换会话文件中存储的“待办事项”列表,并将有关终点的警告标记为已完成。 完成此操作后,剩余的待办任务列表条目数为6。

    标注原语DelayedService导入

    现在,我们将对与Delayed Service通信的SOAPRequest节点重复相同的任务。 在生成的名为StockQuote_MediationFlow_getQuote_Request.subflow子流中,找到名为DelayedService的SOAPRequest节点,然后在“ HTTP传输属性”选项卡上,更改Web服务URL。 因此端口号为7800。新的Web服务URL应为:

    http://localhost:7800/StockQuoteProviderWeb/sca/DelayedServicePortTypeExport1

    返回到转换会话文件中存储的“待办事项”列表,并将有关终点的警告标记为已完成。 完成此操作后,剩余的待办任务列表条目数为5。

    XSL转换原语RealtimeToStockQuoteService映射

    向实时服务或延迟服务发出请求后,该流程将使用其他映射将实时响应消息转换为StockQuote响应消息,并将延迟响应消息转换为Stockquote响应消息。 这些映射是自动转换的,但是我们现在将对其进行编辑,以便将本地环境树中的subscriptionLevel映射到qualityOfService元素,该元素可以在StockQuote响应消息中找到。 在映射中执行此操作将意味着我们可以完全从IBM Integration Bus消息流中完全除去SetQualityOfService原语(在映射节点之后)。

    IIB_StockQuote项目中,打开RealtimeToStockQuoteService_res_1.map并单击源消息程序集,以便其属性出现在屏幕的底部。 在属性选项卡上,单击链接Headers and folders: Properties然后在弹出窗口中,通过勾选LocalEnvironment框并单击OK,将LocalEnvironment树添加到地图源。 展开现已添加到地图源的LocalEnvironment树,然后右键单击LocalEnvironment的Variables子树下的any元素。 选择Cast菜单操作,如下图6所示:

    将定义的结构添加到LocalEnvironment的Variables部分
    图06

    从出现的“ Type Selection对话框中,选择SubscriptionInformation元素,然后单击“确定”。 将SubscriptionInformation元素添加到LocalEnvironment后,展开树,然后将subscriptionLevel元素拖放到getQuoteResponse目标消息中的qualityOfService元素。 单击刚刚创建的“移动”转换,然后查看其属性。 将数组索引(在下面的图7中用红色框突出显示)设置为值1。此步骤从Toolkit的“问题”视图中删除警告,该警告提醒您从数组映射时应设置基数。

    在RealtimeToStockQuoteService地图上设置输入数组索引
    图07

    保存地图并返回存储在转换会话文件中的“待办事项”列表,并将有关地图的警告标记为已完成。 完成此操作后,剩余的待办任务列表条目数为4。

    XSL转换原语DelayedToStockQuoteService映射

    现在,对IIB_Resources项目中的DelayedToStockQuoteService映射进行相同的更改。 编辑自动转换的映射,以将subscriptionLevel从LocalEnvironment树移动到StockQuote响应消息中的qualityOfService元素。 就像我们上次执行的映射更改一样,请确保将“移动”变换上的数组索引设置为值1。此步骤从“工具箱”的“问题”视图中删除警告,提醒您在映射时应设置基数从数组。 保存地图并返回存储在转换会话文件中的“待办事项”列表,并将有关地图的警告标记为已完成。 完成此操作后,剩余的待办任务列表条目数为3。

    消息元素设置器原语SetQualityOfService

    名为SetQualityOfService的消息元素设置器原语被转换为JavaCompute节点。 但是,由于对映射DelayedToStockQuoteServiceRealtimeToStockQuoteService进行了较早的更改,当消息到达流中的这一点时,已经在准备StockQuote响应消息时对QualityOfService字段进行了分配。 因此,不再需要将此节点保留在消息流中,因此应将其删除。 将两个映射节点直接连接到输出节点( StockQuoteService_getQuote_InputResponse )。 还删除包含节点引用的java类的文件。 您将在项目IIB_StockQuoteJava找到名为StockQuote_MediationFlow_getQuote_request_SetQualityOfService.java文件。 返回到转换会话的“待办任务”列表,并将与SetQualityOfService节点有关的两个任务标记为已完成。 完成此操作后,应该只剩下一个需要执行操作的待办任务列表条目。

    StockQuote导出JMS绑定

    当转换工具生成IIB_StockQuote.msgflow ,将配置SOAPInput节点,以代替WebSphere ESB StockQuote服务上的Web服务(JMS)导出绑定。 该节点将接收到导致调用StockQuote服务的初始请求。 将该节点设置为通过JMS传输接收消息(在节点的“基本属性”选项卡上, Transport = JMS )。 检查“ JMS传输属性”选项卡,您将看到默认情况下该工具建议将WebSphere MQ用作JMS提供程序。 但是, SourceJNDI URL bindings locationConnection factory名称都需要配置。 添加了转换待办任务列表条目,以提醒用户在转换后应手动完成此操作。 我们现在将这样做。 如表3所示,在SOAPInput节点上设置值。这些JMS设置正确地对应于我们在测试流程之前将设置的JMS资源。

    IIB_StockQuote.msgflow中SOAPInput节点的JMS属性
    物业名称 适当的价值
    资源 StockQuoteService
    JNDI URL绑定位置 文件:/ C:/ JNDI-Directory
    连接工厂名称 StockQuoteServiceQCF

    配置完成后,JMS属性应如图8所示:

    IIB_StockQuote.msgflow中SOAPInput节点的JMS属性
    图08

    保存消息流并返回到转换会话的“待办任务”列表,并将与JMS传输属性有关的最后一个任务标记为完成。 保存转换会话文件。 讨论了所有更改之后, StockQuote_MediationFlow_getQuote_request.subflow应该类似于图9:

    最终StockQuote_MediationFlow_getQuote_request.subflow
    图09

    配置JMS绑定和队列定义

    在测试转换后的资源之前,以下说明将帮助您设置JMS输入队列和输出队列。 本文包括一个名为Resources.zip的附件。 将文件的内容提取到目录C:\Resources (可以选择另一个目录,但是本文稍后的说明将假定此位置)。 该文件包含以下文件:

    附件文件Resources.zip文件的内容
    文档名称 目的
    StockQuoteJMS.def 用于创建所需的JMS定义的配置文件。
    股票报价WMQ.mqsc 用于创建所需的WMQ队列的配置文件。
    CustomerType.csv 方案用来确定是调用实时服务还是延迟服务的查找文件。
    JMSUtil.jar 提供了用于放置和获取JMS消息的测试实用程序。

    现在检查是否有现有的JNDI绑定文件。 在Windows平台上,默认情况下,绑定文件位于目录C:\JNDI-Directory 。 如果此目录包含.bindings文件,则使用以下说明创建的定义将添加到该文件中。 或者,您可以删除现有的绑定文件,并且以下说明将从头开始创建一个新的绑定文件。 You can also configure WMQ to use an entirely new bindings file in a different location. If you wish to do this, then navigate to the WMQ installation subdirectory &lt;WMQ_Installation_Directory&gt;\java\bin . Add the following changes shown in Listing 4 to the JMSAdmin.config file. The PROVIDER_URL property points to the directory where you would like to generate the bindings:

    Additions to JMSAdmin.config
    INITIAL_CONTEXT_FACTORY=com.sun.jndi.fscontext.RefFSContextFactory PROVIDER_URL=file:/C:/JNDI-Directory

    Having configured the location for the bindings file, the following instructions describe how to generate the JMS definitions:

    1. Open an IBM Integration Bus Command Console window and change directory to the WMQ installation directory which is being used by the runtime broker that you intend to use for testing, and move to its subdirectory &lt;WMQ_Installation_Directory&gt;\java\bin . If you installed WMQ to the default location, then this will be C:\Program Files (x86)\IBM\WebSphere MQ\java\bin .
    2. Use the JMSAdmin command to set up the required Queue Connection Factory and queues:
      JMSAdmin.bat &lt; C:\Resources\StockQuoteJMS.def

      The StockQuoteJMS.def file is provided with this article. It contains the following instructions (it is assumed that you will be using the default IBM Integration Bus configuration which involves a broker named IB9NODE , associated with a queue manager named IB9QMGR , which uses a listener on port 2414):

      DEF QCF(jms/StockQuoteServiceQCF) TRANSPORT(CLIENT) CHANNEL(SYSTEM.BKR.CONFIG)+ HOST(127.0.0.1) PORT(2414) QMGR(IB9QMGR) DEFINE Q(jms/StockQuoteService) QUEUE(STOCKQUOTE.IN) QMGR(IB9QMGR) DEFINE Q(jms/StockQuoteServiceResponse) QUEUE(STOCKQUOTE.OUT) QMGR(IB9QMGR) END
    3. Next, use the runmqsc command to set up the required WMQ queues (to which the JMS definitions above will bind). Do this from the same IBM Integration Bus Command Console window:
      runmqsc IB9QMGR &lt; C:\Resources\StockQuoteWMQ.mqsc

      The StockQuoteWMQ.mqsc file is provided with this article. It contains the following instructions:
      def ql(STOCKQUOTE.IN) def ql(STOCKQUOTE.OUT)

    Create the Log database

    Earlier in the article we discussed the conversion extension point which replaces the WebSphere ESB Message Logger primitive with a Mapping node to insert data into a DB2 database. In order for this part of the flow to work, we need to create the database ready to receive the data to be logged:

    1. From the Windows start menu, launch the DB2 Command Line Processor window. Create the database using the following command:
      create db LOGDB
    2. In the same DB2 Command Line Processor window, connect to the database which you just created:
      connect to LOGDB
    3. Now create a table to store the data:
      CREATE TABLE DATAWAREHOUSE (MESSAGEDATA CLOB (1 M) NOT NULL, DBINSERTTIMESTAMP TIMESTAMP NOT NULL WITH DEFAULT CURRENT_TIMESTAMP)
    4. Exit the DB2 Command Line Processor:
      disconnect all quit exit

    Create IBM Integration Bus JDBC configurable service

    The runtime IBM Integration Bus Node where you intend to deploy your flow will need to be configured to be able to connect via JDBC to the Log database. You can create the configurable service by launching an IBM Integration Bus command console and then using the following command:

    mqsicreateconfigurableservice IB9NODE -c JDBCProviders -o LOGDB -n databaseName,databaseType,databaseVersion,jarsURL,portNumber, serverName,type4DatasourceClassName,type4DriverClassName -v LOGDB,DB2,9.7,"C:\Program Files\IBM\SQLLIB\java",50000, localhost,com.ibm.db2.jcc.DB2XADataSource,com.ibm.db2.jcc.DB2Driver

    If the user id under which you run the IBM Integration Bus node does not have authority to access the database, you will also need to run the mqsisetdbparms command to authorize the flow to insert data into the database.

    Deploy converted resources

    1. IBM Integration Bus resources (Integration Services) are provided to simulate the Realtime and Delayed services with which the StockQuoteService communicates. Import RealtimeService and DelayedService from the project interchange file named PI_IIB_StubServices.zip which is provided with this article.
    2. Create a Broker Archive file inside a project in your Integration Toolkit workspace (such as inside IIB_StockQuote for example), and on the Prepare tab, select the application IIB_StockQuote , and the two Integration Services DelayedService and RealtimeService :
      Broker Archive File
      图10
    3. Click the Build and Save button and then deploy the BAR file to your default configuration:
      Deployed resources
      图11

    Test converted resources

    A test tool (called JMSUtil) is provided with this article which can be used to write a JMS message of the correct format to the input queue, and retrieve the response message which IBM Integration Bus will write to the reply queue.

    1. Open an IBM Integration Bus Command Console and (assuming you followed the instructions earlier in the article) change directory to C:\Resources .
    2. The JMSUtil application needs access to the JMS libraries provided with WebSphere MQ, so assuming you installed WMQ to the default location, launch the application with the command shown below:
      java -jar JMSUtil.jar -cp "C:\Program Files (x86)\IBM\WebSphere MQ\java\lib"
    3. JMSUtil is launched with the correct settings pre-configured for the JMS bindings discussed earlier in the article, so the Connection tab properties will already have been set for you, as shown below:
      JMSUtil Connection Properties
      图12

      Switch to the Header tab properties and you will see that the JMSReplyTo queue has also been defined for you to match with the definition we created earlier.
      JMSUtil Header Properties
      图13

      Switch to the Data tab properties and you will see that the data carried in the body of the message has also been defined. If you wish to change the message when doing your own testing, you can edit the text directly using your keyboard:
      JMSUtil Data
      图14

      Switch back to the Connection tab properties and click the Write Message button. The Status and Current Queue Depth properties will be updated to show the message has been written to the queue successfully:
      JMSUtil Data Written to the queue successfully
      Figure 15
    4. Assuming the IBM Integration Bus flow has executed successfully all the way through, we will now read the response message from the queue. Change the JMS Destination Name to be StockQuoteServiceResponse and click the Read Message button. The Status should show a successful read has occurred, and the Current Queue Depth should now read as zero (the message has just been taken from the response queue):
      JMSUtil message read from the response queue successfully
      Figure 16
    5. Switch to the Data properties tab and you should see that it contains the response message which came from the IIB_StockQuote service:
      JMSUtil data view of the response message
      Figure 17

    Check Log database

    The Log subflow which was used as the replacement for the Message Logger primitive should have copied the input message which was propagated through the IBM Integration Bus flow into the DATAWAREHOUSE table of the LOGDB database which we created earlier. Open a DB2 Control Center and check the contents of the table. You should see something like . The input message to the StockQuote service has been logged with a timestamp.

    Message logged to the DB2 database
    Figure 18

    结论

    IBM Integration Bus V9是IBM的新战略集成产品(基于与WebSphere Message Broker相同的体系结构构建)。 Integration Bus Toolkit提供了用于转换构建时资源的第一功能,该构建时资源最初是为支持WebSphere Enterprise Service Bus用例而创建的。 本文演示了如何使用该工具转换简单的中介,并且还讨论了两种产品之间的一些体系结构差异。 本系列的第二篇文章涉及一个基于WebSphere Enterprise Service Bus StockQuote示例的更复杂的场景,该示例显示了要转换的更广泛的中介原语,还讨论了转换工具的扩展点。


    翻译自: https://www.ibm.com/developerworks/websphere/library/techarticles/1308_thompson2/1308_thompson2.html

    进程原语和线程原语是啥意思

    展开全文
  • 原语操作: # 使组式: 1 2 3 >>>  from   celery  import   group >>> group(send_mail.s(i, i, i)  for   i  in   xrange ( 10 ))().get() >>> group(send_mail.s( 'msg_{0}' ....
  • 2.1.3 操作系统之原语实现对进程的控制

    千次阅读 多人点赞 2020-03-15 16:56:00
    进程控制的五种原语(1)进程的创建原语(2)进程的终止原语(3)进程的唤醒和阻塞原语(4)进程的切换原语 0.思维导图 1.什么是进程控制? 2.原语实现对进程的控制 关于原语的作用和处在操作系统内核的重要地位...
  • Python 多线程学习

    千次阅读 多人点赞 2019-05-10 22:32:10
    这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程的同步。 import threading import time import queue def get_num(workQueue): print("Starting " + threading.currentThread()....
  • 它包括用于节点发现,基于筏的共识,任务调度等的原语。 它的主要优点是: 分布式: SwarmKit使用来进行协调,并且不依赖于单点故障来执行决策。 安全: Swarm内的节点通信和成员身份是安全的开箱即用。 ...
  • 进程撤销原语

    2021-04-20 22:44:32
    一个进程在完成其任务后应给予撤销,以便及时释放它所占有的各类资源。引起进程了撤销的事件大致有以下几类: 1、进程正常结束,到一个进程完成其任务后,应该将其撤销并释放其所占有的资源。 2、进程异常结束,在...
  • vxworks任务间通信

    千次阅读 2016-01-12 16:49:24
    任务间通信机制是多任务间相互同步和通信以协调各自活动的主要手段。VxWorks提供的任务间通信手段按其速度由快到慢包括信号量、消息队列、管道到网络透明的套接字。 任务间通信机制: 共享内存,数据的简单共享; ...
  • 操作系统—同步原语

    2021-01-07 20:49:35
    同步原语 原来我们都用的是单核的CPU,但是单核的性能现在已经很难有突破了,所以开始在一个CPU中添加多个物理核。 但是原来的应用程序都是为单核设计的,在多核运行无法体现多核的性能,为了更充分的使用多核,应用...
  • 计算机网络谢希仁第七版课后习题答案

    万次阅读 多人点赞 2019-10-12 21:43:44
    数据链路层 数据链路层的任务是在两个相邻结点的线路上无差错地传送以帧(frame)为单位的数据。每一帧包括数据和必要的控制信息。网络层 网络层的任务就是要选择合适的路由,使 发送站的运输层所传下来的分组能够...
  • 举例:任务 A 需要修改 Z,任务 B 也需要修改 Z。如果是串行系统,A 执行完了,再执行B,很简单。在并发系统中,因为 A,B 是并发执行的,所以就需要在操作 Z 的时候确保 A、B 保证串行化的机制。 CO_LOCK { // ...
  • PV原语

    千次阅读 2014-04-21 16:23:34
    进程同步是指进程一种直接的协同工作关系,是一些进程相互合作,共同完成一项任务。进程的直接相互作用构成进程的同步。 二、进程的互斥 (1)进程互斥 某些资源一次只能为一个进程服务,因此各进程互斥使用...
  • java是如何实现原语的 总览 有两个很好的理由在可能的地方使用原语而不是包装器。 明晰。 通过使用原语,您可以清楚地知道null值是不合适的。 性能。 使用原语通常更快。 清晰度通常比性能更重要,并且是...
  • verilog 入门教程

    万次阅读 多人点赞 2014-06-16 11:14:01
    线网类型表示构件的物理连线,而寄存器类型表示抽象的数据存储元件。  (7)能够描述层次设计,可使用模块实例结构描述任何层次。  (8)设计的规模可以是任意的;语言不对设计的规模(大小)施加任何限制...
  • C#并行编程-Task

    千次阅读 2016-10-22 17:39:08
    C#并行编程-Task 菜鸟学习并行编程,参考《C#并行编程高级教程.PDF》,如有错误,欢迎指正。...C#并行编程-线程同步原语 C#并行编程-PLINQ:声明式数据并行   任务简介 TPL引入新的基于任务的编程模型,
  • asyncio同步原语与线程(threading)模块同步原语基本类似,但有两点重要区别: asyncio同步原语非线程安全,因此不应被用作系统线程同步(可以使用threading代替); asyncio同步原语不允许使用timeout参数;可以...
  • 进程通信 进程调度算法 线程 最后 如果觉得看完有收获,希望能给我点个赞,这将会是我更新的最大动力,感谢各位的支持 欢迎各位关注我的公众号【java冢狐】,专注于java和计算机基础知识,保证让你看完有所收获,...
  • Barrier -使任务可以同时同步所有任务。 Mutex -互斥锁。 RwLock读写器锁,允许任意数量的读取器或单个写入器。 Semaphore -限制并发操作的数量。 执照 根据以下任一许可 Apache许可证2.0版( 或 ) MIT许可证...
  • 总而言之,如果一个函数想要拆分并同时执行一些工作,请确保该函数返回时完成其所有子任务。 这样,它就成为了我们习惯于从同步代码中获取的黑匣子。 一个函数有输入和返回值,当它完成时,它创建的代码不再运行。 ...
  • verilog 综合注意事项

    万次阅读 多人点赞 2016-07-29 15:46:40
    任务可能是组合逻辑或者时序逻辑,取决于何种情况下调用任务。 18、Z: Z会综合成一个三态门,必须在条件语句中赋值 19、参数化设计: 优点:参数可重载,不需要多次定义模块 四:模块优化 1、资源共享...
  • 更高级的同步原语。 实现了一些 Go 同步原语。 令牌 提供令牌实现。 只有拥有Token才能做事,然后才能将令牌移交给其他人。 批 提供批量实现。 类似于errgroup ,可以返回每个任务的所有错误结果。 任何 提供部分...
  • 当他们阻止时,他们只会阻止单个任务,而不是整个React堆。 #Cargo.toml [dependencies] futures =“ 0.3.1” futures-locks =“ 0.6”用法通常,提供的原语的工作方式与标准库中的原语非常相似。 但是,它们不会...
  • 在这一节中我们就会介绍 Go 语言中常见的同步原语 Mutex、RWMutex、WaitGroup、Once 和 Cond 以及扩展原语 ErrGroup、Semaphore和 SingleFlight 的实现原理,同时也会涉及互斥锁、信号量等并发编程中的常见概念。...
  • 创建原语 撤销原语 挂起原语 激活原语 阻塞原语 唤醒原语 进程调度原语 1.何时调用阻塞原语? 当正在运行的进程需要等待某一事 件而发生运行受阻时,它通过中断请求系统服务。 系统按照进程的需求进行适当处理后,...
  • http://www.amobbs.com/thread-4071460-1-1.html http://blog.chinaunix.net/uid-22003667-id-3291833.html http://zhangyiyu120.blog.163.com/blog/static/98906938201022462557514/

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,465
精华内容 9,786
关键字:

任务间原语