《牲畜林》--(用)
牲畜林
作家介绍卡尔维诺Calvino,Italo(1923—1985)意大利小说家。生于古巴,2岁时回到意大利,后毕业于都灵大学文学系。他在二战期间参加抵抗运动,他的第一部长篇小说《蜂巢小径》就是根据这段经历写成的。主要作品有:《阿根廷蚂蚁》、《不存在的骑士》等等。他的作品独具一格,擅长用童话的方式来写小说。所以他的小说也可以说是童话。除了写小说,收集编写民间故事。他走遍意大利,付出了两年时间的辛勤劳动,终于编写出一部《意大利童话》,它可以和安徒生、格林兄弟的童话媲美。
细细品味——六次举枪的不同写法①牛:②猪:③羊:④火鸡:⑤兔子:颤抖的双手使枪口不停地在空中转动。他想对准德国人的胸膛,可是准星正对着的却是牛屁股。(直接描写、细节刻画)朱阿手中的猎枪又跳起了塔兰泰拉舞。(拟人)朱阿简直给搞糊涂了,连扳机在什么地方也不知道。(夸张)听了这话,年纪已经不年轻、但还没有结婚的、腼腆的朱阿羞得满面通红,手中的猎枪像烤肉的铁叉一样在眼前转动起来。(比喻、细节刻画)只写了朱阿被恳求,至于恳求后的情况,则省略了。
⑥母鸡:现在他可以毫无顾忌地开枪了,就算把那没毛的母鸡打死,也没什么关系。暴露出朱阿更深层的心理活动——前面不开枪,不仅是怕误伤牲畜,而且也是怕没打中德国兵,反被对方还击射中。作者一只笔写了6次,把重复的情节写得毫无重复之感。足见作家强大的文字驾驭能力。卡尔维诺怎样编故事?层层推进波澜起伏
延迟法“为了保持这种线性结构,作者往往故意延迟小说的发展。什克洛夫斯基在研究了大量民谣、童谣、神话、民间故事后发现,她们的一系列手法:反复、延缓、重复叙事……都在尽量拉开我们与终点的距离。因为小说不能总是平缓地前进,否则就会是读者产生阅读的疲劳。它必须让读者不时发觉会发生点什么,使他们由平静而转如紧张。”——《小说门》(曹文轩)延迟就是作者竭力给故事、人物、心理的进展设置障碍,又不使读者觉得希望完全破灭,就在这样捉迷藏的游戏中,一环扣一环,实现小说的张力。
小说中几次使用了延迟手法,这样做有什么作用?《西游记》唐僧取经欧·亨利《警察与赞美诗》
阻止人阻止原因第一次第二次第三次第四次第五次第六次朱阿怕遇害的是“花大姐”两个小孩猪死了,什么都没了白胡子牧羊人千万别打死我的羊年轻的戴红头巾的胖姑娘打死了……我就割断你的脖子梳辫子满脸雀斑的小姑娘别打死我的兔子,反正德国人已经把它拿走了最穷的老太婆吉鲁米娜那是我在世界上唯一的财产……那我就更伤心了
1、延迟法的反复使用,使得各种牲畜(只有最后的野猫不是家畜)接连出场,成为故事的真正主角。2、“延迟”使得原本紧张激烈的情节节奏舒缓下来,战争的阴影和残酷被更有生命力的和谐自然挤到一边。3、战争的严酷性也仍然从中显露出来。朱阿的“花大姐”两小孩的猪老太婆吉鲁米娜的母鸡唯一的财产本来已穷困之至,失去这点财产,他们的生活将更加悲惨。
结束德国兵生命的是谁?作者为什么这么安排?子弹一颗也没有打到德国兵身上,而是全部交给了那只衰老的母鸡。作家把最后的任务交给一只凶恶的野猫,它不是牲畜,反而算得上是牲畜的敌人,它和德国兵在厮打中一起掉下了石崖。让邪恶与邪恶同归于尽,善良的人连手都不要弄脏。
“当我觉得人类的王国不可避免地要变得沉重时,我总想我是否应该像柏修斯那样飞向另一个世界。我不是说要逃避到幻想与非理性的世界中去,而是说我应该改变方法,从另一个角度去观察这个世界,以另外一种逻辑、另外一种认识与检验的方法去看待这个世界。我所寻求的各种轻的形象,不应该像梦幻那样在现在与未来的现实生活中必然消失。”——卡尔维诺
本文是反法西斯题材,但我们读来不觉得“沉重”,你认为作者安排有什么巧妙之处?把故事发生的地点安排在“牲畜林”这一特殊的所在,仿佛与战争隔绝,树林和牲畜们仍然生机勃勃,没有对战争的恐惧。正是这最自然的生命力,给人以生活的希望,这希望,则是杀死战争妖魔的基础。“简直像诺亚方舟一样。”(是善良的人类的力量与希望)最后,“牲畜林”这个充满自然和谐的地方,似乎拥有自净能力,经过一番小风浪,它就又回到生活本来的轨道中去。
谈谈你对朱阿的印象及朱阿在文中的作用一个近乎小丑的形象,是嗜酒过度的酒鬼,不可救药的劣等射手。起穿针引线的作用。
幽默讽刺
“猴子掰包谷(玉米)”猴子在地里掰包谷,刚掰下一个,觉得前面的更好,就扔下手里的去掰另一个。另一个到手,觉得还有更好的,就把到手的又扔掉,去掰那个“更好的”。这样一路走一路掰,不知不觉走到了地的尽头,这时天色已晚,只得慌慌张张随便掰一个回家了。回去一看,恰恰是个烂包谷。
拣贝壳的小孩有两个小孩去海边玩,看到退潮以后的海滩上有着很多美丽的贝壳。一个小孩就把看到的所有贝壳都拣了起来,直到两手捧不下为止。另一个小孩看到一个贝壳,总觉得这不是最好的,就没有拣,而是去寻找更好的,当他发现一个比刚才要好的贝壳时,还是觉得这不是最好的,他要找到一个世上最好的贝壳,于是继续寻找。结果,一直找到天黑,他都没有找到自己想找的那个最好的贝壳。
一个德国兵:花大姐——小猪—山羊—火鸡—家兔—母鸡
第九讲进程同步与通信目的与要求:掌握信号量解决进程同步互斥问题的方法,掌握进程通信的基本实现方法。重点与难点:信号量的典型应用,通信实现。作业:15,16,17。
4.2.5进程同步与互斥举例一、有限缓冲区问题问题描述:设有n个缓冲区,一组生产者进程往缓冲区写数据,一组消费者进程从缓冲区取数据,写取都以一个缓冲区为单位。说明:将缓冲池看做是共享数据,对缓冲区的操作必须是互斥操作。如果n个缓冲区全满,生产者进程必须等待。如果缓冲区全空,消费者进程必须等待。
有限缓冲区的生产者/消费者问题(生产者和消费者共享一个产品缓冲池)。共享N个缓冲区P1P2…PmC1C2…Cn生产者消费者缓冲池
解:设置以下信号量mutex,初值为1,控制互斥访问缓冲池。full,初值为0,表示当前缓冲池中满缓冲区数,用于同步。empty,初值为n,表示当前缓冲池中空缓冲区数,用于同步。有限缓冲区生产者/消费者进程描述如下:typeitem=…;varbuffer=…;full,empty,mutex:semaphor;nextp,nextc:item;beginfull:=0;empty:=n;mutex:=1;
P(empty);P(mutex);addnextptobuffer;V(mutex);V(full);untilfalse;end;ParbeginProducer:beginrepeat…produceaniteminnextp;...
…consumetheiteminnextc;…untilfalse;end;Parend;consumer:beginrepeatP(full);P(mutex);removeanitemfrombuffertonextc释放缓冲区V(mutex);V(empty);
若存在一共享数据A,那些对它进行读访问者叫Reader,对它进行写访问者叫做Writer。第一类Reader/Writer问题:Reader和Writer争夺访问共享数据A时,Reader有较高优先数。表现在:除了某个Writer正在访问数据之外,任何情况下Reader欲访问数据均可以直接进行访问。二、Readers/Writers问题
该问题可具体描述为:1.如果当前无人访问数据,则Reader/Writer欲访问即可访问。2.如果已存在一个Reader正在访问数据,其他欲访问Reader可马上访问(这体现Reader有较高优先权);而欲访问的Writer必须等待。3.若某个Writer正访问数据,则欲访问的Reader/Writer都必须等待。
(续)4.当最后一个结束访问数据的Reader发现有Writer正在等待时,则将其中一个唤醒。5.当某个Writer结束访问时,若只有Writer在等待,则唤醒某个Writer,若既有Writer也有Reader;则按FIFO或某它原则唤醒一个Writer或所有Reader。
Reader的一般结构为:P(mutex);readcount:=readcount+1;Ifreadcount=1thenP(wrt);V(mutex);读数据AP(mutex);readcount:=readcount-1;Ifreadcount=0thenV(wrt);V(mutex);
Writer的一般结构为:P(wrt);写数据AV(wrt);
三、哲学家就餐问题问题描述:五个哲学家五只筷子,哲学家循环做着思考和吃饭的动作,吃饭程序是:先取左边筷子,再取右边筷子,再吃饭,再放筷子。
实现:为每个筷子设一把锁(信号量,初值为1)每个哲学家是一个进程。共享数据结构为:VarChopstick;array[0,4]ofsemaphore;第i个进程描述为(i=0,…,4)repeatP(chopstick[i]);P(chopstick[(i+1)mod5]);吃V(chopstick[i]);V(Chopstick[(i+1)mod5];思考untilfalse;(这可能导致死锁)
4.3进程通信两种基本进程通信方法:1.共享存储(Shared-memory):相互通信的进程有共享存储区。进程间可以通过直接读写共享存储区的变量来交互数据,同步与互斥在并发程序设计时安排进入程序。操作系统提供这样的共享存储区及某些同步互斥工具。2.消息传递(message-passing):若进程间无共享空间,则必须通过消息传递通信,且必须通过OS系统调用实现。
消息传递系统调用语句的一般形式:发送:Send&消息to目的地标识接收:Receive&消息from源地址标识.一、消息传递方法1.直接通信法基本思想:进程在发送和接收消息时直接指明接收者或发送者进程ID。缺点:必须指定接收进程ID(UNIX的信号机制类似这种形式)。4.3.1消息传递通信原理
举例:(UNIX中两进程利用信号通信)。ProcessA┆kill(1040,SIGUSR1);#向1040号进程发送一个SIGUSR1信号。ProcessB┆Signal(SIGUSR1,func);#当收到SIGUSR1信号时,就执行func(),如果SIGUSR1信号未到,则系统登记func函数,待其信号到时再调用执行。┆┆
2.间接通信法(信箱命名法〕基本思想:系统为每个信箱设一个消息队列,消息发送和接收都指向该消息队列,(每个进程可以对消息队列发送并接收/只发送/只接收)缺点:必须有一个通信双方共享的一个逻辑消息队列(UNIX的PIPE,FIFO及IPC消息传递机制都属于这种形式),使用时消息发送者约定写方式打开信箱,消息接收者约定读方式打开信箱或同时读写打开。优点:很容易建立双向通信链(只要对信箱说明为读写打开)。
逻辑通信链容量:在通信发送者和接收者之间存在一条逻辑通信链,设链的容量是指该链暂存消息的能力。1.容量为0,表示链中无缓冲(不计链头的发送缓冲和链尾的接收缓冲),这要求接收方必须在发送方之前发接收请求,否则发送失败。2.有限容量,表示链中有有限缓冲区、发送者不必等接收者发出接收请求,不必等接收者准备好接收缓冲区,即可将消息存于通信链中的缓冲区中。3.消息从发送方缓冲进入系统缓冲区,即可再次发新消息,无需等上一消息被完全接收。二、缓冲与同步
发送者执行send()的同步问题:1.将发送者消息拷入通信链缓冲区,即将控制返回发送者。2.在将消息从硬通信通道发出后,将控制返回发送者。3.在消息由接收方节点的系统收到后,再将控制返回发送者。4.在消息由接收方收到后,再将控制返回发送者。5.在消息由接收方处理完后,再将控制返回发送者(RPC,LPC)。为实现3.,4.情形同步,需要建立回送到发送者所在系统的通信链,5.的情形需要建立回送到发送者的通信链。
4.3.2进程通信示例直接通信消息系统的两个基本操作为:send(A):A指向含接收者pid和消息正文的空间。Receive(A):A指向缓冲区用于接收消息,该系统调用函数返回值是消息发送者pid。实现:系统有一用于进程通信的缓冲池,池中缓冲区用于存放消息及消息发送者pid和消息链指针(用pid定位进程PCB表)。Sender’spid消息正文Link消息缓冲区
每个进程有一个消息队列,存放发送给该进程的消息,队列头存于PCB中,同时在PCB中设一互斥信号量mutex(初值为1)和一同步通信的信号量Sm(初值为0),Sm也用于计录消息队列中的消息数。...mutexSm...Sender’spidtextSender’spidtextReceiver’sPCBmessagemessageHptr
Send(A):beginNew(p);从缓冲池得一个buffer...置sender’spid;将A中消息送bufferp;获得Receiver’spid;P(mutex);将bufferp挂入相应的消息队列;V(Sm);V(mutex);end;
Receive(A):beginP(Sm);P(mutex);从本进程的消息队列取一个bufferf;V(mutex);从bufferf中取得消息正文送A,并得到sender’spid作为Receive()的返回值;...dispose(f);#释放bufferf到缓冲池…end;注:new,dispose函数对缓冲池的访问也需要互斥.