【Android】系统启动流程分析 —— SystemServer 处理过程
本文基于 Android 14.0.0_r2 的系统启动流程分析。
SystemServer 进程主要用于创建系统服务,我们熟知的 AMS、WMS 和 PMS 都是由它来创建的,因此掌握 SystemServer 进程是如何启动的,它在启动时做了哪些工作是十分必要的。
一、源码解析
-
ZygoteInit 的
handleSystemServerProcess下面的子方法去调用了com.android.server.SystemServer的main方法,至此 SystemServer 就创建和启动完毕了:路径:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.javapublic static void main(String[] argv) {...Runnable caller;try {...if (startSystemServer) {Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);...}...}... }路径:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.javaprivate static Runnable forkSystemServer(String abiList, String socketName,ZygoteServer zygoteServer) {...if (pid == 0) {...return handleSystemServerProcess(parsedArgs);}... }路径:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.javaprivate static Runnable handleSystemServerProcess(ZygoteArguments parsedArgs) {...if (parsedArgs.mInvokeWith != null) {...} else {...return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion,parsedArgs.mDisabledCompatChanges,parsedArgs.mRemainingArgs, cl);} }路径:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.javapublic static Runnable zygoteInit(int targetSdkVersion, long[] disabledCompatChanges,String[] argv, ClassLoader classLoader) {...return RuntimeInit.applicationInit(targetSdkVersion, disabledCompatChanges, argv,classLoader); }路径:/frameworks/base/core/java/com/android/internal/os/RuntimeInit.javaprotected static Runnable applicationInit(int targetSdkVersion, long[] disabledCompatChanges,String[] argv, ClassLoader classLoader) {...return findStaticMain(args.startClass, args.startArgs, classLoader); }路径:/frameworks/base/core/java/com/android/internal/os/RuntimeInit.javaprotected static Runnable findStaticMain(String className, String[] argv,ClassLoader classLoader) {Class<?> cl;try {// 反射拿到 SystemServer 类cl = Class.forName(className, true, classLoader);} catch (ClassNotFoundException ex) {...}Method m;try {// 反射拿到 SystemServer.java 的 main 函数,并启动。m = cl.getMethod("main", new Class[] { String[].class });} catch (NoSuchMethodException ex) {...} catch (SecurityException ex) {...}...return new MethodAndArgsCaller(m, argv); } -
SystemServer.run
路径:/frameworks/base/services/java/com/android/server/SystemServer.javapublic static void main(String[] args) {new SystemServer().run(); }路径:/frameworks/base/services/java/com/android/server/SystemServer.javaprivate void run() {...try {...// 设置系统语言、国家、时区相关。if (!SystemProperties.get("persist.sys.language").isEmpty()) {final String languageTag = Locale.getDefault().toLanguageTag();SystemProperties.set("persist.sys.locale", languageTag);SystemProperties.set("persist.sys.language", "");SystemProperties.set("persist.sys.country", "");SystemProperties.set("persist.sys.localevar", "");}...// 设置 main 线程的优先级,有此可得主线程就是 SystemServer 进程下的其中线程。android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);android.os.Process.setCanSelfBackground(false);// 开始主线程的运行,和 Looper.loop 配对使用。// 运行在 Looper.prepareMainLooper() ~ Looper.loop(),之间的就是运行在主线程中。Looper.prepareMainLooper();Looper.getMainLooper().setSlowLogThresholdMs(SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);...// 初始化 native services,加载 android_servers 库(libandroid_servers.so)。System.loadLibrary("android_servers");...// 通过 ActivityThread 来创建 system 上下文。createSystemContext();// 初始化 ActivityThread,创建 TelephonyServiceManager、StatsServiceManager、MediaServiceManager。ActivityThread.initializeMainlineModules();// 将 SystemServer 加入 ServiceManager(binder 线程池)。// 每个继承自 SystemServer 或属于 SystemServer 进程的服务都将加入到 ServiceManager 中的线程池中。ServiceManager.addService("system_server_dumper", mDumper);mDumper.addDumpable(this);// 每个 server 基本上对应了一个 manager,对外提供的 API 也是只能获取到 manager。// 创建 SystemServiceManager,它会对系统的服务进行创建、启动和生命周期管理,启动系统的各种服务。mSystemServiceManager = new SystemServiceManager(mSystemContext);mSystemServiceManager.setStartInfo(mRuntimeRestart,mRuntimeStartElapsedTime, mRuntimeStartUptime);mDumper.addDumpable(mSystemServiceManager);// LocalServices 是 system_server 进程中各个服务提供的本地服务。// system_server 进程中每个服务都可以往 LocalServices 放对象。// 有些核心服务是继承自 SystemServer,LocalServices 是公开缓存池目的是解耦。LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);...}...// 启动 Services。try {t.traceBegin("StartServices");// 启动系统启动所需的一系列关键服务:AMS,P(power/package)MS,SensorService,DisplayManagerService,LightService 等。startBootstrapServices(t);// 启动核心服务:BatteryService,GpuService 等。startCoreServices(t);// 启动其他服务:VibratorManagerService,闹钟服务,相机服务,网络服务,输入法服务,存储服务等。startOtherServices(t);// 以上的所有服务都由 mSystemServiceManager 来启动,所以都是继承自 SystemServer。// 分别是引导服务、核心服务和其他服务// [引导服务]// Installer 系统安装 apk 时的一个服务类,启动完成 Installer 服务之后才能启动其他的系统服务。// ActivityManagerService 负责四大组件的启动、切换、调度。// PowerManagerService 计算系统中和Power相关的计算,然后决策系统应该如何反应。// LightsService 管理和显示背光LED。// DisplayManagerService 用来管理所有显示设备。// UserManagerService 多用户模式管理。// SensorService 为系统提供各种感应器服务。// PackageManagerService 用来对 apk 进行安装、解析、删除、卸载等等操作。// [核心服务]// BatteryService 管理电池相关的服务。// UsageStatsService 收集用户使用每一个 APP 的频率、使用时常。// WebViewUpdateService WebView 更新服务。// [其他服务]// CameraService 摄像头相关服务。// AlarmManagerService 全局定时器管理服务。// InputManagerService 管理输入事件。// WindowManagerService 窗口管理服务。// VrManagerService VR模式管理服务。// BluetoothService 蓝牙管理服务。// NotificationManagerService 通知管理服务。// DeviceStorageMonitorService 存储相关管理服务。// LocationManagerService 定位管理服务。// AudioService 音频相关管理服务。...}...// 主线程Looper.loop();// 若执行到这里说明主线程意外退出了。// 主线程:Looper.prepareMainlooper ~ Looper.loop 之间。throw new RuntimeException("Main thread loop unexpectedly exited"); }以上方法可以看出来关于其他服务的启动都是运行在主线程中的 Looper.prepareMainlooper ~ Looper.loop 之间,每个 SystemServer 中的服务都有一个 binder,会加入到 ServiceManager 的 binder 线程池中统一管理,这样拿到全局的 ServiceManager,根据 AIDL 获取到每个 Service 了。
-
startBootstrapServices(t)
启动系统启动所需的一系列关键服务:AMS,P(power/package)MS,SensorService,DisplayManagerService,LightService 等。
-
startCoreServices(t)
启动核心服务:BatteryService,GpuService 等。
-
startOtherServices(t)
启动其他服务:VibratorManagerService,闹钟服务,相机服务,网络服务,输入法服务,存储服务等。
在这些启动的服务里(调用了 onStart 启动服务),都会将服务存入 ServiceManager 用来管理系统中的各种 Service,用于系统 C/S 架构中的 Binder 机制通信:Client 端要使用某个 Service,则需要先到 ServiceManager 查询 Service 的相关信息,然后根据 Service 的相关信息与 Service 所在的 Server 进程建立通讯通路,这样 Client 端就可以使用 Service 了。
-
-
各类系统服务的作用
引导服务(startBootstrapServices) 作用 ActivityManagerService 负责四大组件的启动、切换、调度 PowerManagerService 计算系统中和 Power 相关的计算,然后决策系统应该如何反应 Installer 系统安装 apk 时的一个服务类,启动完成 Installer 服务之后才能启动其他的系统服务 LightsService 管理和显示背光 LED DisplayManagerService 用来管理所有显示设备 PackageManagerService 用来对 apk 进行安装、解析、删除、卸载等等操作 SensorService 为系统提供各种感应器服务 核心服务(startCoreServices) 作用 BatteryService 管理电池相关的服务 GpuService 硬件显示服务 WebViewUpdateService WebView 更新服务 其他服务(startOtherServices) 作用 CameraService 摄像头相关服务 AlarmManagerService 全局定时器管理服务 InputManagerService 管理输入事件 WindowManagerService 窗口管理服务 BluetoothService 蓝牙管理服务 PackageManagerService 用来对 apk 进行安装、解析、删除、卸载等等操作 SensorService 为系统提供各种感应器服务 LocationManagerService 定位管理服务 … … -
SystemServer.startBootstrapServices
路径:/frameworks/base/services/java/com/android/server/SystemServer.javaprivate void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {...// 尽早启动看门狗,以便在早期启动过程中出现死锁时使系统服务器崩溃。t.traceBegin("StartWatchdog");// 启动看门狗,看门狗需要定时喂狗,若喂狗超时则会触发重启,以便知道进程和服务是否正常运行。final Watchdog watchdog = Watchdog.getInstance();watchdog.start();mDumper.addDumpable(watchdog);t.traceEnd();...t.traceBegin("StartInstaller");// 通过 mSystemServiceManager 来启动 Installer 服务,管理应用的安装与卸载。Installer installer = mSystemServiceManager.startService(Installer.class);t.traceEnd();...// 通过 mSystemServiceManager 来启动 UriGrantsManagerService,管理 Uri。t.traceBegin("UriGrantsManagerService");mSystemServiceManager.startService(UriGrantsManagerService.Lifecycle.class);t.traceEnd();// 通过 mSystemServiceManager 来启动 PowerStatsService,管理电源状态。t.traceBegin("StartPowerStatsService");mSystemServiceManager.startService(PowerStatsService.class);t.traceEnd();...t.traceBegin("StartActivityManager");// 通过 mSystemServiceManager 来启动 ActivityTaskManagerService,管理 Activity 任务栈。ActivityTaskManagerService atm = mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getService();// 启动 ActivityManagerService,管理 Activity 等。mActivityManagerService = ActivityManagerService.Lifecycle.startService(mSystemServiceManager, atm);// 让 ActivityManagerService 拿到 systemServer,例如可以通过 mSystemServiceManager 来判断系统是否启动完成。mActivityManagerService.setSystemServiceManager(mSystemServiceManager);mActivityManagerService.setInstaller(installer);mWindowManagerGlobalLock = atm.getGlobalLock();t.traceEnd();...// 启用 PowerManagerService 服务,电源管理服务。t.traceBegin("StartPowerManager");mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);t.traceEnd();...// 启动屏幕亮度服务,比如亮度调整。t.traceBegin("StartLightsService");mSystemServiceManager.startService(LightsService.class);t.traceEnd();...// 启动屏幕显示服务。t.traceBegin("StartDisplayManager");mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);t.traceEnd();...try {...// 启动 PMS,包管理服务。mPackageManagerService = PackageManagerService.main(mSystemContext, installer, domainVerificationService,mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF);} finally {Watchdog.getInstance().resumeWatchingCurrentThread("packagemanagermain");}...// 启动传感器服务。t.traceBegin("StartSensorService");mSystemServiceManager.startService(SensorService.class);t.traceEnd();t.traceEnd(); }可以看到大多数服务都是通过 mSystemServiceManager.startService 来启动,接下来看看 startService 方法内容。
-
SystemServiceManager.startService
路径:/frameworks/base/services/core/java/com/android/server/SystemServiceManager.javapublic <T extends SystemService> T startService(Class<T> serviceClass) {try {final String name = serviceClass.getName();...final T service;try {// 反射拿到该 Java 类Constructor<T> constructor = serviceClass.getConstructor(Context.class);service = constructor.newInstance(mContext);}...// 将当前服务(Java类)加入 SystemService 服务队列中,统一管理。startService(service);return service;} finally {Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);} }路径:/frameworks/base/services/core/java/com/android/server/SystemServiceManager.javapublic void startService(@NonNull final SystemService service) {...// 将当前服务加入 mServices 队列中。mServices.add(service);long time = SystemClock.elapsedRealtime();try {// 调用当前服务的 onStart 来启动服务。service.onStart();} catch (RuntimeException ex) {...}warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart"); }可以看到 startService 方法就是反射拿到服务类,然后加入队列中,调用其 onStart 方法进行启动。
-
ServiceManager 服务管理
每个属于 SystemServer 的服务都将加入到 ServiceManager 的 binder 线程池中,以供后续直接获取和管理。就拿 BatteryService 服务来讲解:
路径:/frameworks/base/services/java/com/android/server/SystemServer.javamSystemServiceManager.startService(BatteryService.class);已知 startService 后会调用 BatteryService 服务的 onStart 方法,继续看看 onStart 内部:
路径:/frameworks/base/services/core/java/com/android/server/BatteryService.java@Override public void onStart() {...mBinderService = new BinderService();// 将 BinderService 服务加入 ServiceManager 中。publishBinderService("battery", mBinderService);mBatteryPropertiesRegistrar = new BatteryPropertiesRegistrar();// 将 batteryproperties 服务加入 ServiceManager 中。publishBinderService("batteryproperties", mBatteryPropertiesRegistrar);// 将 BinderService 服务加入到 LocalServices 中。publishLocalService(BatteryManagerInternal.class, new LocalService()); }继续看看 mBinderService 具体是什么,又是如何加入到 ServiceManager 中的:
路径:/frameworks/base/services/core/java/com/android/server/BatteryService.javaprivate final class BinderService extends Binder {... }可以看到 mBinderService 就是一个 Binder,然后调用 publishBinderService 加入到 ServiceManager 中的 binder 线程池中:
路径:/frameworks/base/services/core/java/com/android/server/SystemService.javaprotected final void publishBinderService(String name, IBinder service,boolean allowIsolated, int dumpPriority) {ServiceManager.addService(name, service, allowIsolated, dumpPriority); }调用 ServiceManager.addService 加入到 binder 线程池中,而 ServiceManager 服务早就在 servicemanager.rc 文件中作为核心服务启动了:
路径:/frameworks/native/cmds/servicemanager/servicemanager.rcservice servicemanager /system/bin/servicemanagerclass core animationuser systemgroup system readproccriticalfile /dev/kmsg wonrestart setprop servicemanager.ready falseonrestart restart --only-if-running apexdonrestart restart audioserveronrestart restart gatekeeperdonrestart class_restart --only-enabled mainonrestart class_restart --only-enabled halonrestart class_restart --only-enabled early_haltask_profiles ServiceCapacityLowshutdown critical
二、总结
SystemServer 作为 Android 系统的核心组成部分之一,通过 fork 自 init 进程,在启动过程中创建并启动各类系统服务(核心服务、引导服务、其他服务),并将这些服务内建的 Binder 实例注册到 ServiceManager 的 binder 线程池中,从而实现了系统服务的高效管理和跨进程通信。
参考
基于Android13的系统启动流程分析(六)之SystemServer内部逻辑分析
相关文章:
【Android】系统启动流程分析 —— SystemServer 处理过程
本文基于 Android 14.0.0_r2 的系统启动流程分析。 SystemServer 进程主要用于创建系统服务,我们熟知的 AMS、WMS 和 PMS 都是由它来创建的,因此掌握 SystemServer 进程是如何启动的,它在启动时做了哪些工作是十分必要的。 一、源码解析 Zyg…...
Web前端—属性描述符
属性描述符 假设有一个对象obj var obj {a:1 }观察这个对象,我们如何来描述属性a: 值为1可以重写可以遍历 我们可以通过Object.getOwnPropertyDescriptor得到它的属性描述符 var desc Object.getOwnPropertyDescriptor(obj, a); console.log(desc);我…...
SpringBoot及其特性
0.前言 Spring 框架提供了很多现成的功能。那么什么是 Spring Boot?使用 Spring 框架,我们可以避免编写基础框架并快速开发应用程序。为了让 Spring 框架提供基础框架,我们需要向 Spring 框架描述有关我们的应用程序及其组件的信息。 不只是…...
「JavaEE」初识进程
初识进程 🍉进程🍌操作系统的进程管理 🍉PCB 重要属性🍌进程的身份标识🍌内存指针🍌文件描述符表🍌进程的状态🍌优先级🍌记账信息🍌上下文 🍉内存…...
计算机视觉——图像特征提取D2D先描述后检测特征提取算法原理
概述 局部特征提取是计算机视觉中的一个重要任务,它旨在从图像中提取出能够代表图像局部结构和外观信息的特征。这些特征通常用于图像匹配、物体识别、三维重建、跟踪和许多其他应用。传统方法,如尺度不变特征变换(SIFT)…...
The “from“ argument must be of type string. Received undefined——vue报错记录
今天在用机器人打包测试环境时,一直报错: The "from" argument must be of type string. Received undefined 啥意思呐? 百度也没有找到对应的问题所在。 下面写一下我的解决方法: vue.config.js 在vue.config.js中…...
汽车4S行业的信息化特点与BI建设挑战
汽车行业也是一个非常大的行业,上下游非常广,像主机厂,上游的零配件,下游的汽车流通,汽车流通之后的汽车后市场,整个链条比较长。今天主要讲的是汽车流通,汽车4S集团。一个汽车4S集团下面授权代…...
JSX 和 HTML 之间的区别
JSX和 HTML 都是用于创建和构建网页的标记语言,但它们有一些关键的区别。 1. JSX 是 JavaScript 的语法扩展,而 HTML 是一种标记语言。 2. JSX 允许您在语法中包含表达式和函数,而 HTML 只允许静态文本。 3. JSX 通常用于 React 应用程序&…...
AI日报:GPT-4-Turbo正式版自带读图能力;Gemini1.5Pro开放API;SD3将于4月中旬发布;抖音宫崎骏AI特效爆火
欢迎来到【AI日报】栏目!这里是你每天探索人工智能世界的指南,每天我们为你呈现AI领域的热点内容,聚焦开发者,助你洞悉技术趋势、了解创新AI产品应用。 新鲜AI产品点击了解:AIbase - 智能匹配最适合您的AI产品和网站 ὏…...
IDEA 宝贝插件
1. Codota— 代码智能提示 Codota还包含一个网站:https://www.codota.com/code 2.Alibaba Java Code Guidelines— 阿里巴巴 Java 代码规范 3. SequenceDiagram —— 调用链路自动生成时序图 4. google-java-format —— 代码自动格式化...
[C语言][数据结构][链表] 单链表的从零实现!
目录 零.必备知识 1.一级指针 && 二级指针 2. 节点的成员列表 a.数据 b.指向下一个节点的指针. 3. 动态内存空间的开辟 (malloc-calloc-realloc) 一.单链表的实现与销毁 1.1 节点的定义 1.2 单链表的尾插 1.3 单链表的头插 1.4 单链表的尾删 1.5 单链表的头删 1…...
oracle rac打补丁后sqlplus / as sysdba ora-12537
sqlplus / as sysdba 报错: ORA-12537: TNS:connection closed 检查用户属组: [rootrac1 ~]# id oracle uid1102(oracle) gid1101(oinstall) groups1101(oinstall),1102(dba) [rootrac1 ~]# id grid uid1101(grid) gid1101(oinstall) groups1101(oin…...
TCP-IP详解卷一:协议——阅读总结
该内容适合程序员查看 第1章 概述 1.1 引言 WAN全称是 Wide Area Network,中文名为广域网。 LAN全称是 Local Area Network,中文名为局域网。 1.2分层 ICP/IP协议族通常被认为是一个四层协议系统 分层协议应用层Telnet、FTP和e-mail运输层TCP和UDP网…...
【带源码】如何开发一个视频打赏,付费观看视频的系统?
【带源码】如何开发一个视频打赏,付费观看视频的系统?开发指南来了 最近非常火爆的视频打赏系统,有用户端,管理端,代理端 风口来了,系统部署简单,需要详细部署教程的可以留下评论哦!…...
Linux--进程的概念(一)
目录 一、冯诺依曼体系结构二、操作系统2.1 什么是操作系统2.2 操作系统的意义 三、进程3.1 进程的基本概念3.2 描述进程——PCB3.3 进程和程序的区别3.4 task_struct-PCB的一种3.5 task_struct的内容分类 四、如何查看进程4.1 通过系统文件查看进程4.2 通过ps指令查看进程 五、…...
大话设计模式——15.观察者模式(Observer Pattern)
简介 也称发布订阅模式(Publish/Subscribe),定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 UML图: 应用场景: 消息通知组件&#x…...
MySQL 主从复制部署(8.0)
什么是主从数据库 主从数据库是一种数据库架构模式,通常用于提高数据库的性能、可用性和可伸缩性。 它包括两种类型的数据库服务器: 1)主数据库(Master):主数据库是读写数据的主要数据库服务器。所有写操…...
大话设计模式——16.命令模式(Command Pattern)
简介 请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的对象进行执行。命令模式是一种特殊的策略模式,体现多个策略执行的问题,而不是选择的问题 UML图 应用场景 界面选择、键盘、按钮、事件操作都类似命令模式 …...
react17+18 中 setState是同步还是异步更新
在类组件中使用setState,在函数式组件中使用hooks的useState。 setstate目录 1. 类组件1.1 react 17版本1.2 react 18版本 2、函数式组件 1. 类组件 1.1 react 17版本 参考内容:第十一篇:setState 到底是同步的,还是异步的&…...
Unity框架,ET框架8.1版本的打包流程记录
目录 打包代码前置1.必须要安装Visusal Studio 2022的组件,如下图,必须都要进行安装,不然会在代码重构的时候报错,丢失SDK。Rider的版本必须2023及以上 步骤一、使用Rider编辑器打开项目后进行重构项目步骤二、使用HybirdCLR生成A…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...
Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...
32位寻址与64位寻址
32位寻址与64位寻址 32位寻址是什么? 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元(地址),其核心含义与能力如下: 1. 核心定义 地址位宽:CPU或内存控制器用32位…...
