哲学家进餐问题(在计算机 *** 作系统方面的相关编程)

哲学家进餐问题(在计算机 *** 作系统方面的相关编程),第1张

*** 作系统并发和互斥:哲学家进餐问题和理发师问题

1. 哲学家进餐问题:

(1) 在什么情况下5 个哲学家全部吃不上饭?

考虑两种实现的方式,如下:

A.

算法描述:

void philosopher(int i) /*i:哲学家编号,从0 到4*/

{

while (TRUE) {

think( )/*哲学家正在思考*/

take_fork(i)/*取左侧的筷子*/

take_fork((i+1) % N)/*取左侧筷子;%为取模运算*/

eat( )/*吃饭*/

put_fork(i)/*把左侧筷子放回桌子*/

put_fork((i+1) % N)/*把右侧筷子放回桌子*/

}

}

分析:假如所有的哲学家都同时拿起左侧筷子,看到右侧筷子不可用,又都放下左侧筷子,

等一会儿,又同时拿起左侧筷子,如此这般,永远重复。对于这种情况,即所有的程序都在

无限期地运行,但是都无法取得任何进展,即出现饥饿,所有哲学家都吃不上饭。

B.

算法描述:

规定在拿到左侧的筷子后,先检查右面的筷子是否可用。如果不可用,则先放下左侧筷子,

等一段时间再重复整个过程。

分析:当出现以下情形,在某一个瞬间,所有的哲学家都同时启动这个算法,拿起左侧的筷

子,而看到右侧筷子不可用,又都放下左侧筷子,等一会儿,又同时拿起左侧筷子……如此

这样永远重复下去。对于这种情况,所有的程序都在运行,但却无法取得进展,即出现饥饿,

所有的哲学家都吃不上饭。

(2) 描述一种没有人饿死(永远拿不到筷子)算法。

考虑了四种实现的方式(A、B、C、D):

A.原理:至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释

放出他所使用过的两支筷子,从而可使更多的哲学家进餐。以下将room 作为信号量,只允

许4 个哲学家同时进入餐厅就餐,这样就能保证至少有一个哲学家可以就餐,而申请进入

餐厅的哲学家进入room 的等待队列,根据FIFO 的原则,总会进入到餐厅就餐,因此不会

出现饿死和死锁的现象。

伪码:

semaphore chopstick[5]={1,1,1,1,1}

semaphore room=4

void philosopher(int i)

{

while(true)

{

think()

wait(room)//请求进入房间进餐

wait(chopstick[i])//请求左手边的筷子

wait(chopstick[(i+1)%5])//请求右手边的筷子

eat()

signal(chopstick[(i+1)%5])//释放右手边的筷子

signal(chopstick[i])//释放左手边的筷子

signal(room)//退出房间释放信号量room

}

}

B.原理:仅当哲学家的左右两支筷子都可用时,才允许他拿起筷子进餐。

方法1:利用AND 型信号量机制实现:根据课程讲述,在一个原语中,将一段代码同时需

要的多个临界资源,要么全部分配给它,要么一个都不分配,因此不会出现死锁的情形。当

某些资源不够时阻塞调用进程由于等待队列的存在,使得对资源的请求满足FIFO 的要求,

因此不会出现饥饿的情形。

伪码:

semaphore chopstick[5]={1,1,1,1,1}

void philosopher(int I)

{

while(true)

{

think()

Swait(chopstick[(I+1)]%5,chopstick[I])

eat()

Ssignal(chopstick[(I+1)]%5,chopstick[I])

}

}

方法2:利用信号量的保护机制实现。通过信号量mutex对eat()之前的取左侧和右侧筷

子的 *** 作进行保护,使之成为一个原子 *** 作,这样可以防止死锁的出现。

伪码:

semaphore mutex = 1

semaphore chopstick[5]={1,1,1,1,1}

void philosopher(int I)

{

while(true)

{

think()

wait(mutex)

wait(chopstick[(I+1)]%5)

wait(chopstick[I])

signal(mutex)

eat()

signal(chopstick[(I+1)]%5)

signal(chopstick[I])

}

}

C. 原理:规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子而偶数号

的哲学家则相反.按此规定,将是1,2号哲学家竞争1号筷子,3,4号哲学家竞争3号筷子.即

五个哲学家都竞争奇数号筷子,获得后,再去竞争偶数号筷子,最后总会有一个哲学家能获

得两支筷子而进餐。而申请不到的哲学家进入阻塞等待队列,根FIFO原则,则先申请的哲

学家会较先可以吃饭,因此不会出现饿死的哲学家。

伪码:

semaphore chopstick[5]={1,1,1,1,1}

void philosopher(int i)

{

while(true)

{

think()

if(i%2 == 0) //偶数哲学家,先右后左。

{

wait (chopstick[ i + 1 ] mod 5)

wait (chopstick[ i])

eat()

signal (chopstick[ i + 1 ] mod 5)

signal (chopstick[ i])

}

Else //奇数哲学家,先左后右。

{

wait (chopstick[ i])

wait (chopstick[ i + 1 ] mod 5)

eat()

signal (chopstick[ i])

signal (chopstick[ i + 1 ] mod 5)

}

}

D.利用管程机制实现(最终该实现是失败的,见以下分析):

原理:不是对每只筷子设置信号量,而是对每个哲学家设置信号量。test()函数有以下作

用:

a. 如果当前处理的哲学家处于饥饿状态且两侧哲学家不在吃饭状态,则当前哲学家通过

test()函数试图进入吃饭状态。

b. 如果通过test()进入吃饭状态不成功,那么当前哲学家就在该信号量阻塞等待,直到

其他的哲学家进程通过test()将该哲学家的状态设置为EATING。

c. 当一个哲学家进程调用put_forks()放下筷子的时候,会通过test()测试它的邻居,

如果邻居处于饥饿状态,且该邻居的邻居不在吃饭状态,则该邻居进入吃饭状态。

由上所述,该算法不会出现死锁,因为一个哲学家只有在两个邻座都不在进餐时,才允

许转换到进餐状态。

该算法会出现某个哲学家适终无法吃饭的情况,即当该哲学家的左右两个哲学家交替

处在吃饭的状态的时候,则该哲学家始终无法进入吃饭的状态,因此不满足题目的要求。

但是该算法能够实现对于任意多位哲学家的情况都能获得最大的并行度,因此具有重要

的意义。

伪码:

#define N 5 /* 哲学家人数*/

#define LEFT (i-1+N)%N /* i的左邻号码 */

#define RIGHT (i+1)%N /* i的右邻号码 */

typedef enum { THINKING, HUNGRY, EATING } phil_state/*哲学家状态*/

monitor dp /*管程*/

{

phil_state state[N]

semaphore mutex =1

semaphore s[N]/*每个哲学家一个信号量,初始值为0*/

void test(int i)

{

if ( state[i] == HUNGRY &&state[LEFT(i)] != EATING &&

state[RIGHT(i)] != EATING )

{

state[i] = EATING

V(s[i])

}

}

void get_forks(int i)

{

P(mutex)

state[i] = HUNGRY

test(i)/*试图得到两支筷子*/

V(mutex)

P(s[i])/*得不到筷子则阻塞*/

}

void put_forks(int i)

{

P(mutex)

state[i]= THINKING

test(LEFT(i))/*看左邻是否进餐*/

test(RIGHT(i))/*看右邻是否进餐*/

V(mutex)

}

}

哲学家进程如下:

void philosopher(int process)

{

while(true)

{

think()

get_forks(process)

eat()

put_forks(process)

}

}

2.理发师问题:一个理发店有一个入口和一个出口。理发店内有一个可站5 位顾客的站席

区、4 个单人沙发、3 个理发师及其专用理发工具、一个收银台。新来的顾客坐在沙发上等

待;没有空沙发时,可在站席区等待;站席区满时,只能在入口外等待。理发师可从事理

发、收银和休息三种活动。理发店的活动满足下列条件:

1)休息的理发师是坐地自己专用的理发椅上,不会占用顾客的沙发;

2)处理休息状态的理发师可为在沙发上等待时间最长的顾客理发;

3)理发时间长短由理发师决定;

4)在站席区等待时间最长的顾客可坐到空闲的理发上;

5)任何时刻最多只能有一个理发师在收银。

试用信号量机制或管程机制实现理发师进程和顾客进程。

原理:

(1)customer 进程:

首先检查站席区是否已满(stand_capacity),若满选择离开,否则进入站席区,即进入

理发店。在站席区等待沙发的空位(信号量sofa),如果沙发已满,则进入阻塞等待队列,

直到出现空位,在站席区中等待时间最长的顾客离开站席区(stand_capacity)。坐到沙

发上,等待理发椅(barber_chair),如果理发椅已满,则进入阻塞等待队列,直到出现

空位,在沙发上等待时间最长的顾客离开沙发(释放信号量sofa)。坐到理发椅上,释放

准备好的信号(customer_ready),获得该理发师的编号(0~1 的数字)。等待理发师理

发结束(finished[barber_number])。在离开理发椅之前付款(payment),等待收据

(receipt),离开理发椅(leave_barberchair)。最后离开理发店。

这里需要注意几点:

a) 首先是几个需要进行互斥处理的地方,主要包括:进入站席区、进入沙发、进入理发椅

和付款几个地方。

b) 通过barber_chair 保证一个理发椅上最多只有一名顾客。但这也不够,因为单凭

baber_chair 无法保证一名顾客离开理发椅之前,另一位顾客不会坐到该理发椅上,

因此增加信号量leave_barberchair,让顾客离开理发椅后,释放该信号,而理发

师接收到该信号后才释放barber_chair 等待下一位顾客。

c) 在理发的过程中,需要保证是自己理发完毕,才能够进行下面的付款、离开理发椅的活

动。这个机制是通过customer 进程获得给他理发的理发师编号来实现的,这样,当

该编号的理发师释放对应的finished[i]信号的时候,该顾客才理发完毕。

d) 理发师是通过mutex 信号量保证他们每个人同时只进行一项 *** 作(理发或者收款)。

e) 为了保证该顾客理发完毕后马上可以付款离开,就应该保证给该顾客理发的理发师在理

发完毕后马上到收银台进入收款 *** 作而不是给下一位顾客服务。在伪码中由以下机制实

现:即顾客在释放离开理发椅的信号前,发出付款的信号。这样该理发师得不到顾客的

离开理发椅的信号,不能进入下一个循环为下一名顾客服务,而只能进入收款台的收款

*** 作。直到顾客接到收据后,才释放离开理发椅的信号,离开理发椅,让理发师释放该

理发椅的信号,让下一位等待的顾客坐到理发椅上。

(2)barber 进程

首先将该理发师的编号压入队列,供顾客提取。等待顾客坐到理发椅坐好(信号量

customer_ready),开始理发,理发结束后释放结束信号(finished[i])。等待顾客

离开理发椅(leave_barberchair)(期间去收银台进行收款活动),释放理发椅空闲信

号(barber_chair),等待下一位顾客坐上来。

(3)cash(收银台)进程

等待顾客付款(payment),执行收款 *** 作,收款 *** 作结束,给付收据(receipt)。

信号量总表:

信号量 wait signal

stand_capacity 顾客等待进入理发店 顾客离开站席区

sofa 顾客等待坐到沙发 顾客离开沙发

barber_chair 顾客等待空理发椅 理发师释放空理发椅

customer_ready 理发师等待,直到一个顾客坐

到理发椅

顾客坐到理发椅上,给理发师

发出信号

mutex 等待理发师空闲,执行理发或

收款 *** 作

理发师执行理发或收款结束,

进入空闲状态

mutex1 执行入队或出队等待 入队或出队结束,释放信号

finished[i] 顾客等待对应编号理发师理

发结束

理发师理发结束,释放信号

leave_barberchair 理发师等待顾客离开理发椅 顾客付款完毕得到收据,离开

理发椅释放信号

payment 收银员等待顾客付款 顾客付款,发出信号

receipt 顾客等待收银员收、开具收据收银员收款结束、开具收据,

释放信号

伪码:

semaphore stand_capacity=5

semaphore sofa=4

semaphore barber_chair=3

semaphore customer_ready=0

semaphore mutex=3

semaphore mutex1=1

semaphore finished[3]={0,0,0}

semaphore leave_barberchair=0

semaphore payment=0

semaphore receipt=0

void customer()

{

int barber_number

wait(stand_capacity)//等待进入理发店

enter_room()//进入理发店

wait(sofa)//等待沙发

leave_stand_section()//离开站席区

signal(stand_capacity)

sit_on_sofa()//坐在沙发上

wait(barber_chair)//等待理发椅

get_up_sofa()//离开沙发

signal(sofa)

wait(mutex1)

sit_on_barberchair()//坐到理发椅上

signal(customer_ready)

barber_number=dequeue()//得到理发师编号

signal(mutex1)

wait(finished[barber_number])//等待理发结束

pay()//付款

signal(payment)//付款

wait(receipt)//等待收据

get_up_barberchair()//离开理发椅

signal(leave_barberchair)//发出离开理发椅信号

exit_shop()//了离开理发店

}

void barber(int i)

{

while(true)

{

wait(mutex1)

enqueue(i)//将该理发师的编号加入队列

signal(mutex1)

wait(customer_ready)//等待顾客准备好

wait(mutex)

cut_hair()//理发

signal(mutex)

signal(finished[i])//理发结束

wait(leave_barberchair)//等待顾客离开理发椅信号

signal(barber_chair)//释放barber_chair 信号

}

}

void cash() //收银

{

while(true)

{

wait(payment)//等待顾客付款

wait(mutex)//原子 *** 作

get_pay()//接受付款

give_receipt()//给顾客收据

signal(mutex)

signal(receipt)//收银完毕,释放信号

}

}

分析:

在分析该问题过程中,出现若干问题,是参阅相关资料后才认识到这些问题的隐蔽性和严重

性的,主要包括:

(1)在顾客进程,如果是在释放leave_barberchair 信号之后进行付款动作的话,很

容易造成没有收银员为其收款的情形, 原因是: 为该顾客理发的理发师收到

leave_barberchair 信号后,释放barber_chair 信号,另外一名顾客坐到理发椅上,

该理发师有可能为这另外一名顾客理发,而没有为刚理完发的顾客收款。为解决这个问题,

就是采取在释放leave_barberchair 信号之前,完成付款 *** 作。这样该理发师无法进入

下一轮循环为另外顾客服务,只能到收银台收款。

(2)本算法是通过给理发师编号的方式,当顾客坐到某理发椅上也同时获得理发师的编号,

如此,当该理发师理发结束,释放信号,顾客只有接收到为其理发的理发师的理发结束信号

才会进行付款等 *** 作。这样实现,是为避免这样的错误,即:如果仅用一个finished 信

号量的话,很容易出现别的理发师理发完毕释放了finished 信号,把正在理发的这位顾

客赶去付款,而已经理完发的顾客却被阻塞在理发椅上的情形。当然也可以为顾客进行编

号,让理发师获取他理发的顾客的编号,但这样就会限制顾客的数量,因为finished[]

数组不能是无限的。而为理发师编号,则只需要三个元素即可。

3.参考文献:

左金平 计算机 *** 作系统中哲学家进餐问题探究。

参考教材 *** 作系统—内核与设计原理

其他网络资源

一个简单的解法是引入一个餐厅服务生,哲学家必须经过他的允许才能拿起餐叉。因为服务生知道哪只餐叉正在使用,所以他能够作出判断避免死锁。

为了演示这种解法,假设哲学家依次标号为A至E。如果A和C在吃东西,则有四只餐叉在使用中。B坐在A和C之间,所以两只餐叉都无法使用,而D和E之间有一只空余的餐叉。假设这时D想要吃东西。如果他拿起了第五只餐叉,就有可能发生死锁。相反,如果他征求服务生同意,服务生会让他等待。这样,我们就能保证下次当两把餐叉空余出来时,一定有一位哲学家可以成功的得到一对餐叉,从而避免了死锁。 另一个简单的解法是为资源(这里是餐叉)分配一个偏序或者分级的关系,并约定所有资源都按照这种顺序获取,按相反顺序释放,而且保证不会有两个无关资源同时被同一项工作所需要。在哲学家就餐问题中,资源(餐叉)按照某种规则编号为1至5,每一个工作单元(哲学家)总是先拿起左右两边编号较低的餐叉,再拿编号较高的。用完餐叉后,他总是先放下编号较高的餐叉,再放下编号较低的。在这种情况下,当四位哲学家同时拿起他们手边编号较低的餐叉时,只有编号最高的餐叉留在桌上,从而第五位哲学家就不能使用任何一只餐叉了。而且,只有一位哲学家能使用最高编号的餐叉,所以他能使用两只餐叉用餐。当他吃完后,他会先放下编号最高的餐叉,再放下编号较低的餐叉,从而让另一位哲学家拿起后边的这只开始吃东西。

尽管资源分级能避免死锁,但这种策略并不总是实用的,特别是当所需资源的列表并不是事先知道的时候。例如,假设一个工作单元拿着资源3和5,并决定需要资源2,则必须先要释放5,之后释放3,才能得到2,之后必须重新按顺序获取3和5。对需要访问大量数据库记录的计算机程序来说,如果需要先释放高编号的记录才能访问新的记录,那么运行效率就不会高,因此这种方法在这里并不实用。

这种方法经常是实际计算机科学问题中最实用的解法,通过为分级锁指定常量,强制获得锁的顺序,就可以解决这个问题。 1984年,K. Mani Chandy和J. Misra提出了哲学家就餐问题的另一个解法,允许任意的用户(编号P1, ..., Pn)争用任意数量的资源。与迪科斯彻的解法不同的是,这里编号可以是任意的。

1.对每一对竞争一个资源的哲学家,新拿一个餐叉,给编号较低的哲学家。每只餐叉都是“干净的”或者“脏的”。最初,所有的餐叉都是脏的。

2.当一位哲学家要使用资源(也就是要吃东西)时,他必须从与他竞争的邻居那里得到。对每只他当前没有的餐叉,他都发送一个请求。

3.当拥有餐叉的哲学家收到请求时,如果餐叉是干净的,那么他继续留着,否则就擦干净并交出餐叉。

4.当某个哲学家吃东西后,他的餐叉就变脏了。如果另一个哲学家之前请求过其中的餐叉,那他就擦干净并交出餐叉。

这个解法允许很大的并行性,适用于任意大的问题。

各位有想对前辈说的话,想写封信给前辈们,那么如何给前辈写一封信?下面我整理了写给前辈的一封信,供你参考。

写给前辈的一封信篇一

致豫让前辈的一封信

豫让前辈·:

您好!

每每读到您屡刺赵襄子,竟不惜吞炭,辞家,我便不禁为您扼腕——您真的太傻了!

其原因有三:

1. 不顾后果。别说在春秋战国,即使在当今,做了好事,纵然,是真心所为,也会招人揣度——“这小子一定是居心不良,想要得到赵襄子的赏识吧。”“很有可能!这小子竟吞炭报主,说他是真心的·,谁也不信呀!:”“没准他走投无路了,想诳上赵襄子!”“世态炎凉呀!”先生,你还真别不信,一切皆有可能,一不小心,你没准就会被人“人肉”了。先生,您说您冒天下之大不韪去博这个恶名是不是傻?

2. 是非观念混淆。就算您要报恩,也要先掂量掂量吧,

咱21世纪啥子最重要?地球人都知道——monkey!,神马感恩不感恩,知遇不知遇的,有钱才是硬道理,在金钱的威压下,无价的爱情,不也变成了“宁愿坐在宝马车上哭,不愿坐在自行车上笑”吗?高尚的师德,不也演变为一切以金钱为重吗?改变命运的知识,可以买到,享誉终身的名声,可以买到。因为有钱,所以高尚因为有钱,所以高尚。您既有能力,又有机会,竟为了一个小小的智伯而是大好机会白白葬送,大把大把的钞票从手中流过,何其愚也?

3. 不信前人之言。身体是革命的本钱,没有一个好身

体,何谈刺杀?可您却甘愿吞炭,甘愿屡屡以身犯险,置生命于何地,置健康于何地?古有严嵩严分宜,今有许迈永许三多,为了健康,为了生命,皆以身试法,何其勇也,相比之下,您不是太傻了吗?纵有傻子沈浩,白痴王伟,愚人郭明义,但相较之下,还是文强居多,不是吗?

豫让前辈,如果我是您的话,我一定不会做此等既不利人更不利己的傻事·,还望您三思考。

写给前辈的一封信篇二

写给沙叶新前辈的一封信尊敬的沙叶新老师,您好!

首先请允许笔者 自我介绍 。笔者是出生在湖北一个破落农村的一个曾经怀有报效祖国的青年。笔者同时也是一个有七年文学历史的农村青年。

笔者自信有一定的文学才华,但在现实生活的连番跌撞下,也不得不低下曾经傲气十足的头颅。笔者因为在人生的十字路口找不到方向,迷茫困顿下,才不得不写出自己的心声的。最近一个多月,笔者都在网络上发表笔者的想法,但名不见经卷,人微言轻,在这个商业社会,几乎没有那家媒体关注笔者的 事迹 。笔者是一有 故事 的青年。有自己的苦衷,万般无奈之下,只有希冀沙老前辈能够拨冗空闲为笔者奔走宣传一二。

笔者父母皆是穷苦的农民,如今皆已年迈,没有退休金养老,而我目今27岁,依旧是单身光棍一条,依旧身无存款,囊中羞涩。笔者家境贫寒,近乎家徒四壁,盖不起新房,娶不起媳妇,接续香火恐怕也是遥遥无期了。笔者目今还有一些褴褛衣衫遮蔽其身,笔者担忧,再过一两年,笔者要裸奔上街了。

所幸笔者身材修长,算的上一美男子,笔者被逼无奈之下,也不在在乎那么些“礼义廉耻”的三纲五常了,笔者只想哪位富婆(富姐)包养。也许笔者会被骂的狗血淋头,但笔者正因为文学的熏陶,才“理所当然”地下此决定。

27岁还没结婚,这在我们这思想落后的农村来说,无异是一个异数。父母时常劝说我成家立业。但我心里清楚,身为一个男人,没有安身立命的能力,娶妻生子也是枉然。如果没有能耐,就不要结婚,以免给对方往后带来不必要的麻烦。

我打工的时间不是很长,零零散散凑起来,也大约三年时间。即便我离开曾经深深眷恋的学堂,但我一直在坚持着我的文学梦想。

我涉足文学,是从2003年高考失利之后。赋闲在家,读一些闲书,萌发了对文学的特殊 爱好 。持续至今,屈指算来,也就有了七个年头了。虽然时间不算很长,但我深信,我对文学还是有一定程度的造诣!

从古至今,文学都在历史的纷乱变革中,呈现出不可磨灭的地位。虽然有焚书坑儒,有文字狱,有灭佛,但 文化 的薪火相传,并没有因为曾经的兵燹战火,而与琼楼大殿一齐化为焦土。这是文化的幸运,但也有不幸。许多重要的藏书,难免失秩消亡,成为绝响。这不能不说,是文化的遗憾。

《诗经》,《周礼》,《礼记》,《山海经》,《论语》,《墨子》,《庄子》,《老子》,《韩非子》,《列子》,《管子》,二十四史,《资治通鉴》......魏晋南北朝的辞赋,唐诗,宋词,元曲,明清小说......都给我们留下了弥足珍贵的文化奇迹。

中国是四大闻名古国之一。三皇和五帝(黄帝,颛臾,帝喾,唐尧,虞舜),还有盘古开天辟地,女蜗造人,仓颉创字......这些神话 传说 ,都给华夏民族增添了神圣的光彩。

中国有五千年的历史,上下五千年。博大精深的文化渊薮,多元的文化脉络,不是那个民族的文化所能比及的。

班固,班昭,扬雄,庾信,萧乾,司马相如,司马迁,李白,杜甫,贺知章,陆游,白居易,孟浩然,李淳风,袁天罡,李煜,司马光,苏轼,苏洵,苏辙,秦观,韩愈,欧阳修,初唐四杰,竹林七贤......这些伟大的文学家,在历史的长河中,流芳百世,启发着后来者,激励着后来者。

自古文人多寂寞,唯有饮者留其名。作家与文人大都先知先觉,看的社会事物是深刻透彻的,所谓透过现象看本质,窥一斑而知全豹。但文人也有迷惑,蒲松龄一生潦倒不堪,在官场黑暗的科举制度下,用犀利的笔,写下了《聊斋志异》词人柳咏,潦倒于青楼之中,与歌妓为伍,不能不令人顿生怜悯杜甫奔波坎坷,命途多蹇李白怀才不遇,失意中以诗酒聊以自慰......大多是文人的悲哀。但我想,那是古代封建时代的杯具吧。

现代社会,文学在不断萎缩,不知道是商业引起的,还是由于政治引起的,或者是其他。章怡和老前辈说,当今艺术趋于消亡。每个人都心浮气躁,穷人,富人,甚至就连佛家清净之地,也或多或少的沾染了世俗的庸俗之气吧。

穷人在努力工作着,依旧只能养家糊口,能够供给子女上学,也就算是要烧香拜佛,谢天谢地了富人有的富得流油 ,但大都为富不仁,冷漠,自私,贪婪,即便做慈善事业,也要为自己贴金,为自己的商业做 广告 。官场的水最深,深不可测,不可见底,云波诡谲。佛家清净之地,本该伴随青灯经书,宣扬佛法普照。但不少寺庙却为此敛财,不以为耻。

现在社会的名利观,是史无前例的。人的欲望,如同无底洞,欲壑难填。为了攫取金钱,不择手段,铤而走险,没有了道德基础的束缚。法律的效用只在于富人,并不怎么保护穷人的利益(并非笔者凭空捏造,报纸上的报道屡见不鲜)。前段时间播放的《孔子》,笔者不知道有有没有 教育 作用,但笔者窃以为,人心的净化,不是靠一部《孔子》就能够易如反掌解决的。世风日下,人心欺倒。

真正的知识份子,是不会屈服于权力的。古代许多有气节的文人身上都有的风骨,亦是习以为常的。士为知己者死!

但现今的文人,最注重的还是利益,明哲保身,向世俗权力低头,亦是习以为常的。毕竟文艺是为政治服务。文艺是粘附在政治这张“皮”上的毛。皮之不存,毛将焉附?在易中天老师《劝君免谈陈寅恪》一文中,道出了文人与学术研究者的困惑,尤其是学术研究者的无奈,写 文章 的意义的论述。

笔者亦疑惑何为锦绣文章?何为大作?以下摘录易中天老师《劝君免谈陈寅恪》一文:

所谓“权”,并不等于或只是政治权力,也包括学术权力。它可能是一种行政权力,也可能只是一种话语权力。比如能批给你一大笔科研经费,为你调查研究、收集资料大开方便之门,让你看到别人看不到的东西等等,运用的是行政权力说一不二,一言九鼎,“说你行你就行,不行也行说不行就不行,行也不行”,则是在运用话语权力了。话语权力也很厉害呢!它能决定一个人在学术界混得怎么样,能不能混出个名堂来,甚至混不混得下去,同样堪称“生杀予夺”。君不见,多少有着真才实学的人默默无闻,多少有着真知灼见的著作埋没不彰,而某些平庸之辈的平庸之作甚至狗屁不通的东西却被捧上了天,就因为后者掌握了话语权力而前者没有么!行政权力与职位有关,话语权力与地位有关,但在中国现行体制下,两者之间往往有一种说不清楚的瓜葛和猫腻。长期以来,中国的学术活动尤其是学术评价(评奖、评职称、批课题等等),一直在行政化的体制下运作。而且,随着所谓“量化管理”的推行,学术的体制化还有愈演愈烈之势。体制是不由分说的。顺之者昌,逆之者亡。体制也是一视同仁的。无论谁和体制作对,哪怕脱离体制,都将一事无成,甚至连饭都没得吃。?

笔者知道现在才略有明白,自古文人不自由。但笔者又认为,现代社会应该不会重蹈先前的覆辙了吧。然,现实却令笔者不那么乐观。

笔者窃以为,当今考学历,考名牌大学,硕士,博士,博士后,两院院士,都有一个显而易见的目的,那就是学历就是敲门砖。当然,现在这种意义,毕竟减弱了不少。不过,人情世故,起了很犹为重要的作用。如果你不通世故,即便你有经天纬地之才,也说不定会被前仆后继的嫉妒者所菲薄,甚至将你“除”之而后快。

再是“朝廷有人好办事”,权力的诱惑力,不是以人的意志为转移。你有权,别人朝着你的权力尊重你,你没权,别人毫不留情的离开你。所谓人一走,茶就凉,哪管什么周详不周详!笔者想,就是这么个道理吧。

笔者但愿这些庸俗的影响文坛学术界的不成文的潜规则,能够在若干年后,消弭殆尽!

再说一说,古人的天命观。孔子云,不知天命不可以为君子。还有《周易》,《易经》,《推背图》,《烧饼歌》,《梅花诗......淳风,袁天罡的《推背图》据说屡验屡灵,后世帝王皆为之畏忌,也风闻统治者篡改里面的记载。至于刘伯温,笔者想,这应该是没得怀疑的吧。

现代社会是以民主,自由,博爱为主题的多元文化存在。不应该出现什么农村户口,城市户口那么悬虚的工资和福利待遇。《世界人权宣言》不是解说的很清楚么?城市人,农村人,都应该一视同仁。倘若区别对待,那不是背离了《世界人权宣言》吗?还有马克思先生的共产主义的理论么?中国毕竟加入了WTO,人类的普世价值,应该是通用的,不分国界的。因为我是农民,所以我不那么服气!

笔者水木生

写给前辈的一封信篇三

90后准程序员写给前辈们的一封信

作为一个即将步入社会的90后,一直有许多话想对前辈们说....

1.我们的时代?

我们的时代是什么?我觉得就是吃快餐长大的一代,想想70后的那一代程序员,他们那时候没什么网络,没太多的技术,书也没现在这么牛毛,他们有着扎实的基本功,他们玩起内存那叫一个帅,现在呢?生活大爆炸,信息大爆炸,我们这一代人,被太多的信息覆盖,盲目的学习,盲目的崇拜,看着什么都懂,但是又什么都不行,就像魔兽世界老一代的玩家形容我们,吃快餐长大的一代,就像我们这些从《熊猫人之谜》开始玩wow一样,我们也许不明白,当年的魔兽有多好玩,练一个号有多么难,又多么的有乐趣,什么叫副本,什么叫任务,今天的时代,各种所谓的技术,各种工具,各种几个月精通,就像随机副本一样,催肥了我们,也害了我们......

2.我崇拜的程序员

我最崇拜的有两种程序员,一种是把程序员当生活的,他们享受编程,喜欢开源,喜欢linux,喜欢python,用vim,Emacs,写博客,用邮件列表,画 思维导图 ,还经常写写打油诗,把自己比作武林高手,比作诗人,我就很希望自己将来能成为他们那样的人,还有一种程序员,只是用程序挣钱,比如我的一个老师,他的水平就很高,自己接C和c++的项目赚了不少钱,但是当我问起他,用vim还是Emacs,他说没听过,他只用VS,他也从来不写博客,不想把自己的东西贡献出来,他也说,他需要的许多软件都是拿钱都买不到的,开源的根本不能用,只是实现了皮毛,我也挺崇拜他的,我觉得这样的人很聪明,很会挣钱。

3.头痛的简历

简历上有两个最令我头痛的地方,一个是 毕业 院校,一个是项目经历,我上的是一个兰州的普通本科,兰州没什么软件公司,外地的又不来招牌,所以我前几天来到了西安,但是在外人眼里,我们兰州人都是骑骆驼上学的,所以在简历上写这种毕业院校,HR估计看都不会看的。

还有一个就是项目经历,我想说,我没有项目经历,但是我在大学并没有闲着,我是根据自己的 方法 ,去“修炼”,比如,我不看别人的一行代码,去实现贪吃蛇,俄罗斯方块这样的程序,我就开始想,我应该怎么写,我试着先去实现一个能画方格的程序,接着,再去实现一个能根据坐标,画出方格的程序,然后是一个蛇类,移动的算法,输入控制。。。就这样自己想办法一块块构建起来,没有看别人一行代码。之后,有一次,我在书上读到驱动测试编程,我真有种“蓦然回首,那人却在灯火阑珊处”的感觉,在自学了python后,我又试着用pygame来重写,或者用c++用MVC的方式重写贪吃蛇,或者把输入控制的键盘映射,改成可配置的文本文件,或者把控制模块和绘制模块,改成文本流传递消息,这些都是从《UNIX编程艺术》上学来的,在比如,我们上jsp课的时候,我就不明白动态网页的原理,我就开始“计算机考古”,开始看HTTP头,明白动态网页的原理,然后用CGI实现了一个老师布置的jsp作业,虽然被老师批评了,但是我觉得最起码学到了许多。像我们的《计算机图形学》课,老师居然教我们C在DOS下的画图,我觉得那太过时了,我就开始自学OPENGL,然后用WINAPI写一个窗口,把它粘进去,我还常常用像HGE,pygame,来实现一些老师布置的算法程序,把这些算法演示出来,比如蚁群算法,做出来就像游戏一样。我还把《机械迷城》中的几个过不去的迷宫游戏,自己用栈,实现了迷宫算法,或者干脆用pygame写一个自己玩。有一次我在想opengl是如何实现的,我就开始用2d的api写了个3d的程序(使用正交投影),我还用思维导图解决问题,比如这篇博客就是先用思维导图画好的。我就用自己的方式,写了许多“玩具程序”,修炼自己,但是我真没有项目经历,我没有跟老师一起做项目,是因为,我不喜欢跟他们做,他们动不动就跟你讲什么挣钱,什么不挣钱,他们会告诉你,那些大老板,根本不懂程序,但是人家挣许多钱,他们也不愿意把代码写的漂亮,能运行挣钱就行,还都是拼音命名规则,我觉得大学本来就是培养自己兴趣的时候,我觉得我做到了,不过最近就再想,我所做的这些,是不是真的比不上那三个月的项目实习 经验 ?

4.大学的教育

说实话,我真的不喜欢老师们上课的方式,他们大多数就是在读ppt,要么有半节课在骂社会,一切跟程序有关的东西都变得枯燥,他们让背java继承public,protect,private的表,被const指针的各种搭配,在配上static,还背优先级,我觉得,就是应试教育的恶果,我从来都是“记用法,不记规则”的,因为规则这东西,又不是语言的设计者故意刁难你的,肯定自有用途,所以在我的笔记上有“const 引用,能让形参不被copy,提高效率”这句话,不会有“const引用,函数无法修改形参”这句话。

像《 *** 作系统 》这样的课程,老师天天讲理论,什么哲学家就餐,线程调度,全是在黑板上画,我为了学习 *** 作系统,干脆就自己去学linux系统编程,用用那些api,我觉得这是学习 *** 作系统最好的方式,而且,我觉得linux真的比windows适合学习,linux上有vim这样的编辑器,也有那么多的软件工具,还有man,有管道,等等,许多哲学,不像windows的sdk那么臃肿...

我们这个年纪的人,一开始就是windows,web邮箱,vs,有太多的东西没有经历过,我就喜欢去寻找“过时”的好东西,我把它称之为《计算机考古学》,做一个真正地程序员,了解来龙去脉。

我们学校就是为了大家好就业,给大家的方向都定的j2ee,而我就选择自己的方式,寻找自己的兴趣,我并不是那种浮躁什么都想学,我觉得大学,又不是研究生,也不是什么培训包就业班,本来就应该用自己的方式寻找自己的未来,而且,最后,我还是决定了自己的方向,那就是五个一,一个编辑器vim,一个过程语言c,一个动态语言python,一个无底洞语言c++,一个平台linux...

再有,就是设计模式这东西,不知道为什么,被说的那么神奇,然后大家盲目的崇拜,那些精通java企业级的,好像都要懂设计模式才行,我觉得,本科生就不应该学什么设计模式,能把oop学懂就不错了,oop可不仅仅就是封装,继承,多态这么简单,不管怎样,应该先学会把程序实现出来,许多人没写多少代码,没学懂oop,就开始设计模式。就像一个连与人交流的情商都没有的人去学习什么读心术,企图提高自己的情商,真是可怕,再说了,学了linux,看了《Unix编程艺术》,你可能连oop都不崇拜了...

大学,自己做了许多,也思考了许多,可惜参加了3个月培训的人已经月薪5000了,我来到这里投简历又没人看...

这就是我,一个没上过重点,没有实习经历的90后想说的,我还想说,我热爱程序,希望能找到一个属于自己的工作...


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/8513319.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-17
下一篇 2023-04-17

发表评论

登录后才能评论

评论列表(0条)

保存