当前位置:文档之家› Mina2.0阅读源码笔记(比较详细)

Mina2.0阅读源码笔记(比较详细)

Mina2.0阅读源码笔记(比较详细)
Mina2.0阅读源码笔记(比较详细)

Mina源码阅读笔记,详情请关注:https://www.doczj.com/doc/05687132.html,/ielts0909/blog

写了很多关于Apache Mina的文章,为了方便大家阅读,我将关于mina的一些文章做点儿索引。

Mina官网资料-----------------------------------------------------------------

Mina官网是学习mina最重要的地方:Apache Mina

Mina官网上有教你快速上手的quick start:《Quick Start》

Mina官网提供了User Guide,这个手册包含了很多概念和示例:《User Guide》

Mina的应用博客--------------------------------------------------------------

Mina基于NIO开发中间有个重要的桥梁缓冲区,了解两者不同:《IoBuffer和ByteBuffer》Mina实现自定义协议的通信、对通信的一些思考:《Mina实现自定义协议通信》、《Tcp 传输下的思考》、《NIO开发的思考》

Mina提供状态机来实现复杂的业务控制:《Mina状态机State Machine》

Mina源码解读-----------------------------------------------------------------

《Mina源码阅读笔记(一)-整体解读》

《Mina源码阅读笔记(二)- IoBuffer的封装》

《Mina源码阅读笔记(三)-Mina的连接IoAccpetor》

《Mina源码阅读笔记(四)—Mina的连接IoConnector》

《Mina源码阅读笔记(五)—Mina对连接的操作IoSession》

《Mina源码阅读笔记(六)—Mina异步IO的实现IoFuture》

《Mina源码阅读笔记(七)—Mina的拦截器FilterChain》

《Mina源码阅读笔记(八)—Mina拦截器器的末端IoHandler》

题外话--------------------------------------------------------------------------

Mina的系列就写到这里了,后面如果有心得体会还会再更新上去,接下来我主要想写的是分布式消息系统的内容。最近比较忙,更完mina终于可以稍微歇一歇了。后面我会写点儿关于分布式消息订阅系统kafka的相关内容。欢迎各位支持。谢谢!

Mina源码阅读笔记(一)-整体解读

今天的这一节,将从整体上对mina的源代码进行把握,网上已经有好多关于mina源码的阅读笔记,但好多都是列举了一下每个接口或者类的方法。我倒是想从mina源码的结构和功能上对这个框架进行剖析。源码的阅读一般有如下几种方法:第一,根据问题读源码,这种方法可能用的最多,哪里有问题了,然后F3一步步点进去;第二种,专门为了读源码而读,从整体到局部,总用法到设计。第三种,可是根据软件的设计特点,根据特点逐一解读。这几篇文章主要将根据第三种方法进行阅读,因为mina的各个模块很有调理,而且我关注的重点也主要分布在几个核心点上,对我来说,这样的读法更合理。

Apache MINA is a network application framework which helps users develop high performance and high scalability network applications easily. It provides an abstract ·event-driven · asynchronous API over various transports such as TCP/IP and UDP/IP via Java NIO.

写过NIO的人都知道,NIO里主要有那么几部分,用于内容切换的各类缓冲区,当然我们印象最深的就是ByteBuffer;用于IO服务直接连通的通道Channel,这里有用于文件和网络的通道;有用于实现NIO socket Reactor模式的选择器selector;和处理字符集的Charset。而mina就是将这几部分有机的整合,实现了这个高性能的框架。

在看代码之前,我们要先了解mina到底为我们提供了什么,我按照源码的结构整理如下:用于缓冲区的IoBuffer org.apache.mina.core.buffer

用于提供连接的service org.apache.mina.core.service

org.apache.mina.transport.*

用于提供两端状态的session org.apache.mina.core.session

用于拦截所有IO事件和请求的filter chain和各类拦截器(在IoService和IoHandler之间)org.apache.mina.core.filterchain org.apache.mina.filter.*

用于处理IO事件的handler org.apache.mina.handler.*

用于实现异步IO操作的future org.apache.mina.core.future

用于实现IO轮询的的polling org.apache.mina.core.polling

用户实现代理的proxy org.apache.mina.proxy.*

至此,mina-core-2.0.7中的代码大致就可以分成上述这几类了。而我们对源码的浏览也会按照这几部分逐一进行。

在开始阅读代码之前,我们再熟悉一下mina在通信时会做的事情,这样的事情不是徒劳的,对过程理解的越透彻对代码的分析也会越深刻,我们不但要学习代码里的设计模式和组织结构,更要去理解里面的实现逻辑。没装UML的工具,就拿PPT画了:

这里的变现没有像之前mina通信那篇文章里一样,描述具体的编码和解码过程,这个图主

要描述了两端对接的过程,是一个宏观上的通信过程:

1、图中的一对应的是service执行的过程,首先肯定是要建立连接,对于服务端是Accept,

客户端则是connect。

2、图中的二,指的是在每次连接之后就会产生一个记录通信信息的session,我们看mina

官方的描述:every time a client connects to the server, a new session is created, and will be kept in memory until the client is disconnected.

3、图中的三指的是过滤器链,这里主要实现我们对通信的要求,比如编码、解码、日志等。

4、图中的四是Handler,是filter chain的最后一步,通过adapter接入了session的整个生

命周期。

服务器端反之亦然。

上面的图示mina官方给出的,表述的同一个意思。在IoHandler这里mina是这么给出描述的: The interface is hub of all activities done at the end of the Filter Chain.

分析清楚了整个代码的体系,后面开始,我们就可以针对每一个部分详细分析了。我们会从最基本的缓冲区开始,这部分相对比较独立,之后会根据连接过程进行一步步分析。

Mina源码阅读笔记(二)IoBuffer的封装

在阅读IoBuffer源码之前,我们先看Mina对IoBuffer的描述:A byte buffer used by MINA applications. This is a replacement for ByteBuffer. 这是一个对ByteBuffer的replacement,同样是用作缓冲区,做内容的切换和承载的容器,为什么要用重新封装ByteBuffer,MINA是这么给出解释的Two Reasons:

●It doesn't provide useful getters and putters

●It is difficult to write variable-length data due to its fixed

capacity

用过ByteBuffer的人可能经常会遇到BufferOverflowException这样的异常,原因是buffer在初始化allocate之后就不能再自动的改变大小了,如果项目很规整,约定的很好,那可能不太会出意外,怕就怕项目一大,好多东西就乱套了。所以在阅读IoBuffer源码的时候,我们会着重看它和ByteBuffer之间的差异。另外一点,就是IoBuffer作为一个应用框架的工具,必然会提供比原生Buffer更便捷的方法,比如IoBuffer中可以直接put和get String,可以直接将内容转成十六进制等等。

用法很简单,我倒是想从如何将一个已有的类进行封装和扩展的角度来看IoBuffer的源码。在看MINA的源码之前,我们有必要稍稍回顾一下ByteBuffer的构成:

ByteBuffer继承了Buffer类,这个继承关系约定了Buffer系列中特定的操作形式(有点儿像指针),limit/position/mark/capacity,以及在遍历中使用的hasRemaining。然后通过两个静态方法来构建出ByteBuffer:

使用Heap空间,堆空间的构造采用申请byte数组:

public static ByteBuffer allocate(int capacity) {

if (capacity < 0)

throw new IllegalArgumentException();

return new HeapByteBuffer(capacity, capacity);

}

使用direct memory,这块内存的开辟就比较麻烦了,好多都是采用了Bit和native的方法:public static ByteBuffer allocateDirect(int capacity) { return new DirectByteBuffer(capacity);

}

除了构造之外,剩下的主要是对数据的操作方法,wrap、get和put,下面的图没有截全,还有好多方法:

则,AbseractIoBuffer提供了具体的实现:

IoBuffer没有继承任何类,只是实现了comparable接口,我们注意到IoBuffer类修饰符用的是abstract,跟ByteBuffer也是用abstract修饰,至于为什么要用abstract,我觉得也容易理解,毕竟这是一个要对外直接使用的类,同时需要对实现进行规则和扩展:

public abstract class IoBuffer implements Comparable

在IoBuffer的一系列代码阅读中,你可以看到抽象类之间的继承,内部类的使用情况等等,

后面,我会通过一个删减版的例子来盘点这中间的关系,所以大片的源码就不贴了。

UML工具不会用,关键是怕用错了,还是用PPT画了。囧一个,大家有好那种可以一键生成的工具推荐一下,我之前用的是JUDE和Visio。上图画出了IoBuffer中几个重要类之间的关系,两个内部类均继承了AbstractIoBuffer,AbstractIoBuffer和IoBufferWrapper均实现了IoBuffer中的具体操作部分。IoBufferAllocator接口主要定义了为缓冲区开辟空间的方法,所以IoBuffer中需要引用来自IoBufferAllocator的对象。

在IoBuffer中,我们熟知的allocate和wrap方法被声明成了static,通过引用IoBufferAllocator 接口中的对象来实现,而其他诸如get、put等操作的方法都定义为abstract了,让其子类得以实现。IoBuffer中我们还值得关注的主要见我之前写过的一篇文章《IoBuffer和ByteBuffer》。

下面是这些中产生buffer的接口IoBufferAllocator和其实现类:

接口很简单,就定义了几个在IoBuffer中已经被static修饰的方法。有两个类都实现了IoBufferAllocator,但是在IoBuffer中使用的是SimpleBufferAllocator:

/** The allocator used to create new buffers */

private static IoBufferAllocator allocator = new SimpleBufferAllocator();

/** A flag indicating which type of buffer we are using : heap or direct */

private static boolean useDirectBuffer = false;

所以我们主要关注SimpleBufferAllocator:

public IoBuffer allocate(int capacity, boolean direct) { return wrap(allocateNioBuffer(capacity, direct));

}

public ByteBuffer allocateNioBuffer(int capacity, boolean direct) {

ByteBuffer nioBuffer;

if (direct) {

nioBuffer = ByteBuffer.allocateDirect(capacity); } else {

nioBuffer = ByteBuffer.allocate(capacity);

}

return nioBuffer;

}

public IoBuffer wrap(ByteBuffer nioBuffer) {

return new SimpleBuffer(nioBuffer);

}

public void dispose() {

// Do nothing

}

这是接口中定义的几个方法,这里调用内部类SimpleBuffer来生成相应的buffer,又由于SimpleBuffer继承了AbstractIoBuffer,所以真正实现的代码在AbstractIoBuffer中(这里有点儿绕,大家结合上面的图和源码一起读)。而且注意构造方法的protected关键字的使用:private ByteBuffer buf;

protected SimpleBuffer(ByteBuffer buf) {

super(SimpleBufferAllocator.this,

buf.capacity());

this.buf = buf;

buf.order(ByteOrder.BIG_ENDIAN);

}

protected SimpleBuffer(SimpleBuffer parent, ByteBuffer buf) {

super(parent);

this.buf = buf;

}

看到了吧,底层还是用的NIO中的ByteBuffer。至于怎么实现AutoExpand这样的方法,我觉得不是源码的重点,这些都是算法上的事情,如果你不关注算法,可以稍稍看看即可,而且好多都是native的实现,也看不到。而我这边主要关注的还是他们之间的结构。

上图左边的路走通了,我们来走右边的路,右边主要看AbstractIoBuffer,他是IoBuffer的具体实现,但是它也是一个抽象类,也要被其他类继承,用于扩展。AbstractIoBuffer中,大多类都是final的。而且这里面主要的实现都是在处理limit/position/mark/capacity这之间的关系。而CachedBufferAllocator主要用于实现IoBuffer中自动扩展AutoExpand和收缩: that caches the buffers which are likely to be reused during auto-expansion of the buffers.

Mina源码阅读笔记(三)—mina的连接IoAccpetor

其实在mina的源码中,IoService可以总结成五部分service责任、Processor线程处理、handler 处理器、接收器和连接器,分别对应着IoService、IoProcessor、IoHandler、IoAcceptor和IoConnector。在代码的中有如下包跟IoService关系密切:

org.apache.mina.core.service

org.apache.mina.transport.*

org.apache.mina.core.polling 这个包主要是实现了轮询

其中core.service包中主要定义了上面五个部分的接口,以及IoHandler和IoProcessor的实现(Handler是一种常见的设计模式,具体的业务其实并没有多少,只是在结构上将层次划分的更清楚。Processor是mina内部定义的接口,一般不对外使用,用mina官方的话,主要performs actual I/O operations for IoSession. 这一部分我想放在

IoSession中来讲)。而在transport包中实现了具体的连接方式,当然,这部分也是我们今天阅读的重点。我想要关注的也是mina底层如何用NIO实现各种连接。

所以这一节的重点是IoAcceptor和IoConnector,Handler和IoService只是稍稍带过,写点儿用法和构成。先看mina对IoService的介绍:IoService provides basic I/O Service and manages I/O Sessions within MINA.

上面的图简单介绍了IoService的职责,以及其具体实现类AbstractIoService中的职责。在比较大的框架中,都是采用了大量的抽象类之间继承,采用层级实现细节这样的方式来组织代码。所以在mina中看到Abstract开头的类,并不仅仅只是一个抽象,其实里面也包含很多的实现了。

IoService用来管理各种IO服务,在mina中,这些服务可以包括session、filter、handler等。在AbstractIoService中,也是通过线程池来装载这些服务的:

private final Executor executor;

private final boolean createdExecutor;

protected AbstractIoService(IoSessionConfig sessionConfig, Executor executor) {

//省略。。。

if (executor == null) {

this.executor = Executors.newCachedThreadPool();

createdExecutor = true;

} else {

this.executor = executor;

createdExecutor = false;

}

threadName = getClass().getSimpleName() + '-' +

id.incrementAndGet();

}

然后我们关注一下service中的dispose方法,学习一下线程安全在这里的用法:/**

* A lock object which must be acquired when related resources are

* destroyed.

*/

protected final Object disposalLock = new Object();

private volatile boolean disposing;

private volatile boolean disposed;

private final boolean createdExecutor;

public final void dispose(boolean awaitTermination) { if (disposed) {

return;

}

synchronized (disposalLock) {

if (!disposing) {

disposing = true;

try {

dispose0();

} catch (Exception e) {

ExceptionMonitor.getInstance().exceptionCaught(e);

}

}

}

if (createdExecutor) {

ExecutorService e = (ExecutorService) executor;

e.shutdownNow();

if (awaitTermination) {

//Thread.currentThread().setName();

try {

LOGGER.debug("awaitTermination on {} called by thread=[{}]", this, Thread.currentThread().getName());

e.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS);

LOGGER.debug("awaitTermination on {} finished", this);

} catch (InterruptedException e1) {

LOGGER.warn("awaitTermination on [{}] was interrupted", this);

// Restore the interrupted status

Thread.currentThread().interrupt();

}

}

}

disposed = true;

}

为了多线程之间变量内存的可见性,防止抢占资源时候出现意想不到的问题,这里用了volatile关键字修饰布尔型变量这样的经典用法,同时使用内置锁机制控制线程的访问。与IoService比较相关的还有个TransportMetadata,这个类主要记录了IoService的相关信息,在使用中,也不是很常见,所以略过这部分了。更多的线程运用在IoProcessor中会体现,这部分放到后面写,今天的主要目的还是连接IoAcceptor和IoConnector。

从现在开始就要复杂了,我们先从服务器的接收端开始写起,也就是IoAccpetor,先上一张宏观的图,来理清思路,图来自mina官网:

简单介绍一下,连接的实现有四种:

We have many of those implementing classes

?NioSocketAcceptor : the non-blocking Socket transport IoAcceptor

?NioDatagramAcceptor : the non-blocking UDP transport IoAcceptor

?AprSocketAcceptor : the blocking Socket transport IoAcceptor, based on APR

?VmPipeSocketAcceptor : the in-VM IoAcceptor

我们按照图上用箭头标出的两条路来分析我们最常用的NioSocketAcceptor,回顾一下调用这

接口IoAcceptor直接继承了IoService接口,并定义了自己特有的操作。其操作的具体实现由AbstractIoAcceptor完成(注意是上图左边的类来实现的)。我们继续从左边往下看,与IoAcceptor直接关联的是SocketAcceptor接口,它们(IoAcceptor和SocketAcceptor)之间也是接口的继承关系,所以根据前面的经验,我们可以猜测,SocketAcceptor一定又新定义了一些属于自己需要去实现的操作,这样做肯定是为了与另一种实现DatagaramAcceptor来区别,事实也确实如此,看下图:

这里需要注意的是上图被框出来的部分,他们的返回类型均被缩小了(我记不得是向下转型还是向上转型,应该是向下吧,现在返回的都是子类),这样实现的好处是绝对的专一,避免了转型上的错误。

在看NioSocketAcceptor之前,我们还是要先看右边这条路:

public abstract class AbstractIoAcceptor extends AbstractIoService implements IoAcceptor

回顾一下,AbstractIoService实现了对session的管理,IoAcceptor定义了一些建立连接时用到的一系列方法,这样一来,AbstractIoAcceptor一来有了对session使用的功能,二来需要实现建立连接里需要用到的那些方法,理清楚了这些,我们可以看AbstractIoAcceptor的具体实现:private final List defaultLocalAddresses

= new ArrayList();

private final List unmodifiableDefaultLocalAddresses = Collections

.unmodifiableList(defaultLocalAddresses);

private final Set boundAddresses = new HashSet();

private boolean disconnectOnUnbind = true;

/**

* The lock object which is acquired while bind or unbind operation is performed.

* Acquire this lock in your property setters which shouldn't be changed while

* the service is bound.

*/

protected final Object bindLock = new Object();

这里有三点要说:

●这里的Address不是用了list就是用了set,注意这些都是用来保存LocalAddress的,mina

在设计的时候考虑的很全面,服务器可能会有多个网卡的啊。

●解释下unmodifiableList,JDK自带方法:Returns an unmodifiable view of the specified list.

This method allows modules to provide users with "read-only" access to internal lists. Query operations on the returned list "read through" to the specified list, and attempts to modify the returned list, whether direct or via its iterator, result in an UnsupportedOperationException. The returned list will be serializable if the specified list is serializable. Similarly, the returned list will implement RandomAccess if the specified list does.

●时刻注意线程安全的问题。

AbstractIoAcceptor主要是对localAddress的操作,里面涉及到集合类的使用和内置锁的使用,其他没有什么特别的,大家可以看看源码,容易理解。主要可以看看里面的bind方法,这个

里面涉及了两层锁。

AbstractPollingIoAcceptor在实现连接中至关重要的一个类,他是socket轮询策略的主要实现,有那么几点要关注:

●polling strategy : The underlying sockets will be checked

in an active loop and woke up when an socket needed to be processed.

●An Executor will be used for running client accepting and

an AbstractPollingIoProcessor will be used for processing client I/O operations like reading, writing and closing.

(将连接和业务分开,AbstractPollingIoProcessor部分会在session部分写)。

●All the low level methods for binding, accepting, closing

need to be provided by the subclassing implementation.这个类光看用到的工具就知道他不简单了,之前我们见过的处理线程安全问题都只是用了内置锁,这里终于用到了concurrent包里的东西了。这个类里没有出现NIO中selector这样的东西,而是做了一种策略,这种策略是在线程处理上的,采用队列和信号量协同处理socket到来时候连接的策略。推荐大家仔细看看这个类,里面的注释很详细,我列几个成员变量,你看看有兴趣没:

/** A lock used to protect the selector to be waked up before it's created */

private final Semaphore lock = new Semaphore(1);

private final IoProcessor processor;

private final boolean createdProcessor;

private final Queue registerQueue = new

ConcurrentLinkedQueue();

private final Queue cancelQueue = new ConcurrentLinkedQueue();

private final Map boundHandles = Collections.synchronizedMap(new HashMap

H>());

private final ServiceOperationFuture disposalFuture= new ServiceOperationFuture();

/** A flag set when the acceptor has been created and initialized */

private volatile boolean selectable;

/** The thread responsible of accepting incoming requests */

private AtomicReference acceptorRef = new AtomicReference();

protected boolean reuseAddress = false;

在这个类里还有一个Acceptor的内部类,实现runnable接口,主要用作接收客户端的请求。这个类也有可看性。这里面的东西不是很好写,需要大家自己去细细品味。

看最后一个类,两边的焦点,NioSocketAcceptor。看之前在AbstractPollingIoAcceptor里有句话:All the low level methods for binding, accepting, closing need to be provided by the subclassing implementation.这里总该有NIO的一些东西了:

public final class NioSocketAcceptor extends AbstractPollingIoAcceptor implements

SocketAcceptor {

private volatile Selector selector;

我想看到的东西终于来了,selector,先不说,接着往下看:

@Override

protected void init() throws Exception {

selector = Selector.open();

}

@Override

protected NioSession accept(IoProcessor processor, ServerSocketChannel handle) throws Exception {

SelectionKey key = handle.keyFor(selector);

if ((key == null) || (!key.isValid()) ||

(!key.isAcceptable())) {

return null;

}

// accept the connection from the client

SocketChannel ch = handle.accept();

if (ch == null) {

return null;

}

return new NioSocketSession(this, processor, ch);

}

@Override

protected ServerSocketChannel open(SocketAddress localAddress) throws Exception {

// Creates the listening ServerSocket

ServerSocketChannel channel =

ServerSocketChannel.open();

boolean success = false;

try {

// This is a non blocking socket channel

channel.configureBlocking(false);

// Configure the server socket,

ServerSocket socket = channel.socket();

// Set the reuseAddress flag accordingly with the setting

socket.setReuseAddress(isReuseAddress());

// and bind.

socket.bind(localAddress, getBacklog());

// Register the channel within the selector for ACCEPT event

channel.register(selector,

SelectionKey.OP_ACCEPT);

success = true;

} finally {

if (!success) {

close(channel);

}

}

return channel;

}

都是最基本的java NIO吧,是不是很熟悉,是不是有种相见恨晚的感觉,是不是很简单。当

然简单是相对的,因为之间做了那么多铺垫,所以程序设计真的是一种艺术,看你怎么去设计。

只是你想过没有,这是一个final的类,不能继承,那我们在调用的时候从来没有写acceptor.open,这时候这个方法什么时候执行呢,在这个类里面也没有展示出来。这个疑问先留着,后面会说,这当然也是一种机制。

侯捷stl源码剖析注释之42 sgi-stl-slist

完整列表 The Annotated STL Sources 1 G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_slist.h 完整列表 /* * Copyright (c) 1997 * Silicon Graphics Computer Systems, Inc. * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Silicon Graphics makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. * */ /* NOTE: This is an internal header file, included by other STL headers. * You should not attempt to use it directly. */ #ifndef __SGI_STL_INTERNAL_SLIST_H #define __SGI_STL_INTERNAL_SLIST_H __STL_BEGIN_NAMESPACE #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) #pragma set woff 1174 #endif // 單向串列的節點基本結構 struct __slist_node_base { __slist_node_base* next ; }; // 全域函式:已知某一節點,安插新節點於其後。 inline __slist_node_base* __slist_make_link (__slist_node_base* prev_node, __slist_node_base* new_node) { // 令 new 節點的下一節點為prev 節點的下一節點 new_node->next = prev_node->next; prev_node->next = new_node; // 令 prev 節點的下一節點指向new 節點 return new_node; } // 全域函式:找出某一節點的前一個節點。 inline __slist_node_base* __slist_previous (__slist_node_base* head, const __slist_node_base* node) {

UBoot移植详解

u-boot 移植步骤详解 1 U-Boot简介 U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。但是U-Boot不仅仅支持嵌入式Linux 系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。其它系列的处理器和操作系统基本是在2002年11 月PPCBOOT 改名为U-Boot后逐步扩充的。从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和持着不懈的努力。当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。 选择U-Boot的理由: ①开放源码; ②支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS; ③支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale; ④较高的可靠性和稳定性; ④较高的可靠性和稳定性; ⑤高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等; ⑥丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等; ⑦较为丰富的开发调试文档与强大的网络技术支持; 2 U-Boot主要目录结构 - board 目标板相关文件,主要包含SDRAM、FLASH驱动; - common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测;

六西格玛管理读后感

《六西格玛管理》读后感 目前,很多国内的企业都在实施六西格玛管理,如联想,中兴,宝钢等,并且取得了初步成效。这些企业的成功促使国内的考虑导入六西格玛管理的企业越来越多,人们对六西格玛管理知识的需求也越来越迫切。所以我们要紧跟潮流了解学习六西格玛。 读了此书之后我了解了六西格玛的的发展历史,六西格玛于20世纪,80年代产生,他是一种降低缺陷的方法,是对全面质量管理特别是质量改进理论的继承性发展,它的DMAIC 改进流程模式源于PDCA循环,其统计技术集成,囊括了所有数字类和思维类质量工具技术。六西格玛一共有两层含义,一层是基于统计角度,另一层是基于管理角度。 通过这本书我了解到六西格玛管理的含义。第一点以顾客为关注中心,获得高的各科满意度是企业所追求的主要目标,然而顾客只有在其需求得到充分理解并获得满足后,才会满意和忠诚,我们要知道顾客的需求是动态变化的,所以我们要实时追踪客户的需求,第二点六西格玛管理是基于数据和事实驱动的管理方法。是应用统计数据和分析方法来建立对关键变量的理解和获得优化结果。第三点聚焦于流程改进。在六西格玛中流程是采取改进行动的主要对象。设计产品和服务,度量业绩,改进效率和顾客满意度等都是流程,流程在六西格玛中是成功的关键。第四点有预见的积极管理。积极是指主动的在事情发生之前进行管理,而不是被动的处理那些令人忙乱的危机。第五点无边界合作。六西格玛管理建立在广泛沟通的基础上,改进企业内部的合作。联结这种无边界合作的纽带就是那些有强烈使命感的黑带。黑带就是项目改进团队的负责人。第六点追求完美,容忍失误。也就是说六西格玛为企业提供一个近乎完美的努力方向,但是这样做总是有风险的,在推行六西格玛管理的过程中,可能会遇到挫折和失败,企业应以积极的应对挑战的心态,面对挑战和失败。 而且六西格玛管理的核心理念就是以顾客为中心,关注过程,减少或消除过程变异,实现突破性改进,以提升企业组织的经营业绩。 并且在选择六西格玛项目时,我们选择需要遵从一些原则:第一点,有意义有价值。六西格玛项目要支持顾客满意的改善,要支持企业战略目标的实现,要有挑战性,强调过程的改进,要为企业带来较大的经济效益。第二点:可管理,每个六西格玛项目都是可管理的,也就是说六西格玛项目预解决的问题应清晰且可测量。 而且做项目的时候我们需要确定好项目的目标,需要一个定义明确,大家都理解的目标,要考虑一下的因素确定目标,第一目前水平,顾客需求,业界标准,公司目标。然后我们需要制定项目计划,先做任务的分解,然后估算任务时间并确定任务之间的关系,再编制项目

毕设-施工组织设计--任务书

集美大学 毕业设计(论文)任务书工程技术学院土木工程专业1011 班学生杜军斌学号2010100025 一、毕业设计(论文)题目:晋江阳光城翡丽湾高支模施工专项方案 二、毕业设计(论文)工作规定进行日期:2014年1月10日起至2014年 5 月24日止 三、毕业设计(论文)进行地点: 集美大学工程技术学院 四、任务书的内容: 1.熟悉图纸 2.了解工程概况 工程名称:晋江阳光城翡丽湾 建设地点:晋江英塘村,地处社马路与灵石路交叉路口 总建筑面积:1550㎡ 建筑主要结构合理使用年限50年 建筑主体耐火等级: 一级 建筑物抗震设防烈度:7度 屋面防水等级:Ⅱ级 结构形式:框架剪力墙结构 基础形式:PHC管桩基础 设计标高:室内±0.0000相当于黄海标高26.8000。 标高说明:本工程施工图所注标高及总平面图尺寸以米为单位,其余以毫米为单位,门窗尺寸均指土建砖口尺寸,建筑楼地面、窗台、吊顶标高均为完成面标高。 3.施工条件 1)施工单位资质情况以及施工能力:国家房屋建筑工程总承包特级资质 2)劳动力:满足工期要求及要求连续施工。 3)施工机械:均可满足要求。

4)水电:建设单位已从城市供水,供电网引至施工现场。 5)生活条件:在工地上设有活动房供外包工人及保卫人员住在工地,还有在工地上搭设临时的食堂供其他人员吃饭,所有生活设施须统一安排。 4.主要设计内容 1高支模的方案选择 2 高支模的施工计划 3 模板安装工艺流程 4 模板的施工方法 5 模板安装检查验收 6 模板拆除 7 模板的施工安全保证措施 8高支模安装的劳动力计划 5.进度要求 (1)2013年09月20日~10月31日,毕业设计(论文)前期准备工作; (2)2013年11月01日~11月20日,组织教师命题,修订并印刷《毕业设计(论文)指导手册》; (3)2013年12月03日教研室上报毕业设计(论文)命题; (4)2013年12月06日~12月17日,学院审定毕业设计(论文)命题; (5)2013年11月22日~12月10日,举办毕业设计(论文)专题讲座; (6)2013年12月20日~26日,组织学生选题; (7)2013年12月27日~2013年12月31日审核学生选题情况,确定毕业设计(论文)指导教师; (8)2014年01月10日前,指导教师下达毕业设计(论文)任务书; (9)2014年02月16日~03月15日,毕业设计(论文)实习; (10)2014年02月16日~03月15日,指导学生完成毕业设计(论文)开题报告; (11)2014年03月17日学生上交毕业设计(论文)开题报告、实习日记、实习报告、实习鉴定; (12)2014年03月16日教研室报送毕业实习成绩; (13)2014年03月23日~03月31日,完成毕业设计(论文)粗纲; (14)2014年03月30日~04月12日,中期进度检查; (15)2014年04月13日~04月19日,完成毕业设计(论文)细纲;

UBoot源码分析1

?UBoot源码解析(一)

主要内容 ?分析UBoot是如何引导Linux内核 ?UBoot源码的一阶段解析

BootLoader概念?Boot Loader 就是在操作系统内核运行之前运行 的一段小程序。通过这段小程序,我们可以初始 化硬件设备、建立内存空间的映射图,从而将系 统的软硬件环境带到一个合适的状态,以便为最 终调用操作系统内核准备好正确的环境 ?通常,Boot Loader 是严重地依赖于硬件而实现 的,特别是在嵌入式世界。因此,在嵌入式世界 里建立一个通用的Boot Loader 几乎是不可能的。 尽管如此,我们仍然可以对Boot Loader 归纳出 一些通用的概念来,以指导用户特定的Boot Loader 设计与实现。

UBoot来源?U-Boot 是 Das U-Boot 的简称,其含义是 Universal Boot Loader,是遵循 GPL 条款的开放源码项目。最早德国 DENX 软件工程中心的 Wolfgang Denk 基于 8xxROM 和 FADSROM 的源码创建了 PPCBoot 工程项目,此后不断 添加处理器的支持。而后,Sysgo Gmbh 把 PPCBoot 移 植到 ARM 平台上,创建了 ARMBoot 工程项目。最终, 以 PPCBoot 工程和 ARMBoot 工程为基础,创建了 U- Boot 工程。 ?而今,U-Boot 作为一个主流、通用的 BootLoader,成功地被移植到包括 PowerPC、ARM、X86 、MIPS、NIOS、XScale 等主流体系结构上的百种开发板,成为功能最多、 灵活性最强,并且开发最积极的开源 BootLoader。目前。 U-Boot 仍然由 DENX 的 Wolfgang Denk 维护

六西格玛质量控制管理解读

同济大学 硕士学位论文 第三方物流服务质量的控制与改进姓名:张翔申请学位级别:硕士 专业:管理科学与工程指导教师:刘仲英20050112

『刊济人学硕.L学位论文第三方物流服务质量的控制与改进 1绪论 ”第三方物流”(Third Party Logistics,简称3PL或TPL于上世纪80年代中期在欧美困家首先提出。在1988年美国物流管理委员会的一项顾客服务调查中,首次提到” 第三方服务提供者~词。目前对于第三方物流解释很多,国内外学术和实践领域尚没有一个统一的定义,在我国2001年公布的国标《物流术语》中,暂将第三方物流定义为”供方与需方以外的物流企业提供物流服务的业务模式”。 国外第三方物流服务始于上个世纪80年代初,随着航空管制等政策的开放开始起步,得到快速发展。在我国,其发展的历程非常短,开始于上世纪90年代末,目前只处于刚刚起步的阶段。 由于物流关系到社会生产、消费的顺利进行,在国民经济中占据着重要地位,因此对物流技术和服务的研究也成为了当前重要的课题。社会各界,无论是学术界、企业界还是政府,都对第三方物流给予了热切关注,这种关注,从东南沿海城市逐步蔓延到全国,俨然形成了一股”第三方物流热”。但由于从理论研究到实践经验的全面

缺乏,中国的第三方物流企业面临着发展中的众多难题,而2001年11月中国加入WTO, 市场的开放更加引起了国内第三方物流企业发展的紧迫感,迫使我们加快引入国外各种管理理念和方法,结合中国实际情况,研究中国第三方物流企业发展之道。 根据我国的一些统计数据,我国经济发展的物流成本一直居高不下,除了生产流通环节周期长,如制造企业制成品的库存周转时间是51天,第三方物流服务所提供的物流服务质量也是一个重要因素,统计数据显示TPL物流服务过程中单证准确率仅为96.4%,及时率仅为86.7%,破损率则高达2.2%。在物流服务外包业务中,服务质量已经成为客户主要关心的方面。 由于物流服务质量关系到物流活动的特性和服务质量管理的特点,本章从中国物流企业发展的环境谈起,通过发展中的瓶颈引出物流服务质量的问题;指出本文研究的意义;最后提出要讨论的重点问题、研究思路和论文结构。 1.1研究背景 1.1.1中国第三方物流服务发展环境 1.1.1.1需求快速增长 在第三方物流概念引入中国之后,中国的物流市场快速得到发展。原因之一是原本计划经济体制下那种“大而全”、“小而全”的企业生产、销售模式无法适应市场经 蚓济人学顼I:学位论文第一章绪论 济环境下的激烈竞争,很多企业为了集中资源优势和核心能力,通过外包仓储、运输以及相关的物流活动减轻管理压力:原因之二是外资、合资企业在进入中国市场后, 由于伙伴物流企业由于暂时的政策限制没有能够同时进入1,他们对专业物流的需求强烈而且要求严格,对国内物流市场的发展起到了一个推动作用,也培养了一

iTop4412的uboot第一阶段

2 uboo t 源码分析 2.5.1.star t.S 2.5.1.star t.S 引入引入 2.5.1.1、u-boot.lds中找到start.S入口 (1)在C语言中整个项目的入口就是 main函数(这是 个.c文件的项目,第一个要分析的文件就是包含了C语言规定的),所以譬如说一 个有 main函数的那个文件。 10000 ( 2 方。ENTRY(_start)因此 _start 符号所在的文件就是整个程序的起始文 件, _sta rt 所在处的 代码就是整个程序的起始代码。 2.5.1.2、SourceInsight中如何找到 文件 (1)当前状况:我们知道在uboot中的1000多个文件中有一个符号 叫 _start,但是我们不知道 这个符号在哪个文件中。这种情况下要查找一个符号在所有项目中文件中的引用,要使用SourceInsight的搜索功能。 (2)start.s 在cpu/arm_cortexa9/start.s (3)然后进入start.S文件中,发现 个uboot的入口代码,就是第57 57行中就 是行。_sta rt 标号的定义处,于是乎我们就找到了整 2.5.1.3、SI中找文件技巧 (1)以上,找到了start.S文件,下面我们就从start.S文件开始分析uboot第一阶段。 (2)在SI中,如果我们知道我们要找的文件的名字,但是我们又不知道他在哪个目录下,我 们要怎样找到并打开这个文件?方法是在 SI中先打开右边的工程项目管理栏目,然后点击 最左边那个(这个是以文件为单位来浏览的),然后在上面输入栏中输入要找的文件的名 字。我们在输入的时候,SI在不断帮我们进行匹配,即使你不记得文件的全名只是大概记 得名字,也能帮助你找到你要找的文件。 2.5.2.start.S解析1 2.5.2.1、不简单的头文件包含

STL源码剖析总结_第二章-空间配置器

2.空间配置器 2.1具备次配置力(sub-allocation)的SGI空间配置器 SGI含有两个空间配置器类,std::allocator内存分配类符合标准,但是仅仅是对operator new和operator delete简单封装一下而已;其次是SGI特殊的内存分配器std::alloc,其中实现采用了内存池,对于分配大量小容量的对象,可以大大减少内存碎片。 SGI标准的空间配置器std::allocator 这是对应的模板内联内存分配函数。实现起来也很简单,注意这里分配的内存仅仅是一块没有使用的空间而已,在上面并没有构造对象,后面讲解如何在上面构造对象。 模板内联内存释放函数,直接调用全局的operator delete释放对应的内存。

SGI特殊的空间配置器Std::alloc class Foo{…} Foo* pf = new Foo;//配置内存,然后构造对象delete pf;//将对象析构,然后释放内存 new的算是包含两个阶段:

1)调用::operator new 配置内存 2)调用Foo::Foo()构造对象内容 Delete算式也包含两个阶段 1)调用Foo::~Foo()将对象析构 2)调用::operator delete释放内存 为了精密分工,STL allocator将两个阶段的操作分开来,内存配置操作由alloc::allocate()负责,内存释放操作由alloc::deallocate()负责;对象构造由::construct()负责,对象析构由::destroy()负责。

2.stl_alloc.h 内存空间的分配和释放 内部使用malloc在堆中申请内存,其中制造了一个内存池,可以减少小型区块过多而造成的内存碎片问题。 SGI设计了双层级配置器,第一级配置器直接使用malloc()和free(),第二级配置器则视情况采用不同的策略:当配置区块超过128bytes时,采用第一级配置器,当配置区块小于128bytes时,采用第二级配置器,采用复杂的memory pool。它内存池实际上就是内部维护了16个自由链表,预先已经分配好了,当需要从内存池中取内存时候,直接从对应链表取出即可;当释放内存到内存池时候,直接将内存插入链表即可。每个链表中节点分别占用8、16、24、32、40、48、52、64、72、80、88、96、104、112、120、128字节。

嵌入式Linux之我行 史上最牛最详细的uboot移植,不看别后悔

嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(一) 嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux 的朋友提供方便。如有错误之处,谢请指正。 ?共享资源,欢迎转载:https://www.doczj.com/doc/05687132.html, 一、移植环境 ?主机:VMWare--Fedora 9 ?开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 ?编译器:arm-linux-gcc-4.3.2.tgz ?u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 本次移植的功能特点包括: ?支持Nand Flash读写 ?支持从Nor/Nand Flash启动 ?支持CS8900或者DM9000网卡 ?支持Yaffs文件系统 ?支持USB下载(还未实现) 1.了解u-boot主要的目录结构和启动流程,如下图。

u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成;u-boot的stage2代码通常放在lib_xxxx/board.c文件中,他用C语言写成。各个部分的流程图如下:

2. 建立自己的开发板项目并测试编译。 目前u-boot对很多CPU直接支持,可以查看board目录的一些子目录,如:board/samsung/目录下就是对三星一些ARM 处理器的支持,有smdk2400、smdk2410和smdk6400,但没有2440,所以我们就在这里建立自己的开发板项目。 1)因2440和2410的资源差不多,主频和外设有点差别,所以我们就在board/samsung/下建立自己开发板的项目,取名叫my2440 2)因2440和2410的资源差不多,所以就以2410项目的代码作为模板,以后再修改

六西格玛管理读书笔记

《六西格玛管理》读书笔记 姓名:毛艳金学号:2114508109 班级:工程081 六西格玛(6σ)概念于1986年由摩托罗拉公司的比尔·史密斯提出,此概念属于品质管理范畴,西格玛(Σ,σ)是希腊字母,这是统计学里的一个单位,表示与平均值的标准偏差。旨在生产过程中降低产品及流程的缺陷次数,防止产品变异,提升品质。六西格玛是一种能够严格、集中和高效地改善企业流程管理质量的实施原则和技术。它包含了众多管理前沿的先锋成果,以”零缺陷”的完美商业追求,带动质量成本的大幅度降低,最终实现财务成效的显著提升与企业竞争力的重大突破。 20世纪90年代发展起来的6σ(西格玛)管理是在总结了全面质量管理的成功经验,提炼了其中流程管理技巧的精华和最行之有效的方法,成为一种提高企业业绩与竞争力的管理模式。该管理法在摩托罗拉、通用、戴尔、惠普、西门子、索尼、东芝行众多跨国企业的实践证明是卓有成效的。为此,国内一些部门和机构在国内企业大力推6σ管理工作,引导企业开展6σ管理。 企业也可以用西格玛的级别来衡量在商业流程管理方面的表现。传统的公司一般品质要求已提升至3sigma.这就是说产品的合格率已达至99.73%的水平,只有0.27%为次货。又或者解释为每一千货产品只有2.7件为次品。很多人认为产品达至此水平已非常满意。可是,根据专家研究结果证明,如果产品达到99.73%合格率的话,以下事件便会继续在现实中发生:每年有20,000次配错药事件;每年不超过15,000婴儿出生时会被抛落地上;每年平均有9小时没有水、电、暖气供应;每星期有500宗做错手术事件;每小时有2000封信邮寄错误。由此可以看出,随着人们对产品质量要求的不断提高和现代生产管理流程的日益复杂化,企业越来越需要象六西格玛这样的高端流程质量管理标准,以保持在激烈的市场竞争中的优势地位。事实上,日本已把”6 Sigma”作为他们品质要求的指标。管理专家Ronald Snee先生将6西格玛管理定义为:“寻求同时增加顾客满意和企业经济增长的经营战略途径。 六西格玛管理的特征 六西格玛管理的核心特征是使顾客与企业获得双赢,并降低经营风险。它能使企业的质量活动同时为顾客、员工、所有者和整个公司创造价值和经济利益。它注重质量的经济性,企业改进原来有缺陷的流程,这种投资可降低原来的高成本,提升顾客满意度,并挽回部分失去的顾客。 六西格玛管理是一种量化的综合管理方法,是一种目标管理、主动改进型管理、绩效管理和文化管理。六西格玛管理的主要特征具体如下: 1.以顾客为关注中心。六西格玛管理关注顾客的需求,以顾客为中心。它的出发点就是研究客户最需要的是什么。顾客满意是企业所追求的主要目标,而顾客只有在其需求得到充分理解并获得满足后才会满意和忠诚。 2.依据数据和事实,使管理成为量化的科学。六西格玛管理把“基于事实管理”的理念提到更高的层次,一开始就澄清什么是衡量企业业绩的尺度,然后应用统计数据和分析方法来建立对关键变量的理解,获得优化结果。 3.通过提高顾客满意度和降低资源成本,促使组织的业绩提升。六西格玛管理的目标有两个,一是提高顾客满意度,即通过提高顾客满意度来占领市场,开拓市场,从而提高组织的效益。二是降低资源成本,即通过降低资源成本,尤其是不良质量成本损失COPQ(Cost of Poor Quality),从而增加组织的收入。 4.聚焦于流程改进。在六西格玛管理中,流程是采取改进行动的主要对象,是成功的关键。设计产品和服务,度量业绩,改进效率和顾客满意度,甚至经营企业等,都是流程。 5.有预见的积极管理。有预见的积极管理意味着应当关注那些常被忽略的业务运作,并养成习惯:确定远大的目标并且经常加以检视;确定清晰的工作优先次序;注重预防问题而不是疲于处理已发生的危机

钟鼓楼读后感

读钟鼓楼有感 大一上学期的大学语文老师讲的红楼梦很有意思,进一步了解红楼梦,喜欢上了刘心武,所以读了他的这本钟鼓楼。 很惊讶一天的事他能写成一本书,1982年12月12日的北京钟鼓楼附近的一个四合院里的琐碎小事在他笔下生动的铺展开来,通过这一天不同的人不同的事,展示了那个年代北京人的真实生活,虽然我没有经历过那个时代,可当文章将四合院,大大小小的胡同,和一个个鲜活的面孔展现给我的时候,我居然能深刻的体会和理解,所有的有一切都是那么的熟悉,那么的亲切,难道这就是中华民族血脉的相连? 作者借薛大娘家二儿子的婚事,向我们展现了刚刚改革开放后几十张鲜活的脸孔,形形象象的人尽收于我们的眼底。善良本份却与不能与儿媳好好相处的薛大娘,不迷信却在意儿子结婚的日子是不是双数的日子,怕逢上单数的日子生出不吉利的丧偶效果,相信现代的20世纪也是这样,你可以轻易得荡涤繁缛的迷信习俗,却很难消除存在于人们内心中的原始迷信心理。只为了是内心平静悠闲的薛永全大爷,在解放前当过喇嘛,解放后变成摊贩,后而又变为公私合营和国营商场的售货员。对于别人的喇嘛可以结婚嘲笑他不以为意,在他看来,那是挣钱的职业,在儿子结婚的这一天还去刹海后海边遛弯、打八卦掌呢。17 时髦活力的冯婉珠,和荀磊自由恋爱,不会歧视绣鞋的姑娘,见到荀磊翻译的书因为不正当的理由退稿时,愤愤不平的说要到出版局去告他。多情善感的张秀藻,单相思与荀磊,又不想复杂的让那些琐事影响了自己的事业心。才华横溢的荀磊,生于1960年“大跃进”那个困苦的时期,在父亲的引导下,成了乱哄哄的教室中少数听讲的学生,没有书读,他就读那过了时的台历。以第一名的外语成绩成为某外事部门的培训人员,后送去英国培训,一直保持第一的名词,并把第二甩的远远的。钟情艺术的澹台智珠,在事业与家庭之间与丈夫存在争吵,希望事业更近一步,却不想与丈夫这样每天闹矛盾,在文化大革命开始时,被作为“封资修的黑苗子”冲击,因讲错一句话被打成“反革命”,曾偷偷喝了半瓶“敌敌畏”没死成,经历昏迷、呆滞、麻木、消沉、痛苦、绝望,,,,,后又转变为冷静、任命、无求、开通、企望,,,,,,1977年重新练功,成就如今的小有名气。30 淡泊名利的海西宾,虽然不是海奶奶的亲孙子,却一直很孝顺,积极向上的路喜纯,虽出身于社会的最底层,但他从不放弃自己,被势利眼瞧不上,却被餐馆当红案的何师傅收为私人徒弟,他努力学习,不放过每一次练功机会。在薛家忙了一天之后并没有要一点报酬,而是交到了一群亲近的朋友。敢做敢为的慕樱,轰轰烈烈的嫁给了一位抗美援朝的残废的军人,后来发现那不是爱,毅然离婚,嫁给了葛尊志,当葛尊志因为她失去了大好前途,在家细心收拾,对她关怀备至时,她又毅然离婚,因为她爱上了别人,她说婚外爱情是合理的,如果爱情消失了,再维持婚姻是不道德的,是虚伪的。她的这种观点在当时的确引起了很大的争论。心地善良性格不好而招人讨厌的詹丽颖,不懂的理解别人,固然从未有意伤害别人,说出的话却让人难受,就因为她这种性格,曾被当作“右派”受了20多年的改造,平反后性格却无收敛。,,,,,,,43 对于一个人,刘心武基本上也不给他定调,不象我们长期看到的作品,好人很好,坏人很坏,他总是给他笔下的人物留下了一点余地,让人感觉那些人仿佛就活在我们身边。这些钟鼓楼旁边的北京居民展现了那个年代北京的真实生活。一部作品,一天的生活,写活了一群群北京市民、写活了一个活生生的北京城。 小说中多次提到“历史感”,作者认为普通老百姓的吃、穿、住、行才是构成历史的脉络,每个老百姓都应该具有历史感,历史并不只属于名人伟人,我们的生活并不是没有意义的,我们的喜怒哀乐、生死哭歌都将载入史册。每一个人都不可能是单独地存在着。他必与许许多多的人共存于一个空间之中,这便构成了社会。而在同一个社会中,人们的阶级意识不同,政治方向不同,经济利益不同,人生态度不同,道德品质不同,文化教养不同,性格旨趣不

STL源码剖析总结_第八章配接器

8 配接器 8.1 配接器之概观与分类 1、设计模式中对配接器的定义如下:将一个class的接口转换为另一个class的接口,使原本因接口不兼容而不能合作的classes可以一起运作。 2、容器配接器(应用于容器) stack和queue是两个容器配接器,底层默认由deque构成。stack封住了所有的deque对外接口,只开放符合stack原则的几个函数;queue封住了所有的deque 对外接口,只开放符合queue原则的几个函数。 3、迭代器配接器(应用于迭代器) 3.1 insert iterators 可以把一般迭代器的复制操作转变为插入操作。 insert iterators包括back_insert_iterator(专门负责尾端插入),front_insert_iterator (专门负责头端插入)和insert_iterator(可以负责任何位置执行插入)。主要观念是,每个insert iterators内部都维护有一个容器;容器有自己的迭代器,当客户端对insert iterators做赋值操作时,就在insert iterators中转为对该容器的迭代器做插入操作,其他的迭代器功能则被关闭。 3.2 reverse iterators reverse iterators将迭代器的行进方向逆转,使原本应该前进的operator++变成了后退操作,原本后退的operator—操作变成了前进操作。当迭代器被逆转,虽然实体位置不变,但逻辑位置必须改变,主要是为了配合迭代器区间的“前闭后开“习惯。

3.3 IOStream iterators IOStream iterators可以将迭代器绑定到某个iostream对象身上。绑定一个istream object(例如:std::cin),称为istream_iterator,拥有输入功能。绑定到ostream object (例如:std::cout),称为ostream_iteratpr,拥有输出功能。内部维护一个istream member,客户端对这个迭代器做的operator++操作,会被导引调用内部所含的那个istream member的输入操作。绑定一个ostream object,就是在ostream iterator内部维护一个ostream member,客户端对这个迭代器做的operator=操作,会被导引调用内部所含的那个ostream member的输出操作。 3.4 运用实例

《六西格玛管理法》读后感

《六西格玛管理法》读后感 一、初识六西格玛 六西格玛是一个统计学概念,来自正态分布。六西格玛也可以理解为一种合格率标准:达到了99.9997%无缺陷产品或服务水平。然而比起作为一种指标,六西格玛最有利的特色是它建立了一套保证改进活动得到完美表现的必要的基础结构。 书中,我理解到了六西格玛管理的核心理念。第一点:关注客户是最重要的事情。客户的需求是动态变化的,因此我们要实时追踪客户的需求,只有在充分理解并满足客户的需求后,才会让其感到满意和忠诚,同时获得企业所追求的主要目标。第二点:六西格玛管理是基于数据和事实驱动的管理方法,是应用统计数据和分析方法来建立对关键变量的理解和获得优化结果。第三点:关注流程、管理和改善。在六西格玛中流程是采取改进行动的主要对象。设计产品和服务,度量业绩,改进效率和顾客满意度等都是流程,流程在六西格玛中是成功的关键。第四点:有预见的积极管理。积极是指主动的在事情发生之前进行管理,而不是被动的处理那些令人忙乱的危机。第五点,要有变革管理的意识。当进行流程改善时,组织管理也要同步进行,让人员状况与整个变革流程相匹配,才能让整个团队更好地向新的层次进化并取得变革的效果。第六点,追求完美,容忍失误。也就是说六西格玛为企业提供一个近乎完美的努力方向,但是这样做总是有风险的,在推行六西格玛管理的过程中,可能会遇到挫折和失败,企业应以积极的应

对挑战的心态,面对挑战和失败。 二、两个关键词: 2.1 变异 六西格玛的最终目的,我认为可以理解为:“消除变异”。了解变异有助于管理者更全面地知晓业务和流程真正的表现。追求六西格玛绩效的目的是把变异降低或缩减到很小的程度,从而为企业与客户带来巨大价值的改善。 2.2 流程 理解了六西格玛管理的核心理念与目的,接下来便要认识它对于企业战略管理最为核心的改进思路:流程管理。六西格玛管理主要就是要通过流程改进、流程设计/再设计以及全方位的流程管理来形成一套完整的结构管理体系。而在整个实施的过程中,基于基础的PDCA循环,六西格玛管理的过程改善分为DMAIC 五个步骤: D定义(Define)其要点是用数字来直观的表明"缺陷是什么",“在什么时间段内改到什么程度可以接受”。 M测量(Measure)要点是保证全程引用数据的准确性。 A分析(Analyze)经过DM阶段找准问题,通过诸如群策群力、鱼刺图之类的工具寻找可能引起缺陷的原因,然后在实际生产和服务过程中去搜集这些原因相关的各种数据,找到真正影响结果的关键因素。 I改进(Improve)这一阶段存在的主要难点常见的有改进需求和客观条件或者工艺水平之间矛盾,这些矛盾主要依赖设计、工艺和制造人员的专业知识和经

毕设 施工组织设计 任务书

集美大学 毕业设计(论文)任务书工程技术学院土木工程专业1011 班学生杜军斌学号2010100025 一、毕业设计(论文)题目:晋江阳光城翡丽湾高支模施工专项方案 二、毕业设计(论文)工作规定进行日期:2014 年1月10日起至2014年 5 月24日止 三、毕业设计(论文)进行地点:集美大学工程技术学院 四、任务书的内容: 1.熟悉图纸 2.了解工程概况 工程名称:晋江阳光城翡丽湾 建设地点:晋江英塘村,地处社马路与灵石路交叉路口 总建筑面积:1550㎡ 建筑主要结构合理使用年限50年 建筑主体耐火等级:一级 建筑物抗震设防烈度:7度 屋面防水等级:Ⅱ级 结构形式:框架剪力墙结构 基础形式:PHC管桩基础 设计标高:室内±0.0000相当于黄海标高26.8000。 标高说明:本工程施工图所注标高及总平面图尺寸以米为单位,其余以毫米为单位,门窗尺寸均指土建砖口尺寸,建筑楼地面、窗台、吊顶标高均为完成面标高。 3.施工条件 1)施工单位资质情况以及施工能力:国家房屋建筑工程总承包特级资质 2)劳动力:满足工期要求及要求连续施工。 3)施工机械:均可满足要求。 4)水电:建设单位已从城市供水,供电网引至施工现场。

5)生活条件:在工地上设有活动房供外包工人及保卫人员住在工地,还有在工地上搭设临时的食堂供其他人员吃饭,所有生活设施须统一安排。 4.主要设计内容 1 高支模的方案选择 2 高支模的施工计划 3 模板安装工艺流程 4 模板的施工方法 5 模板安装检查验收 6 模板拆除 7 模板的施工安全保证措施 8 高支模安装的劳动力计划 5.进度要求 (1)2013年09月20日~10月31日,毕业设计(论文)前期准备工作; (2)2013年11月01日~11月20日,组织教师命题,修订并印刷《毕业设计(论文)指导手册》; (3)2013年12月03日教研室上报毕业设计(论文)命题; (4)2013年12月06日~12月17日,学院审定毕业设计(论文)命题; (5)2013年11月22日~12月10日,举办毕业设计(论文)专题讲座; (6)2013年12月20日~26日,组织学生选题; (7)2013年12月27日~2013年12月31日审核学生选题情况,确定毕业设计(论文)指导教师; (8)2014年01月10日前,指导教师下达毕业设计(论文)任务书; (9)2014年02月16日~03月15日,毕业设计(论文)实习; (10)2014年02月16日~03月15日,指导学生完成毕业设计(论文)开题报告;(11)2014年03月17日学生上交毕业设计(论文)开题报告、实习日记、实习报告、实习鉴定; (12)2014年03月16日教研室报送毕业实习成绩; (13)2014年03月23日~03月31日,完成毕业设计(论文)粗纲; (14)2014年03月30日~04月12日,中期进度检查; (15)2014年04月13日~04月19日,完成毕业设计(论文)细纲; (16)2014年04月20日~04月26日,完成和筛选文献资料,确定翻译的外文文献,并整理完成不少于2万字的读书笔记;

AM335x uboot spl分析

AM335x uboot spl分析 芯片到uboot启动流程 ROM → SPL→ uboot.img 简介 在335x 中ROM code是第一级的bootlader。mpu上电后将会自动执行这里的代码,完成部分初始化和引导第二级的bootlader,第二级的bootlader引导第三级bootader,在 ti官方上对于第二级和第三级的bootlader由uboot提供。 SPL To unify all existing implementations for a secondary program loader (SPL) and to allow simply adding of new implementations this generic SPL framework has been created. With this framework almost all source files for a board can be reused. No code duplication or symlinking is necessary anymore. 1> Basic ARM initialization 2> UART console initialization 3> Clocks and DPLL locking (minimal) 4> SDRAM initialization 5> Mux (minimal) 6> BootDevice initialization(based on where we are booting from.MMC1/MMC2/Nand/Onenand) 7> Bootloading real u-boot from the BootDevice and passing control to it. uboot spl源代码分析 一、makefile分析 打开spl文件夹只有一个makefile 可见spl都是复用uboot原先的代码。 主要涉及的代码文件为u-boot-2011.09-psp04.06.00.03/arch/arm/cpu/armv7 u-boot-2011.09-psp04.06.00.03/arch/arm/lib u-boot-2011.09-psp04.06.00.03/drivers LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-spl.lds 这个为链接脚本 __image_copy_end _end 三、代码解析 __start 为程序开始(arch/arm/cpu/armv7/start.S) .globl _start 这是在定义u-boot的启动定义入口点,汇编程序的缺省入口是 start 标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点。

如何成为一个程序员

如何成为一个程序员:想成为一个游戏程序员需要有以下资料 疯狂代码 https://www.doczj.com/doc/05687132.html,/ ?: http:/https://www.doczj.com/doc/05687132.html,/GameDevelopment/Article36086.html 、书籍: 算法和数据结构: 数据结构(C语言版)——严蔚敏、吴伟民 清华出版社 我觉得其配套习题集甚至比原书更有价值每个较难题都值得做下 Introduction to Algorithms第 2版 中文名算法导论 有关算法标准学习教材和工程参考手册在去年CSDN网站WebSite上其翻译版竟然评为年度 2十大技术畅销书同时员杂志上开设了“算法擂台”栏目这些溯源固本举动不由得使人对中国现今浮躁不堪所谓“IT”业又产生了线希望这本厚厚书幸亏打折我才买得起虽然厚达千页但其英文通俗晓畅内容深入浅出可见经典的作往往比般水准书还耐读还能找到MIT视频教程第节课那个老教授嘻皮笑脸后面就是长发助教上课了 C语言名题精选百则 窍门技巧篇——冼镜光 机械工业出版社 作者花费年时间搜集了各种常见C段极具窍门技巧性编程法其内容都是大有来头而且给出了详细参考资料如个普通Fibonacci数就给出了非递归解、快速算法、扩充算法等步步深入直至几无油水可榨对于视速度如生命连个普通浮点数转化为整数都另辟蹊径以减少CPU cycle游戏员怎可不看? 计算机算法基础(第 2版)—— 佘祥宣等 华中科大出版社 我看到几个学校研究生拿它作教材(研究生才开算法太开玩笑了吧)这本书薄是薄了点用作者话来说倒也“精辟

”其实此书是Fundamentals of Computer Algorithms缩写版不过原书出版太久了反正我是没找到 The Art of Computer ProgrammingVolume 1-3 作者Donald E. Knuth是我心目中和冯.诺依曼、Dijkstra、Shannon并列 4位大师这本书作者从读大学本科时开始写直写到博士时十年磨剑足见其下足了功夫可作为计算机技术核心——算法和数据结构终极参考手册创新处也颇多譬如常见Shell排序他在书中提出可用(3i-1)/2间隔这使其稍快于O(n1. 5)当然这套书描述高度数学化为此恐怕般人(我?)最好还得先看本数学预备书Concrete Mathematics(直译为混凝土数学?^-^)再说可惜是这套书才出到第 3卷并没有覆盖全部常见算法内容不过好在对于游戏员来说越常见算法用得越多这也不算是什么要命损失 STL源码剖析—— 侯捷 华中科大出版社 侯捷不用介绍了华人技术作家中旗舰说其有世界级水准也不为过这本书我以为是C和数据结构葵花宝典(欲练此功必先自宫)也就是说不下几层地狱很难看懂它要求预备知识太多了如STL、数据结构、泛型编程、内存管理都要很扎实(为此是不是还要看看有内存管理设计模式的称Small Memory Software这本书呢?)但是旦看懂真会是所向披靡 Data Structures for Game Programmers 每个数据结构例程都是个小游戏还用SDL库实现了个算法演示系统虽然内容失的于浅但起码让人了解了数据结构在游戏中作用 其实游戏并不比其它特殊甚至要求基本功更加扎实所以花时间做些看似和实际应用不甚相干习题对今后工作是大有裨益而且有些应用很广算法如常被人津津乐道[Page]A*算法及其变种牵涉到图检索周游和分枝-限界法恐怕还得读些艰深论文才能充分明白运用如Donald E. KnuthAn analysis of alpha-beta cutoffs其实还有不少此类

相关主题
文本预览
相关文档 最新文档