??xml version="1.0" encoding="utf-8" standalone="yes"?>在线亚洲精品视频,中文国产成人精品久久亚洲精品AⅤ无码精品 ,国产精品亚洲精品日韩动图http://m.tkk7.com/DLevin/category/50406.htmlIn general the OO style is to use a lot of little objects with a lot of little methods that give us a lot of plug points for overriding and variation. To do is to be -Nietzsche, To bei is to do -Kant, Do be do be do -Sinatrazh-cnSat, 05 Sep 2015 04:44:37 GMTSat, 05 Sep 2015 04:44:37 GMT60[转]高性能IO模型析http://m.tkk7.com/DLevin/archive/2015/09/04/427118.htmlDLevinDLevinFri, 04 Sep 2015 07:16:00 GMThttp://m.tkk7.com/DLevin/archive/2015/09/04/427118.htmlhttp://m.tkk7.com/DLevin/comments/427118.htmlhttp://m.tkk7.com/DLevin/archive/2015/09/04/427118.html#Feedback0http://m.tkk7.com/DLevin/comments/commentRss/427118.htmlhttp://m.tkk7.com/DLevin/services/trackbacks/427118.html高性能IO模型析

转自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模型的伪代码描述为:

{
    read(socket, buffer);
    process(buffer);
}

即用户需要等待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模型的伪代码描述为:

{
    
while(read(socket, buffer) != SUCCESS) { }
    process(buffer);
}

? 用户需要不断地调用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函数的伪代码描述为:

{
    select(socket);
    
while(1) {
        sockets 
= select();
        
for(socket in sockets) {
            
if(can_read(socket)) {
                read(socket, buffer);
                process(buffer);
            }
        }
    }
}

其中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多\复用模型的伪代码描述为:

void UserEventHandler::handle_event() {
    
if(can_read(socket)) {
        read(socket, buffer);
        process(buffer);
    }
}

{
    Reactor.register(
new UserEventHandler(socket));
}

用户需要重写EventHandler的handle_event函数q行d数据、处理数据的工作Q用LE只需要将自己的EventHandler注册到Reactor卛_。Reactor中handle_events事g循环的伪代码大致如下?/span>

Reactor::handle_events() {
    
while(1) {
       sockets 
= select();
       
for(socket in sockets) {
            get_event_handler(socket).handle_event();
       }
    }
}

事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模型的伪代码描述为:


void UserCompletionHandler::handle_event(buffer) {
    process(buffer);
}

{
    aio_read(socket, 
new UserCompletionHandler);
}

用户需要重写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>


怼的:
http://www.cnblogs.com/nufangrensheng/p/3588690.html
http://www.ibm.com/developerworks/cn/linux/l-async/



DLevin 2015-09-04 15:16 发表评论
]]>
[转]HotSpot术语?/title><link>http://m.tkk7.com/DLevin/archive/2015/08/10/426721.html</link><dc:creator>DLevin</dc:creator><author>DLevin</author><pubDate>Mon, 10 Aug 2015 12:27:00 GMT</pubDate><guid>http://m.tkk7.com/DLevin/archive/2015/08/10/426721.html</guid><wfw:comment>http://m.tkk7.com/DLevin/comments/426721.html</wfw:comment><comments>http://m.tkk7.com/DLevin/archive/2015/08/10/426721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/DLevin/comments/commentRss/426721.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/DLevin/services/trackbacks/426721.html</trackback:ping><description><![CDATA[<p>非常好的术语参考表Q纪录下来以防以后忘了。{自:<a >http://openjdk.java.net/groups/hotspot/docs/HotSpotGlossary.html</a><br /><br /></p><h1 style="font-size: 12.5pt; padding: 0pt; margin: 0ex 0.5ex 1ex 0pt; font-family: 'DejaVu Sans', 'Bitstream Vera Sans', 'Luxi Sans', Verdana, Arial, Helvetica;">HotSpot Glossary of Terms</h1><p style="padding: 0pt; margin: 1ex 0em; font-family: 'DejaVu Sans', 'Bitstream Vera Sans', 'Luxi Sans', Verdana, Arial, Helvetica; font-size: 13.3333330154419px; line-height: 18.6666660308838px;">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 <em>TBD</em> for "to be defined") because we think of things that we need to define faster than we think of good definitions.</p><dl style="font-family: 'DejaVu Sans', 'Bitstream Vera Sans', 'Luxi Sans', Verdana, Arial, Helvetica; font-size: 13.3333330154419px; line-height: 18.6666660308838px;"><dt><a name="adaptiveSpinning" id="adaptiveSpinning"><strong>adaptive spinning</strong></a></dt><dd>An optimization technique whereby a thread spins waiting for a change-of-state to occur (typically a flag that represents some event has occurred - such as the release of a lock) rather than just blocking until notified that the change has occurred. The "adaptive" part comes from the policy decisions that control how long the thread will spin until eventually deciding to block.</dd><dt><a name="biasedLocking" id="biasedLocking"><strong>biased locking</strong></a></dt><dd>An optimization in the VM that leaves an object as logically locked by a given thread even after the thread has released the lock. The premise is that if the thread subsequently reacquires the lock (as often happens), then reacquisition can be achieved at very low cost. If a different thread tries to acquire a biased lock then the bias must be revoked from the current bias owner.</dd><dt><a name="blockStartTable" id="blockStartTable"><strong>block start table</strong></a></dt><dd>A table that shows, for a region of the heap, where the object starts that comes on to this region from lower addresees. Used, for example, with the<a style="text-decoration: none; color: #666666;">card table</a> variant of the <a style="text-decoration: none; color: #666666;">remembered set</a>.</dd><dt><a name="bootstrapClassloader" id="bootstrapClassloader"><strong>bootstrap classloader</strong></a></dt><dd>The logical classloader that has responsibility for loading the classes (and resources) that are found in the boot-classpath - typically the core Java platform classes. Typically implemented as part of the VM, by historical convention the bootstrap classloader is represented by NULL at the Java API level.</dd><dt><a name="bytecodeVerification" id="bytecodeVerification"><strong>bytecode verification</strong></a></dt><dd>A step in the linking process of a class where the methods bytecodes are analyzed to ensure type-safety.</dd><dt><a name="C1Compiler" id="C1Compiler"><strong>C1 compiler</strong></a></dt><dd>Fast, lightly optimizing bytecode compiler. Performs some value numbering, inlining, and class analysis. Uses a simple CFG-oriented SSA "high" IR, a machine-oriented "low" IR, a linear scan register allocation, and a template-style code generator.</dd><dt><a name="C2Compiler" id="C2Compiler"><strong>C2 compiler</strong></a></dt><dd>Highly optimizing bytecode compiler, also known as 'opto'. Uses a "sea of nodes" SSA "ideal" IR, which lowers to a machine-specific IR of the same kind. Has a graph-coloring register allocator; colors all machine state, including local, global, and argument registers and stack. Optimizations include global value numbering, conditional constant type propagation, constant folding, global code motion, algebraic identities, method inlining (aggressive, optimistic, and/or multi-morphic), intrinsic replacement, loop transformations (unswitching, unrolling), array range check elimination.</dd><dt><a name="cardTable" id="cardTable"><strong>card table</strong></a></dt><dd>A kind of <a style="text-decoration: none; color: #666666;">remembered set</a> that records where oops have changed in a generation.</dd><dt><a name="classDataSharing" id="classDataSharing"><strong>class data sharing</strong></a></dt><dd>A startup optimization that records the in-memory form of some classes, so that that form can be mapped into memory by a subsequent run of the virtual machine, rather than loading those classes from their class files.</dd><dt><a name="classHierachyAnalysis" id="classHierachyAnalysis"><strong>class hierachy analysis</strong></a></dt><dd>Also known as 'CHA'. Analysis of the class tree used by a compiler to determine if the receiver at a virtual call site has a single implementor. If so, the callee can be inlined or the compiler can employ some other static call mechanism.</dd><dt><a name="codeCache" id="codeCache"><strong>code cache</strong></a></dt><dd>A special heap that holds compiled code. These objects are not relocated by the GC, but may contain oops, which serve as GC roots.</dd><dt><a name="compaction" id="compaction"><strong>compaction</strong></a></dt><dd>A garbage collection technique that results in live objects occupying a dense portion of the virtual address space, and available space in another portion of the address space. Cf. <a style="text-decoration: none; color: #666666;">free list</a>.</dd><dt><a name="concurrency" id="concurrency"><strong>concurrency</strong></a></dt><dd>Concurrency, or more specifically concurrent programming, is the logical simultaneous execution of multiple instruction streams. If multiple processors are available then the logical simultaneity can be physical simultaneity - this is known as 'parallelism'</dd><dt><a name="concurrentGarbageCollection" id="concurrentGarbageCollection"><strong>concurrent garbage collection</strong></a></dt><dd>A garbage collection algorithm that does most (if not all) of its work while the Java application threads are still running.</dd><dt><a name="copyingGarbageCollection" id="copyingGarbageCollection"><strong>copying garbage collection</strong></a></dt><dd>A garbage collection algorithm that moves objects during the collection.</dd><dt><a name="deoptimization" id="deoptimization"><strong>deoptimization</strong></a></dt><dd>The process of converting an compiled (or more optimized) stack frame into an interpreted (or less optimized) stack frame. Also describes the discarding of an nmethod whose dependencies (or other assumptions) have been broken. Deoptimized nmethods are typically recompiled to adapt to changing application behavior. Example: A compiler initially assumes a reference value is never null, and tests for it using a trapping memory access. Later on, the application uses null values, and the method is deoptimized and recompiled to use an explicit test-and-branch idiom to detect such nulls.</dd><dt><a name="dependency" id="dependency"><strong>dependency</strong></a></dt><dd>An optimistic assumption associated with an nmethod, which allowed the compiler to emit improved code into the nmethod. Example: A given class has no subclasses, which simplifies method dispatch and type testing. The loading of new classes (or replacement of old classes) can cause dependencies to become false, which requires dependent nmethods to be discarded and activations of those nmethods to be deoptimized.</dd><dt><a name="eden" id="eden"><strong>eden</strong></a></dt><dd>A part of the Java object heap where object can be created efficiently.</dd><dt><a name="freeList" id="freeList"><strong>free list</strong></a></dt><dd>A storage management technique in which unused parts of the Java object heap are chained one to the next, rather than having all of the unused part of the heap in a single block.</dd><dt><a name="garbageCollection" id="garbageCollection"><strong>garbage collection</strong></a></dt><dd>The automatic management of storage.</dd><dt><a name="garbageCollectionRoot" id="garbageCollectionRoot"><strong>garbage collection root</strong></a></dt><dd>A pointer into the Java object heap from outside the heap. These come up, e.g., from static fields of classes, local references in activation frames, etc.</dd><dt><a name="GCMap" id="GCMap"><strong>GC map</strong></a></dt><dd>A description emitted by the JIT (C1 or C2) of the locations of oops in registers or on stack in a compiled stack frame. Each code location which might execute a safepoint has an associated GC map. The GC knows how to parse a frame from a stack, to request a GC map from a frame's nmethod, and to unpack the GC map and manage the indicated oops within the stack frame.</dd><dt><a name="generationalGarbageCollection" id="generationalGarbageCollection"><strong>generational garbage collection</strong></a></dt><dd>A storage management technique that separates objects expected to be referenced for different lengths of time into different regions of the heap, so that different algorithms can be applied to the collection of those regions.</dd><dt><a name="handle" id="handle"><strong>handle</strong></a></dt><dd>A memory word containing an oop. The word is known to the GC, as a root reference. C/C++ code generally refers to oops indirectly via handles, to enable the GC to find and manage its root set more easily. Whenever C/C++ code blocks in a safepoint, the GC may change any oop stored in a handle. Handles are either 'local' (thread-specific, subject to a stack discipline though not necessarily on the thread stack) or global (long-lived and explicitly deallocated). There are a number of handle implementations throughout the VM, and the GC knows about them all.</dd><dt><a name="hotLock" id="hotLock"><strong>hot lock</strong></a></dt><dd>A lock that is highly contended.</dd><dt><a name="interpreter" id="interpreter"><strong>interpreter</strong></a></dt><dd>A VM module which implements method calls by individually executing bytecodes. The interpreter has a limited set of highly stylized stack frame layouts and register usage patterns, which it uses for all method activations. The Hotspot VM generates its own interpreter at start-up time.</dd><dt><a name="JITCompilers" id="JITCompilers"><strong>JIT compilers</strong></a></dt><dd>An on-line compiler which generates code for an application (or class library) during execution of the application itself. ("JIT" stands for "just in time".) A JIT compiler may create machine code shortly before the first invocation of a Java method. Hotspot compilers usually allow the interpreter ample time to "warm up" Java methods, by executing them thousands of times. This warm-up period allows a compiler to make better optimization decisions, because it can observe (after initial class loading) a more complete class hierarchy. The compiler can also inspect branch and type profile information gathered by the interpreter.</dd><dt><a name="JNI" id="JNI"><strong>JNI</strong></a></dt><dd>The Java Native Interface - a specification and API for how Java code can call out to native C code, and how native C code can call into the Java VM</dd><dt><a name="JVMTI" id="JVMTI"><strong>JVM TI</strong></a></dt><dd>The Java Virtual Machine Tools Interface - a standard specification and API that is used by development and monitoring tools. See <a style="text-decoration: none; color: #666666;">JVM TI</a> for more information.</dd><dt><a name="klassPointer" id="klassPointer"><strong>klass pointer</strong></a></dt><dd>The second word of every object header. Points to another object (a metaobject) which describes the layout and behavior of the original object. For Java objects, the "klass" contains a C++ style "vtable".</dd><dt><a name="markWord" id="markWord"><strong>mark word</strong></a></dt><dd>The first word of every object header. Usually a set of bitfields including synchronization state and identity hash code. May also be a pointer (with characteristic low bit encoding) to synchronization related information. During GC, may contain GC state bits.</dd><dt><a name="nmethod" id="nmethod"><strong>nmethod</strong></a></dt><dd>A block of executable code which implements some Java bytecodes. It may be a complete Java method, or an 'OSR' method. It routinely includes object code for additional methods inlined by the compiler.</dd><dt><a name="objectHeader" id="objectHeader"><strong>object header</strong></a></dt><dd>Common structure at the beginning of every GC-managed heap object. (Every oop points to an object header.) Includes fundamental information about the heap object's layout, type, GC state, synchronization state, and identity hash code. Consists of two words. In arrays it is immediately followed by a length field. Note that both Java objects and VM-internal objects have a common object header format.</dd><dt><a name="objectPromotion" id="objectPromotion"><strong>object promotion</strong></a></dt><dd>The act of copying an object from one generation to another.</dd><dt><a name="oldGeneration" id="oldGeneration"><strong>old generation</strong></a></dt><dd>A region of the Java object heap that holds object that have remained referenced for a while.</dd><dt><a name="onStackReplacement" id="onStackReplacement"><strong>on-stack replacement</strong></a></dt><dd>Also known as 'OSR'. The process of converting an interpreted (or less optimized) stack frame into a compiled (or more optimized) stack frame. This happens when the interpreter discovers that a method is looping, requests the compiler to generate a special nmethod with an entry point somewhere in the loop (specifically, at a backward branch), and transfers control to that nmethod. A rough inverse to deoptimization.</dd><dt><a name="oop" id="oop"><strong>oop</strong></a></dt><dd>An object pointer. Specifically, a pointer into the GC-managed heap. (The term is traditional. One 'o' may stand for 'ordinary'.) Implemented as a native machine address, not a handle. Oops may be directly manipulated by compiled or interpreted Java code, because the GC knows about the liveness and location of oops within such code. (See GC map.) Oops can also be directly manipulated by short spans of C/C++ code, but must be kept by such code within handles across every safepoint.</dd><dt><a name="parallelClassloading" id="parallelClassloading"><strong>parallel classloading</strong></a></dt><dd>The ability to have multiple classes/type be in the process of being loaded by the same classloader at the same time.</dd><dt><a name="parallelGarbageCollection" id="parallelGarbageCollection"><strong>parallel garbage collection</strong></a></dt><dd>A garbage collection algorithm that uses multiple threads of control to perform more efficiently on multi-processor boxes.</dd><dt><a name="permanentGeneration" id="permanentGeneration"><strong>permanent generation</strong></a></dt><dd>A region of the address space that holds object allocated by the virtual machine itself, but which is managed by the garbage collector. The permanent generation is mis-named, in that almost all of the objects in it <em>can</em>be collected, though they tend to be referenced for a long time, so they rarely become garbage.</dd><dt><a name="rememberedSet" id="rememberedSet"><strong>remembered set</strong></a></dt><dd>A data structure that records pointers between generations.</dd><dt><a name="safepoint" id="safepoint"><strong>safepoint</strong></a></dt><dd>A point during program execution at which all GC roots are known and all heap object contents are consistent. From a global point of view, all threads must block at a safepoint before the GC can run. (As a special case, threads running JNI code can continue to run, because they use only handles. During a safepoint they must block instead of loading the contents of the handle.) From a local point of view, a safepoint is a distinguished point in a block of code where the executing thread may block for the GC. Most call sites qualify as safepoints. There are strong invariants which hold true at every safepoint, which may be disregarded at non-safepoints. Both compiled Java code and C/C++ code be optimized between safepoints, but less so across safepoints. The JIT compiler emits a GC map at each safepoint. C/C++ code in the VM uses stylized macro-based conventions (e.g., TRAPS) to mark potential safepoints.</dd><dt><a name="seaOfNodes" id="seaOfNodes"><strong>sea-of-nodes</strong></a></dt><dd>The high-level intermediate representation in C2. It is an SSA form where both data and control flow are represented with explicit edges between nodes. It differs from forms used in more traditional compilers in that nodes are not bound to a block in a control flow graph. The IR allows nodes to float within the sea (subject to edge constraints) until they are scheduled late in the compilation process.</dd><dt><a name="sa" id="sa"><strong>Serviceability Agent (SA)</strong></a></dt><dd>The Serviceablity Agent is collection of Sun internal code that aids in debugging HotSpot problems. It is also used by several JDK tools - jstack, jmap, jinfo, and jdb. See <a style="text-decoration: none; color: #666666;">SA</a> for more information.</dd><dt><a name="stackmap" id="stackmap"><strong>stackmap</strong></a></dt><dd>Refers to the StackMapTable attribut e or a particular StackMapFrame in the table.</dd><dt><a name="StackMapTable" id="StackMapTable"><strong>StackMapTable</strong></a></dt><dd>An attribute of the Code attribute in a classfile which contains type information used by the new verifier during verification. It consists of an array of StackMapFrames. It is generated automatically by javac as of JDK6.</dd><dt><a name="survivorSpace" id="survivorSpace"><strong>survivor space</strong></a></dt><dd>A region of the Java object heap used to hold objects. There are usually a pair of survivor spaces, and collection of one is achieved by copying the referenced objects in one survivor space to the other survivor space.</dd><dt><a name="synchronization" id="synchronization"><strong>synchronization</strong></a></dt><dd>In general terms this is the coordination of concurrent activities to ensure the safety and liveness properties of those activities. For example, protecting access to shared data by using a lock to guard all code paths to that data.</dd><dt><a name="TLAB" id="TLAB"><strong>TLAB</strong></a></dt><dd>Thread-local allocation buffer. Used to allocate heap space quickly without synchronization. Compiled code has a "fast path" of a few instructions which tries to bump a high-water mark in the current thread's TLAB, successfully allocating an object if the bumped mark falls before a TLAB-specific limit address.</dd><dt><a name="uncommonTrap" id="uncommonTrap"><strong>uncommon trap</strong></a></dt><dd>When code generated by C2 reverts back to the interpreter for further execution. C2 typically compiles for the common case, allowing it to focus on optimization of frequently executed paths. For example, C2 inserts an uncommon trap in generated code when a class that is uninitialized at compile time requires run time initialization.</dd><dt><a name="verifier" id="verifier"><strong>verifier</strong></a></dt><dd>The software code in the VM which performs bytecode verification.</dd><dt><a name="VMOperations" id="VMOperations"><strong>VM Operations</strong></a></dt><dd>Operations in the VM that can be requested by Java threads, but which must be executed, in serial fashion by a specific thread known as the VM thread. These operations are often synchronous, in that the requester will block until the VM thread has completed the operation. Many of these operations also require that the VM be brought to a safepoint before the operation can be performed - a garbage collection request is a simple example.</dd><dt><a name="writeBarrier" id="writeBarrier"><strong>write barrier</strong></a></dt><dd>Code that is executed on every oop store. For example, to maintain a remembered set.</dd><dt><a name="youngGeneration" id="youngGeneration"><strong>young generation</strong></a></dt><dd>A region of the Java object heap that holds recently-allocated objects.</dd></dl><img src ="http://m.tkk7.com/DLevin/aggbug/426721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/DLevin/" target="_blank">DLevin</a> 2015-08-10 20:27 <a href="http://m.tkk7.com/DLevin/archive/2015/08/10/426721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]自旋锁、排队自旋锁、MCS锁、CLH?/title><link>http://m.tkk7.com/DLevin/archive/2015/08/07/416102.html</link><dc:creator>DLevin</dc:creator><author>DLevin</author><pubDate>Thu, 06 Aug 2015 16:18:00 GMT</pubDate><guid>http://m.tkk7.com/DLevin/archive/2015/08/07/416102.html</guid><wfw:comment>http://m.tkk7.com/DLevin/comments/416102.html</wfw:comment><comments>http://m.tkk7.com/DLevin/archive/2015/08/07/416102.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/DLevin/comments/commentRss/416102.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/DLevin/services/trackbacks/416102.html</trackback:ping><description><![CDATA[转自Qhttp://coderbee.net/index.php/concurrent/20131115/577<br /><br /><h3>自旋锁(Spin lockQ?/h3><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">自旋锁是指当一个线E尝试获取某个锁Ӟ如果该锁已被其他U程占用Q就一直@环检锁是否被释放,而不是进入线E挂h睡眠状态?/p><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">自旋锁适用于锁保护的界区很小的情况,临界区很的话,锁占用的旉很短?/p><h4>单的实现</h4><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.atomic.AtomicReference;<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> SpinLock {<br />    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> AtomicReference</span><span style="color: #000000; "><</span><span style="color: #000000; ">Thread</span><span style="color: #000000; ">></span><span style="color: #000000; "> owner </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> AtomicReference</span><span style="color: #000000; "><</span><span style="color: #000000; ">Thread</span><span style="color: #000000; ">></span><span style="color: #000000; ">();<br />    <br />    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> lock() {<br />        Thread currentThread </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Thread.currentThread();</span><span style="color: #008000; ">//</span><span style="color: #008000; "> 如果锁未被占用,则设|当前线Eؓ锁的拥有?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">        </span><span style="color: #0000FF; ">while</span><span style="color: #000000; "> (owner.compareAndSet(</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">, currentThread)) { }<br />    }<br />    <br />    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> unlock() {<br />        Thread currentThread </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Thread.currentThread();</span><span style="color: #008000; ">//</span><span style="color: #008000; "> 只有锁的拥有者才能释N</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">        owner.compareAndSet(currentThread, </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">);<br />    }<br />}</span></div><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;"><br />SimpleSpinLock里有一个owner属性持有锁当前拥有者的U程的引用,如果该引用ؓnullQ则表示锁未被占用,不ؓnull则被占用?/p><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">q里用AtomicReference是ؓ了用它的原子性的compareAndSetҎQCAS操作Q,解决了多U程q发操作D数据不一致的问题Q确保其他线E可以看到锁的真实状?br /></p><h4>~点</h4><ol style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; list-style-position: outside; list-style-image: initial; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;"><li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;">CAS操作需要硬件的配合Q?/li><li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;">保证各个CPU的缓存(L1、L2、L3、跨CPU Socket、主存)的数据一致性,通讯开销很大Q在多处理器pȝ上更严重Q?/li><li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;">没法保证公^性,不保证等待进E?U程按照FIFO序获得锁?/li></ol><h3>Ticket Lock</h3><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">Ticket Lock 是ؓ了解决上面的公^性问题,cM于现实中银行柜台的排队叫P锁拥有一个服务号Q表C正在服务的U程Q还有一个排队号Q每个线E尝试获取锁之前先拿一个排队号Q然后不断轮询锁的当前服务号是否是自q排队P如果是,则表C己拥有了锁,不是则l轮询?/p><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">当线E释NӞ服务号?Q这样下一个线E看到这个变化,退旋?/p><h4>单的实现</h4><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.atomic.AtomicInteger;  <br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> TicketLock {<br />    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> AtomicInteger serviceNum </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> AtomicInteger(); </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 服务?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> AtomicInteger ticketNum </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> AtomicInteger(); </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 排队?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> lock() { </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 首先原子性地获得一个排队号</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">        </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> myTicketNum </span><span style="color: #000000; ">=</span><span style="color: #000000; "> ticketNum.getAndIncrement(); </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 只要当前服务号不是自q׃断轮?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">        </span><span style="color: #0000FF; ">while</span><span style="color: #000000; "> (serviceNum.get() </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> myTicketNum) { }<br />        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> myTicketNum;<br />    }<br />    <br />    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> unlock(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> myTicket) { </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 只有当前U程拥有者才能释N</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">        </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> next </span><span style="color: #000000; ">=</span><span style="color: #000000; "> myTicket </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />        serviceNum.compareAndSet(myTicket, next);<br />    }<br />}</span></div><h4>~点</h4><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">Ticket Lock 虽然解决了公qx的问题Q但是多处理器系l上Q每个进E?U程占用的处理器都在d同一个变量serviceNum Q每ơ读写操作都必须在多个处理器~存之间q行~存同步Q这会导致繁重的pȝȝ和内存的量Q大大降低系l整体的性能?/p><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">下面介绍的CLH锁和MCS锁都是ؓ了解册个问题的?/p><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">MCS 来自于其发明人名字的首字母: John Mellor-Crummey和Michael Scott?/p><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">CLH的发明h是:CraigQLandin and Hagersten?/p><h3>MCS?/h3><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">MCS Spinlock 是一U基于链表的可扩展、高性能、公q的自旋锁,甌U程只在本地变量上自旋,直接前驱负责通知其结束自旋,从而极大地减少了不必要的处理器~存同步的次敎ͼ降低了ȝ和内存的开销?/p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.atomic.AtomicReferenceFieldUpdater;<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> MCSLock {<br />    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> MCSNode {<br />        </span><span style="color: #0000FF; ">volatile</span><span style="color: #000000; "> MCSNode next;<br />        </span><span style="color: #0000FF; ">volatile</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; "> isBlock </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">; </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 默认是在{待?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">    }<br /><br />    </span><span style="color: #0000FF; ">volatile</span><span style="color: #000000; "> MCSNode queue;</span><span style="color: #008000; ">//</span><span style="color: #008000; "> 指向最后一个申请锁的MCSNode</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">final</span><span style="color: #000000; "> AtomicReferenceFieldUpdater UPDATER </span><span style="color: #000000; ">=</span><span style="color: #000000; "> AtomicReferenceFieldUpdater<br />            .newUpdater(MCSLock.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">, MCSNode.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">, </span><span style="color: #000000; ">"</span><span style="color: #000000; ">queue</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> lock(MCSNode currentThread) {<br />        MCSNode predecessor </span><span style="color: #000000; ">=</span><span style="color: #000000; "> UPDATER.getAndSet(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">, currentThread);</span><span style="color: #008000; ">//</span><span style="color: #008000; "> step 1</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (predecessor </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {<br />            predecessor.next </span><span style="color: #000000; ">=</span><span style="color: #000000; "> currentThread;</span><span style="color: #008000; ">//</span><span style="color: #008000; "> step 2</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />            </span><span style="color: #0000FF; ">while</span><span style="color: #000000; "> (currentThread.isBlock) {</span><span style="color: #008000; ">//</span><span style="color: #008000; "> step 3</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">            }<br />        }<br />    }<br /><br />    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> unlock(MCSNode currentThread) {<br />        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (currentThread.isBlock) {</span><span style="color: #008000; ">//</span><span style="color: #008000; "> 锁拥有者进行释N才有意义</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">            </span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br />        }<br /><br />        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (currentThread.next </span><span style="color: #000000; ">==</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {</span><span style="color: #008000; ">//</span><span style="color: #008000; "> 查是否有人排在自己后?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">            </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (UPDATER.compareAndSet(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">, currentThread, </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)) {</span><span style="color: #008000; ">//</span><span style="color: #008000; "> step 4<br />                </span><span style="color: #008000; ">//</span><span style="color: #008000; "> compareAndSetq回true表示实没有人排在自己后?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">                </span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br />            } </span><span style="color: #0000FF; ">else</span><span style="color: #000000; "> {<br />                </span><span style="color: #008000; ">//</span><span style="color: #008000; "> H然有h排在自己后面了,可能q不知道是谁Q下面是{待后箋?br />                </span><span style="color: #008000; ">//</span><span style="color: #008000; "> q里之所以要忙等是因为:step 1执行完后Qstep 2可能q没执行?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">                </span><span style="color: #0000FF; ">while</span><span style="color: #000000; "> (currentThread.next </span><span style="color: #000000; ">==</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) { </span><span style="color: #008000; ">//</span><span style="color: #008000; "> step 5</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">                }<br />            }<br />        }<br /><br />        currentThread.next.isBlock </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br />        currentThread.next </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;</span><span style="color: #008000; ">//</span><span style="color: #008000; "> for GC</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">    }<br />}</span></div><h3>CLH?/h3><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">CLH锁也是一U基于链表的可扩展、高性能、公q的自旋锁,甌U程只在本地变量上自旋,它不断轮询前q状态,如果发现前驱释放了锁q束自旋?br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.atomic.AtomicReferenceFieldUpdater;<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> CLHLock {<br />    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> CLHNode {<br />        </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; "> isLocked </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">; </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 默认是在{待?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">    }<br /><br />    @SuppressWarnings(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">unused</span><span style="color: #000000; ">"</span><span style="color: #000000; "> )<br />    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">volatile</span><span style="color: #000000; "> CLHNode tail ;<br />    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">final</span><span style="color: #000000; "> AtomicReferenceFieldUpdater</span><span style="color: #000000; "><</span><span style="color: #000000; ">CLHLock, CLHNode</span><span style="color: #000000; ">></span><span style="color: #000000; "> UPDATER </span><span style="color: #000000; ">=</span><span style="color: #000000; "> AtomicReferenceFieldUpdater<br />                  . newUpdater(CLHLock.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">, CLHNode .</span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> , </span><span style="color: #000000; ">"</span><span style="color: #000000; ">tail</span><span style="color: #000000; ">"</span><span style="color: #000000; "> );<br /><br />    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> lock(CLHNode currentThread) {<br />        CLHNode preNode </span><span style="color: #000000; ">=</span><span style="color: #000000; "> UPDATER.getAndSet( </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">, currentThread);<br />        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(preNode </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {</span><span style="color: #008000; ">//</span><span style="color: #008000; ">已有U程占用了锁Q进入自?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">            </span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(preNode.isLocked ) {<br />            }<br />        }<br />    }<br /><br />    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> unlock(CLHNode currentThread) {<br />        </span><span style="color: #008000; ">//</span><span style="color: #008000; "> 如果队列里只有当前线E,则释攑֯当前U程的引用(for GCQ?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (</span><span style="color: #000000; ">!</span><span style="color: #000000; ">UPDATER .compareAndSet(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">, currentThread, </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)) {<br />            </span><span style="color: #008000; ">//</span><span style="color: #008000; "> q有后箋U程</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">            currentThread. isLocked </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">false</span><span style="color: #000000; "> ;</span><span style="color: #008000; ">//</span><span style="color: #008000; "> 改变状态,让后l线E结束自?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">        }<br />    }<br />}</span></div><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;"><br /></p><h3>CLH??MCS?的比?/h3><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">下图是CLH锁和MCS锁队列图C:<br /><img src="http://coderbee.net/wp-content/uploads/2013/11/CLH-MCS-SpinLock.png" alt="CLH-MCS-SpinLock" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; max-width: 100%; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; box-shadow: rgba(0, 0, 0, 0.2) 0px 1px 4px;" /></p><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">差异Q?/p><ol style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; list-style-position: outside; list-style-image: initial; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;"><li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;">从代码实现来看,CLH比MCS要简单得多?/li><li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;">从自旋的条g来看QCLH是在本地变量上自旋,MCS是自旋在其他对象的属性?/li><li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;">从链表队列来看,CLH的队列是隐式的,CLHNodeq不实际持有下一个节点;MCS的队列是物理存在的?/li><li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;">CLH锁释放时只需要改变自q属性,MCS锁释攑ֈ需要改变后l节点的属性?/li></ol><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">注意Q这里实现的锁都是独占的Q且不能重入的?/strong></p><img src ="http://m.tkk7.com/DLevin/aggbug/416102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/DLevin/" target="_blank">DLevin</a> 2015-08-07 00:18 <a href="http://m.tkk7.com/DLevin/archive/2015/08/07/416102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlet中web.xml配置文g(?http://m.tkk7.com/DLevin/archive/2014/05/18/413796.htmlDLevinDLevinSat, 17 May 2014 16:43:00 GMThttp://m.tkk7.com/DLevin/archive/2014/05/18/413796.htmlhttp://m.tkk7.com/DLevin/comments/413796.htmlhttp://m.tkk7.com/DLevin/archive/2014/05/18/413796.html#Feedback1http://m.tkk7.com/DLevin/comments/commentRss/413796.htmlhttp://m.tkk7.com/DLevin/services/trackbacks/413796.html阅读全文

DLevin 2014-05-18 00:43 发表评论
]]>
【{】一个不错的eclipse反编译插?/title><link>http://m.tkk7.com/DLevin/archive/2012/11/02/390685.html</link><dc:creator>DLevin</dc:creator><author>DLevin</author><pubDate>Fri, 02 Nov 2012 07:05:00 GMT</pubDate><guid>http://m.tkk7.com/DLevin/archive/2012/11/02/390685.html</guid><wfw:comment>http://m.tkk7.com/DLevin/comments/390685.html</wfw:comment><comments>http://m.tkk7.com/DLevin/archive/2012/11/02/390685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/DLevin/comments/commentRss/390685.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/DLevin/services/trackbacks/390685.html</trackback:ping><description><![CDATA[在CSDN论坛上看到的一个不错的eclipse反编译插Ӟ感觉看v来不错的样子Q因而记下,原网址是:<a >http://topic.csdn.net/u/20121030/14/CDE52930-BAF2-4F88-B751-3797A7EB3C44.html</a><br /><br />闲暇之余Q写了一个Eclipse下的Java反编译插ӞEclipse Class DecompilerQ整合了目前最好的2个Java反编译工具Jad和JD-CoreQƈ且和Eclipse Class Viewer无缝集成Q能够很方便的用本插g查看cd源码Q以及采用本插gq行Debug调试?br /><br /><strong sizset="44" sizcache="0">Eclipse Class Decompiler插g更新站点Q?<a title="http://feeling.sourceforge.net/update" target="_blank">http://feeling.sourceforge.net/update</a></strong><br /><br />直接使用Eclipseq行更新Q支持Eclipse 3.x, 4.xQ不依赖M其他插gQ直接勾选更新插件即可?br /><br /><img alt="" src="http://m.tkk7.com/images/blogjava_net/cnfree/install.png" /><br /><br /><br />下图为Eclipse Class Decompiler的首选项面Q可以选择~省的反~译器工Pq进行反~译器的基本讄。缺省的反编译工具ؓJD-CoreQJD-Core更ؓ先进一些,支持泛型、Enum、注解等JDK1.5以后才有的新语法?br /><br /><img alt="" src="http://m.tkk7.com/images/blogjava_net/cnfree/preferences.png" /><br /><br />首选项配置选项Q?br />1.重用~存代码Q只会反~译一ơ,以后每次打开该类文gQ都昄的是~存的反~译代码?br />2.忽略已存在的源代码:若未选中Q则查看Class文g是否已绑定了Java源代码,如果已绑定,则显CJava源代码,如果未绑定,则反~译Class文g。若选中此项Q则忽略已绑定的Java源代码,昄反编译结果?br />3.昄反编译器报告Q显C反~译器反~译后生成的数据报告及异怿息?br />4.使用Eclipse代码格式化工P使用Eclipse格式化工具对反编译结果重新格式化排版Q反~译整个Jar包时Q此操作会消耗一些时间?br />5.使用Eclipse成员排序Q用Eclipse成员排序对反~译l果重新格式化排版,反编译整个Jar包时Q此操作会消耗大量时间?br />6.以注释方式输出原始行号信息:如果Class文g包含原始行号信息Q则会将行号信息以注释的方式打印到反~译l果中?br />7.Ҏ行号寚w源代码以便于调试Q若选中该项Q插件会采用AST工具分析反编译结果,q根据行号信息调整代码顺序,以便于Debugq程中的单步跟踪调试?br />8.讄cd~译查看器作为缺省的cL件编辑器Q默认ؓ选中Q将忽略Eclipse自带的Class ViewerQ每ơEclipse启动后,默认使用本插件提供的cL看器打开Class文g?br /><br /><br />插g提供了系l菜单,工具栏,当打开了插件提供的cd~译查看器后Q会Ȁz菜单和工具栏选项Q可以方便的q行首选项配置Q切换反~译工具重新反编译,以及导出反编译结果?br /><br /><img alt="" src="http://m.tkk7.com/images/blogjava_net/cnfree/MenuBar.png" /><br /><img alt="" src="http://m.tkk7.com/images/blogjava_net/cnfree/ToolBar.png" /><br /><br /><br />cd~译查看器右键菜单包含了Eclipse自带cL看器右键菜单的全部选项Qƈ增加了一?#8220;导出反编译源代码”菜单V?br /><br /><img alt="" src="http://m.tkk7.com/images/blogjava_net/cnfree/export.png" /><br /><br />打开目路径下的Class文gQ如果设|类反编译查看器为缺省的查看器,直接双击Class文g卛_Q如果没有设|ؓ~省查看器,可以使用右键菜单q行查看?br /><br /><img alt="" src="http://m.tkk7.com/images/blogjava_net/cnfree/open.png" /><br /><br /><br />Eclipse Class Decompiler插g也提供了反编译整个Jar文g或者Java包的反编译。该操作支持Package Explorer对包昄布局的操作,如果是^铺模式布局Q则导出的源代码不包含子包,如果是层U模式布局Q则导出选中的包及其所有的子包?br /><br /><img alt="" src="http://m.tkk7.com/images/blogjava_net/cnfree/ExportPackage.png" /><br /><br /><br />Debug调试Q可以在首选项选中寚w行号q行单步跟踪调试Q和普通的包含源代码时的调试操作完全一_同样的也可以讄断点q行跟踪?br /><br /><img alt="" src="http://m.tkk7.com/images/blogjava_net/cnfree/Debug.png" /><br /><img src ="http://m.tkk7.com/DLevin/aggbug/390685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/DLevin/" target="_blank">DLevin</a> 2012-11-02 15:05 <a href="http://m.tkk7.com/DLevin/archive/2012/11/02/390685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【{】Log4j/common log和各U服务器集成的问?/title><link>http://m.tkk7.com/DLevin/archive/2012/11/02/390639.html</link><dc:creator>DLevin</dc:creator><author>DLevin</author><pubDate>Thu, 01 Nov 2012 18:08:00 GMT</pubDate><guid>http://m.tkk7.com/DLevin/archive/2012/11/02/390639.html</guid><wfw:comment>http://m.tkk7.com/DLevin/comments/390639.html</wfw:comment><comments>http://m.tkk7.com/DLevin/archive/2012/11/02/390639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/DLevin/comments/commentRss/390639.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/DLevin/services/trackbacks/390639.html</trackback:ping><description><![CDATA[转自Q?a >http://xinyanfei.blog.sohu.com/72361504.html</a><br />我从转到Java开发后Q一直在开发Application ServerQ所以基本没有和大型的Web Server打过交道Q所以关于common logging在这些server上部|时遇到的问题也只能是从理论上去解释。感觉这文章介l的不错Q所以{载过来?br /><br /><span id="saiwkmc" class="Apple-style-span" style="color: #62613b; font-family: Verdana, Arial, Helvetica, 宋体, sans-serif; line-height: 25px; ">  目前的很多商业和非商业的服务器中间g都默认集成了common-log甚至是log4j.因此当我门把我们的应用发布在上面的时?都会遇到关于log斚w的问?<br style="line-height: 25px; " />  1.webshpere下面集成log4j.<br style="line-height: 25px; " />  "WebSphere的类装入器方式有两种方式QPARENT_FIRST和PARENT_LAST。默认值是PARENT_FIRSTQ这U方式在载入当前classpath的类之前先蝲入其上一Uclassloader能够装入的类。这是标准的JVM classloader的默认策略。如果采用PARENT_LASTQ则q程正好相反Q即先蝲入当前classpath的类Q再载入其上一Uclassloader能够装入的类Q这样可以用当前classpath中更新的c覆盖其上一Uclassloader的相同类。受c装入器方式影响的classloader包括application classloader、WAR classloader以及׃ncd的classloader?<br style="line-height: 25px; " /> 因ؓwebsphere在共享类库的classloader中有一套common logging,但是没有合适配|文?如果我们把配|正的log4j.properties文g攑֜׃ncd?我们会发现log4j可以q行.但还有另外一个很通用的方?-改变webshpere的类库加载顺?我们让他先加载我们web应用所需的类?x们把web应用的加栽方式改为PARENT_LAST.<br style="line-height: 25px; " />  ?管我小心的提防,今天q是中招?在我的配|里,log4j的配|文件只能读取一?不能一个应用一个配|文?Z让它加蝲自己的配|?可以自己?或者用spring?servlet/listenerL动加载这个配|文?<br style="line-height: 25px; " /> 2.jboss下面的集成log4j<br style="line-height: 25px; " />  大家可能都曾在ؓjboss下面配置log4j郁闷q?jboss比webshpere走的q远.无论你的目是否使用了log4j,jboss在自己启动的时候就已经q行他了.也就是说在jboss加蝲自己׃ncd的时?已经d了自己log4j.xml文g配置.q个文g在conf中可以找?如果你需要ؓ你的应用单独配置一个catagory,你需要直接在q里配置Q?br style="line-height: 25px; " />   在webloader装蝲应用的时?如果应用中有log4j的包,gd现appender已被占用的问?W者把log4j的包q带应用中的log4j配置文g一q移?世界清净?<br style="line-height: 25px; " />关于Z让应用自带的log4j配置文g生效,有h修改<br style="line-height: 25px; " /> <attribute name="Java2ClassLoadingCompliance">false</attribute><br style="line-height: 25px; " />?br style="line-height: 25px; " /> <attribute name="UseJBossWebLoader">false</attribute><br style="line-height: 25px; " />q两个属性.<br style="line-height: 25px; " /> Q.sunone下面集成log4j<br style="line-height: 25px; " />    距离上次用SunOne服务器已l好长时间了,gsunOne的log有些cMjboss,也是一个服务器的log集中理.׃使用的不是很?暂且在这里站个位?<br style="line-height: 25px; " />随手贴点关于log的信?<br style="line-height: 25px; " /><a style="line-height: 21px; color: #62613b; font: normal normal normal 12px/normal Verdana, Arial, Helvetica, 宋体, sans-serif; text-decoration: underline; ">http://wiki.apache.org/jakarta-commons/Logging/FrequentlyAskedQuestions</a><br style="line-height: 25px; " /><a style="line-height: 21px; color: #62613b; font: normal normal normal 12px/normal Verdana, Arial, Helvetica, 宋体, sans-serif; text-decoration: underline; ">http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0408_baigang/part3.html</a></span><br /><img src ="http://m.tkk7.com/DLevin/aggbug/390639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/DLevin/" target="_blank">DLevin</a> 2012-11-02 02:08 <a href="http://m.tkk7.com/DLevin/archive/2012/11/02/390639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【{】ؓ什么很多程序员都选择xQ?/title><link>http://m.tkk7.com/DLevin/archive/2012/09/04/386964.html</link><dc:creator>DLevin</dc:creator><author>DLevin</author><pubDate>Tue, 04 Sep 2012 07:10:00 GMT</pubDate><guid>http://m.tkk7.com/DLevin/archive/2012/09/04/386964.html</guid><wfw:comment>http://m.tkk7.com/DLevin/comments/386964.html</wfw:comment><comments>http://m.tkk7.com/DLevin/archive/2012/09/04/386964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/DLevin/comments/commentRss/386964.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/DLevin/services/trackbacks/386964.html</trackback:ping><description><![CDATA[<p sizset="27" sizcache="1">转自Q龙铭洪博客 <a >http://blog.csdn.net/long892230</a><br /><br />今天看到一个帖子:“<a >E序?/a>内部晋升来困难,但是外部来的大P来多Q所以很多h都选择x”Q之后我从三个方面简要的q行了回{:“外面来的L有包装的Q内部的都是肉nPKQ此一输;外面来的L股人马Q内部的一Ҏ的,升谁都伤感情Q此二输Q外面来的通常都是大{推荐的,没有特别重大ZQh不会来,内部的就不解释了Q成果都被大佬吸Ӟ难有ZQ此三输”。之后讨Z断,我也余兴未了Ql写来?/p> <p>q个世界上有一cMh特别苦|苦逼到什么程度呢Q他们省吃P用攒׃房,l果房h来贵Q公司外部竞争激烈,他们工作异常J忙Q披星戴月,日复一日;技术更新行业罕见,他们要随时调整心情,随时学习知识Q他们长期和机器ZQ大多比较呆傻,比较单纯Q还有很多不一一例DQ这一cMh是E序员?/p> <p>而就是这么一cȝ序员q着q么苦逼的生活Q在公司内部却难以获得公q的晋升ZQ外来的和尚L在不断打破^衡,甚至是刚毕业的新和尚拿得都比老和多Q这是全行业都罕见的奇观QIT人有q经历了?/p> <p>某创业公司,某个E序员要职Q老板甚至不问问他直接领导的意见,同意了Q没有挽留,之后大骂不忠诚,q个人拿3kQ拿?q_他走了以后,老板?k雇了个新面孔Q但是不愿意给q个老h晋升Q不愿意l加到哪怕是4k?/p> <p>某上市公司,游戏部门H然从外部空降了一个领|原因是原大{被挖C后,剩下的h升谁都有意见Q难以服众,不从外部请h来镇不住局面,q个Z来,大家是团l了Q团lv来和q个人斗Q但最后还是和解了?/p> <p>某国际大公司Q某Z造简历,包装的如׃玉,获得高职Q工作主要有下属完成Q他只需要汇众汇报即可,؜路越宽,直到某天事发Q依然是高官?/p> <p sizset="28" sizcache="1">某IT企业Q某清华同学职时语重心长的Ҏ_XXQ可以理解ؓ|游Q搜索,电商L一U)?0-02q毕业的q些人清华h的机会,我们是比某人强十倍也没有ZQ也得从下面做vQ搜索的天时不属于我Q此人去了某金融分析软g公司Q目前是高管Q同期留在某<a href="http://http//blog.csdn.net">IT</a>企业的其他同学依然过着苦逼的生活?/p> <h3>举了q么多例子,我想说得是ؓ什么不l你晋升q个问题Q或者晋升很难,Z么?</h3> <p><strong>1Q大佬的问题</strong></p> <p>你晋升困难,最大的主观原因在你自己Q最大的客观原因在你的直接上司。付责Q人的_目前很多企业的领导是不合格的Q他们大?0后,没有Z人着想的思想基础Q一味的考虑自己Q不下属,曄我对某h_你说你是合格的领|你说Z下属每个员工U房在哪里,每月多少房租Q我同意你是合格的领导Q结果他愧不言。你晋升不了Q很大程度上是你的领导没有帮你,q你每月房租多少都不知道Q你指望他帮助你提高技术水qI帮助你晋升?</p> <p><strong>2Q大佬的大{的问?/strong></p> <p>你大佬的大{Qlevel很高Q他需要引入新鲜血Ԍ他知道这个队伍缺什么,q个是他思考的问题Q他需要找牛的人来补这个缺口,于是一个光鲜照人的牛hq来了(虽然两年后也会泯Z人)l队伍带来了新鲜的血Ԍ但你的大佬升不上去,你大佬边上的位置被这个h占了Q你的位|在哪?</p> <p><strong>3Q公司的问题</strong></p> <p>各大企业l员工的再教育和培训都是不尽相同的,但大多口h一致的Q在工作中锻炼成长,q句话是最扯E的,国外很多大公司是有很完善的培训和再教育计划的Q会l员工一个充늚ZQƈ且给其一个完善的培训后,以便于让他在新升职的岗位上能够很好的胜Q。在国内大公叔R在找牛hQ就是不愿意自己培养Q原因是什么,不解释,你懂得?/p> <p><strong>4Q你的兄?/strong></p> <p>很多时候让你升不了职恰恰是因ؓ和你一h斗的兄弟Q他们工作也很不错,你升职了Q他们怎么办?q也是一个^衡的问题Q你很努力,Z么你没有带动你的兄弟一起努力,你上MQ需要你q帮兄弟的支持,他们会支持你吗?曾有一个说了一句话Q我觉得很值得回味Q?#8220;当大安认ؓ你该升职了,是你升职的时候了”Q细l品呻I很有道理?/p> <p><strong>5Q你自己的问?/strong></p> <p>最后你升不了职是你自己的问题,每天工作很忙Q没旉充电Q每天工作压力很大,来不及学习,每天q个那个Q一q下来碌无为。你提高了自q效率了嘛Q你周围有朋友再帮你吗?你知道你要学什么嘛Q你知道什么样的工作才能超出领导的期望?Q你出领导期望后却没有升职和领导沟通过吗?我曾在某企业Q我周围的几乎所有h加薪升职都是和领导沟通后才获得的。指望主动给你加薪升职,不如指望自己的沟通?/p> <p><strong>6Q还是你自己的问?/strong></p> <p>你选择的这个行业是不是对的Q公司是不是对的Q就好像我说的这个清华的同学q个例子。如果你能耐大可以选大公司QPKC牛Z去,如果你能耐不大,L熟大公司Q还心理期盼高薪升职׃现实了,不如M个有前途的中小公司Q开创自q事业?/p> <h3>从企业角度出发,如何创徏一个合理公q的晋升机制呢?</h3> <p>1Q第一大佬才会招W一的人,W二大佬只会招W三的人,因此公司一把手必须是第一的QhD才能靠谱Q制度才靠谱Q没熟读历史Q不理解中国文化的,不要做公怸把手?/p> <p>2Q晋升的制度必须公^Q面向每一个hQ每一个层ơ,q往往很难做到Q做前端的和做后台的不好比,但做前端的可以和做前端的比。必要有公开公^的比|已获得升职机会。例如某公司做一个高l矩阵分解的NQ大家机会均{,性能最快,效果最好,胜出者升职,带领团队?/p> <p>3Q鼓励公司职员交,传播和帮助他人的文化Q一个h如果乐于助hQ帮助他人提高技术水qIq个人升职升上来Q大安会顶Q反之,你保守,不帮助他人,水^再牛Q升职上来也没h支持?/p> <p>4Q可以给职员一些挑战的ZQ提供更多的资源Q比如某公司的闪电计划,越了谷歌搜索效果,是一个很好的例子Q要敢于l一些勇于挑战的职员更多的资源,在严L战斗中考验Qƈ提供充分弹药?/p> <p>5Q给予内训机会,邀请业界牛座,送职员去帝考察开会乃臛_作等{。培训机会是发达国家企业的一U非常好的激励措施,一个岗?个h培训Q最好的上岗Q这是一个很公^的机会,培训机构_独立?nbsp;  <br />Ҏ有很多,只要q第一的大{Q心中有着q帮打生打死的兄弟,办法L有的Q不要L考虑自己的业l,考虑自己的乌U帽Q做到这一点很隑־难,但制度不是只有这位大佬可以制定,M职员都应该积极投w到制度建立的过E中Q要敢于提出自己的观点,毕竟公司是大家的公司?/p> <p sizset="29" sizcache="1">我就写这么多Q我是一个十q一U?strong sizset="29" sizcache="1"><a >E序?/a></strong>的n份写q篇博客的,我努力做到客观,但我怿我更多代表的是劳方立场?/p><img src ="http://m.tkk7.com/DLevin/aggbug/386964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/DLevin/" target="_blank">DLevin</a> 2012-09-04 15:10 <a href="http://m.tkk7.com/DLevin/archive/2012/09/04/386964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>20世纪《福布斯》二十本最具媄响力的商业书c?/title><link>http://m.tkk7.com/DLevin/archive/2012/07/12/368317.html</link><dc:creator>DLevin</dc:creator><author>DLevin</author><pubDate>Thu, 12 Jul 2012 03:12:00 GMT</pubDate><guid>http://m.tkk7.com/DLevin/archive/2012/07/12/368317.html</guid><wfw:comment>http://m.tkk7.com/DLevin/comments/368317.html</wfw:comment><comments>http://m.tkk7.com/DLevin/archive/2012/07/12/368317.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/DLevin/comments/commentRss/368317.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/DLevin/services/trackbacks/368317.html</trackback:ping><description><![CDATA[<div id="kowmgki" class="floatright"><span><a class="image" title="" ><div><div><br /><a >http://docs.huihoo.com/java/jmx/jmx_base.html</a></div>http://blog.csdn.net/honno/article/details/1798476</div><img alt="" src="http://wiki.mbalib.com/w/images/3/37/Most_Influential_Business_Books.jpg" width="185" longdesc="/wiki/Image:Most_Influential_Business_Books.jpg" height="97" /></a></span></div> <p>  ?a title="布? >布?/a>》杂志评Z上个世纪末最具媄响力的二十本商业书籍。上世纪70q代末,国l济陷入衰退的阵痛期Q来自阿拉伯世界的石油威胁及来自日本的经压力ɾ国人的日子很不好过Q商业书c也因此被尘一时。但在接下来?0?0q代Q美国经保持了二十q的持箋增长Q一大批优秀?a title="CEO" >CEO</a>?a title="比尔·盖茨" >比尔·盖茨</a>?a title="?#183;艄? >?#183;艄?/a>?a title="唐纳?#183;Ҏ? >唐纳?#183;Ҏ?/a>Q出现在Z的视野中。商业书c的出版和发行也因此I前z跃Q本ơ评出的二十本书按类别分为管理类、叙事类、投资类及传记类。它们分别是Q?</p> <p>  <strong>汤姆·彼得斯错了吗Q?/strong> </p> <p>  理cMc在整个排行榜上所占的比重最大,其中<a title="汤姆·彼得? >汤姆·彼得?/a>(<a title="Thomas Peters" >Thomas Peters</a>)?a title="《追求卓? >《追求卓?/a>高居榜首。这本书出版?982q_最开始源自著名的咨询公司<a title="麦肯? >麦肯?/a>的一个内部项目。当时的国商业界正倍受日本公司咄咄gh的扩张姿态的困扰Q日本公司普遍采用的严格?a title="制度化管? >制度化管?/a>让这个战败国的经迅速崛赗面对强烈个Z义精的员工Q美国公叔R导成了被长期讥笑的低能者?a title="汤姆·彼得? >汤姆·彼得?/a>?a title="|伯?#183;沃特? >|伯?#183;沃特?/a>的《追求卓》成了美国商业的拯救者。这本书为管理设定了一个积极的目标Q而非面的难题。彼得斯提出的杰Z业的 8个特性几乎ؓ未来20q的商业理奠定了格局Q?</p> <p>  1.偏好行动而不是沉?</p> <p>  2.在品和服务上接q顾客的需?</p> <p>  3.鼓励自治和放松,而不是紧密监?</p> <p>  4.寚w员的态度是鼓励其生力,避免“我们”?#8220;他们”q种对立情A </p> <p>  5.以一U被UCؓ“<a title="走动式管? >走动式管?/a>”保持与大家的紧密接触 </p> <p>  6.“专注于自w?#8221;以保持商业优势,因此避免了无关的风险 </p> <p>  7.l织l构z,人员_ֹ </p> <p>  8.对目标同时保持松紧有度的Ҏ,但却不窒息创新的控制pȝ?</p> <p>  今日的企业领袖没有h不承认深受汤?#183;彼得斯原则的影响。《追求卓》成为第一本销量超q百万的商业书籍Q这本书甚至促成了商业书c出版业的成熟。汤?#183;彼得斯也成了一位标志性的明星人物?</p> <p>  今日的汤?#183;彼得斯已l失M最初的光彩Qh们甚臛_始遗忘他了。在《追求卓》出?0周年之际Q汤?#183;彼得斯亲自撰文,讲述他写q本书的初衷和过E,他的观点对在哪里Q错在哪里,他承认当时自p了一些谎话。对于试图ؓ商界定未来日程的精英来_《追求卓》背后的故事提供了一pd不可多得的教训。此书引导的潮流向我们展CZ20q来商业世界急剧变化的生动图景?</p> <p>  “我们忘了贴一个警告标{。注意!没有永恒的东ѝQ何东西吃得太多都会有毒。请CQ商业中所有事情都是悖论。ؓ辑ֈq求Q必L之以恒。而当你持之以恒之Ӟ你就Ҏ受到d。你看,q就是悖论。面对它吧!”q是此书出版20q之后汤?#183;彼得斯的再一ơ表白,“卓越只是一U过于静态的观念Q而世界实在变化太快了?#8221; </p> <p>  <strong>好公司能否变成卓公?/strong> </p> <p>  排名W二的是<a title="吉姆·柯林? >吉姆·柯林?/a>(<a title="James C. Collins" >James C. Collins</a>)?a title="杰里·波拉? >杰里·波拉?/a>(<a title="Jerry I. Porras" >Jerry I. Porras</a>)的著?a title="《基业长青? >《基业长青?/a>。在书中作者对那些有见识有q见的公司进行了介绍。许多h认ؓ一间公司的持箋成长依赖于几位优U?a title="CEO" >CEO</a>的持l运作,但本书的作者却告诉ZQ对一个企业而言Q一聪明h在维持现状的基础上敢于进行新试比拥有一个有力的领袖更重要Q而拥有一个核心的理念qؓ之奋斗则是企业的关键所在?</p> <p>  <a title="吉姆·柯林? >吉姆·柯林?/a>的另一本书<a title="《从优秀到卓? >《从优秀到卓?/a>同样榜上有名?</p> <p>  <a title="《基业长青? >《基业长青?/a>q本书研I了18个基业常青公司的成功l验。这些公司包?a title="沃尔? >沃尔?/a>?a title="惠普" >惠普</a>?a title="宝洁" >宝洁</a>?a title="3M" >3M</a>?a title="索尼" >索尼</a>{行业领袖,本书研究的是事gQ是人性。作者从人的角度让我们看C公司的成长和巩固。作者分析的是公司、组l以及h在组l中的作用。作者从公司的角度分析了使得企业长远发展的优势,以此分析企业取得q些优势q期发展的原因。企业在发展q程中必M断自我改革、自我反省来辑ֈq些优势Q其成为公司特性,从而保证长久发展?</p> <p>  Zq一步探寻那些优U的公司走向不同发展道路的因素Q?001q_<a title="吉姆·柯林? >吉姆·柯林?/a>又出版了一本《从优秀到卓》,q本书可说是《基业长青》的姊妹。还在出版《基业长青》之Ӟ柯林斯就提出Q好的公司能否变成卓的公司Q如果能够,他们如何才能实现呢?之后Q他们对1400多个公司q行了研IӞ最后得Zl论Q这是可以达到的。那些由优秀的公司变Z大公司的g者ƈ不一定都拥有最新的技术、最擅长理的CEOQ他们最有力的武器是他们的公司文化,一U激励每个h都按照他们想要的方式d作的文化。综合这两本书,我们已经知道如何׃个优U的公司发展成Z个卓的公司Q这些公叔R是经历了旉考验的。那些正在变革的路口Q不知要d何方的公司或许能在科林斯的书中找C些提C和方向?</p> <p>  <strong>《公司再造》潮的赯</strong> </p> <p>  《追求卓》和《基业长青》集中介l企业如何取得超人的成就Q而排名第三的<a title="《公司再造? >《公司再造?/a>(<a title="Reengineering the CorporationQA Manifesto for Business Revolution" >Reengineering the CorporationQA Manifesto for Business Revolution</a>)则聚焦在企业如何q行自我攚w。书中研I了<a title="特" >特</a>?a title="IBM" >IBM</a>?a title="贝尔公司" >贝尔公司</a>的案例ƈ介绍了相关的成功l验?</p> <p>  1993q_<a title="q克?#183;汉默" >q克?#183;汉默</a>(<a title="Michael Hammer" >Michael Hammer</a>)?a title="James Champy" >James Champy</a>出版?a title="《企业再造? >《企业再造?/a>一书,pȝ阐述?a title="BPR" >BPR</a>(Business Process Reengineering)的思想Q提出再造企业的首要d是BPRQ只有徏讑֥BPRQ才能企业d摆脱困境。至此,BPR作ؓ一U新的管理思想Q像一股风潮席卷了整个国和其他工业化国家?</p> <p>  BPR是企业的业务q程描绘成一?a title="价值链" >价值链</a>(Value Chain)Q竞争不是发生在企业与企业之_而是发生在企业各自的价值链之间。只有对价值链的各个环?<a title="业务程" >业务程</a>)实行有效理的企业,才有可能真正获得市场上的<a title="竞争优势" >竞争优势</a>Q也惟其如此QBPR才被捧ؓ“恢复国竞争力的惟一途径”?</p> <p>  BPR的生,q不仅仅是一本书那么单,隐藏在BPR背后的是深刻的技术、经以及管理变革背景?</p> <p>  资本Mq入70q代以来Q全球经环境发生了巨大的变化,供大于求的现状促成了<a title="卖方市场" >卖方市场</a>转向<a title="买方市场" >买方市场</a>。进?0q代Q以国Z表的资本M发达国家l济陷入增长~慢?a title="通货膨胀" >通货膨胀</a>的尴困境,企业陷入了成本增加、效益降低的局面,<a title="产品竞争? >产品竞争?/a>与亚太国家相比陷入不断下降的局面。美国的企业q切期望改变q种现状Q走ZP?0?0q代陆箋出现的新型管理手D以及管理方法ؓBPR奠定了腾I出的基条g?</p> <p>  90q代初应q而生的BPR正好q合了企业的q种思想和需要。BPR完全满了欧企业急于走出<a title="l济萧条" >l济萧条</a>、寻求持l增长和适应新的商业规则的心理需求,也满了学术界在q中寻求管理思想革新的迫切心理?</p> <p>  BPR?990q概늚诞生Q短?q的旉Q到1993q达到顶峎ͼ在美国几乎Ş成一股风潮,同时qL及到日本、d国等其他工业化国家?990q到1995q是BPR在欧最为鼎盛的时期?0q代末期Q经的持箋E_DBPR成ؓ国企业率先遗弃的对象?</p> <p>  另一本受Ƣ迎的书c?a title="《高效h的七种习惯? >《高效h的七种习惯?/a>着重介l个人管理。这本书虽然已经出版了十多年之久Qƈ已达C上千万的销量,但时至今日仍然是图书市场上的宠儿。有的是,虽然C千万计的C它,但h们的q_工作效率gq没有比十年前有所提高。本书作?a title="史蒂?#183;柯维" >史蒂?#183;柯维</a>却因此名声大振,他的Uh公司<a class="new" title="富兰克林·柯维" >富兰克林·柯维</a>(Franklin Covey)?001q的销售额高达5?000万美元?</p> <p>  q有一位值得一提的作者当?a title="彼得·德鲁? >彼得·德鲁?/a>。他所写的理学著作早?a title="汤姆·彼得? >汤姆·彼得?/a>的《追求卓》之前。在本次评选中Q他?a class="new" title="《d鲁克的核心思想? >《d鲁克的核心思想?/a>被公认ؓ是最有媄响力的商业书c之一?</p> <p>  <strong><a title="杰克·韦尔? >杰克·韦尔?/a>Q再老也会让你惊?/strong> </p> <p>  <a title="CEO" >CEO</a>的传记历来都是出版商q捧的对象,然而最早的CEO传记——1985q由Bantam出版公司推出?a class="new" title="《艾U卡? >《艾U卡?/a>(《Lacocca? 在此ơ评选中却榜上无名。同样名噪一时的传记体书c?a class="new" title="《交易的艺术? >《交易的艺术?/a>(1988q_Random House公司出版)也与排行榜无~?</p> <p>  由华U_司出版的<a title="《杰?#183;韦尔奇自传? >《杰?#183;韦尔奇自传?/a>受到评选h士的一致认可。近来,CEO<a title="杰克·韦尔? >杰克·韦尔?/a>虽然在婚姻问题上颇受争议Q但他仍然被公认Z表了一个时代的最杰出的CEO人选。同他合著该书的?a title="商业周刊" >商业周刊</a>》的<a class="new" title="U翰·伯恩" >U翰·伯恩</a>的著?a class="new" title="《h值链? >《h值链?/a>也在评选中颇受x?</p> <p>  杰克·韦尔奇在担Q<a title="通用公司" >通用公司</a>CEO?0q中Q带领这个工业巨人积累了过4500亿美元的市场资本Qƈ使自己成为全世界最受h敬的企业领对{他提倡ƈ促进了现代企业的<a title="电子商务" >电子商务</a>?a title="六西格玛" >六西格玛</a>体系——卛_100万次生或服务作业中的瑕늎不超q?ơ、质量体pd全球化进E。同Ӟ他徏立了一套独特的<a title="企业哲学" >企业哲学</a>和管理方法。其理念是打破一切界限地吸收有用的思想Q把人当成企业的核心Q徏立自q投入产出模式Q以抵M<a title="官僚M" >官僚M</a>的生?</p> <p>  杰克带领通用公司q入?#8220;中子杰克”时代Q他在每一个通用企业中推?#8220;整顿、出售和关闭”的策略,从而通用公司逐步裁减?0万雇员;他通过购ƈ<a title="RCA公司" >RCA公司</a>为通用未来的赢利奠定了基础……当然Q也有失误的时候,但是杰克能够用一U坦诚的心态去面对p。在“自大的自?#8221;q一章中Q他承认收购<a class="new" title="Kidder Peabody公司" >Kidder Peabody公司</a>是自己最大的p|Q因公司和通用公司的文化背道而驰。对于在职业生最后一q煞费苦心地收购<a title="霍尼韦尔" >霍尼韦尔</a>q遇失败的全过E,本书也做了详的交代。这位善于自嘲的l理q让他明白了一个道理:再老也会有让你惊讶的事情。的,如果韦尔奇撰写自传箋集的话,他会向读者解释他的婚d机和关于巨额退休金的满城风雨吗Q?</p> <p>  在传记类作品中,另一本著名的传记<a title="《摩根胦团? >《摩根胦团?/a>?990q问世,书中描述?a title="J.P.摩根" >J.P.摩根</a>的帝国如何从诞生到陨落的q程Q该书获得了1990 q全最佛_书奖Qƈ在商界h士之中广泛流传?a title="微Y" >微Y</a>的总裁<a title="比尔·盖茨" >比尔·盖茨</a>是这个时代最富有的hQ他的两本描qC息世界的?a class="new" title="《未来之路? >《未来之路?/a>?a class="new" title="《未来时速? >《未来时速?/a>虽然引h注目Q但却没有荣Lơ排行榜?</p> <div style="float: right; margin-left: 5px" class="editsection">[<a title="~辑D落: 排名榜单" >~辑</a>]</div><a name=".E6.8E.92.E5.90.8D.E6.A6.9C.E5.8D.95"></a> <h2>排名榜单</h2> <table class="wikitable"> <tbody> <tr> <th>排名(Rank)</th> <th>书名(Title)</th> <th>作?Author)</th> <th>出版?Publisher)</th> <th>q䆾(Year)</th> <th>cd(Genre) </th></tr> <tr> <td>1</td> <td><a title="《追求卓? >《追求卓?/a>(<a title="In Search of Excellence: Lessons from America's Best-Run Companies" >In Search of Excellence: Lessons from America's Best-Run Companies</a>)</td> <td><a title="汤姆·彼得? >汤姆·彼得?/a>(<a title="Thomas Peters" >Thomas Peters</a>), <a title="|伯?#183;沃特? >|伯?#183;沃特?/a>(<a title="Robert H. Waterman" >Robert H. Waterman</a>)</td> <td>哈珀与罗出版公司(Harper & Row)</td> <td>1982</td> <td>理著作(Management) </td></tr> <tr> <td>2</td> <td><a title="《基业长青? >《基业长青?/a>(<a title="Built to Last: Successful Habits of Visionary Companies" >Built to Last: Successful Habits of Visionary Companies</a>)</td> <td><a title="吉姆·柯林? >吉姆·柯林?/a>(<a title="James C. Collins" >James C. Collins</a>), <a title="杰里·波拉? >杰里·波拉?/a>(<a title="Jerry I. Porras" >Jerry I. Porras</a>)</td> <td>哈珀·柯林斯一般图书出版集?HarperCollins)</td> <td>1994</td> <td>理著作(Management) </td></tr> <tr> <td>3</td> <td><a title="《公司再造? >《公司再造?/a>(<a title="Reengineering the CorporationQA Manifesto for Business Revolution" >Reengineering the CorporationQA Manifesto for Business Revolution</a>)</td> <td><a title="q克?#183;哈默" >q克?#183;哈默</a>(<a title="Michael Hammer" >Michael Hammer</a>), <a title="詹姆?#183;q" >詹姆?#183;q</a>(<a title="James A. Champy" >James A. Champy</a>)</td> <td>哈珀·柯林斯一般图书出版集?HarperCollins)</td> <td>1993</td> <td>理著作(Management) </td></tr> <tr> <td>4</td> <td><a title="《门口的野蛮人? >《门口的野蛮人?/a>(<a title="Barbarians at the Gate: The Fall of RJR Nabisco" >Barbarians at the Gate: The Fall of RJR Nabisco</a>)</td> <td><a class="new" title="布赖?#183;伯勒" >布赖?#183;伯勒</a>(<a class="new" title="Bryan Burrough" >Bryan Burrough</a>), <a class="new" title="U翰·希利亚尔" >U翰·希利亚尔</a>(<a class="new" title="John Helyar" >John Helyar</a>)</td> <td>哈珀·柯林斯一般图书出版集团(HarperCollinsQ?/td> <td>1990</td> <td>说(Narrative) </td></tr> <tr> <td>5</td> <td><a title="《竞争优ѝ? >《竞争优ѝ?/a>(<a title="Competitive Advantage: Creating and Sustaining Superior Performance" >Competitive Advantage: Creating and Sustaining Superior Performance</a>)</td> <td><a title="q克?#183;波特" >q克?#183;波特</a>(<a title="Michael E. Porter" >Michael E. Porter</a>)</td> <td>自由出版C?Free Press)</td> <td>1998</td> <td>理著作(Management) </td></tr> <tr> <td>6</td> <td><a title="《引爆流?事如何产生大变化? >《引爆流?事如何产生大变化?/a>(<a title="The Tipping Point: How Little Things Can Make a Big Difference" >The Tipping Point: How Little Things Can Make a Big Difference</a>)</td> <td><a title="马尔U姆·D德威? >马尔U姆·D德威?/a>(<a title="Malcolm Gladwell" >Malcolm Gladwell</a>)</td> <td>利特?amp;布朗出版C?Little Brown)</td> <td>2000</td> <td>说(Narrative) </td></tr> <tr> <td>7</td> <td><a title="《跨`沟? >《跨`沟?/a>(<a title="Crossing the Chasm: Marketing and Selling Technology Products to Mainstream Customers" >Crossing the Chasm: Marketing and Selling Technology Products to Mainstream Customers</a>)</td> <td><a title="杰弗?#183;摩尔" >杰弗?#183;摩尔</a>(<a title="Geoffrey A. Moore" >Geoffrey A. Moore</a>)</td> <td>哈珀·柯林斯一般图书出版集团商业分C?HarperBusiness)</td> <td>1999</td> <td>理著作(Management) </td></tr> <tr> <td>8</td> <td><a title="《摩根胦团? >《摩根胦团?/a>(<a title="The House of Morgan: An American Banking Dynasty and the Rise of Modern Finance" >The House of Morgan: An American Banking Dynasty and the Rise of Modern Finance</a>)</td> <td><a class="new" title="|恩·彻诺" >|恩·彻诺</a>(<a class="new" title="Ron Chernow" >Ron Chernow</a>)</td> <td>亚特兰大月刊出版CAtlantic Monthly Press</td> <td>1990</td> <td>人物传记(Biography) </td></tr> <tr> <td>9</td> <td><a title="《六西格玛之路? >《六西格玛之路?/a>(<a title="The Six Sigma Way" >The Six Sigma Way</a>)</td> <td><a class="new" title="彼得·潘蒂" >彼得·潘蒂</a>(<a class="new" title="Peter S. Pande et al" >Peter S. Pande et al</a>), <a class="new" title="|伯?#183;U曼" >|伯?#183;U曼</a><a class="new" title="Robert P. Neuman" >Robert P. Neuman</a>, <a class="new" title="|兰·卡法那夫" >|兰·卡法那夫</a>(<a class="new" title="Roland R. Cavanagh" >Roland R. Cavanagh</a>)</td> <td><a title="麦格?#183;希尔公司" >麦格?#183;希尔公司</a>(McGraw-Hill)</td> <td>2000</td> <td>理著作(Management) </td></tr> <tr> <td>10</td> <td><a title="《高效h士的七个习惯? >《高效h士的七个习惯?/a>(<a title="Seven Habits of Highly Effective People: Powerful Lessons in Personal Change" >Seven Habits of Highly Effective People: Powerful Lessons in Personal Change</a>)</td> <td><a title="斯蒂?#183;U维" >斯蒂?#183;U维</a>(<a title="Stephen R. Covey" >Stephen R. Covey</a>)</td> <td>西蒙和舒斯特公司(Simon & Schuster)</td> <td>1990</td> <td>理著作(Management) </td></tr> <tr> <td>11</td> <td><a title="《谎a家的U牌? >《谎a家的U牌?/a>(<a title="Liar's Poker" s Poker</a>)</td> <td><a class="new" title="q克?#183;刘易? >q克?#183;刘易?/a>(<a class="new" title="Michael Lewis" >Michael Lewis</a>)</td> <td>W.WQ诺出版社(W.W. Norton)</td> <td>1989</td> <td>说(Narrative) </td></tr> <tr> <td>12</td> <td><a title="《创新者的H境? >《创新者的H境?/a>(<a title="The Innovator's Dilemma: When New Technologies Cause Great Firms to Fail" >The Innovator's Dilemma: When New Technologies Cause Great Firms to Fail</a>)</td> <td><a title="克莱?#183;克里斯坦? >克莱?#183;克里斯坦?/a>(<a title="Clayton M. Christensen" >Clayton M. Christensen</a>)</td> <td>哈佛商学院出版社(Harvard Business School Press)</td> <td>1997</td> <td>理著作(Management) </td></tr> <tr> <td>13</td> <td><a title="《日本公司? >《日本公司?/a>(<a title="Japan Inc." >Japan Inc.</a>)</td> <td><a class="new" title="x章太? >x章太?/a>(<a class="new" title="Shotaro Ishinomori" >Shotaro Ishinomori</a>)</td> <td>加利尼亚大学出版社(University of California Press)</td> <td>1988</td> <td>理著作(Management) </td></tr> <tr> <td>14</td> <td><a title="《贼巢? >《贼巢?/a>(<a title="Den of Thieves" >Den of Thieves</a>)</td> <td><a class="new" title="詹姆?#183;B·斯图特" >詹姆?#183;B·斯图特</a>(<a class="new" title="James B. Stewart" >James B. Stewart</a>)</td> <td>西蒙和舒斯特公司(Simon & Schuster)</td> <td>1991</td> <td>说(Narrative) </td></tr> <tr> <td>15</td> <td><a title="《d鲁克_֍? >《d鲁克_֍?/a><a title="The Essential Drucker" >The Essential Drucker</a></td> <td><a title="彼得·德鲁? >彼得·德鲁?/a>(<a title="Peter F. Drucker" >Peter F. Drucker</a>)</td> <td>哈珀·柯林斯一般图书出版集团商业分C?HarperBusiness)</td> <td>2001</td> <td>理著作(Management) </td></tr> <tr> <td>16</td> <td><a title="《ؓ未来竞争? >《ؓ未来竞争?/a>(<a title="Competing for the Future" >Competing for the Future</a>)</td> <td><a title="加里·哈默? >加里·哈默?/a>(<a title="Gary Hamel" >Gary Hamel</a>), <a title="普拉哈拉? >普拉哈拉?/a>(<a title="C. K. Prahalad" >C. K. Prahalad</a>)</td> <td>哈佛商学院出版社(Harvard Business School Press)</td> <td>1994</td> <td>理著作(Management) </td></tr> <tr> <td>17</td> <td><a title="《巴菲特之道Q世界上最伟大的投资家的投资战略? >《巴菲特之道Q世界上最伟大的投资家的投资战略?/a>(<a title="The Buffett Way: Investment Strategies of the World's Greatest Investor" >The Buffett Way: Investment Strategies of the World's Greatest Investor</a>)</td> <td><a class="new" title="|伯?#183;哈格斯特? >|伯?#183;哈格斯特?/a>(<a class="new" title="Robert G. Hagstrom" >Robert G. Hagstrom</a>)</td> <td>U翰·威利父子公司(John Wiley & Sons)</td> <td>1991</td> <td>投资(Investing) </td></tr> <tr> <td>18</td> <td><a title="《杰?#183;韦尔奇自传? >《杰?#183;韦尔奇自传?/a>(<a title="Jack: Straight from the Gut" >Jack: Straight from the Gut</a>)</td> <td><a title="杰克·韦尔? >杰克·韦尔?/a>(<a title="Jack Welch" >Jack Welch</a>), <a class="new" title="U翰·拜恩? >U翰·拜恩?/a>(<a class="new" title="John A. Byrne" >John A. Byrne</a>)</td> <td>时代华纳贸易出版公司(Warner)</td> <td>2001</td> <td>传记(Biography) </td></tr> <tr> <td>19</td> <td><a title="《从优秀到卓? >《从优秀到卓?/a>(<a title="Good to Great: Why Some Companies Make the Leap... and Others Don't" >Good to Great: Why Some Companies Make the Leap... and Others Don't</a>)</td> <td><a title="吉姆·柯林? >吉姆·柯林?/a>(<a title="James Collins" >James Collins</a>)</td> <td>哈珀·柯林斯一般图书出版集?HarperCollins)</td> <td>2001</td> <td>理著作(Management) </td></tr> <tr> <td>20</td> <td><a title="《新C?-谷文化? >《新C?-谷文化?/a>(<a title="The New New Thing: A Silicon Valley Story" >The New New Thing: A Silicon Valley Story</a>)</td> <td><a class="new" title="q克?#183;刘易? >q克?#183;刘易?/a>(<a class="new" title="Michael Lewis" >Michael Lewis</a>)</td> <td>W.WQ诺出版社(W.W. Norton)</td> <td>2000</td> <td>说(Narrative) </td></tr></tbody></table> <img src ="http://m.tkk7.com/DLevin/aggbug/368317.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/DLevin/" target="_blank">DLevin</a> 2012-07-12 11:12 <a href="http://m.tkk7.com/DLevin/archive/2012/07/12/368317.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【{】Windows Shell扩展~程ȝ手册大全Q上下文菜单扩展http://m.tkk7.com/DLevin/archive/2012/07/12/373911.htmlDLevinDLevinThu, 12 Jul 2012 03:11:00 GMThttp://m.tkk7.com/DLevin/archive/2012/07/12/373911.htmlhttp://m.tkk7.com/DLevin/comments/373911.htmlhttp://m.tkk7.com/DLevin/archive/2012/07/12/373911.html#Feedback1http://m.tkk7.com/DLevin/comments/commentRss/373911.htmlhttp://m.tkk7.com/DLevin/services/trackbacks/373911.html阅读全文

DLevin 2012-07-12 11:11 发表评论
]]>
[转]关于面试、简历之cȝ某h聊天的观?/title><link>http://m.tkk7.com/DLevin/archive/2012/07/02/381984.html</link><dc:creator>DLevin</dc:creator><author>DLevin</author><pubDate>Mon, 02 Jul 2012 05:51:00 GMT</pubDate><guid>http://m.tkk7.com/DLevin/archive/2012/07/02/381984.html</guid><wfw:comment>http://m.tkk7.com/DLevin/comments/381984.html</wfw:comment><comments>http://m.tkk7.com/DLevin/archive/2012/07/02/381984.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/DLevin/comments/commentRss/381984.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/DLevin/services/trackbacks/381984.html</trackback:ping><description><![CDATA[<p><font style="background-color: #cce8cf">在CSDN上看到的Q感觉说的蛮好的Q{q来收藏一下,原文地址Q?a >http://topic.csdn.net/u/20120629/17/d130a88b-54fc-4402-8d12-b573872d96b3.html</a><br />2012/2/2 15:13:23  <br />有一个原?nbsp; <br />2012/2/2 15:13:29  <br />如果我投历给?nbsp; <br />2012/2/2 15:13:36  <br />׃表我接受挑?nbsp; <br />2012/2/2 15:13:44  <br />那么你怎么P我都遵守  <br />2012/2/2 15:13:49  <br />如果是你打电话给?nbsp; <br />2012/2/2 15:13:57  <br />那是你邀h  <br />2012/2/2 15:14:04  <br />那么你必够尊重我  <br />2012/2/2 15:14:10  <br />不然不玩  <br />2012/2/2 15:14:22  <br />q是不同的,我申LQ我重你,  <br />2012/2/2 15:14:29  <br />你邀LQ你重?nbsp; <br />2012/2/2 15:14:44  <br />你尊重都做不刎ͼq说?nbsp; <br />2012/2/2 15:15:04  <br />你把人邀h了,又要人做W试Q你疯了?nbsp; <br />2012/2/2 15:15:25  <br />我从来面试不带笔  <br />2012/2/2 15:15:33  <br />也不带别?nbsp; <br />2012/2/2 15:15:35  <br />别的  <br />2012/2/2 15:15:40  <br />没多?nbsp; <br />2012/2/2 15:15:42  <br />不说?nbsp; <br />2012/2/2 15:16:34  <br />企业和面试者是q等关系  <br />2012/2/2 15:16:49  <br />我每ơ招人,我都会问人家Q你接受W试?nbsp; <br />2012/2/2 15:16:57  <br />你不接受Q我不勉?nbsp; <br />2012/2/2 15:17:19  <br />但是你真的技术无法判断,又不愿意W试Q我只能说买卖不成仁义?nbsp; <br />2012/2/2 15:17:47  <br />我不认ؓ拒绝W试是不重我,但有的时候需要笔试,我会先说明,你觉得不好,可以不白?nbsp; <br />2012/2/2 15:18:05  <br />但是你投了简历,那就不一样了  <br />2012/2/2 15:18:11  <br />你是接受选拔?nbsp; <br />2012/2/2 15:18:15  <br />不是我邀请面试的  <br />2012/2/2 15:18:46  <br />历写得好的,一般可以不W试Q因为有东西?nbsp; <br />2012/2/2 15:19:07  <br />  15:18:46  <br />历写得好的,一般可以不W试Q因为有东西?nbsp; <br /><br />?nbsp; <br />2012/2/2 15:19:06  <br />有的历什么都看不出来Q我怎么面试你,只好W试先摸?nbsp; <br />2012/2/2 15:19:31  <br />招JAVA和ANDROID  <br />2012/2/2 15:19:41  <br />目前q在?nbsp; <br />2012/2/2 15:20:21  <br />其实怎么选简?nbsp; <br />2012/2/2 15:20:30  <br />很简单,一Q正好符合要?nbsp; <br />2012/2/2 15:20:51  <br />2 目l历清楚Q不是要你介l项目情况,而关键是你做了什?nbsp; <br />2012/2/2 15:21:00  <br />你把自己负责的说清楚  <br />2012/2/2 15:21:08  <br />而不是罗列各U框架名U?nbsp; <br />2012/2/2 15:21:13  <br />是h都会SSH  <br />2012/2/2 15:21:17  <br />有必要写Q?nbsp; <br />2012/2/2 15:21:23  <br />你怎么知道我用SSH?nbsp; <br />2012/2/2 15:21:37  <br />嗯,你要_我做q什?nbsp; <br />2012/2/2 15:21:50  <br />比如XXX目Q我负责XXX模块Q采用XX  <br />2012/2/2 15:22:01  <br />一定是最好的模块Q和有特色的技?nbsp; <br />2012/2/2 15:22:10  <br />一般什么CRUDQ写了有啥用?nbsp; <br />2012/2/2 15:22:24  <br />你做q一大把甜删Ҏ有啥好些?nbsp; <br />2012/2/2 15:22:33  <br />q也能说明一个h抓重点的能力  <br />2012/2/2 15:22:41  <br />你有那么几个炚w?nbsp; <br />2012/2/2 15:22:54  <br />我觉得,嗯,可以叫来详细问问  <br />2012/2/2 15:22:57  <br />面试Z有?nbsp; <br />2012/2/2 15:23:16  <br />那笔试有啥用呢,我已l对你有兴趣点了  <br />2012/2/2 15:23:35  <br />只要你说的是真的Q不出大问题Q这事就成了  <br />2012/2/2 15:24:23  <br />׃是一L  <br />2012/2/2 15:24:28  <br />不是说CRUD׃?nbsp; <br />2012/2/2 15:24:41  <br />有时候也会招CRUD的,因ؓ目l要弟  <br />2012/2/2 15:24:57  <br />但我叫你面试前,对你其实有了期望  <br />2012/2/2 15:25:12  <br />比如招你是做CRUD的,那你?K我都觉得贵了  <br />2012/2/2 15:25:19  <br />招你是当牛人的  <br />2012/2/2 15:25:27  <br />你要15KQ也是可以商量的  <br />2012/2/2 15:25:39  <br />你的历决定了我见你之前对你的定位  <br />2012/2/2 15:25:51  <br />当然你吹牛皮Q来了不是那么一回事  <br />2012/2/2 15:26:01  <br />也会让我快速失d你的兴趣  <br />2012/2/2 15:26:26  <br />其实不是吹牛  <br />2012/2/2 15:26:33  <br />是如何让别h发生兴趣?nbsp; <br />2012/2/2 15:26:40  <br />一般有一个兴点可以免?nbsp; <br />2012/2/2 15:26:42  <br />面了  <br />2012/2/2 15:26:51  <br />2个兴点Q我可以给的钱多点  <br />2012/2/2 15:26:54  <br />3个以?nbsp; <br />2012/2/2 15:26:57  <br />那是我争取你?nbsp; <br />2012/2/2 15:27:11  <br />一个h解决团队的一个问题,p够了  <br />2012/2/2 15:28:12  <br />如果我主动对你介l的多,证明我想要你  <br />2012/2/2 15:28:31  <br />如果我要你说的多Q证明我q没看清楚你Q又不想攑ּ你,想给你机会多?nbsp; <br />2012/2/2 15:28:43  <br />如果我就机械的和你一问一{?nbsp; <br />2012/2/2 15:28:49  <br />基本是ZCD?nbsp; <br />2012/2/2 15:29:21  <br />我是个部门经?nbsp; <br />2012/2/2 15:29:34  <br />我想说下Q面试是怎么一回事  <br />2012/2/2 15:29:43  <br />反正q些l验没用?nbsp; <br />2012/2/2 15:31:13  <br />很多人简历也写的不好Q说也不dQ看不清Q也怽l验很Q但我招你压力很大,你想你要1WQ什么都没表玎ͼ你说凭实力说话,可以试用Q但我天天招人,不行开?nbsp; <br />2012/2/2 15:31:21  <br />HR怎么看我Q上U如何看?nbsp; <br />2012/2/2 15:31:50  <br />不能q么qԌ所以简历和面试Q你必须把闪光点ȝ出来  <br />2012/2/2 15:32:14  <br />一个项目做完,你就得想Q这个项目里我最得意的作品和收获是什?nbsp; <br />2012/2/2 15:32:20  <br />我怎么写入历里?nbsp; <br />2012/2/2 15:32:26  <br />比如某CMS目  <br />2012/2/2 15:32:38  <br />你写我做了栏目管理,文章理Q?nbsp; <br />2012/2/2 15:32:44  <br />有啥用,都是CRUD  <br />2012/2/2 15:33:03  <br />我写Q我负责多线E静态化d生成  <br />2012/2/2 15:33:20  <br />臛_展示?点,1 我知道静态化Q? 我熟悉多U程  <br />2012/2/2 15:33:36  <br />q样Q你LCMS目l,比你开始写的好  <br />2012/2/2 15:35:40  <br />你要把技术和实际问题l合  <br />2012/2/2 15:35:52  <br />q样面馆好问Q启发他提问  <br />2012/2/2 15:36:01  <br />比如我说我会多线E?nbsp; <br />2012/2/2 15:36:16  <br />面馆怎么问,问你如何防止死锁  <br />2012/2/2 15:36:19  <br />是可以怎么?nbsp; <br />2012/2/2 15:36:28  <br />但这东西对他对你都没?nbsp; <br />2012/2/2 15:36:43  <br />你背一背,他也听不出错?nbsp; <br />2012/2/2 15:36:48  <br />但是q是不知道你会不?nbsp; <br />2012/2/2 15:37:08  <br />你说我用多线E做了啥Q这里面为啥要多U程Q多U程解决了什么实际问?nbsp; <br />2012/2/2 15:37:16  <br />或许他还眼睛一?nbsp; <br />2012/2/2 15:37:29  <br />我的某项目可以让你做Q正好啥问题Q需要这?nbsp; <br />2012/2/2 15:37:38  <br />你让他舒服,他就让你舒服  <br />2012/2/2 15:37:45  <br />你和他纯理论  <br />2012/2/2 15:37:55  <br />那他问死你很Ҏ  <br />2012/2/2 15:38:12  <br />因ؓ他不舒服Q他得挖I心思设计问题套?nbsp; <br />2012/2/2 15:38:43  <br />交流C一个h必须惌题问另外一个h的时候,那么被问的h悲剧了  <br />2012/2/2 15:39:08  <br />你要提供的出来话题,让双方变成讨论,那签U就是小事了  <br />2012/2/2 15:39:11  <br />很HAPPY?nbsp; <br />2012/2/2 15:41:03  <br />反正q是我的l验Q我面试是这么被面的Q我当面试官后,也是q样面h?nbsp; <br />2012/2/2 15:41:17  <br />有的人,面完他,你很高兴Q希望他早点上班  <br />2012/2/2 15:41:33  <br />有的人,只希望赶快礼貌而客气的拒绝?nbsp; <br /></font></p><img src ="http://m.tkk7.com/DLevin/aggbug/381984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/DLevin/" target="_blank">DLevin</a> 2012-07-02 13:51 <a href="http://m.tkk7.com/DLevin/archive/2012/07/02/381984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>22个免费的图表、流E图工具【{?/title><link>http://m.tkk7.com/DLevin/archive/2012/05/22/378817.html</link><dc:creator>DLevin</dc:creator><author>DLevin</author><pubDate>Tue, 22 May 2012 04:48:00 GMT</pubDate><guid>http://m.tkk7.com/DLevin/archive/2012/05/22/378817.html</guid><wfw:comment>http://m.tkk7.com/DLevin/comments/378817.html</wfw:comment><comments>http://m.tkk7.com/DLevin/archive/2012/05/22/378817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/DLevin/comments/commentRss/378817.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/DLevin/services/trackbacks/378817.html</trackback:ping><description><![CDATA[<a >http://sd.csdn.net/a/20120517/2805640.html</a><br />感觉q不错,保留~~?img src ="http://m.tkk7.com/DLevin/aggbug/378817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/DLevin/" target="_blank">DLevin</a> 2012-05-22 12:48 <a href="http://m.tkk7.com/DLevin/archive/2012/05/22/378817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>手动制作python的exe可执行程?-- by Leo Jayhttp://m.tkk7.com/DLevin/archive/2011/12/20/366823.htmlDLevinDLevinTue, 20 Dec 2011 03:48:00 GMThttp://m.tkk7.com/DLevin/archive/2011/12/20/366823.htmlhttp://m.tkk7.com/DLevin/comments/366823.htmlhttp://m.tkk7.com/DLevin/archive/2011/12/20/366823.html#Feedback0http://m.tkk7.com/DLevin/comments/commentRss/366823.htmlhttp://m.tkk7.com/DLevin/services/trackbacks/366823.html原文来自Q?a >http://wiki.woodpecker.org.cn/moin/LeoJay/PyPackage
记录下来以防以后找不C?br />

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中?

 

 1#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        *= 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}

39

 

9. 把python25.dll攑ֈd:\dist目录中?

l束?/h3>

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相当的z明了吧。一共才4个文件一个目录,5MB都不到哦?

注:当然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?

 



DLevin 2011-12-20 11:48 发表评论
]]> վ֩ģ壺 ޹Ů߹ۿ| պAVһ| ˾Ʒձֱ| **һһëƬѹۿ| 㽶aavۺ| þþƷƵۿ| һ˾Ʒ| ִӲˬִֿƵ| þþ뾫ƷպĦ| Ļȫ| ۺɫɫ| ԻȫƵ߹ۿ| 츾AVպ츾| 19ѹۿ| ɫػaëƬѹۿ| ŮƵ| һ | ɫһɫһ| һa| ޾Ʒ˳| һѹۿ| ۺ϶ŷ| ŪƵ| ˿wwwƵ| һ| վvƬ㽶| ŮƵѹۿվ| avһ| պϵ | ձxxwwxxwwƵ| һëƬȫѲ| ձƷһ| ëƬѲ| һ| ޳˸| һַ| պһ| Ƶ| ޹ƷþþþϼӰԺ | aëƬav| һѿ|