??xml version="1.0" encoding="utf-8" standalone="yes"?> 转自Qhttp://www.cnblogs.com/fanzhidongyzby/p/4098546.html 服务器端~程l常需要构造高性能的IO模型Q常见的IO模型有四U: Q?Q?/span>同步dIOQBlocking IOQ:即传l的IO模型?/span> Q?Q?/span>同步非阻?/span>IOQNon-blocking IOQ:默认创徏的socket都是d的,非阻塞IO要求socket被设|ؓNONBLOCK。注意这里所说的NIOqJava的NIOQNew IOQ库?/span> Q?Q?/span>IO多\复用QIO MultiplexingQ:即经典的Reactor设计模式Q有时也UCؓ异步dIOQJava中的Selector和Linux中的epoll都是q种模型?/span> Q?Q?/span>异步IOQAsynchronous IOQ:即经典的Proactor设计模式Q也UCؓ异步非阻塞IO?/span> 同步和异?/span>的概忉|q的是用LE与内核的交互方式:同步是指用户U程发vIOh后需要等待或者轮询内核IO操作完成后才能l执行;而异步是指用LE发起IOh后仍l箋执行Q当内核IO操作完成后会通知用户U程Q或者调用用LE注册的回调函数?/span> d和非d的概忉|q的是用LE调用内核IO操作的方式:d是指IO操作需要彻底完成后才返回到用户I间Q而非d是指IO操作被调用后立即q回l用户一个状态|无需{到IO操作d完成?/span> 另外Q?/span>Richard Stevens 在《Unix |络~程》卷1中提到的Z信号驱动的IOQSignal Driven IOQ模型,׃该模型ƈ不常用,本文不作涉及。接下来Q我们详l分析四U常见的IO模型的实现原理。ؓ了方便描qͼ我们l一使用IO的读操作作ؓCZ?/span> 一?/span>同步dIO 同步dIO模型是最单的IO模型Q用LE在内核q行IO操作时被d?/span> ?/span>1 同步dIO 如图1所C,用户U程通过pȝ调用read发vIOL作,qL间{到内核空间。内核等到数据包到达后,然后接收的数据拯到用L_完成read操作?/span> 用户U程使用同步dIO模型的伪代码描述为: 即用户需要等待readsocket中的数据d到buffer后,才l处理接收的数据。整个IOh的过E中Q用LE是被阻塞的Q这D用户在发起IOhӞ不能做Q何事情,对CPU的资源利用率不够?/span> 二?/span>同步非阻塞IO 同步非阻塞IO是在同步dIO的基上,socket讄为NONBLOCK。这样做用户U程可以在发起IOh后可以立卌回?/span> ? 同步非阻塞IO 如图2所C,׃socket是非d的方式,因此用户U程发vIOh时立卌回。但q未dCQ何数据,用户U程需要不断地发vIOhQ直到数据到辑Q才真正d到数据,l箋执行?/span> 用户U程使用同步非阻塞IO模型的伪代码描述为: ?
用户需要不断地调用readQ尝试读取socket中的数据Q直到读取成功后Q才l箋处理接收的数据。整个IOh的过E中Q虽然用LE每ơ发起IO?
求后可以立即q回Q但是ؓ了等到数据,仍需要不断地轮询、重复请求,消耗了大量的CPU的资源。一般很直接用这U模型,而是在其他IO模型中用非?
塞IOq一Ҏ?/span> 三?/span>IO多\复用 IO多\复用模型是徏立在内核提供的多路分d数select基础之上的,使用select函数可以避免同步非阻塞IO模型中轮询等待的问题?/span> ? 多\分离函数select 如图3所C,用户首先需要进行IO操作的socketd到select中,然后d{待selectpȝ调用q回。当数据到达Ӟsocket被激z,select函数q回。用LE正式发起readhQ读取数据ƈl箋执行?/span> ?
程上来看,使用select函数q行IOh和同步阻塞模型没有太大的区别Q甚臌多了d监视socketQ以及调用select函数的额外操作,?
率更差。但是,使用select以后最大的优势是用户可以在一个线E内同时处理多个socket的IOh。用户可以注册多个socketQ然后不断地?
用selectd被激zȝsocketQ即可达到在同一个线E内同时处理多个IOh的目?/span>。而在同步d模型中,必须通过多线E的方式才能辑ֈq个目的?/span> 用户U程使用select函数的伪代码描述为: 其中while循环前将socketd到select监视中,然后在while内一直调用select获取被激zȝsocketQ一旦socket可读Q便调用read函数socket中的数据d出来?/span> ?
而,使用select函数的优点ƈ不仅限于此。虽然上q方式允许单U程内处理多个IOhQ但是每个IOh的过E还是阻塞的Q在select函数上阻
塞)Q^均时间甚x同步dIO模型q要ѝ如果用LE只注册自己感兴的socket或者IOhQ然后去做自q事情Q等到数据到来时再进行处
理,则可以提高CPU的利用率?/span> IO多\复用模型使用了Reactor设计模式实现了这一机制?/span> ? Reactor设计模式 ?
?所C,EventHandler抽象c表CIO事g处理器,它拥有IO文g句柄HandleQ通过get_handle获取Q,以及对Handle?
操作handle_eventQ读/写等Q。承于EventHandler的子cd以对事g处理器的行ؓq行定制。Reactorcȝ于管?
EventHandlerQ注册、删除等Q,q用handle_events实现事g循环Q不断调用同步事件多路分dQ一般是内核Q的多\分离函数
selectQ只要某个文件句柄被Ȁz(可读/写等Q,selectp回(dQ,handle_events׃调用与文件句柄关联的事g处理器的
handle_eventq行相关操作?/span> ?/span>5 IO多\复用 ?
?所C,通过Reactor的方式,可以用LE轮询IO操作状态的工作l一交给handle_events事g循环q行处理。用LE注册事件处?
器之后可以l执行做其他的工作(异步Q,而ReactorU程负责调用内核的select函数查socket状态。当有socket被激zLQ则通知
相应的用LE(或执行用LE的回调函数Q,执行handle_eventq行数据d、处理的工作。由于select函数是阻塞的Q因此多路IO复用
模型也被UCؓ异步dIO模型。注意,q里的所说的d是指select函数执行时线E被dQ而不是指socket。一般在使用IO多\复用模型
Ӟsocket都是讄为NONBLOCK的,不过qƈ不会产生影响Q因为用户发起IOhӞ数据已经到达了,用户U程一定不会被d?/span> 用户U程使用IO多\复用模型的伪代码描述为: 用户需要重写EventHandler的handle_event函数q行d数据、处理数据的工作Q用LE只需要将自己的EventHandler注册到Reactor卛_。Reactor中handle_events事g循环的伪代码大致如下?/span> 事g循环不断地调用select获取被激zȝsocketQ然后根据获取socket对应的EventHandlerQ执行器handle_event函数卛_?/span> IO多\复用是最怋用的IO模型Q但是其异步E度q不?#8220;d”Q因为它使用了会dU程的selectpȝ调用。因此IO多\复用只能UCؓ异步dIOQ而非真正的异步IO?/span> 四?/span>异步IO “?
?#8221;的异步IO需要操作系l更强的支持。在IO多\复用模型中,事g循环文件句柄的状态事仉知l用LE,qLE自行读取数据、处理数据。而在?
步IO模型中,当用LE收到通知Ӟ数据已经被内核读取完毕,q放在了用户U程指定的缓冲区内,内核在IO完成后通知用户U程直接使用卛_?/span> 异步IO模型使用了Proactor设计模式实现了这一机制?/span> ? Proactor设计模式 ?
?QProactor模式和Reactor模式在结构上比较怼Q不q在用户QClientQ用方式上差别较大。Reactor模式中,用户U程通过
向Reactor对象注册感兴的事g监听Q然后事件触发时调用事g处理函数。而Proactor模式中,用户U程?
AsynchronousOperationQ读/写等Q、Proactor以及操作完成时的CompletionHandler注册?
AsynchronousOperationProcessor。AsynchronousOperationProcessor使用Facade模式?
供了一l异步操作APIQ读/写等Q供用户使用Q当用户U程调用异步API后,便l执行自qd?
AsynchronousOperationProcessor 会开启独立的内核U程执行异步操作Q实现真正的异步。当异步IO操作完成
ӞAsynchronousOperationProcessor用LE与AsynchronousOperation一h册的Proactor
和CompletionHandler取出Q然后将CompletionHandler与IO操作的结果数据一赯{发给
ProactorQProactor负责回调每一个异步操作的事g完成处理函数handle_event。虽然Proactor模式中每个异步操作都可以
l定一个Proactor对象Q但是一般在操作pȝ中,Proactor被实CؓSingleton模式Q以便于集中化分发操作完成事件?/span> ?/span>7 异步IO ?
?所C,异步IO模型中,用户U程直接使用内核提供的异步IO API发vreadhQ且发v后立卌回,l箋执行用户U程代码。不q此时用LE已
l将调用的AsynchronousOperation和CompletionHandler注册到内核,然后操作pȝ开启独立的内核U程d理IO?
作。当readh的数据到达时Q由内核负责dsocket中的数据Qƈ写入用户指定的缓冲区中。最后内核将read的数据和用户U程注册?
CompletionHandler分发l内部ProactorQProactorIO完成的信息通知l用LE(一般通过调用用户U程注册的完成事?
处理函数Q,完成异步IO?/span> 用户U程使用异步IO模型的伪代码描述为: 用户需要重写CompletionHandler的handle_event函数q行处理数据的工作,参数buffer表示Proactor已经准备好的数据Q用LE直接调用内核提供的异步IO APIQƈ重写的CompletionHandler注册卛_?/span> ?
比于IO多\复用模型Q异步IOq不十分常用Q不高性能q发服务E序使用IO多\复用模型+多线EQ务处理的架构基本可以满需求。况且目前操作系l对
异步IO的支持ƈ非特别完善,更多的是采用IO多\复用模型模拟异步IO的方式(IO事g触发时不直接通知用户U程Q而是数据读写完毕后攑ֈ用户指定?
~冲ZQ。Java7之后已经支持了异步IOQ感兴趣的读者可以尝试用?/span> 本文从基本概c工作流E和代码C?
例三个层ơ简要描qC常见的四U高性能IO模型的结构和原理Q理清了同步、异步、阻塞、非dq些Ҏh的概c通过寚w性能IO模型的理解,可以在服
务端E序的开发中选择更符合实际业务特点的IO模型Q提高服务质量。希望本文对你有所帮助?/span> 怼的:
read(socket, buffer);
process(buffer);
}
while(read(socket, buffer) != SUCCESS) { }
process(buffer);
}
select(socket);
while(1) {
sockets = select();
for(socket in sockets) {
if(can_read(socket)) {
read(socket, buffer);
process(buffer);
}
}
}
}
if(can_read(socket)) {
read(socket, buffer);
process(buffer);
}
}
{
Reactor.register(new UserEventHandler(socket));
}
while(1) {
sockets = select();
for(socket in sockets) {
get_event_handler(socket).handle_event();
}
}
}
process(buffer);
}
{
aio_read(socket, new UserCompletionHandler);
}
http://www.cnblogs.com/nufangrensheng/p/3588690.html
http://www.ibm.com/developerworks/cn/linux/l-async/
]]>
A work in progress, especially as the HotSpot VM evolves. But a place to put definitions of things so we only have to define them once. There are empty entries (marked TBD for "to be defined") because we think of things that we need to define faster than we think of good definitions.
自旋锁是指当一个线E尝试获取某个锁Ӟ如果该锁已被其他U程占用Q就一直@环检锁是否被释放,而不是进入线E挂h睡眠状态?/p>
自旋锁适用于锁保护的界区很小的情况,临界区很的话,锁占用的旉很短?/p>
SimpleSpinLock里有一个owner属性持有锁当前拥有者的U程的引用,如果该引用ؓnullQ则表示锁未被占用,不ؓnull则被占用?/p>
q里用AtomicReference是ؓ了用它的原子性的compareAndSetҎQCAS操作Q,解决了多U程q发操作D数据不一致的问题Q确保其他线E可以看到锁的真实状?br />
Ticket Lock 是ؓ了解决上面的公^性问题,cM于现实中银行柜台的排队叫P锁拥有一个服务号Q表C正在服务的U程Q还有一个排队号Q每个线E尝试获取锁之前先拿一个排队号Q然后不断轮询锁的当前服务号是否是自q排队P如果是,则表C己拥有了锁,不是则l轮询?/p>
当线E释NӞ服务号?Q这样下一个线E看到这个变化,退旋?/p>
Ticket Lock 虽然解决了公qx的问题Q但是多处理器系l上Q每个进E?U程占用的处理器都在d同一个变量serviceNum Q每ơ读写操作都必须在多个处理器~存之间q行~存同步Q这会导致繁重的pȝȝ和内存的量Q大大降低系l整体的性能?/p>
下面介绍的CLH锁和MCS锁都是ؓ了解册个问题的?/p>
MCS 来自于其发明人名字的首字母: John Mellor-Crummey和Michael Scott?/p>
CLH的发明h是:CraigQLandin and Hagersten?/p>
MCS Spinlock 是一U基于链表的可扩展、高性能、公q的自旋锁,甌U程只在本地变量上自旋,直接前驱负责通知其结束自旋,从而极大地减少了不必要的处理器~存同步的次敎ͼ降低了ȝ和内存的开销?/p>
CLH锁也是一U基于链表的可扩展、高性能、公q的自旋锁,甌U程只在本地变量上自旋,它不断轮询前q状态,如果发现前驱释放了锁q束自旋?br />
下图是CLH锁和MCS锁队列图C:
差异Q?/p>
注意Q这里实现的锁都是独占的Q且不能重入的?/strong>
q个世界上有一cMh特别苦|苦逼到什么程度呢Q他们省吃P用攒׃房,l果房h来贵Q公司外部竞争激烈,他们工作异常J忙Q披星戴月,日复一日;技术更新行业罕见,他们要随时调整心情,随时学习知识Q他们长期和机器ZQ大多比较呆傻,比较单纯Q还有很多不一一例DQ这一cMh是E序员?/p>
而就是这么一cȝ序员q着q么苦逼的生活Q在公司内部却难以获得公q的晋升ZQ外来的和尚L在不断打破^衡,甚至是刚毕业的新和尚拿得都比老和多Q这是全行业都罕见的奇观QIT人有q经历了?/p>
某创业公司,某个E序员要职Q老板甚至不问问他直接领导的意见,同意了Q没有挽留,之后大骂不忠诚,q个人拿3kQ拿?q_他走了以后,老板?k雇了个新面孔Q但是不愿意给q个老h晋升Q不愿意l加到哪怕是4k?/p>
某上市公司,游戏部门H然从外部空降了一个领|原因是原大{被挖C后,剩下的h升谁都有意见Q难以服众,不从外部请h来镇不住局面,q个Z来,大家是团l了Q团lv来和q个人斗Q但最后还是和解了?/p>
某国际大公司Q某Z造简历,包装的如׃玉,获得高职Q工作主要有下属完成Q他只需要汇众汇报即可,路越宽,直到某天事发Q依然是高官?/p>
某IT企业Q某清华同学职时语重心长的Ҏ_XXQ可以理解ؓ|游Q搜索,电商L一U)?0-02q毕业的q些人清华h的机会,我们是比某人强十倍也没有ZQ也得从下面做vQ搜索的天时不属于我Q此人去了某金融分析软g公司Q目前是高管Q同期留在某IT企业的其他同学依然过着苦逼的生活?/p>
1Q大佬的问题
你晋升困难,最大的主观原因在你自己Q最大的客观原因在你的直接上司。付责Q人的_目前很多企业的领导是不合格的Q他们大?0后,没有Z人着想的思想基础Q一味的考虑自己Q不下属,曄我对某h_你说你是合格的领|你说Z下属每个员工U房在哪里,每月多少房租Q我同意你是合格的领导Q结果他愧不言。你晋升不了Q很大程度上是你的领导没有帮你,q你每月房租多少都不知道Q你指望他帮助你提高技术水qI帮助你晋升?
2Q大佬的大{的问?/strong>
你大佬的大{Qlevel很高Q他需要引入新鲜血Ԍ他知道这个队伍缺什么,q个是他思考的问题Q他需要找牛的人来补这个缺口,于是一个光鲜照人的牛hq来了(虽然两年后也会泯Z人)l队伍带来了新鲜的血Ԍ但你的大佬升不上去,你大佬边上的位置被这个h占了Q你的位|在哪?
3Q公司的问题
各大企业l员工的再教育和培训都是不尽相同的,但大多口h一致的Q在工作中锻炼成长,q句话是最扯E的,国外很多大公司是有很完善的培训和再教育计划的Q会l员工一个充늚ZQƈ且给其一个完善的培训后,以便于让他在新升职的岗位上能够很好的胜Q。在国内大公叔R在找牛hQ就是不愿意自己培养Q原因是什么,不解释,你懂得?/p>
4Q你的兄?/strong>
很多时候让你升不了职恰恰是因ؓ和你一h斗的兄弟Q他们工作也很不错,你升职了Q他们怎么办?q也是一个^衡的问题Q你很努力,Z么你没有带动你的兄弟一起努力,你上MQ需要你q帮兄弟的支持,他们会支持你吗?曾有一个说了一句话Q我觉得很值得回味Q?#8220;当大安认ؓ你该升职了,是你升职的时候了”Q细l品呻I很有道理?/p>
5Q你自己的问?/strong>
最后你升不了职是你自己的问题,每天工作很忙Q没旉充电Q每天工作压力很大,来不及学习,每天q个那个Q一q下来碌无为。你提高了自q效率了嘛Q你周围有朋友再帮你吗?你知道你要学什么嘛Q你知道什么样的工作才能超出领导的期望?Q你出领导期望后却没有升职和领导沟通过吗?我曾在某企业Q我周围的几乎所有h加薪升职都是和领导沟通后才获得的。指望主动给你加薪升职,不如指望自己的沟通?/p>
6Q还是你自己的问?/strong>
你选择的这个行业是不是对的Q公司是不是对的Q就好像我说的这个清华的同学q个例子。如果你能耐大可以选大公司QPKC牛Z去,如果你能耐不大,L熟大公司Q还心理期盼高薪升职׃现实了,不如M个有前途的中小公司Q开创自q事业?/p>
1Q第一大佬才会招W一的人,W二大佬只会招W三的人,因此公司一把手必须是第一的QhD才能靠谱Q制度才靠谱Q没熟读历史Q不理解中国文化的,不要做公怸把手?/p>
2Q晋升的制度必须公^Q面向每一个hQ每一个层ơ,q往往很难做到Q做前端的和做后台的不好比,但做前端的可以和做前端的比。必要有公开公^的比|已获得升职机会。例如某公司做一个高l矩阵分解的NQ大家机会均{,性能最快,效果最好,胜出者升职,带领团队?/p>
3Q鼓励公司职员交,传播和帮助他人的文化Q一个h如果乐于助hQ帮助他人提高技术水qIq个人升职升上来Q大安会顶Q反之,你保守,不帮助他人,水^再牛Q升职上来也没h支持?/p>
4Q可以给职员一些挑战的ZQ提供更多的资源Q比如某公司的闪电计划,越了谷歌搜索效果,是一个很好的例子Q要敢于l一些勇于挑战的职员更多的资源,在严L战斗中考验Qƈ提供充分弹药?/p>
5Q给予内训机会,邀请业界牛座,送职员去帝考察开会乃臛_作等{。培训机会是发达国家企业的一U非常好的激励措施,一个岗?个h培训Q最好的上岗Q这是一个很公^的机会,培训机构_独立?nbsp;
Ҏ有很多,只要q第一的大{Q心中有着q帮打生打死的兄弟,办法L有的Q不要L考虑自己的业l,考虑自己的乌U帽Q做到这一点很隑־难,但制度不是只有这位大佬可以制定,M职员都应该积极投w到制度建立的过E中Q要敢于提出自己的观点,毕竟公司是大家的公司?/p>
我就写这么多Q我是一个十q一U?strong sizset="29" sizcache="1">E序?/a>的n份写q篇博客的,我努力做到客观,但我怿我更多代表的是劳方立场?/p>
]]>
?a title="布? >布?/a>》杂志评Z上个世纪末最具媄响力的二十本商业书籍。上世纪70q代末,国l济陷入衰退的阵痛期Q来自阿拉伯世界的石油威胁及来自日本的经压力ɾ国人的日子很不好过Q商业书c也因此被尘一时。但在接下来?0?0q代Q美国经保持了二十q的持箋增长Q一大批优秀?a title="CEO" >CEO?a title="比尔·盖茨" >比尔·盖茨?a title="?#183;艄? >?#183;艄?/a>?a title="唐纳?#183;Ҏ? >唐纳?#183;Ҏ?/a>Q出现在Z的视野中。商业书c的出版和发行也因此I前z跃Q本ơ评出的二十本书按类别分为管理类、叙事类、投资类及传记类。它们分别是Q?
汤姆·彼得斯错了吗Q?/strong>
理cMc在整个排行榜上所占的比重最大,其中Thomas Peters)?a title="《追求卓? >《追求卓?/a>高居榜首。这本书出版?982q_最开始源自著名的咨询公司制度化管?/a>让这个战败国的经迅速崛赗面对强烈个Z义精的员工Q美国公叔R导成了被长期讥笑的低能者?a title="汤姆·彼得? >汤姆·彼得?/a>?a title="|伯?#183;沃特? >|伯?#183;沃特?/a>的《追求卓》成了美国商业的拯救者。这本书为管理设定了一个积极的目标Q而非面的难题。彼得斯提出的杰Z业的 8个特性几乎ؓ未来20q的商业理奠定了格局Q?
1.偏好行动而不是沉?
2.在品和服务上接q顾客的需?
3.鼓励自治和放松,而不是紧密监?
4.寚w员的态度是鼓励其生力,避免“我们”?#8220;他们”q种对立情A
5.以一U被UCؓ“吉姆·柯林?/a>(James C. Collins)?a title="杰里·波拉? >杰里·波拉?/a>(Jerry I. Porras)的著?a title="《基业长青? >《基业长青?/a>。在书中作者对那些有见识有q见的公司进行了介绍。许多h认ؓ一间公司的持箋成长依赖于几位优U?a title="CEO" >CEO的持l运作,但本书的作者却告诉ZQ对一个企业而言Q一聪明h在维持现状的基础上敢于进行新试比拥有一个有力的领袖更重要Q而拥有一个核心的理念qؓ之奋斗则是企业的关键所在?
沃尔?/a>?a title="惠普" >惠普?a title="宝洁" >宝洁?a title="3M" >3M?a title="索尼" >索尼{行业领袖,本书研究的是事gQ是人性。作者从人的角度让我们看C公司的成长和巩固。作者分析的是公司、组l以及h在组l中的作用。作者从公司的角度分析了使得企业长远发展的优势,以此分析企业取得q些优势q期发展的原因。企业在发展q程中必M断自我改革、自我反省来辑ֈq些优势Q其成为公司特性,从而保证长久发展?
Zq一步探寻那些优U的公司走向不同发展道路的因素Q?001q_《公司再造?/a>(Reengineering the CorporationQA Manifesto for Business Revolution)则聚焦在企业如何q行自我攚w。书中研I了特?a title="IBM" >IBM?a title="贝尔公司" >贝尔公司的案例ƈ介绍了相关的成功l验?
1993q_q克?#183;汉默(Michael Hammer)?a title="James Champy" >James Champy出版?a title="《企业再造? >《企业再造?/a>一书,pȝ阐述?a title="BPR" >BPR(Business Process Reengineering)的思想Q提出再造企业的首要d是BPRQ只有徏讑֥BPRQ才能企业d摆脱困境。至此,BPR作ؓ一U新的管理思想Q像一股风潮席卷了整个国和其他工业化国家?
BPR是企业的业务q程描绘成一?a title="价值链" >价值链(Value Chain)Q竞争不是发生在企业与企业之_而是发生在企业各自的价值链之间。只有对价值链的各个环?业务程)实行有效理的企业,才有可能真正获得市场上的竞争优势Q也惟其如此QBPR才被捧ؓ“恢复国竞争力的惟一途径”?
BPR的生,q不仅仅是一本书那么单,隐藏在BPR背后的是深刻的技术、经以及管理变革背景?
资本Mq入70q代以来Q全球经环境发生了巨大的变化,供大于求的现状促成了卖方市场转向买方市场。进?0q代Q以国Z表的资本M发达国家l济陷入增长~慢?a title="通货膨胀" >通货膨胀的尴困境,企业陷入了成本增加、效益降低的局面,l济萧条、寻求持l增长和适应新的商业规则的心理需求,也满了学术界在q中寻求管理思想革新的迫切心理?
BPR?990q概늚诞生Q短?q的旉Q到1993q达到顶峎ͼ在美国几乎Ş成一股风潮,同时qL及到日本、d国等其他工业化国家?990q到1995q是BPR在欧最为鼎盛的时期?0q代末期Q经的持箋E_DBPR成ؓ国企业率先遗弃的对象?
另一本受Ƣ迎的书c?a title="《高效h的七种习惯? >《高效h的七种习惯?/a>着重介l个人管理。这本书虽然已经出版了十多年之久Qƈ已达C上千万的销量,但时至今日仍然是图书市场上的宠儿。有的是,虽然C千万计的C它,但h们的q_工作效率gq没有比十年前有所提高。本书作?a title="史蒂?#183;柯维" >史蒂?#183;柯维却因此名声大振,他的Uh公司富兰克林·柯维(Franklin Covey)?001q的销售额高达5?000万美元?
q有一位值得一提的作者当?a title="彼得·德鲁? >彼得·德鲁?/a>。他所写的理学著作早?a title="汤姆·彼得? >汤姆·彼得?/a>的《追求卓》之前。在本次评选中Q他?a class="new" title="《d鲁克的核心思想? >《d鲁克的核心思想?/a>被公认ؓ是最有媄响力的商业书c之一?
CEO的传记历来都是出版商q捧的对象,然而最早的CEO传记——1985q由Bantam出版公司推出?a class="new" title="《艾U卡? >《艾U卡?/a>(《Lacocca? 在此ơ评选中却榜上无名。同样名噪一时的传记体书c?a class="new" title="《交易的艺术? >《交易的艺术?/a>(1988q_Random House公司出版)也与排行榜无~?
由华U_司出版的杰克·韦尔?/a>虽然在婚姻问题上颇受争议Q但他仍然被公认Z表了一个时代的最杰出的CEO人选。同他合著该书的?a title="商业周刊" >商业周刊》的U翰·伯恩的著?a class="new" title="《h值链? >《h值链?/a>也在评选中颇受x?
杰克·韦尔奇在担Q通用公司CEO?0q中Q带领这个工业巨人积累了过4500亿美元的市场资本Qƈ使自己成为全世界最受h敬的企业领对{他提倡ƈ促进了现代企业的电子商务?a title="六西格玛" >六西格玛体系——卛_100万次生或服务作业中的瑕늎不超q?ơ、质量体pd全球化进E。同Ӟ他徏立了一套独特的企业哲学和管理方法。其理念是打破一切界限地吸收有用的思想Q把人当成企业的核心Q徏立自q投入产出模式Q以抵M官僚M的生?
杰克带领通用公司q入?#8220;中子杰克”时代Q他在每一个通用企业中推?#8220;整顿、出售和关闭”的策略,从而通用公司逐步裁减?0万雇员;他通过购ƈRCA公司为通用未来的赢利奠定了基础……当然Q也有失误的时候,但是杰克能够用一U坦诚的心态去面对p。在“自大的自?#8221;q一章中Q他承认收购Kidder Peabody公司是自己最大的p|Q因公司和通用公司的文化背道而驰。对于在职业生最后一q煞费苦心地收购霍尼韦尔q遇失败的全过E,本书也做了详的交代。这位善于自嘲的l理q让他明白了一个道理:再老也会有让你惊讶的事情。的,如果韦尔奇撰写自传箋集的话,他会向读者解释他的婚d机和关于巨额退休金的满城风雨吗Q?
在传记类作品中,另一本著名的传记J.P.摩根的帝国如何从诞生到陨落的q程Q该书获得了1990 q全最佛_书奖Qƈ在商界h士之中广泛流传?a title="微Y" >微Y的总裁比尔·盖茨是这个时代最富有的hQ他的两本描qC息世界的?a class="new" title="《未来之路? >《未来之路?/a>?a class="new" title="《未来时速? >《未来时速?/a>虽然引h注目Q但却没有荣Lơ排行榜?
Python没有内徏一个编译ؓexe的功能。给pythonE序的部|带来不的ȝ?
所以就会出C些py2exe之类的很不错的工P用于自动?py文g~译?exe文g?
最q抽I研I了一下手动实现类似py2exe的功能,希望加强对python的了解?
l果q相当不错。把l果记录下来Q与大家׃n?
文中所描述的方法,Zpython的以下几个功?
1. pythonE序q行Ӟ会在sys.path指定的\径中查找库文件?
2. python?.3开始,支持从zip文g中import?支持.py,.pyc?pyoQ但不支?pyd)
3. python提供C APIQ让c语言的程序,可以很方便的调用python的程?
注:假设python安装在c:\python25目录中,最后的可执行文件放到d:\dist目录?/strong>
1. 先去c:\python25\Lib目录Q把所有文仉复制出来Q比如复制到d:\pythonlib目录?
2. 开一个cmdH口Q进入d:\pythonlib目录中,q行 python -OO compileall.py -f . 把lib中的.py文g都编译成.pyo文g
3. 删除d:\pythonlib目录中所有的.py?pyc文gQ因为我们只要有.pyo文g可以让q些库运行了?
4. 删除目录中所有用不着的文Ӟ比如cursesQtestQidlelibQmsilib{,以减生成文件的体积?
5. 把这些库打包成一个zip文gQ比如stdlib.zipQ放到d:\dist目录?
6. 把c:\python25\dlls目录中的.pyd?dll文gQ复制到d:\dist\dlls目录中,当然Q删除不可能用到的一些文件_msi.pyd,_ssl.pyd{等Q可以减文件的体积
7. 把自己写的程序,也按步骤2x?所说的ҎQ打成一个mysrc.zip包,攑ֈd:\dist目录中?注意Q自己写的程序的入口应该是main.pyo文g
8. 用以下CE序~译Z个可执行文gQ比方说叫runpy.exeQ也攑ֈd:\dist中?
9. 把python25.dll攑ֈd:\dist目录中?
q样来,d:\dist目录中,一共只?个文件加一个目录:
dlls目录Q用于存放所有的dll文g和pyd文g stdlib.zip文gQ用于存放所有的python?pyo文g格式的标准库 mysrc.zip文gQ用于存放自己写的程序。注意,自己写的E序的入口在main.pyo中? runpy.exe文gQ程序的启动文gQ启动后会设定python的sys.pathQ然后调用main模块 python25.dll文gQpython的核心dllQrunpy.exe依赖于这个dll
注:当然Q这U打包方式第一ơ做的时候比较麻烦,但之后就可以只要把自qE序打包好了,其它的不用变?
而且Q如果自qE序l常做改动的话,自己的程序也可以不打包,直接攑ֈd:\dist中,反正runpy.exe启动E序的时候,只要能正常运行import main可以了?
有不h写emaill我Q问我要我做的包。大家可以在q里下蝲Z2.5.2版本的包Q?python_dist.7z 以及Z3.1.2版本的包Q?python31-dist.7z
注:3.1.2依赖?a class="http" >visual c++ 2008 redistributable package. 如果在目标机器上没有安装Q则E序q行不v来?
解开包后Q只要用自己的程序替换mysrc.zip可以用了?
包里有runpy.exe和runpyw.exe两个文g。其中,runpy.exe是控制台E序Qrunpyw.exe是非控制台程序。这两个E序分别cM于python.exe和pythonw.exe。想让程序运行时出现一个控制台Q就q行runpy.exeQ如果不惛_现黑黑的控制収ͼp行runpyw.exe? #include <Python.h>
2#include <Windows.h>
3#include <stdlib.h>
4#include <stdio.h>
5
6int main()
7{
8 // 得到当前可执行文件所在的目录
9 char szPath[10240];
10 char szCmd[10240];
11 GetModuleFileName(NULL, szPath, sizeof(szPath));
12 char* p = strrchr(szPath, '\\');
13 if (p == NULL)
14 {
15 printf("Get module file name error!\n");
16 return -1;
17 }
18
19 *p = 0;
20
21 // 讑֮q行时的PATH
22 sprintf(szCmd, "PATH=%s\\dlls;%%PATH%%", szPath);
23 _putenv(szCmd);
24
25 // 把sys.path讑֮为['.', '自己的源代码zip文g', '标准库zip文g', 'dll目录']
26 // 然后调用main模块
27 sprintf(szCmd,
28 "import sys\n"
29 "sys.path=['.', r'%s\\mysrc.zip', r'%s\\stdlib.zip', r'%s\\dlls']\n"
30 "import main\n",
31 szPath, szPath, szPath);
32
33 Py_OptimizeFlag = 2;
34 Py_NoSiteFlag = 1;
35 Py_Initialize();
36 PyRun_SimpleString(szCmd);
37 return 0;
38}
39l束?/h3>
]]>