欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    应用软件工程师岗位培训课程常用操作系统.ppt

    • 资源ID:5723717       资源大小:697KB        全文页数:56页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    应用软件工程师岗位培训课程常用操作系统.ppt

    常用操作系统,钱青海,windows版本及开发工具简介 进程 线程 线程的建立与退出 线程调度 线程同步 动态连接库 与其它操作系统区别,windows版本,Windows1.0Windows是由微软在1983年11月(在Lisa之后,Macintosh之前)宣布,并在两年后(1985年11月)发行。在此后的两年中,紧随着Microsoft Windows早期版本1.0之后,又推出了几种改进版本,以支持国际商业市场,并提供新型视讯显示器和打印机的驱动程序。Windows2.0Windows版本2.0是在1987年11月正式在市场上推出的。该版本对使用者接口做了一些改进。这些改进中最有效的是使用了可重迭式窗口,而Windows 1.0中使用的是并排式窗口。Windows 2.0还增强了键盘和鼠标接口,特别是加入了菜单和对话框。Windows3.xMicrosoft Windows版本3.1是1992年4月发布的,其中包括的几个重要特性是TrueType字体技术(给Windows带来可缩放的轮廓字体)、多媒体(声音和音乐)、对象连结和嵌入(OLE:Object Linking and Embedding)和通用对话框。跟OS/2一样,Windows 3.1只能在保护模式下运作,并且要求至少配置了1MB内存的286或386处理器。Window NT在1993年7月发表的Windows NT是第一个支持Intel 386、486和Pentium微处理器32位保护模式的Windows版本。Windows NT提供32位平坦寻址,并使用32位的指令集。(本章后面我会谈到一些寻址空间的问题)。Windows NT还可以移植到非Intel处理器上,并在几种使用RISC芯片的工作站上执行。,windows版本,Windows95/98Windows 95是在1995年8月发布的。和Windows NT一样,Windows 95也支持Intel 386或更高等级处理器的32位,但是Windows 95具有需要较少硬件资源的优点。Windows 98在1998年6月发布,具有保护模式。虽然它缺少Windows NT中的某些功能,诸如高安全性和对RISC机器的可移植性等许多加强功能,包括执行效能的提高、更好的硬件支持以及与因特网和全球信息网(WWW)更紧密的结合。Windows ME 2000年9月微软公司发行32位图形操作系统Windows ME,该操作系统是在Windows 95和Windows 98的基础上开发的。Window2000Windows 2000有四个版本:Professional、Server、Advanced Server和Datacenter Server。所有版本的Windows 2000都有共同的一些新特征:NTFS5,新的NTFS文件系统;EFS,允许对磁盘上的所有文件进行加密;WDM,增强对硬件的支持。WindowXP2001年10月微软发布了Windows XP,它包括了简化了的Windows 2000的用户安全特性,并整合了防火墙,以用来确保长期以来一直困扰微软的安全问题。WINDOWS 2003 2003年1月发布的Windows2003大量继承了Windows XP的友好操作性和Windows 2000 sever的网络特性,是一个同时适合个人用户和服务器使用的操作系统。Windows 2003完全延续了Windows XP安装时方便、快捷、高效的特点,几乎不需要多少人工参与就可以自动完成硬件的检测、安装、配置等工作。虽然在名称上,Windows 2003又延续了Windows家族的习惯命名法则,但从其提供的各种内置服务以及重新设计的内核程序来说,Windows 2003与Windows 2000/XP有着本质的区别。,windows开发工具,常见的Windows应用程序开发语言和工具:Microsoft Visual C+Microsoft Visual Basic Microsoft Visual J+Borland Delphi,windows版本及开发工具简介 进程 线程 线程的建立与退出 线程调度 线程同步 动态连接库 与其它操作系统区别,进程,进程通常被定义为一个正在运行的程序的实例,它由两个部分组成:操作系统用来管理进程的内核对象。地址空间,它包含所有可执行模块或DLL模块的代码和数据。它还包含动态内存分配的空间。如线程堆栈和堆分配空间。每个进程至少拥有一个线程,来执行进程的地址空间中的代码。,进程句柄和优先级,进程的实例句柄加载到进程地址空间的每个可执行文件或DLL文件均被赋予一个独一无二的实例句柄。对于加载资源的函数调用来说,通常都需要该句柄的值。表示进程句柄的两种数据类型:HMODULE与HINSTANCE,进程的优先级,创建进程,创建进程的几种方式:调用ShellExecute函数调用WinExec函数调用Createprocess函数函数原型:HINSTANCE ShellExecute(HWND hwnd,LPCTSTR lpOperation,LPCTSTR lpFile,LPCTSTR lpParameters,LPCTSTR lpDirectory,INT nShowCmd);UINT WinExec(LPCSTR lpCmdLine,UINT uCmdShow);BOOL CreateProcess(LPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFO lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation);,终止进程,终止进程运行常用的四种方式:主线程的进入点函数返回进程中的一个线程调用ExitProcess函数一个进程中的线程调用TerminateProcess函数(应该避免使用这种方法)程中的所有线程自行终止运行(这种情况非常少)。,终止进程,思考调用和不调用ExitProcess函数程序输出结果的不同:class CSamplepublic:CSample()printf(“Constructorn);CSample()printf(“Destructorn);CSample g_SampleObj;void main()CSample SampleObj;ExitProcess(0);,不调用ExitProcess函数的输出结果:ConstructorConstructorDestructorDestructor调用ExitProcess函数的输出结果:ConstructorConstructor,进程间通信方式,文件映射 文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容。Win32 API允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针。通过使用这些指针,不同进程就可以读或修改文件的内容,实现了对文件中数据的共享。应用程序有三种方法来使多个进程共享一个文件映射对象:继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄;命名文件映射:第一个进程在建立文件映射对象时可以给该对象指定一个名字(可与文件名不同)。第二个进程可通过这个名字打开此文件映射对象。另外,第一个进程也可以通过一些其它IPC机制(有名管道、邮件槽等)把名字传给第二个进程。句柄复制:第一个进程建立文件映射对象,然后通过其它IPC机制(有名管道、邮件槽等)把对象句柄传递给第二个进程。第二个进程复制该句柄就取得对该文件映射对象的访问权限。,进程间通信方式,共享内存Win32 API中共享内存(Shared Memory)实际就是文件映射的一种特殊情况。进程在创建文件映射对象时用0 xFFFFFFFF来代替文件句柄(HANDLE),就表示了对应的文件映射对象是从操作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。由于共享内存是用文件映射实现的,所以它也有较好的安全性,也只能运行于同一计算机上的进程之间。匿名管道 匿名管道(Anonymous Pipe)是在父进程和子进程之间,或同一父进程的两个子进程之间传输数据的无名字的单向管道。通常由父进程创建管道,然后由要通信的子进程继承通道的读端点句柄或写端点句柄,然后实现通信。父进程还可以建立两个或更多个继承匿名管道读和写句柄的子进程。这些子进程可以使用管道直接通信,不需要通过父进程。匿名管道是单机上实现子进程标准I/O重定向的有效方法,它不能在网上使用,也不能用于两个不相关的进程之间。,进程间通信方式,命名管道 命名管道(Named Pipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是命名管道可以在不相关的进程之间和不同计算机之间使用,服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。命名管道提供了相对简单的编程接口,使通过网络传输数据并不比同一计算机上两进程之间通信更困难,但它不适合同时和多个进程通信。邮件槽 邮件槽(Mailslots)提供进程间单向通信能力,任何进程都能建立邮件槽成为邮件槽服务器。其它进程,称为邮件槽客户,可以通过邮件槽的名字给邮件槽服务器进程发送消息。进来的消息一直放在邮件槽中,直到服务器进程读取它为止。一个进程既可以是邮件槽服务器也可以是邮件槽客户,因此可建立多个邮件槽实现进程间的双向通信。,进程间通信方式,剪贴板 剪贴板(Clipped Board)实质是Win32 API中一组用来传输数据的函数和消息,为Windows应用程序之间进行数据共享提供了一个中介,Windows已建立的剪切(复制)粘贴的机制为不同应用程序之间共享不同格式数据提供了一条捷径。当用户在应用程序中执行剪切或复制操作时,应用程序把选取的数据用一种或多种格式放在剪贴板上。然后任何其它应用程序都可以从剪贴板上拾取数据,从给定格式中选择适合自己的格式。动态数据交换 动态数据交换(DDE)是使用共享内存在应用程序之间进行数据交换的一种进程间通信形式。应用程序可以使用DDE进行一次性数据传输,也可以当出现新数据时,通过发送更新值在应用程序间动态交换数据。对象连接与嵌入 应用程序利用对象连接与嵌入(OLE)技术管理复合文档(由多种数据格式组成的文档),OLE提供使某应用程序更容易调用其它应用程序进行数据编辑的服务。,进程间通信方式,动态连接库 Win32动态连接库(DLL)中的全局数据可以被调用DLL的所有进程共享,这就又给进程间通信开辟了一条新的途径,当然访问时要注意同步问题。远程过程调用 Win32 API提供的远程过程调用(RPC)使应用程序可以使用远程调用函数,这使在网络上用RPC进行进程通信就像函数调用那样简单。RPC既可以在单机不同进程间使用也可以在网络中使用。NetBios函数 Win32 API提供NetBios函数用于处理低级网络控制,这主要是为IBM NetBios系统编写与Windows的接口。除非那些有特殊低级网络功能要求的应用程序,其它应用程序最好不要使用NetBios函数来进行进程间通信。,进程间通信方式,SocketsWindows Sockets规范是一套Windows下的网络编程接口。它不仅支持TCP/IP协议,而且还支持其它协议(如IPX),使程序员可以充分利用Windows的消息机制进行编程。WM_COPYDATA消息 WM_COPYDATA是一种非常强大的消息。当一个应用向另一个应用传送数据时,发送方只需使用调用SendMessage函数,参数是目的窗口的句柄、传递数据的起始地址、WM_COPYDATA消息。接收方只需像处理其它消息那样处理WM_COPY DATA消息,这样收发双方就实现了数据共享。,常用的进程相关函数,GetExitCodeProcess 检索进程退出码GetGuiResources 确定有多少用户或图形设备接口(GUI)对象在使用中SetPriorityClass 设置进程的基准优先级GetPriorityClass 获得进程的基准优先级SetProcessAffinityMask 确定进程选择那个CPUGetProcessAffinityMask 设置为进程所选择的CPUSetProcessPriorityBoost 允许或禁止来自动态地改变进程优先级的WindowsGetProcessPriorityBoost 读取优先级增加状态SetProcessShutDownParameters 在系统关闭过程中GetProcessShutDownParameters 读取关闭参数SetProcessWorkingSetSize 设置进程占用的最小和最大物理存储器GetProcessWorkingSetSize 读取工作区TerminateProcess 缓和地终止进程ExitProcess 突然终止进程GetProcessVersion 确定进程期望的Windows版本GetProcessTimes 获取进程的CPU占用率GetStartUpInfo 获取作为传送到CreateProcess的启动结构,windows版本及开发工具简介 进程 线程 线程的建立与退出 线程调度 线程同步 动态连接库 与其它操作系统区别,线程,线程是由两个部分组成的:线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量。,线程的创建,创建线程的三种方法:激活一个新进程调用Win32 API函数CreateThread调用C运行库函数_beginthread/_beginthreadex函数原型:HANDLE CreateThread(SEC_ATTRS SecurityAttributes,ULONG StackSize,SEC_THREAD_START StartFunction,PVOID ThreadParameter,ULONG CreationFlags,PULONG ThreadId);uintptr_t _beginthread(void(_cdecl*start_address)(void*),unsigned stack_size,void*arglist);uintptr_t _beginthreadex(void*security,unsigned stack_size,unsigned(_stdcall*start_address)(void*),void*arglist,unsigned initflag,unsigned*thrdaddr);,线程的终止,若要终止线程的运行,可以使用下面的方法:线程函数返回(最好使用这种方法)。通过调用ExitThread(或_endthread/_endthreadex)函数,线程将自行撤消(最好不要使用这种方法)。同一个进程或另一个进程中的线程调用TerminateThread函数(应该避免使用这种方法)。包含线程的进程终止运行(应该避免使用这种方法)。,线程的终止,线程终止运行时发生的操作:线程拥有的所有用户对象均被释放。在Windows中,大多数对象是由包含创建这些对象的线程的进程拥有的。但是一个线程拥有两个用户对象,即窗口和挂钩。当线程终止运行时,系统会自动撤消任何窗口,并且卸载线程创建的或安装的任何挂钩。其他对象只有在拥有线程的进程终止运行时才被撤消。线程的退出代码从STILL_ACTIVE改为传递给ExitThread或TerminateThread的代码。线程内核对象的状态变为已通知。如果线程是进程中最后一个活动线程,系统也将进程视为已经终止运行。线程内核对象的使用计数递减1。,线程的优先级,线程的优先级获取线程的优先级int GetThreadPriority(HANDLE hThread);设置线程的优先级BOOL SetThreadPriority(HANDLE hThread,int nPriority);,线程的优先级,进程优先级类和线程相对优先级的映射,线程调度,线程调度的方法:暂停和恢复线程的运行调用SuspendThread函数暂停一个线程的执行DWORD SuspendThread(HANDLE hThread);调用ResumeThread函数恢复一个线程的执行DWORD ResumeThread(HANDLE hThread);睡眠方式调用Sleep函数告诉系统本线程不想在某个时间段被调度VOID Sleep(DWORD dwMilliseconds);转换到另一个线程调用SwitchToThread的函数使另一个线程得到调度BOOL SwitchToThread(VOID);,线程同步,线程可以使自己进入等待状态,直到一个对象变为已通知状态。可处于已通知状态或未通知状态的内核对象:进程文件修改通知线程事件作业可等待定时器文件信标控制台输入互斥对象,线程同步,常用等待函数:等待一个内核对象变为已通知状态函数:DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds)等待多个内核对象变为已通知状态函数:DWORD WaitForMultipleObjects(DWORD nCount,CONST HANDLE*lpHandles,BOOL bWaitAll,DWORD dwMilliseconds);,事件内核对象,创建事件内核对象:HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,BOOL bInitialState,LPCTSTR lpName);打开事件内核对象:HANDLE OpenEvent(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName);将事件改为已通知状态:BOOL SetEvent(HANDLE hEvent);将事件改为未通知状态:BOOL ResetEvent(HANDLE hEvent);,示例,人工重置事件,自动重置事件,信标内核对象,信标内核对象的创建HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttribute,LONG lInitialCount,LONG lMaximumCount,LPCTSTR lpName);打开信标内核对象HANDLE OpenSemaphore(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName);释放信标资源:BOOL ReleaseSemaphore(HANDLE hSemaphore,LONG lReleaseCount,LPLONG lpPreviousCount);,信标内核对象使用示例,互斥对象内核对象,互斥对象的创建HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName);打开互斥对象HANDLE OpenMutex(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName);释放互斥对象BOOL ReleaseMutex(HANDLE hMutex);,内核对象与线程同步之间的相互关系,windows版本及开发工具简介 进程 线程 线程的建立与退出 线程调度 线程同步 动态连接库 与其它操作系统区别,库,什么是库?库的分类静态链接库动态链接库,动态连接库,为什么使用DLL扩展了应用程序的特性。可以用许多种编程语言来编写。简化了软件项目的管理有助于节省内存有助于资源的共享有助于应用程序的本地化有助于解决平台差异可以用于一些特殊的目的,动态连接库,动态链接库的入口/出口点,动态链接库,导出和导入DLL函数和数据在库的.def文件的EXPROTS部分中填写出导出项目的名称 使用工具相关的方法,比如Visual C+所使用的_declspec(dllexport)关键字。,动态链接库,动态链接库的调用隐式调用让应用程序的源代码只引用DLL中包含的符号。这样,当应用程序启动运行时,加载程序就能够隐含加载(和链接)需要的DLL。显式调用在应用程序运行时让应用程序显式加载需要的DLL并且显式链接到需要的输出符号。显式加载:HMODULE LoadLibrary(LPCTSTR lpFileName);显式卸载:BOOL FreeLibrary(HMODULE hModule);显式链接到一个输出符号:FARPROC GetProcAddress(HMODULE hModule,LPCSTR lpProcName);,线程调用LoadLibrary时执行的操作步骤,线程调用FreeLibrary时执行的操作步骤,常用的线程相关函数,AttachThreadInput 选用线程的处理另外的线程允许的输入,其中,要设置的权能集中在每一个另外的窗口和共享输入状态CreateRemoteThread 在另一个进程中,创建线程CreateThread 在当前进程中创建线程ExitThread 退出当前线程TerminateThread 没有适当地清除情况下,终止线程GetCurrentTherad 得到当前线程句柄GetCurrentThreadId 得到当前线程IDGetExitCodeThread 得到线程的退出代码SetTheradPriority 设置线程优先级GetThreadPriority 读取线程优先级SetThreadPriorityBoost 使能或不使该线程的动态优先级增加GetThreadPriorityBoost 读取该线程动态优先级增加的状态GetThreadTimes 确定被创建、破坏的线程以及使用了多少进程时间SuspendThread 挂起线程ResumeThread 恢复线程(每个命令必须调用SuspendThread一次)SetThreadAffinityMask 确定线程在那个进程中运行SetThreadIdealProcessor 设置线程所选择运行的处理机SwitchToThread 使处理机放弃另外的线程(没有选择哪个线程),windows版本及开发工具简介 进程 线程 线程的建立与退出 线程调度 线程同步 动态连接库 与其它操作系统区别,目前常见操作系统有 LINUX UNIX vxworks windows,嵌入式系统,嵌入式系统嵌入式系统是以嵌入式计算机为技术核心,面向用户、面向产品、面向应用,软硬件可裁减的;适用于对功能、可靠性、成本体积、功耗等综合性能有严格要求的专用计算机系统。嵌入式系统的特点:高可靠性实时性和具体应用有机地结合在一起软件代码要求高质量、高可靠性一般都固化在只读存储器中或间存中,嵌入式操作系统,嵌入式操作系统嵌入式操作系统EOS(Embedded OperatingSystem)是一种用途广泛的系统软件,过去它主要应用于工业控制和国防系统领域。EOS负责嵌人系统的全部软、硬件资源的分配、调度工作,控制协调并发活动;它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能。嵌入式操作系统特有功能可装卸性 强实时性 统一的接口 操作方便、简单、提供友好的图形GUI 提供强大的网络功能 强稳定性,弱交互性 固化代码 更好的硬件适应性,常用嵌入式操作系统,常用嵌入式操作系统PALM OS Windows CE Linux VxWorks,常用嵌入式操作系统,PALM OS 优点操作系统的节能功能 合理的内存管理 数据是以数据库(database)的格式来存储的 外围硬件十分丰富,常用嵌入式操作系统,Windows CE优点具有灵活的电源管理功能,包括睡眠/唤醒摸式高效率的操作系统特性拥有良好的通信能力 支持嵌套中断 更好的线程响应能力 拥有256个优先级别 支持近1500个Win32 API,常用嵌入式操作系统,Linux优点精简的内核,性能高、稳定,多任务适用于不同的CPU,支持多种体系结构 能够提供完善的嵌人式GUI以及嵌入式X.Wifld。WS。提供完整的开发工具和SDK,同时提供PC上的开发版本 用户可定制,可提供图形化的定制和配置工具 常用嵌入式芯片的驱动集,支持大量的周边硬件设备,驱动丰富 针对嵌人式的存储方案,提供实时版本和完善的嵌入式解决方案 完善的中文支持,强大的技术支持,完整的文档 开放源码,丰富的软件资源,广泛的软件开发者的支持,价格低廉,结构灵活,适用面广,常用嵌入式操作系统,Linux OS与 Windows CE的比较Linux是开放源代码的,不存在黑箱技术,遍布全球的众多Linux爱好者都是Linux开发者的强大技术支持者;而Windows CE是非开放性OS;使第三方很难实现产品的定制。Linux的源代码随处可得,注释丰富,文档齐全,易干解决各种问题。Linux的内核小、效率高;而 Windows CE在这方面是笨拙的,占用过多的RAM,应用程序庞大。Linux是开放源代码的OS,在价格上极具竞争力,适合中国国情。Windows CE的版权费用是厂家不得不考虑的因素。Linux不仅支持X86芯片,还是一个跨平台的系统。到目前为止,它可以支持2030种CPU,很多 CPU(包括家电业的芯片)厂商都开始做Linux的平台移植工作,而且移植的速度远远超过Java的开发环境。如果今天采用Linux环境开发产品,那么将来更换CPU时就不会遇到更换平台的困扰。Linux内核的结构在网络方面是非常完整的,它提供了对包括十兆位、百兆位及千兆位的以太网,还有无线网络、Token ring(令牌环)和光纤甚至卫星的支持 Linux在内核结构的设计中考虑适应系统的可裁减性的要求,windows CE在内核结构的设计中并未考虑适应系统的高度可裁减性的要求,常用嵌入式操作系统,VxWorks优点支持广泛的工业标准 具备一个高效的微内核 具有可伸缩性,结束,

    注意事项

    本文(应用软件工程师岗位培训课程常用操作系统.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开