讨论算法复杂性(内存占用、计算量多少)对计算机软件设计的影响?

本研究的目的是开发一个独立于输入和输出设备的便携式模块化脑机接口 (BCI) 软件平台。我们在一个颈脊髓损伤 (C5 ASIA A) 受试者的案例研究中实施了这个平台。

BCI 可以通过使用大脑信号控制假肢或触发功能性电刺激来恢复瘫痪患者的独立性。尽管多项研究已在实验室和家庭中成功实施了这项技术,但便携性、设备配置和护理人员设置仍然是限制部署到家庭环境的挑战。便携性对于将 BCI 从实验室转移到家庭至关重要。

BCI 平台实施包括一个 Activa PC + S 发生器,两个硬膜下四触点电极植入感觉运动皮层的主要左手手臂区域,一个固定在受试者轮椅后部的小型计算机,一个定制的手机应用程序,以及作为末端执行器的机械手套。为了量化 BCI 在家实施的性能,我们量化了在家中的系统设置时间、长期(14 个月)解码精度、硬件和软件配置文件以及应用程序和小型机之间的蓝牙通信延迟。我们创建了一个运动图像标记信号数据集,以在远程计算机上训练二进制运动图像分类器,供在家中在线使用。

小型机与手机App之间的平均蓝牙数据传输延迟为23±0.014 ms。受试者照顾者的平均准备时间为 5.6 ± 0.83 分钟。获取和解码神经信号并将这些解码信号发送到末端执行器的平均时间分别为 404.1 ms 和 1.02 ms。未经再训练的经过训练的运动图像分类器的 14 个月中位准确率为 87.5 ± 4.71%。

该研究展示了一个家庭 BCI 系统的可行性,受试者可以使用友好的移动用户界面无缝操作,不需要日常校准,也不需要技术人员在家设置。该研究还描述了 BCI 系统的便携性和即插即用多个末端执行器的能力,为最终用户提供了选择末端执行器的灵活性,以完成日常需要的特定电机任务。

瘫痪是一种毁灭性的疾病,仅在美国就影响了大约 540 万人 [ 1 ]。在导致瘫痪的各种原因中,中风是最常见的原因,其次是脊髓损伤 (SCI) 和多发性硬化症 [ 2 ]。对于 SCI,美国的发病率最高,颈椎 SCI 的患病率正在上升 [ 3 ]。瘫痪给个人、他们的家人、照顾者和公共卫生带来了巨大的经济和社会负担,因为重度四肢瘫痪的人在受伤后的第一年的费用可能超过 100 万美元 [ 4]。对于 40% 的中风受试者和大多数 SCI 受试者,功能缺陷通常是永久性的,目前尚无治疗方法。因此,在这些受试者中解决功能改善和恢复运动和独立性的需求仍然是一项关键挑战。

尽管缺乏可用的治疗方法,但皮质内脑机接口 (BCI) 的最新进展已显示出在恢复瘫痪患者的功能到达和抓握方面取得了可喜的成果[ 5-8 ]。BCI 通过身体神经系统以外的方式在大脑和身体之间建立外部联系 [ 9 ]。虽然 BCI 可能针对各种消费者,但这项技术为有感觉运动缺陷的受试者带来了有希望的结果,其中 BCI 可以规避功能丧失 [ 10 ]。

调查侵入性 BCI 的研究工作强调了它们恢复因神经系统疾病和损伤而丧失的功能的潜力。侵入性神经记录使人类受试者能够控制虚拟光标 [ 11-16 ] 、计算机 [ 17、18 ] 、拼写器 [ 19 ] 、虚拟 [ 20-22 ]和机器人假肢[ 6-8、15、23 ] 、外骨骼[ 24 ],以及他们自己通过功能性电刺激 (FES)瘫痪的肢体[ 5、25、26]。这些成就突出了 BCI 的许多显着改进,例如神经控制设备在多个自由度上的能力 [ 8 , 15 , 23 , 24 ]。这些演示通常需要将受试者拴在神经数据采集硬件上,以允许高分辨率数据流 [ 6 - 8 , 12 - 15 , 17 , 20 - 22 , 25 , 26]。然而,将对象连接到数据采集硬件的持续需要限制了对象在其家庭和社区中使用 BCI 的能力,因此无法为对象提供控制或配置他们如何与设备交互的真正方法。因此,使 BCI 在研究环境之外发挥作用的领域取得的进展仍然是一个关键的里程碑 [ 27 , 28 ]。

开发用于实验室外使用的便携式 BCI 或不与大型固定研究设备连接且可以轻松运输到任何地方的 BCI 系统仍然是皮质内 BCI 的一项重大挑战,因为它们必须考虑当前无线技术所施加的限制关于高数据速率无线遥测、超低功耗电子设备以及物理组件在身体内部和表面占据的空间 [ 29 , 30 ]。

动物研究研究通过开发无线皮质内接口 [ 31 ] 和修改设备参数以降低功耗而不显着影响解码器质量 [ 32 ] ,继续帮助解决这些问题。最近,Simeral 及其同事展示了一种用于控制计算机光标的皮质内 BCI 的不受限制的方法——依靠与受试者放置在同一房间的短程射频 (RF) 接收塔来捕获来自无线的高带宽数据传输射频头戴式 [ 33 ]。

值得注意的是,许多利用脑电图 (EEG) 的研究已经在各种应用中实现了家庭使用 [ 34 – 38 ];然而,基于 EEG 的 BCI 缺乏更多侵入性技术所捕获的空间分辨率 [ 11 ]。此外,对 BCI 控制信号使用非侵入性技术(例如 EEG)会使设置程序(例如,适当的电极放置)复杂化,从而限制了受试者的独立性和 BCI 在家里使用的便利性。

尽管侵入性皮层内微电极阵列具有出色的信号质量,并展示了 BCI 能力的许多显着优势,但随着时间的推移,这些阵列的信号质量会下降,这通常是由于异物对电极柄刺穿电极柄的反应引发的炎症。血脑屏障 [ 39 – 42 ]。这些装置通常是经皮植入物,其中植入物的一部分完全暴露,增加了感染的风险 [ 43 ]。

与皮层内微阵列类似,通过皮层电图 (ECoG) 在大脑表面使用侵入性电极。该方法实现了长期稳定的信号采集[ 44 ],具有更高的空间分辨率和信噪比[ 45 ]。此类应用程序已经成功地控制了具有多个自由度的光标 [11、46]、计算机 [18]、拼写器 [47 ]以及最近的外骨骼[ 24 ]。长期的、完全植入的实施使研究成果能够从实验室转化为家庭 [ 19 , 47]。虽然完全可植入的 BCI 需要进行侵入性脑部手术,但它们有可能将适用的 BCI 技术转移到家庭环境中,通过最大限度地减少护理人员的设置时间并最大限度地减少经皮感染,因为植入设备的任何部分都没有暴露,因为是皮质内微电极阵列的情况。

BCI 的潜在用户及其护理人员表示,便携性、简单的系统配置和最小化的设置时间是 BCI 系统实施的重要组成部分 [ 48 ]。解决这些设计考虑将更好地促进向家庭的过渡。为了实现设计家庭 BCI 系统的这一目标,我们使用安装在受试者轮椅上的小型计算机,无线记录来自植入的 Activa PC + S 设备的 ECoG 数据并执行神经解码。我们的设计包括一种模块化方法,使受试者能够从各种输出设备中进行选择,并允许在未来通过使用几乎即插即用的系统来添加外围设备。

在家中 BCI 系统在一名患有慢性颈椎四肢瘫痪 (C5 ASIA A) 的 22 岁受试者中实施,以恢复手部抓握。该主题是案例研究的一部分,其中一名受试者注册的目的是完全植入神经传感设备,以在实验室中研究脑机接口。该受试者在大约 6 年前的一次机动车事故中受伤,并且可以自主控制他们的二头肌,但不能控制三头肌或其他远端肌肉群。

BCI 的主要组件包括安装在受试者轮椅上的小型计算机、受试者的智能手机、神经信号采集装置和末端执行器。智能手机作为系统的用户界面,而计算机协调信号采集设备和末端执行器之间的数据采集、处理和传输。

输入设备——神经数据采集

用于收集此 BCI 平台 [ 49 ] 神经数据的硬件由三部分组成,两个内部组件和一个外部组件:(1) 两个四触点电极引线(Resume II 引线,美敦力)植入颅内硬膜下表面大脑的感觉运动手区域,(2) Activa PC + S (Medtronic, USA) 发生器植入左锁骨下方,用于记录和传输接触电极感应到的信号,以及 (3) 外部 Nexus-D遥测接收器(美国美敦力)在其天线放置在植入的 Activa PC + S 发生器附近时收集发射信号(图 1)。八个植入电极配置为双极配置,从而产生四个通道的 ECoG 数据。在此配置中,Activa PC + S 仅允许两个时间序列和两个功率采样通道。通道 1 和 3 提供以 200 Hz 采样的实时 ECoG 输出,通道 2 和 4 提供以 5 Hz 采样的 4-36 Hz 之间的平均功率输出。这些频率设置是根据用于检测与事件相关的失步的初始实验室测量结果选择的 [ 49]。来自这些通道的数据以 Nexus 遥测仪收集的数据包的形式传输,并通过 USB 串行连接传送到计算机进行进一步处理。该装置及其检测运动意图的能力,在受试者被植入该装置几个月后,在实验室环境中进行了严格测试,然后再进行家庭部署 [ 49 ]。

图2:系统总览。使用放置在感觉运动皮层表面的两条四触点硬膜下带记录电皮质 (ECoG) 信号。ECoG 信号通过皮下植入物传输到外部接收器,外部接收器将其传送到小型计算机进行处理。解码器将信号分类为运动图像命令,然后通过蓝牙发送以启动机械手套.

输出设备——末端执行器

使用机械手套(Neomano,Neofect,South Korea)启动手抓握。所有输入设备(神经数据采集)和输出设备(末端执行器)通过串口通信与计算机通信,而自定义手机应用程序(App)和小型机通过蓝牙低功耗(BLE)协议通信。

我们在家中使用 BCI 平台收集数据来训练连续运动图像分类器。受试者使用移动应用程序启动数据收集会话。为了收集与运动意图相关的 ECoG 数据,文本提示被发送到受试者的手机上,显示“MOVE”或“REST”,并指示受试者在 MOVE 状态下考虑快速打开和关闭他们的手(图 3d)。提示以 6-10 秒的间隔随机来回交替(对应于 15-25 个数据包,或 PC + S 收集的通道 1 和 3 的 个时间序列数据样本)。这个交替过程持续了 5 分钟,每个数据收集会话总共收集了 750 个数据包(或每个时间通道 60,000 个数据样本)。这些 5 分钟试验中的 33 次用于训练解码器(总计 165 分钟的训练数据),之后使用 17 次开环试验和 12 次闭环试验来验证和测试解码器。闭环试验是在数据收集过程中解码值主动控制假肢手套的试验,而在开环试验中,假肢手套没有被触发。

图2:移动应用程序概述。该应用程序用作受试者与计算机上运行的 BCI 软件交互的 GUI。a主屏幕显示当前选择的正在使用的输入和输出设备。右上角的蓝点标记了系统的状态。b输入设备选择屏幕,允许主体从更多设备中进行选择。c允许受试者调整给定设备的参数(例如解码器阈值、末端执行器电机速度等)的设置页面。这些设置由计算机端的软件类的应用程序编程接口 (API) 定义,并通过蓝牙传送以进行动态显示。d向受试者提示评估准确性或对设备解码器应用校准的数据收集会话。

Activa PC + S 提供了四个数据采样通道。通道 1 和 3 提供 200 HZ 的实时数据,通道 2 和 4 提供以 5 Hz 采样的 4-36 Hz 之间的平均功率。数字 2a、b 描绘了通过 1 Hz 高通有限脉冲响应滤波器并标有信号采样时出现的提示后的 300 秒代表性试验的 200 秒。然后为每个数据包的每个时间通道计算功率谱密度,为每个时间序列通道生成 321 个光谱特征。然后将从通道 2 和 4 收集的 4-36 Hz 之间的平均功率值与来自时间通道的频谱估计的这些功率值分组,为每个标记有提示的特征向量创建总共 644 个特征。收集时间。平均频谱密度显示了每个运动想象状态中 β 波段(12-25 Hz)的差异(图 2 c,f),并且随着时间的推移也可以观察到这一点(图 2 d、e)。这些特征向量用于训练分类器,该分类器首先通过线性判别分析、2 状态隐马尔可夫模型传递特征,然后进行逻辑回归以将状态概率映射到运动图像命令(更多详细信息,请参见 [ 49 ])。

)。D , E数据的平均窗口 (6.4 s, N = 2051) 的时频频谱图,显示从 REST 状态多次转换期间过滤、平均和归一化数据中 1-100 Hz 之间频带功率的变化 (由时间序列的前半部分表示)到 MOVE 状态。

除了数据收集,日常使用设备只需打开电脑并使用应用程序选择合适的输入和输出设备即可。重要的是,因为我们没有使用任何刺激,所以在家使用的安全问题是最小的。

图形用户界面移动应用程序

我们将使用 NativeScript 开发的定制手机应用程序 (App) 部署到受试者的智能手机上,允许受试者通过 BLE 控制 BCI 系统。该应用程序提供了一个图形用户界面 (GUI),显示 BCI 的当前状态,允许受试者选择可用的输入和输出设备,以及更改每个设备的首选项和设置(图  3)。手机应用程序不参与任何数据采集或处理。

该应用程序显示了可以选择进行控制的可用输入和输出设备。如果这些设备分别与小型计算机连接或断开连接,则会从应用程序中添加或删除这些设备。连接后,设备会提供设备特定的设置,这些设置可以使用应用程序进行设置(图 3)。将新设备纳入系统不需要更新应用程序,因为它将动态显示计算机可以访问的内容。

神经信号运动图像编码可能因受试者而异,因此,机器学习算法必须经常重新训练或重新校准,以从数据中解码受试者的预期运动。我们设计了软件应用程序编程接口 (API) 来关联解码器训练协议和输入设备。通过这种方式,受试者可以使用该应用程序为 Activa PC + S 生成的信号训练解码器。可用时,该设备的设置菜单中会显示一个校准按钮(图 3C)。选择后,应用程序的校准模式被激活,允许受试者评估与给定输入设备相关的解码器的准确性。在校准模式下,应用程序从计算机接收文本以显示患者同时记录数据并适当地标记数据,以通过监督学习模型测试或重新训练解码器。

计算机应用程序是用 Python [ 50 – 54 ] 编写的,由两个子进程组成:一个用于管理输入和输出设备之间的通信,另一个用于管理与应用程序的 BLE 通信(图 4)。这些子进程使用异步事件循环来控制执行可能中断的点,并在这两个进程之间切换,以最大限度地减少设备通信之间可能发生的处理延迟。主应用程序迭代地从选定的输入设备收集解码或分类的神经信号,并将返回的命令发送到选定的输出设备。同时,蓝牙进程等待来自 App 的读取、写入和通知请求。

图4:应用程序控制流。a主应用程序由守护程序脚本(或后台运行进程)初始化,以确保程序在计算机开启时始终运行。计算机应用程序异步运行多个协程,以允许输入和输出设备之间几乎不间断的数据流以及蓝牙通信。b主应用程序进程迭代地调用管理输入和输出设备的类。这些设备管理器类包含用于获取设备输入和向输出设备发送命令的公共方法。这些设备类通过串行端口通信与其对应的硬件进行通信。重要的是,可能存在一系列设备供受试者使用。这些可以通过应用程序通过

电机 BCI 的简单描述是一个输入设备(或其中许多),它提供神经数据,将其转换为有意义的输出,并将该输出发送到输出设备(或其中许多)。因为我们假设 BCI 中的所有设备都必须与计算机通信,所以我们的目标是创建一个 API 来提供一个框架,用于合并 BCI 系统使用的物理可用硬件设备。这是通过编写一个抽象设备类来概括定义物理设备和 BCI 软件之间的基本交互和接口所需的方法和属性来完成的(图  4)。更具体地说,通过继承抽象设备类的方法和属性,可以很容易地定义用于初始化使BCI系统与硬件通信的串行通信端口的方法。通过将这些设备类文件保存到相对于应用程序路径的文件夹中,该软件能够使用通用设备类加载这些设备,而无需将任何特定于设备的详细信息直接硬编码到软件中。例如,为 Nexus-D 遥测仪编码的 Nexus 类继承了这个抽象设备类,允许 BCI 系统自动识别设备并开始与 Activa PC + S 收集的数据进行交互和监控。应用程序,API 还提供声明设备属性的选项(如果有),主体可以调整。通过创建设备设置对象,设备类可以定义如何以及在何种程度上可以更改每个属性。这些设备设置对象继承了用于将这些设置转换为渲染命令的方法,这些命令将由应用程序发送并显示以供最终用户交互。这些设备设置将允许受试者或护理人员潜在地改变给定设备的速度、延迟或其他以用户为中心的偏好。

总之,该设计为受试者提供了动态硬件选择(例如,机械矫形器、FES 等)和调整设备设置(例如,矫形器的速度或时间延迟等)的能力,以实现更多定制控制。在我们的实现中,用于从 Activa PC + S 捕获数据的 Nexus 遥测仪通过继承通用设备类进行封装,以创建到硬件的编程接口。信号解码器的特性和方法(图 4 b) 与 Nexus 遥测仪相关的,例如解码器阈值和解码器校准,作为 Nexus 类中的设备设置提供。由于解码器执行二进制分类,因此使用阈值来区分解码信号是 MOVE 或 REST 的输出移动概率。

我们设计了使用BLE与App进行通信的软件,并创建了一个跨平台的蓝牙库,使计算机能够通过蓝牙外围角色支持(即蓝牙主机设备)发布服务。计算机和手机之间传输的数据,包括设备设置、设备状态和校准,利用三个蓝牙通用属性 (GATT) 特性进行数据传输。但是,GATT 特性的最小传输单元为 512 字节,要传输的设备设置信息的大小可能会超过此限制。为了避免这种情况,我们在 BLE 上开发了一个附加层,以启用数据流,使用数据队列通过单个 BLE GATT 特性迭代传输数据。仅当最终用户使用应用程序进行更改时才需要蓝牙通信。蓝牙库是使用事件驱动的回调和异步过程调用设计的。这种设计允许 Python 应用程序专注于从输入设备收集数据,并将该数据传送到输出设备,仅在调用时遵循蓝牙通信过程。通过使用蓝牙,BCI 系统可以在家庭以外的社区中使用,因为蓝牙通信独立于

BCI在使用过程中,所有数据都记录在小型机硬盘上的文件中。该软件将数据文件保存到一个目录中,该目录自动同步大学加密的符合 HIPAA 标准的云存储,假设机载计算机具有活动的互联网连接,几乎可以即时访问传入的数据。为了确保计算机能够连接互联网,我们在将设备安装到对象的轮椅上之前,将对象的家庭 WiFi 的服务集标识符 (SSID)、安全配置文件和密码保存到计算机上。这种配置允许计算机连接到对象的家庭 WiFi,以便在对象到家后进行数据同步。

系统设计的目标是为受试者提供配备完全植入式神经感觉装置的功能性脑机接口供家庭使用。我们通过在小型计算机(m90n Nano,Lenovo,China;Windows 10 Pro;Intel i3 2.10 GHz,8 GB RAM)上安装设计的软件将系统部署到家中,并将计算机与锂电池(50,000 mAh 电源银行,克里斯多尼亚,中国)在一个定制的 3D 打印案例中。通过使用穿过印在箱子外部的孔的带子将这个箱子连接到受试者的轮椅后面。滑动门被放置在机箱的两侧,以便于访问电池和小型计算机上的充电端口和电源按钮。在小型机上安装 BCI 软件后, 4一个)。我们使用版本控制系统在线存储了我们软件的代码。这允许我们的守护程序脚本从版本控制系统中提取,以确保代码是最新的。这种设置允许我们使用 git 提交日期和时间戳作为条件,我们可以根据这些条件以编程方式选择和分析在不同软件条件下收集的数据(例如,在解码器更新或初始错误修复之前和之后)。

Activa PC + S 具有 200 Hz 的采样率,并具有以 2.5 Hz (400 ms) 的速率覆盖的板载内存存储。通过设备固件对 Activa PC + S 的 API 调用会阻止程序执行,直到数据可用。重要的是,如果两次后续调用 API 以收集数据的时间间隔 > 400 ms,则在两次 API 调用之间的时间内皮质内电极采样的数据将丢失,因为 Activa PC + S 已经在存储数据在发出第二次调用之前的下一个 400 毫秒块。因此,收集数据的调用之间的显着延迟可能会导致数据丢失。这对于解码器训练的数据收集尤为重要,其中传入的数据必须被同步标记。因为数据标记依赖于通过 BLE 发送的消息,我们需要确保向对象显示运动指令的时间与正在收集的数据在时间上匹配。因此,只有在通过 BLE 向应用程序发送指令的时间小于 400 毫秒时,数据才能可靠地与呈现给受试者的屏幕指令标签匹配,以最大限度地减少覆盖数据的机会以及受试者的反应时间。通过在模拟重新校准会话期间记录时间戳,计算机发送提示的时间戳与应用程序上显示相同提示的时间戳之间的差异表明平均延迟到屏幕为 23 毫秒(图 1)。只有当通过 BLE 向 App 发送指令的时间小于 400 毫秒时,数据才能可靠地与呈现给受试者的屏幕指令标签匹配,以最大限度地减少覆盖数据的机会以及受试者的反应时间。通过在模拟重新校准会话期间记录时间戳,计算机发送提示的时间戳与应用程序上显示相同提示的时间戳之间的差异表明平均延迟到屏幕为 23 毫秒(图 1)。只有当通过 BLE 向 App 发送指令的时间小于 400 毫秒时,数据才能可靠地与呈现给受试者的屏幕指令标签匹配,以最大限度地减少覆盖数据的机会以及受试者的反应时间。通过在模拟重新校准会话期间记录时间戳,计算机发送提示的时间戳与应用程序上显示相同提示的时间戳之间的差异表明平均延迟到屏幕为 23 毫秒(图 1)。5),表明蓝牙通信没有增加会影响数据收集的时间延迟。我们还发现在传输过程中没有丢掉蓝牙数据包。

图5:蓝牙低功耗通信基准。在数据收集会话期间观察到的时间延迟 (n = 750)。蓝牙传输时延测量为App上显示提示改变的时间与计算机系统上提示改变启动BLE(提示显示通知特性)的时间之差。

系统应用程序分析使用 cProfile Python 模块测量,并使用 SnakeViz 可视化(图6) 来描述由 BCI 系统中的进程引起的延迟。BCI 软件是在受试者在家设置后初始化的。在系统使用 5 分钟时收集分析。主应用程序循环由两个主要功能组成:(1)从所选输入设备读取解码命令(图6左)和(2)将命令发送到选定的输出设备(图 6右)。系统分析显示,将输入信号处理为电机指令命令的时间约为 400 毫秒(图 6左),之后只用了 1 毫秒将该命令发送到末端执行器以进行手抓握(图 6 右)。这个主循环的第一部分:将输入信号处理成运动指令,由两个子过程组成:(1) 从 Activa PC + S (~ 393 ms) 接收神经通道数据,以及 (2) 解码信号转换成电机指令(10.23 ms)。然后,将该命令发送到

图 6:系统分析。代表处理传入数据(左)和将解码输出发送到手套(右)所花费的时间比例的旭日图。每个旭日形图的中心代表获取解码的神经信号(左)或向手套发送命令(右)的过程。围绕中心点的每条弧线代表一个子流程,需要执行以处理传入数据(左)或发送数据(右)。弧的长度表示子流程完成所花费的时间相对于依赖它完成的子流程的比例。虽然有许多子流程,但与 BCI 软件相关的那些都被突出显示。其余子流程是系统特定流程,例如输入-输出操作。

运动图像分类器的准确度指标在训练后的第二年继续测量,无需重新校准(图 7)。解码器精度定义为正确分类的数据窗口的数量,在 79 次试验中保持稳定,中值精度为 87.53%(图  7; 灰色虚线)。

图 7:解码器分类。与 Nexus 遥测输入设备相关的解码器的分类性能。第 0 个月表示对训练数据的评估,随后的月份表示自训练以来的月数。黑色虚线表示全球中位数 87.53%。

几乎不需要对护理人员进行培训来学习使用我们的 BCI 实施为受试者设置设备。设置只需要打开系统,将遥测天线适当地放置在对象上,并将任何末端执行器设备安装到对象的肢体上。从这一点开始,受试者能够在没有帮助的情况下使用应用程序配置、校准和控制 BCI 系统。为了量化这一点,我们测量了从护士开始设置系统到受试者对机械手套进行神经控制之间的平均时间量(图 8)。平均而言,设置此实现的时间为 5.58 分钟,其中大部分时间(2.34 分钟)用于在 App 和小型机之间建立蓝牙连接并配置系统以及戴上 Neomano 手套(2.18 分钟)。

图 8 :系统设置时间。受试者的主要照顾者设置系统所用的时间。连续几天每天重复测量一次。A显示设置系统的总时间,而B显示不同设置步骤的时间,总和为总经过时间。不包括校准时间,因为在日常设置期间不需要校准时间。

我们的设计旨在让 BCI 在家庭内外都能发挥作用,并让受试者控制设备选择、数据收集以及系统设置和偏好,同时最大限度地减少对护理人员辅助设置的需求。尽管该系统是在具有植入神经接口的 SCI 受试者中实施的,但应用程序可以扩展到其他形式的瘫痪,或者可以使用 BCI 的任何地方,例如与 EEG 耳机或皮质内尖峰信号一起使用。

在我们的设计中,该应用程序用作 GUI。然而,其他实现使用智能手机进行信号处理——使用手机作为系统的唯一处理单元[ 55-58 ] ——而不是使用板载小型计算机。其他人则使用智能手机来推动与家用电器的通信 [ 35 , 36]。在这里,NativeScript 的使用将手机应用程序的开发限制为蓝牙低功耗协议,这限制了我们系统的高带宽数据流的能力,而蓝牙经典射频通信 (RFCOMM) 原本可以实现原始信号传输。然而,正如 Campbell 等人所报道的,使用经典 RFCOMM 的替代解决方案可能会很快耗尽手机的电池电量。[ 56 ]。然而,如果系统在未来的迭代中完全移动到手机上,则需要考虑 RFCOMM 的实施以实现连续和可靠的数据收集和流式传输。此外,迁移到手机使用需要加强安全措施。作为 [ 59] 指出,此类系统的广泛和值得信赖的使用将需要小心以确保系统的完整性和安全性。

作为重要说明,我们的受试者能够使用二头肌可用的残余运动来导航应用程序的使用。然而,该应用程序非常简单,可以让护理人员在需要时配置或更改系统设置,并且不会将我们的系统应用限制在具有独特残余运动的受试者身上。

为了在实验室之外更实际地使用 BCI,系统可移植性是一个重要组成部分 [ 27 ]。一种提高便携性的方法是使用更小的计算设备,这些设备在个人平板电脑、手机和小型计算机中变得更容易获得。之前的几项研究已经将平板电脑和手机等便携式设备用于命令 [ 35 ] 和信号处理 [ 55 , 57 , 58 ]、主体交互 [ 38 ] 以及作为末端执行器本身 [ 56 ]]。在我们的设计中,我们使用了一台小型计算机和受试者的智能手机,这使我们能够让受试者控制 BCI,同时确保 BCI 软件可以独立于手机继续运行。此外,就成本而言,这些组件已经是可以轻松购买的消费级产品。手机和电动矫形器使用的短程蓝牙通信允许对系统进行持续控制,这允许受试者在家外继续使用 BCI。由于电动矫形器通过无线蓝牙无线电与系统通信,WiFi 仅用于上传离线分析所需的数据,BCI 系统本身的使用独立于互联网连接运行。

用于研究开发的模块化 BCI 设计有助于提高科学的可重复性,并减少了开发新的 BCI 软件和配置所需的时间。已经开发了几种软件工具、包和管道来帮助完成这项工作[ 60-64 ]。此类应用已在实验室和家庭中成功使用其中一些系统 [ 65 ]。除了这些工具之外,其他研究还显示了各种成功的输出控制,包括光标控制、拼写器、家用电器控制、外骨骼、假肢和FES [ 6-8、11-24、47]。我们的设计侧重于最终用户交互,同时使软件能够跨操作系统和处理器架构进行扩展。虽然我们在测试设备时只使用了电动矫形器,但我们确保系统可以是模块化的,包括在运行时动态更改输入和输出设备。这种模块化是使用对象的移动设备的另一个目的。它允许受试者交换末端执行器设备、启动培训课程并调整可用的系统设置。

当提供设备类时,输入设备(例如,EEG 系统)具有即插即用功能。实现一个设备类需要某种机制来将数字化数据从设备采样到计算机;例如,通过串行端口、套接字或设备提供的 API。可以使用或定制我们工作中的解码器,将输入信号转换、分类或回归为有意义的值。设备类必须继承设备基类并定义一个 get_input 方法,然后(1)收集先前确定的数据,(2)将该数据解码为有意义的值,然后(3)返回该值。最后,串行端口、套接字或 API 属性可以定义在平台将用于在启动期间自动检测设备的类上。有了这些,可以将新设备添加到平台中,

主题与家庭 BCI 平台的交互

总之,BCI 平台及其实施不仅使患有颈椎 SCI 的受试者能够在家中恢复手握并交换模块化组件,而且还使受试者能够单独控制每个设备和整个 BCI 系统的设置和偏好. 更具体地说,这些设置包括用于更改电动矫形器的响应时间和重新启动 BCI 应用程序的选项。研究人员的帮助或运送到实验室变得不必要,因为该应用程序允许受试者按照他们的时间表启动数据收集会话。

我们在家中使用的系统的部署最大限度地减少了对复杂穿脱程序的需求。在几个会话中,我们测量了从开始到受试者可以控制手套的平均设置时间,大约为 5 分钟。这完全在接受调查的潜在用户 [ 48 ]之前推荐的 10-20 分钟的设置时间范围内。这种简化的很大一部分可能是使用完全植入的设备的结果。这种设置避免了使用可能需要电线连接、凝胶应用、准确放置和配置 EEG 帽的EEG帽 [ 66、67 ]。相比之下,最近的一项研究能够在几个会话中实现 8 个看护人-受试者对的平均设置时间为 20 分钟 [ 68]。通常,设置时间取决于 BCI 系统的每个组件的设置时间。非侵入性技术的持续发展将有助于降低这些设置时间和配置复杂性。虽然,用户评估没有系统地评估,但主题确实评论说:“它易于使用和控制,只是有时需要一点时间通过蓝牙连接”。

尽管我们的实现仅使用 4 个 ECoG 通道,与许多 EEG 通道相比,可能会限制系统的功能输出,但此实现的目的是尽量减少在家使用的设置时间和复杂性,同时仍向受试者提供一些功能. 尽管如此,即使是完全植入的系统也可能需要需要插入系统的有线设置[ 6-8、19、47 ]。

然而,在我们的实施中,打开固定在轮椅后面的电池就足以启动系统。从这里开始,将遥测天线与皮下发射器对齐,从而实现神经控制。值得注意的是,由于使用了诸如 Activa PC + S 之类的植入设备,因此易于设置是该 BCI 平台的实施问题,而不是使用该平台的要求。该平台可以使用 EEG 耳机实现。对于此处介绍的实施,完全植入的 Activa PC + S 用于改进家庭设置和整个系统的使用。

Python 作为开发语言可能不会导致完全与操作系统无关的平台。这种限制主要是语言用于与操作系统和硬件交互的方法的结果。另一种解决方案可能是利用已经可用的软件,例如 BCI2000 [ 60 ]。但是,使用 Python 等解释性语言进行开发无需在远程系统更新期间进行编译。

此处介绍的实现中的主题能够使用他们自己的剩余二头肌功能使用 App GUI。这通常会限制 GUI 对能力较差的受试者的使用。然而,App GUI 仍然为护理人员提供了方便的系统访问。此外,计划未来的迭代以启用语音激活和/或凝视控制,以更好地控制具有不同残疾的受试者以及对手和手臂的控制。

使用 Activa PC + S 和 Nexus 遥测仪并不是完全无线的。Nexus 遥测仪和 Activa PC + S 之间的数据样本收集需要将外部天线放置在植入式发生器附近。然而,植入式发生器的较新实施(Medtronic Percept、St. Jude、Boston Scientific、Clinatec 等)正在将无线功能构建到他们的发生器中。此外,用于深部脑刺激的 Activa PC + S 可以使用长达 5 年,但在不使用刺激的情况下使用的设备的电池寿命尚不清楚。可以感应充电的植入物 [ 69 ] 并以无线方式传输其信号 [ 70 ]] 将提供更强大的系统,进一步减少系统维护和护理人员协助,同时最大限度地提高便携性。

像许多侵入性研究一样,我们对侵入性设备的实施仅限于一个主题,因此难以概括。幸运的是,使用与事件相关的去同步作为执行运动图像二元分类的方法已经很成熟 [ 68 , 71 – 74 ],并且一些研究已经在家中使用它 [ 34 , 68 , 75 , 76 ]。虽然,我们将此 BCI 系统用于颈椎 SCI 的受试者,但它提供了有关如何改进软件和应用程序以便更容易融入其他 BCI

未来采用 BCI 相关技术需要确保 BCI 系统便携、设置直观且易于配置 [ 48]。这种模块化的 BCI 软件设计为在消费类计算机平台和移动电话设备上实施 BCI 系统提供了一个轻量级平台。BCI 平台可以轻松添加输入和输出设备,受试者可以使用移动图形用户界面轻松切换。BCI 模块化软件平台设计的实施证明了将 BCI 系统过渡到更便携的设备以供家庭使用的可行性越来越高。随着越来越多的辅助和康复设备变得可用,模块化平台可能会为 BCI 用户提供更多功能。此类系统的开发将使 BCI 的辅助和康复能力更容易为受益于它们的受试者所接受。家庭环境中的 BCI 系统为提高瘫痪受试者的独立性提供了良机。未来的工作将集中在扩展输入和输出设备之间的定制映射,以允许同时使用多个设备。

说出5个以上Math对象中的成员。

3.如果是post请求,必须设置请求头。 4.调用send 发送请求 (如果不需要参数,就写null) 判断status 状态码 为 200 表示接口请求成功 备注:如果是post请求,想要传json格式数据。

XSS(Cross-Site Scripting,跨站脚本攻击)是一种代码注入攻击。攻击者在目标网站上注入恶意代码,当被攻击者登陆网站时就会执行这些恶意代码,这些脚本可以读取 cookie,session tokens,或者其它敏感的网站信息,对用户进行钓鱼欺诈,甚至发起蠕虫攻击等。

  1. 使用特殊符号、标签转义符。

2.CSRF攻击(跨站请求伪造):

CSRFCross-site request forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

    • 服务端给用户生成一个token,加密后传递给用户

    • 用户在提交请求时,需要携带这个token

    • 服务端验证token是否正确

就是通过吧SQL命令插入到Web表单递交或输入域名,最终达到欺骗服务器执行恶意的SQL命令。

解决:表单输入时通过正则表达式将一些特殊字符进行转换

DDoS又叫分布式拒绝服务,全称 Distributed Denial of Service,其原理就是利用大量的请求造成资源过载,导致服务不可用。

  1. 防火墙等防护设置禁止ICMP包等

使用基于token的登录流程

1. 客户端使用用户名跟密码请求登录

2. 服务端收到请求,去验证用户名与密码

3. 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端

5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token

6. 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

常见http状态码分类:

404服务器资源未找到 2xx Success(成功状态码) 请求正常处理完毕 3xx Redirection(重定向状态码) 需要附加操作已完成请求 4xx Client Error(客户端错误状态码) 服务器无法处理请求 5xx Server Error(服务器错误状态码) 服务器处理请求出错

浏览器从输入url到渲染页面,发生了什么?

这玩意一定要说全了装逼

合成 URL:浏览区会判断用户输入是合法 URL,比如用户输入的是搜索的关键词,默认的搜索引擎会合成新的,如果符合url规则会根据url协议,在这段内容加上协议合成合法的url 
网络进程获取到 URL,先去本地缓存中查找是否有缓存资源,如果有则拦截请求,直接将缓存资源返回给浏览器进程;否则,进入网络请请求阶段;    
DNS 查找数据缓存服务中是否缓存过当前域名信息,有则直接返回;否则,会进行 DNS 解析返回域名对应的 IP 和端口号,如果没有指定端口号,http 默认 80 端口,https 默认 443。如果是 https 请求,还需要建立 TLS 连接;
TCP 三次握手与服务器建立连接,然后进行数据的传输;(三次握手开喷)

浏览器首先会向服务器发送请求行,它包含了请求方法、请求 URI 和 HTTP 协议的版本;另外还会发送请求头,告诉服务器一些浏览器的相关信息,比如浏览器内核,请求域名;

服务器首先返回响应行,包括协议版本和状态码,比如状态码 200 表示继续处理该请求;如果是 301,则表示重定向,服务器也会向浏览器发送响应头,包含了一些信息;

查看响应头的信息,做不同的处理,比如重定向,存储cookie 看看content-type的值,根据不同的资源类型来用不同的解析方式

浏览器渲染原理直接开干.....

浏览器将获取的HTML文档解析成DOM树。
渲染树的每个元素包含的内容都是计算过的,它被称之为布局layout。浏览器使用一种流式处理的方法,只需要一次绘制操作就可以布局所有的元素。
将渲染树的各个节点绘制到屏幕上,这一步被称为绘制painting。

数据传输完成,正常情况下 TCP 将四次挥手断开连接。但是如果浏览器或者服务器在HTTP头部加上 Connection: keep-alive,TCP 就会一直保持连接。

网络安全、HTTP协议

1.`TCP`向上层提供面向连接的可靠服务 ,`UDP`向上层提供无连接不可靠服务。
2.虽然 `UDP` 并没有 `TCP` 传输来的准确,但是也能在很多实时性要求高的地方有所作为
3.对数据准确性要求高,速度可以相对较慢的,可以选用`TCP`

不可靠传输,不使用流量控制和拥塞控制 可靠传输,使用流量控制和拥塞控制
支持一对一,一对多,多对一和多对多交互通信
首部最小20字节,最大60字节
适用于实时应用(IP电话、视频会议、直播等) 适用于要求可靠传输的应用,例如文件传输

4.`在OSI` 网络模型中,HTTP工作于应用层,而HTTPS 的安全传输机制工作在传输层 5.`HTTP` 无法加密,而HTTPS 对传输的数据进行加密,证的网络协议,安全性高于HTTP协议。 6.`HTTP`无需证书,而HTTPS 需要CA机构wosign的颁发的SSL证书,一般免费证书少,因而需要一定费用。

1.GET在浏览器回退不会再次请求,POST会再次提交请求
2.GET请求会被浏览器主动缓存,POST不会,要手动设置
3.GET请求参数会被完整保留在浏览器历史记录里,POST中的参数不会
4.GET请求在URL中传送的参数是有长度限制的,而POST没有限制
6.GET参数暴露在地址栏不安全,POST放在报文内部更安全
7.GET一般用于查询信息,POST一般用于提交某种信息进行某些修改操作
1.私密性的信息请求使用post(如注册、登陆)。
2.查询信息使用get。

第一次:建立连接时,客户端发送syn包到服务器,等待服务端确认

第二次:服务器收到syn包,必须确认客户的syn,同时也发送一个syn包,即syn+ACK包

第三次:客户端收到服务器的syn和ack包,向服务器发送确认包ack,发送完毕,客户端和服务端连接成功,完成三次握手

第一次:浏览器发送完数据后,发送fin请求断开连接

第二次:服务器发送ack到客户端,确认客户端的断开请求

第三次:服务器请求断开fin的请求

第四次:客户端确认服务器的断开ack

  1. 1和1.0相比,1.1可以一次传输多个文件

  2. http2.0采用二进制格式,新增特性 多路复用、header压缩、服务端推送(静态html资源)

浏览器缓存的作用:减少冗余的数据传输,节省网络带宽,更快加载页面,缓存降低了服务器的要求,有更快的响应

强制缓存:浏览器在加载资源的时候,会根据本地缓存中的headers中的信息(expires,cache-control)是否要强缓存,如果命中的话,则会使用缓存中的资源,否则继续发送请求。

协商缓存:客户端向服务端发送请求,服务端检测是否有对应的标识,如果没有服务端会返回客户端对应的标识,客户端在下次请求把标识带过去服务器会验证标识,如果通过了,则会响应304,告诉浏览器读取缓存,如果没有通过则返回请求的资源。

两类缓存规则可以同时存在,强制缓存优先级高于对比缓存,也就是说,当执行强制缓存的规则时,如果缓存生效,直接使用缓存,不再执行对比缓存规则。

基于对比缓存,不管是否使用缓存都需要向服务器发送请求,那么还用缓存干什么?
服务端在进行标识比较后,只返回header部分,通过状态码通知客户端使用缓存,不再需要将报文主体部分返回给客户端。

memory cache 将资源文件缓存到内存中,下次请求读取的是内存中的
disk cache 将资源存到硬盘中,下次请求从硬盘中读取

HTTP报文就是浏览器和服务器间通信时发送及响应的数据块。
浏览器向服务器请求数据,发送请求(request)报文;
服务器向浏览器返回数据,返回响应(response)报文。
报文信息主要分为两部分:header,数据主体部分(body)

共同点: 都是保存在浏览器端、且同源的

  1. cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递。cookie数据还有路径(path)的概念,可以限制cookie只属于某个路径下sessionStoragelocalStorage不会自动把数据发送给服务器,仅在本地保存。

  • sessionStorage:仅在当前浏览器窗口关闭之前有效;

  • localStorage:始终有效,窗口或浏览器关闭也一直保存,本地存储,因此用作持久数据;

  • cookie:只在设置的cookie过期时间之前有效,即使窗口关闭或浏览器关闭

  • sessionStorage:不在不同的浏览器窗口中共享,即使是同一个页面;

  • localstorage:在所有同源窗口中都是共享的;也就是说只要浏览器不关闭,数据仍然存在

  • cookie: 也是在所有同源窗口中都是共享的.也就是说只要浏览器不关闭,数据仍然存在

页面置换:在地址映射过程中,如果在页面中发现所要访问的页面不存在于内存中,则产生缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。

全局置换:在整个内存空间置换。

局部置换:在本进程中进行置换。

      a.最佳置换算法(OPT):从主存中移出永远不再需要的页面;如无这样的页面存在,则选择最长时间不需要访问的页面。于所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。

 b.先进先出置换算法(FIFO):该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程已调入内存的页面按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。但该算法与进程实际运行的规律不相适应,因为在进程中,有些页面经常被访问,比如,含有全局变量、常用函数、例程等的页面,FIFO算法并不能保证这些页面不被淘汰。

c.最近最久未使用算法(LRU):根据页面调入内存后的使用情况做出决策的。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t。当需要淘汰一个页面时,选择现有也面中t值最大的,即最近最久未使用的页面予以淘汰。

局部页面置换的三种算法C++代码实现:

创建状态:进程正在被创建;

就绪状态:进程被加入到就绪队列中等待CPU调度运行;

执行状态:进程正在被运行;

等待阻塞状态:进程因为某种原因,比如等待I/O,等待设备,而暂时不能运行;

终止状态:进程运行完毕;

软链接也叫符号链接,软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

硬链接:通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

定义:又称微线程,纤程,英文名Coroutine。协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。例如:

上面示例程序中,协程运行结果可能是12x3yz。在执行A的过程中,可以随时中断,去执行B,B也可能在执行过程中中断再去执行A。但协程的特点在于是一个线程执行。

a.协程最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制。因此,没有线程切换的开销。协程和多线程相比,线程数量越多,协程的性能优势就越明显。

b.不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突。在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

13.进程同步的几种方式

信号量:用于进程间传递信号的一个整数值。在信号量上只有三种操作可以进行:初始化、P操作、V操作,这三种操作都是原子操作。P操作(递减操作)可以用于阻塞一个进程,V操作(增加操作)可以用于解除阻塞一个进程

原理:两个或多个进程可以通过简单的信号进行合作,一个进程可以被迫在某一位置停止,直到它接收到一个特定的信号。该信号即为信号量s。为通过信号量s传送信号,进程可执行原语semSignal(s);为通过信号量s接收信号,进程可执行原语semWait(s);如果相应的信号仍然没有发送,则进程被阻塞,直到发送完为止。可把信号量视为一个具有整数值的变量,在它之上定义三个操作:

管程:由一个或多个过程、一个初始化序列和局部数据组成的软件模块,其主要特点如下:

       c.在任何时候,只能有一个进程在管程中执行,调用管程的任何其他进程都被阻塞,以等待管程可用;

消息传递:是进程间进程消息传递所需要的最小操作集。一个进程以消息的形式给另一个指定的目标进程发送消息;进程通过执行receive原语接收消息,receive原语中指明发送消息的源进程和消息。

14.线程同步的几种方式

临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。

互斥量:采用互斥对象机制。只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。

信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。

事件:通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作。

15.操作系统中程序的内存结构

一个程序本质上都是由BSS段、数据段(data段)、text段(代码段)三个组成的。可以看到一个可执行程序在存储(没有调入内存)时分为代码段、数据区和未初始化数据区三部分。

BSS段(未初始化数据区):通常用来存放程序中未初始化的全局变量和静态变量的一块内存区域。BSS段属于静态分配,程序结束后静态变量资源由系统自动释放。

数据段:存放程序中已初始化的全局变量的一块内存区域。数据段也属于静态内存分配。

代码段:存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域属于只读。在代码段中,也有可能包含一些只读的常数变量text段和data段在编译时已经分配了空间,而BSS段并不占用可执行文件的大小,它是由链接器来获取内存的。

       a.BSS段(未进行初始化的数据)的内容并不存放在磁盘上的程序文件中,其原因是内核在程序开始运行前将它们设置为0。需要存放在程序文件中的只有正文段和初始化数据段。

 b.data段(已经初始化的数据)则为数据分配空间,数据保存到目标文件中。数据段包含经过初始化的全局变量以及它们的值。BSS段的大小从可执行文件中得到,然后链接器得到这个大小的内存块,紧跟在数据段的后面。当这个内存进入程序的地址空间后全部清零。包含数据段和BSS段的整个区段此时通常称为数据区

可执行程序在运行时又多出两个区域:栈区和堆区

a.栈区:由编译器自动释放,存放函数的参数值、局部变量等。每当一个函数被调用时,该函数的返回类型和一些调用的信息被存放到栈中。然后这个被调用的函数再为他的自动变量和临时变量在栈上分配空间。每调用一个函数一个新的栈就会被使用。栈区是从高地址位向低地址位增长的,是一块连续的内存区域,最大容量是由系统预先定义好的,申请的栈空间超过这个界限时会提示溢出,用户能从栈中获取的空间较小。

b.堆区:用于动态分配内存,位于BSS和栈中间的地址区域。由程序员申请分配和释放。堆是从低地址位向高地址位增长,采用链式存储结构。频繁的malloc/free造成内存空间的不连续,产生碎片。当申请堆空间时库函数是按照一定的算法搜索可用的足够大的空间。因此堆的效率比栈要低的多。

我要回帖

更多关于 算法多样化和算法优化的关系 的文章

 

随机推荐