精华内容
下载资源
问答
  • 浅析adb创建流程 浅析adb创建流程浅析adb创建流程
  • 公司开发者账号详细创建流程文档(1.AppID账号的创建流程;邓白氏编码的创建详细创建过程;苹果开发者账号详细创建流程
  • BMC ITSM 事件管理流程创建过程,remedy的事件管理流程演示。
  • MFC创建过程

    2016-03-10 16:47:20
    vs2013 MFC的创建过程(可以用来进行代码跟踪 了解MFC运行流程)
  • SqlSession 创建过程.pdf

    2020-05-21 14:37:06
    我们都知道 SqlSession 是 MyBatis 执行 SQL 的门面,那么 MyBatis 的 SqlSession 的创建过程是如何的呢?看看这里就知道了!
  • Activity创建流程

    千次阅读 2018-12-11 09:56:50
    Activity 创建流程分析 在前两篇文章中我们谈到了从桌面点击图标到启动进程以及启动ActivityThread再到ActivityThread启动Activity的过程分析 1. 安卓应用启动流程分析 2. ActivityThread启动页面分析 本片文章可谓...

    Activity 创建流程分析

    在前两篇文章中我们谈到了从桌面点击图标到启动进程以及启动ActivityThread再到ActivityThread启动Activity的过程分析
    1. 安卓应用启动流程分析
    2. ActivityThread启动页面分析

    本片文章可谓是紧接着上面两篇文章,上文说到的ActivityThread performLaunchActivity(),今天继续讲从这里如何创建Activity 的。

     private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
         。。。
            if (r.profileFd != null) {
                mProfiler.setProfiler(r.profileFile, r.profileFd);
                mProfiler.startProfiling();
                mProfiler.autoStopProfiler = r.autoStopProfiler;
            }
            handleConfigurationChanged(null, null);
            //上节提到,我们ActivityThread开启来之后呢,开启Activity 的入口在这里,那么我们还是继续深入其中,看看他又做了什么操作。
            Activity a = performLaunchActivity(r, customIntent);
    
            if (a != null) {
                r.createdConfig = new Configuration(mConfiguration);
                Bundle oldState = r.state;
                handleResumeActivity(r.token, false, r.isForward);
                。。。
            } else {
                try {
                    ActivityManagerNative.getDefault()
                       .finishActivity(r.token, Activity.RESULT_CANCELED, null);
                } catch (RemoteException ex) {
                    // Ignore
                }
            }
        }
    
    private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
            ActivityInfo aInfo = r.activityInfo;
            if (r.packageInfo == null) {
                r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,
                        Context.CONTEXT_INCLUDE_CODE);
            }
    
            ComponentName component = r.intent.getComponent();
            //首先通过Intent获取到Activity 的相关信息
            if (component == null) {
                component = r.intent.resolveActivity(mInitialApplication.getPackageManager());
                r.intent.setComponent(component);
            }
            if (r.activityInfo.targetActivity != null) {
                component = new ComponentName(r.activityInfo.packageName,
                        r.activityInfo.targetActivity);
            }
            Activity activity = null;
            //此处 mInstrumentation通过newActivity的方法获取到一个Activity的实例
            
            try {
                java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
                activity = mInstrumentation.newActivity( cl, component.getClassName(), r.intent);
                StrictMode.incrementExpectedActivityCount(activity.getClass());
                r.intent.setExtrasClassLoader(cl);
                if (r.state != null) {
                    r.state.setClassLoader(cl);
                }
            } catch (Exception e) {}
            try {
                Application app = r.packageInfo.makeApplication(false, mInstrumentation);
              	//ContextImpl创建,这个类单独讲
                if (activity != null) {
                    ContextImpl appContext = new ContextImpl();
                    appContext.init(r.packageInfo, r.token, this);
                    appContext.setOuterContext(activity);
                    CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());
                    Configuration config = new Configuration(mCompatConfiguration);
                    //这里很重要,attach方法绑定的是谁呢?  你想 目前还没有绘制页面还没有添加到窗体
                    //所以说  会创建window绑定  并绑定WindowManagerService
                    activity.attach(appContext, this, getInstrumentation(), r.token,
                            r.ident, app, r.intent, r.activityInfo, title, r.parent,
                            r.embeddedID, r.lastNonConfigurationInstances, config);
    
                    if (customIntent != null) {
                        activity.mIntent = customIntent;
                    }
                    r.lastNonConfigurationInstances = null;
                    activity.mStartedActivity = false;
                    int theme = r.activityInfo.getThemeResource();
                    if (theme != 0) {
                        activity.setTheme(theme);
                    }
                    activity.mCalled = false;
                    //到了这里开始 调用调用Activity的 onCreate方法。
                    mInstrumentation.callActivityOnCreate(activity, r.state);
                    r.activity = activity;
                    r.stopped = true;
                    if (!r.activity.mFinished) {
                        activity.performStart();
                        r.stopped = false;
                    }
                    if (!r.activity.mFinished) {
                        if (r.state != null) {
                            mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);
                        }
                    }
                    if (!r.activity.mFinished) {
                        activity.mCalled = false;
                        mInstrumentation.callActivityOnPostCreate(activity, r.state);
                    }
                }
            return activity;
        }
    

    上面给出了简单的注释,应该都可以看懂,那么现在很明显最重要的看看attach方法里面主要做了什么。

    首先看Instrumentation 如何创建Activity
     public Activity newActivity(ClassLoader cl, String className,
                Intent intent)
                throws InstantiationException, IllegalAccessException,
                ClassNotFoundException {
                //这里你就明白了,怎么获取的Activity实例
            return (Activity)cl.loadClass(className).newInstance();
        }  
      //下来看Activity的attach方法
    final void attach(Context context, ActivityThread aThread,
                Instrumentation instr, IBinder token, int ident,
                Application application, Intent intent, ActivityInfo info,
                CharSequence title, Activity parent, String id,
                NonConfigurationInstances lastNonConfigurationInstances,
                Configuration config) {
            attachBaseContext(context);
    
            mFragments.attachActivity(this);
            //这个版本还是基于API——15的,新版本的会有些差别。
            //这里创建了Window 并获取到了WindowManager
            mWindow = PolicyManager.makeNewWindow(this);
    		//提一句   public Window makeNewWindow(Context context) {
           	//	 return new PhoneWindow(context);
       		 //}
            mWindow.setCallback(this);
            mWindow.getLayoutInflater().setPrivateFactory(this);
            if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {
                mWindow.setSoftInputMode(info.softInputMode);
            }
            if (info.uiOptions != 0) {
                mWindow.setUiOptions(info.uiOptions);
            }
            mUiThread = Thread.currentThread();
            
            mMainThread = aThread;
            mInstrumentation = instr;
            mToken = token;
            mIdent = ident;
            mApplication = application;
            mIntent = intent;
            mComponent = intent.getComponent();
            mActivityInfo = info;
            mTitle = title;
            mParent = parent;
            mEmbeddedID = id;
            mLastNonConfigurationInstances = lastNonConfigurationInstances;
    
            mWindow.setWindowManager(null, mToken, mComponent.flattenToString(),
                    (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
            if (mParent != null) {
                mWindow.setContainer(mParent.getWindow());
            }
            mWindowManager = mWindow.getWindowManager();
            mCurrentConfig = config;
        }
    
    

    今天内容就超级简单了,我们总结下就是ActivityThread里面通过ActivityManagerService、 H、ApplicationThread 的操作最终走到了 performLaunchActivity ,通过Instrumentation调用反射获取到了Activity的对象,尔后 创建了Window 并调用了onCreate方法,那我们知道onCreate方法里面我们一般写的是啥啊? 不就是setContentView()吗,也就是开始了真正的绘制之路,绘制的路程少不了WindowManagerService 对吧,上面我们已经创建了Window,似乎已经很近了不是,今天就到这里,下一篇看Activity的绘制流程!

    展开全文
  • 使用echarts创建流程

    千次阅读 2020-05-26 15:35:58
    使用echarts创建流程图使用echarts创建流程图 使用echarts创建流程图 为了建立流程图,需要使用echarts的关系图组件,即type类型为‘graph’。 首先创建一个div,为echarts准备一个具备大小的Dom <div id="main...

    使用echarts创建流程图

    使用echarts创建流程图

    在这里插入图片描述
    为了建立流程图,需要使用echarts的关系图组件,即type类型为‘graph’。

    首先创建一个div,为echarts准备一个具备大小的Dom

    <div id="main" style="width: 900px;height:1500px;padding-left: 250px;"></div>
    		<script type="text/javascript">
    			// 基于准备好的dom,初始化echarts实例
    			var myChart = echarts.init(document.getElementById('main'));
    

    然后指定图表的配置项和数据

    var option = {
    				title: {
    					text: '流程'
    				},
    				series: [{
    					type: 'graph',
    					layout: 'none',
    					symbolSize: 100,
    					roam: true,
    					color: '#6A5ACD',
    					label: {
    						show: true,
    						fontSize: 16,
    						color: '#FFF',
    						//backgroundColor:'white'
    					},
    					symbol: 'roundRect',
    					edgeSymbol: ['circle', 'arrow'],
    					edgeSymbolSize: [4, 10],
    					edgeLabel: {
    						fontSize: 25
    					},
    

    其中,symbol参数可以修改元素的样式,‘roundRect’为圆角矩形,还有’circle’, ‘rect’, ‘triangle’, ‘diamond’, ‘pin’, ‘arrow’, 'none’这几种样式,也可以通过 ‘image://url’ 设置为图片,其中 URL 为图片的链接,或者 dataURI
    例如:
    symbol:‘image://https://tse3-mm.cn.bing.net/th/id/OIP.EUApg_eTs1xbeOlcQ2HuTAHaHl?pid=Api&rs=1’
    在这里插入图片描述
    edgeSymbol:连线的参数,为了做成流程图的样式,建议设置成带箭头的线的格式,即edgeSymbol: [‘circle’, ‘arrow’]

    然后需要对流程图中的每个节点进行设计。

    data: [{
    							name: 'A',
    							x: 100,
    							y: 100,
    						}, {
    							name: 'B',
    							x: 100,
    							y: 200,
    							tooltip: {
    								show: true,
    								position: 'right',
    								textStyle: {
    									width: 20
    								},
    								formatter: function(params) {
    									return params.dataType == 'node' ? '鼠标悬停的显示的内容' : '';
    								},
    
    							},
    						}, 
    

    其中,每一个{}中的内容表示一个节点,name为节点显示的内容,tooltip为鼠标悬停在节点上时显示的内容,如果不设置tooltip,则默认悬停的内容为name的值。
    关于tooltip,其中有一项formatter,要进行一下特殊说明。
    formatter这个参数是用来设置鼠标悬停时显示的内容的。
    如果不做特殊的显示,一般写作:

    formatter:'悬停显示的内容'
    

    这种方式下,鼠标悬停到流程节点或者连接流程节点上的线的时候,都会显示对应的内容。
    如果只希望鼠标悬停在流程节点时显示内容,而不希望停在线上的时候也显示,可以用文中所写的方法:

    formatter: function(params) {
    		return params.dataType == 'node' ? '鼠标悬停的显示的内容' : '';
    

    其中dataType 的值只会是 ‘node’ 或者 ‘edge’,表示当前点击在节点是连接线上。
    如果只希望鼠标悬停在连接线时显示内容,而不希望停在节点的时候也显示,可以使用如下方法:

    formatter: function(params) {
    		return params.dataType == 'edge' ? '鼠标悬停的显示的内容' : '';
    //或者,尽量选择第一种方式
    formatter: function(params) {
    		return params.dataType == 'node' ? '' : '鼠标悬停的显示的内容';
    

    如果不想显示鼠标悬停,可以选择将show置为false。

    当对节点做完设置后,可以开始设置连接线。

    links: [{
    						source: 'A',
    						target: 'B',
    						lineStyle: {
    							color: '#473C8B',
    							width: 3,
    						},
    
    					}, {
    						source: 'B',
    						target: 'C',
    						lineStyle: {
    							color: '#473C8B',
    							width: 3,
    						},
    						label: {
    							show: true,
    							position: 'middle',
    							formatter: '有疑问',
    							fontSize: 15,
    						},
    					}, {
    						source: 'B',
    						target: 'D',
    						lineStyle: {
    							color: '#473C8B',
    							width: 3,
    						},
    						label: {
    							show: true,
    							position: 'middle',
    							formatter: '完成',
    							fontSize: 15
    						},
    					}]
    

    其中,必须要设置的是source和target,表示连接线的起点和终点。注意,source和target的值必须和节点中的name值一致,否则无法画出线。
    如果想要在连接线上面显示内容,可以通过label来进行设置,formatter即为线上显示的内容。
    当完成所有节点和连接线的设置后,输入

    myChart.setOption(option);
    

    即可显示流程图。

    如果想要在流程图中,进行其他操作,如点击节点A,跳转到test.html

    myChart.on('click', {
    		name: 'A'
    	}, function() {
    		window.location.href = "test.html"
    	});
    
    展开全文
  • 前言 Java 对象的创建到销毁,简单来讲就是:...对象创建过程 对象内存布局 虚拟机字节码执行引擎执行 如何判断对象是否死亡 垃圾收集算法 垃圾收集器 本文通过一个简单的 Demo 为起点,将上述的知识点串联起来。让...

    前言

    创建对象是 Java 语言绕不开的话题,那么对象是如何创建出来的呢?我们今天就来聊一聊。对象创建第一步就是检查类是否加载,而类的加载又牵扯到类的加载过程。如果单说对象的创建而绕开类的加载过程,感觉有点牵强。干脆就将这2块内容结合起来一起讲。希望通过我的讲解带你搞懂类的加载过程和对象的创建。

    在进行阅读前你需要先了解 Java 运行时数据区域 的相关概念,如果你已经了解可以直接向下阅读,如果对Java 运行时数据区域一无所知,请先一步我的另一篇博客 Java 虚拟机学习笔记 | 运行时数据区总结 一文进行了解。

    对象的创建和类的加载执行流程

    对象的创建

    首先介绍一下对象的创建需要大致流程如下:

    1. 类加载检查
    2. 为新对象分配内存
    3. 为对象值初始化为零值
    4. 设置对象头
    5. 执行init方法

    类加载检查: 当虚拟机遇到 new 指令的时候会去常量池中检查者个类的符号引用是否存在,进行类加载检查操作,如果没有执行就进行类加载过程。这里所说的 new 执行不是我们写代码时候的 new。这个new指令可以通过 javap进行反汇编进行查看。

    如下所示的Demo.java的代码:
    在这里插入图片描述
    编译 Demo.java
    在这里插入图片描述
    将 Demo.class 字节码文件进行反汇编操作。
    在这里插入图片描述
    生成的反汇编内容如下:
    0:new 就是虚拟机遇到的 new 指令。
    在这里插入图片描述
    为新对象分配内存: 如果该类已经进行了类加载,会在堆内存中为新对象分配一块内存空间。内存空间的大小在类加载的时候就已经确定了。分配内存空间方式有2种:1. 指针碰撞、2. 空闲列表。
    采用那种方式进行,取决于垃圾收集器采用那种收集算法。如果是标记整理那么会采用指针碰撞的方式,如果是标记清除则会采用空闲列表的方式。

    分配内存是一个高并发的操作,虚拟机在分配内存的时候通过2中方式来保证线程安全的问题:1. TLAB、 2. CAS+重试。
    默认情况下会为每个线程预先在堆上分配一个内存空间,我们称之为 TLAB(Thread Local Allocation Buffer)线程本地分配缓存。当对象内存需要内存空间大于 TLAB 或者 TLAB用完是采用 CAS+重试的方式进行。

    为新对象值初始化为零值:
    分配完内存后,接下来的操作就是将对象成员属性值设置为零值。这样可以保证这些示例属性在不赋值的情况下就可以使用。需要注意的是这个操作不包含对象头。

    设置对象头: 分配完内存后需要对对象头进行设置,类型指针(找到类的元信息)、对象GC分代年龄、线程持有的锁、锁的状态标志(否启用偏向锁) 对象头也被称之为 Mark Word。

    对象在内存中的布局包含了3部分:对象头、实例数据、对齐填充。每一块包含的内容如下图所示:
    在这里插入图片描述

    执行init方法: 在执行完上述的操作后对象基本算是在我们的堆内存中创建完毕,但是对象真正的创建才刚刚开始。还需要执行 init方法,完成成员属性字段真实的赋值后才开始按照我们编写的代码的逻辑进行执行。

    这里所说的 init 方法就是我们在上面进行反汇编代码中的 invokespecial 指令。如下图所示:
    在这里插入图片描述

    类加载过程

    创建对象过程中第一步就是执行类加载检查,如果已经进行类的加载就继续执行对象创建过程,如果没有进行类的加载就会执行类的加载过程。具体执行流程如下:

    • 加载
    • 链接
    • 初始化

    链接过程又可以拆分为:

    • 验证
    • 准备
    • 解析

    加载: 这里说的加载和类加载不是一回事,加载时类加载的一个执行过程。加载这个动作是读取字节码的信息并将为该类创建一个Class对象到方法区中 也可以理解为 将.class文件加载到方法区中。另外还有一点就是加载和连接是同交叉进行的。

    需要注意的是类的加载时通过类加载器执行的。在 Java 虚拟机中类加载器有一下几种:

    • BootstrapClassLoader(启动类加载器)
    • ExtensionClassLoader(扩展类加载器)
    • AppClassLoader(应用程序类加载器)
    • 自定义类加载器

    在这里插入图片描述
    类在通过类加载器进行加载的时候才用的是双亲委派模型,具体的定义就是:
    当了进行加载的时候先判断该类是否被加载过,如果已经被加载的类直接返回。如果没有被加载过开始进行加载,加载的过程中会将加载的请求委派给它的父类加载器进行加载。如果父类加载器无法加载时,才由自己的加载器进行加载。最总的效果是我们的加载操作基本都由BootstrapClassLoader(启动类加载器) 执行。简单点理解就是:有啥事各自找各自的爸去做,老爸不做在由自己去做。我个人理解就是啃老模式

    每个类都有与他对应的类记加载器,当父类加载器为null时,BootstrapClassLoader(启动类加载器)会作为该类的父类加载器。

    这样做的好处是:保证了Java程序的稳定运行,可以避免类的重复加载,保证了 Java 的核心 API 不被篡改。例如:如果不使用双亲委派模型,我们编写一个称为 java.lang.Object 类的话,那么程序运行的时候,系统就会出现多个不同的 Object 类。

    验证: 验证会对 文件格式、元数据、字节码、符号引用进行验证。确保我们的代码的正确性。
    准备: 为类变量分配内存,并将类变量的值初始化为零值。这步和创建对象过程中 为新对象值初始化为零值 的操作类似。
    解析: 将常量池内的符号引用替换为直接引用的过程
    初始化: 初始化操作会执行类构造器,并且会对类变量进行真实的赋值操作。这步和创建对象中执行init方法类似。执行完之后就可以开始创建对象了。

    类加载过程和对象的创建 具体执行流程图如下:
    在这里插入图片描述
    类加载过程中各阶段在在Java 运行时数据区域处理流程图如下:
    在这里插入图片描述
    类加载过程中各阶段在在Java 运行时数据区域处理流程具体介绍图如下:在这里插入图片描述
    对象的创建各阶段在在Java 运行时数据区域处理流程图如下:
    在这里插入图片描述

    小结

    关于类加载过程和对象的创建,不仅仅是它们如何创建这么简单。还有很多细节需要我们了解,例如:对象的创建在分配内存的时候需要通过 指针碰撞或空闲列表的方式进行分配;同时关于分配的线程安全问题采用 TLAB 和 CAS+重试的方式来保证;对象内存布局包含:对象头、示例数据、对其填充;类的加载过程中还涉及到类加载器的双亲委派模型来保证程序稳定运行。

    参考文献

    深入理解Java虚拟机 JVM 高级特性与最佳实践

    展开全文
  • OpenStack虚拟机创建流程

    万次阅读 2017-11-20 22:29:13
    引言创建虚拟机是OpenStack最基本的功能,也是较为核心的功能。整个流程以Nova组件为中心,期间会涉及到与其他组件的交互,如Keystone、Glance、...下面就详细介绍一下虚拟机的整个创建流程(OpenStack Ocata版本)。

    引言

    创建虚拟机是OpenStack最基本的功能,也是较为核心的功能。整个流程以Nova组件为中心,期间会涉及到与其他组件的交互,如Keystone、Glance、Neutron、Cinder。下面就详细介绍一下虚拟机的整个创建流程(OpenStack Ocata版本)。

    创建流程

    可以将整个过程大致分为三个阶段,第一个阶段为从novaclient到nova-api,第二个阶段为从nova-api到nova-compute,第三个阶段为从nova-compute到底层的Hypervisor。

    1. 从novaclient到nova-api

    创建虚拟机一般是从界面或命令行发出请求开始的,两种方式都会借助novaclient向nova-api发出HTTP请求。nova-api暴露了一组RESTful的API,以接受novaclient发出的各种请求。创建虚拟机时需要向{your_compute_service_url}/servers发送POST请求。在使用命令行创建时可使用“--debug”选项来跟踪这些HTTP请求,如使用nova --debug boot
    这里写图片描述

    为了保证对OpenStack各个服务的安全访问,在请求创建虚拟机之前,novaclient会先向Keystone发送用户的用户名、密码、域名信息来申请一个有效的token,之后向nova-api发送请求的头部就会带有token信息。nova-api收到请求后会向Keystone验证token的有效性,token验证通过后,nova-api会向数据库写入虚拟机的初始数据。Keystone在验证token时,会先去缓存数据库memcached中查找,若缓存未命中再去数据库中的token表查找对应记录。由于OpenStack各个组件之间都需要token验证,并且token存在有效期,过期的token不会自动清理,所以随着时间的增长token表的记录会越来越多,那么在查询token表时就可能存在慢查询。除了使用memcached做缓存之外,我们还可以使用keystone-manage token_flush对token表做定期清理,避免数据库慢查询。

    2. 从nova-api到nova-compute

    nova-api工作结束后会向nova-conductor发起RPC请求,请求创建虚拟机。nova-conductor是nova-compute和数据库之间的桥梁,它可以防止nova-compute直接访问数据库,从而提高对数据库访问的安全性。随着nova-conductor功能的完善,它也接管了nova-compute中一些耗时较长的任务,如build_instancesresize_instancelive_migrate_instance等。
    这里写图片描述

    nova-conductor收到请求后首先以rpc.call的方式请求nova-scheduler完成虚拟机创建的调度工作。nova-scheduler使用过滤和权重计算的方法来选定创建虚拟机的主机,过滤器和权重计算方法可以在nova.conf中配置。nova-scheduler自己会维护一份计算节点数据,并根数据库中对比。调度完成后将选定的host返回给nova-conductor,由nova-conductor向nova-compute发起rpc.cast的创建请求。

    一般来说,OpenStack各个组件之间会通过RESTful API进行通信,而组件内部的各个服务进程之间则是通过基于AMPQ的RPC方式进行通信。RPC方式又分为两种,rpc.cast和rpc.call,rpc.call为request/response方式,多用于同步场景;而使用rpc.cast方式发出请求后则无需一直等待响应,但之后需要定期查询执行结果,一般用于异步场景。实现RPC通信还需借助消息队列,OpenStack将其使用的通信方式都封装在公有库oslo_messaging中,目前支持的消息队列包括Rabbitmq、Zeromq、Kafka等。

    以nova-api和nova-conductor之间的通信为例。nova-conductor服务在启动时会注册一个RPC server等待处理请求,nova-api发送创建虚拟机的rpc请求时会先创建一个topic publisher用于话题发布,发布的topic为conductor,method为build_instance,然后publisher将消息发送给话题交换器,话题交换器再根据routing_key转发给绑定的消息队列,最后由topic consumer接收并调用nova-conductor manager中的build_instance方法处理。
    这里写图片描述

    创建虚拟机过程中的所有HTTP请求和RPC请求均会占用服务器的TCP连接数。一般来说,作为客户端的TCP连接数最大为65535个,但也会受到内存、文件描述符等因素的影响,所以为保证正常创建虚拟机,可以使用监控工具来监控服务器的资源或进行TCP连接的调优。

    3. 从nova-compute到Hypervisor

    nova-compute收到请求后再分别调用glanceclient、neutronclient和cinderclient向glance、neutron、cinder获取创建虚拟机的镜像、网络、存储信息,认证过程与nova-api类似。
    这里写图片描述

    此时虚拟机的vm_state为Building,虚拟机还只存在于数据库中,完成最后的创建还要交给Hypervisor。OpenStack支持的Hypervisor包括Libvirt、hyperv、xen、vmware等,其中对libvirt管理的KVM的支持性最好,这也是OpenStack默认的hypervisor。当libvirt收到创建请求时,会拉取镜像创建根存储、根据请求中的虚拟机信息生成xml文件,再根据xml文件创建网络(如ovs上创建端口)、define domain、start domain等,直到libvirt检测到虚拟机状态为running则创建成功。

    当OpenStack使用Ceph共享存储时,镜像无需下载到本地再上传到后端,而是直接使用clone,配合Ceph支持的COW技术几乎可以完成虚拟机的秒级启动。前提是使用raw格式的镜像,因为Ceph不支持从qcow2的镜像引导,若使用qcow2镜像创建虚拟机,则需要将镜像下载到本地转换成raw格式再上传,不仅增加启动时间,而且还可能因为空间不足无法完成镜像的格式转换从而造成虚拟机启动失败,所以建议直接使用raw格式的镜像创建虚拟机。

    为避免创建过程中服务的单点故障,建议使用keepalived+haproxy的方式实现OpenStack各个服务的高可用。

    结束语

    创建虚拟机是OpenStack的基本功能,掌握整个虚拟机的创建流程,有助于理解OpenStack各个组件以及组件内部的通信过程,同时,对理解虚拟机的其他操作流程也有很大帮助。同时,对于OpenStack运维人员来说,掌握虚拟机几个核心操作的流程,可以帮助我们在遇到类似虚拟机创建错误等问题时进行快速定位。

    转载自九州云微信公众号。

    展开全文
  • 深入理解Java对象的创建过程:类的初始化与实例化

    万次阅读 多人点赞 2017-05-18 14:17:45
    在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的。...本文试图对JVM执行类初始化和实例化的过程做一个详细深入地介绍,以便从Java虚拟机的角度清晰解剖一个Java对象的创建过程
  • 进程的创建过程

    千次阅读 2019-05-18 17:47:47
    所有的进程都是由别的进程创建出来的,用鼠标双击运行一个程序的时候,实际上是由...进程的创建过程: 映射EXE文件 创建内核对象EPROCESS(一个进程对应一个EPROCESS) 映射系统DLL(ntdll.dll) 创建线程内核对象ET...
  • java对象的创建过程

    万次阅读 多人点赞 2018-09-03 20:54:02
    大家都知道,java使用new 关键字进行对象的创建,但这只是从语言层次上理解了对象的创建,下边我们从jvm的角度来看看,对象是怎么被创建出来的,即对象的创建过程。 对象的创建大概分为以下几步: 1:检查类是否...
  • 本篇仅简单介绍流程,具体的创建过程,由后续的源码解析部分进行详述。 总体流程图 简易版Spring Bean的创建过程如下图: 简单来讲,Bean的创建有下面几个过程: 解析Bean的定义构建BeanDefinition 对Bean...
  • Kubernetes中pod创建流程

    千次阅读 2019-01-25 16:50:21
    Pod是Kubernetes中最基本的部署调度单元,可以包含container,逻辑上表示某种应用的一个实例。例如一个web站点应用由前端、后端及... Pod的创建流程如下图所示(图片来源于网络):   具体的创建步骤包括: 1...
  • Android AlertDialog创建过程详解

    千次阅读 2016-01-27 13:44:05
    详细的说明了AlertDialog的创建过程
  • 进程创建过程

    千次阅读 2019-02-25 16:07:26
    在进程创建时,调用do_fork函数来创建新进程,那么和调度相关的操作主要有两个,一个是sched_fork,这是对一个进程进行调度的初始化,另外一个就是wake_up_new_task,这个是把刚刚创建的子进程唤醒加入到调度器中...
  • spring bean创建流程

    千次阅读 2020-04-30 17:44:15
    一、流程图 getBean()流程图,来源:https://blog.csdn.net/laravelshao/article/details/82318063 其它有关图,来源:... ...scope="singleton"单例 在启动(容器初始化之前), 就已经创建了bean,且整个...
  • C++(类对象的创建过程与释放过程)

    千次阅读 2019-08-16 17:00:25
    C++类对象的创建过程与释放过程 如下图所示 创建释放过程代码举例 #include <iostream> using namespace std; class Man { public: Man(void) { cout<<"我是man的构造函数,我被调用了"<<...
  • JDK1.8——Java对象的创建过程

    千次阅读 2020-08-16 20:22:20
    对象创建过程概述 对象的创建过程如图: 这里解释一下什么是符号引用: 符号引用: 符号引用是一个字符串,它给出了被引用的内容的名字并且可能会包含一些其他关于这个被引用项的信息——这些信息必须足以唯一的...
  • Spring中Bean的创建流程

    千次阅读 2019-03-14 13:40:39
    Spring中Bean的创建流程 一. 核心代码 BeanDefinition的解析在AbstractAutowireCapableBeanFactory的resolveBeforeInstantiation()中: @Nullable protected Object resolveBeforeInstantiation(String beanName, ...
  • Spring IOC容器创建过程

    千次阅读 2019-01-09 19:30:54
    直接上图吧。这是SpringIOC容器创建的整个过程 总共有12大步。...从spring IOC容器整个创建过程可以看出Spring给我们提供了两大利器来对程序进行扩展。所谓的容器本质就是一个ConcurrentHashMa...
  • 接上一篇描述,开发完请假流程后可以导出一份bpmn格式的xml文件,这个文件可用于部署流程创建流程实例。包含以下几个步骤: 一、引入activiti依赖的jar包 创建spring boot的maven项目,在pom文件中添加如下依赖...
  • OpenStack虚机网卡的创建过程

    千次阅读 2017-12-06 21:57:48
    OpenStack最基本和常用的操作就是启动虚机。虚机启动的过程中涉及很多内容,其中非常重要的一个环节就是创建并绑定虚机的虚拟网卡。虚机的创建和管理是Nova的任务,...这次介绍一下,OpenStack中虚机的网卡的创建过程
  • springboot-Bean的创建过程

    千次阅读 2018-12-20 16:19:01
    Bean的创建过程: DefaultListableBeanFactory-&gt;AbstractBeanFactory-&gt;AbstractAutowireCapableBeanFactory DefaultListableBeanFactory:执行创建bean前的准备操作,如:将factory注册表所有的...
  • 继承关系的对象创建过程

    千次阅读 2016-08-25 19:01:27
    继承关系的对象创建过程
  • LINUX系统和WINDOWS系统进程创建流程

    千次阅读 2018-09-06 17:04:23
    windows进程创建流程 windows系统提供给用户的创建函数接口名称为CreateProcess(),下面我们通过分析系统中的这个函数的具体实现过程来阐述系统是如何 从无到有将一个新进程带入到操作系统的运行中去的。 来源...
  • activiti6.0入门(二)-创建流程

    千次阅读 2019-07-06 14:24:01
    创建流程 你已经按着第一篇完成了服务的搭建,登录后,选择第三个模块 Identity management(身份管理) —> Users 到如下界面 这里是一个创建用户的页面,由于是新服务,所以用户为空,可以具体创建用户就不贴...
  • SAP Query创建过程

    千次阅读 2013-06-30 15:20:19
    【原】图解SAP Query创建过程 【原创,转载请注明出处,谢谢!】 制作SAP Query可以用到SQ03(创建用户组并分配用户)、SQ02(创建InfoSet并分配到用户组)、SQ01(在分配好的用户组中使用信息集来生成Query ...
  • 干货!K8S之pod创建流程+调度约束

    千次阅读 2020-05-23 16:12:27
    文章目录一、pod创建过程二、调度方式(指定节点创建pod) 一、pod创建过程 Kubernetes通过watch的机制进行每个组件的协作,每个组件之间的设计实现了解耦。 用户使用create yaml创建pod,请求给apiseerver,api...
  • activiti创建流程23张表结构

    千次阅读 2015-01-07 22:01:28
    1、创建流程引擎配置类 ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration(); 2、设置流程引擎配置类 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,753,573
精华内容 1,501,429
关键字:

创建过程