Linux进程 ----- 信号处理

信号处理——基础知识及常用算法 信号处理——基础概念及常用算法 阅读详情

目录

前言

一、信号的处理时机

1.1 处理时面临的情况

1.2 “合适”的时机

二、用户态与内核态

2.1 概念理论

2.2 再现 进程地址空间

2.3 信号处理过程

三、信号的捕捉

3.1 内核实现

3.2 sigaction

四、信号部分小结


前言

从信号产生到信号保存,中间经历了很多,当操作系统准备对信号进行处理时,还需要判断时机是否 “合适”,在绝大多数情况下,只有在 “合适” 的时机才能处理信号,即调用信号的执行动作。

一、信号的处理时机

1.1 处理时面临的情况

普通情况

所谓的普通情况就是指 信号没有被阻塞,直接产生,记录未决信息后,再进行处理

在这种情况下,信号是不会被立即递达的,也就无法立即处理,需要等待合适的时机。

特殊情况

当信号被 阻塞 后,信号 产生 时,记录未决信息,此时信号被阻塞了,也不会进行处理

当阻塞解除后,信号会被立即递达,此时信号会被立即处理

普通情况 就有点难搞了,它需要等待 “合适” 的时机,才能被 递达,继而被 处理

1.2 “合适”的时机

信号的产生是 异步 的

        也就是说,信号可能随时产生,当信号产生时,进程可能在处理更重要的事,此时贸然处理信号显然不够明智

比如进程正在执行一个重要的 IO,突然一个终止信号发出,IO 立即终止,对进程、磁盘都不好

因此信号在 产生 后,需要等进程将 更重要 的事忙完后(合适的时机),才进行 处理

合适的时机:进程从 内核态 返回 用户态 时,会在操作系统的指导下,对信号进行检测及处理

至于处理动作,分为:默认动作、忽略、用户自定义

搞清楚 “合适” 的时机 后,接下来需要学习 用户态 和 内核态 相关知


二、用户态与内核态

对于 用户态、内核态 的理解及引出的 进程地址空间 和 信号处理过程 相关知识是本文的重难点

2.1 概念理论

先来看看什么是 用户态和内核态

  • 用户态:执行用户所写的代码时,就属于 用户态
  • 内核态:执行操作系统的代码时,就属于 内核态

自己写的代码被执行很好理解,操作系统的代码是什么?

  • 操作系统也是由大量代码构成的
  • 在对进程进行调度、执行系统调用、异常、中断、陷阱等,都需要借助操作系统之手
  • 此时执行的就是操作系统的代码

也就是说,用户态 与 内核态 是两种不同的状态,必然存在相互转换的情况

用户态 切换为 内核态:

  • 当进程时间片到了之后,进行进程切换动作
  • 调用系统调用接口,比如 open、close、read、write 等
  • 产生异常、中断、陷阱等

内核态 切换为 用户态:

  • 进程切换完毕后,运行相应的进程
  • 系统调用结束后
  • 异常、中断、陷阱等处理完毕

信号的处理时机就是 内核态 切换为 用户态,也就是 当把更重要的事做完后,进程才会在操作系统的指导下,对信号进行检测、处理

下面来结合 进程地址空间 深入理解 操作系统的代码 及 状态切换 的相关内容(拓展知识)

2.2 再现 进程地址空间

首先简单回顾下 进程地址空间 的相关知识:

  • 进程地址空间 是虚拟的,依靠 页表+MMU机制 与真实的地址空间建立映射关系
  • 每个进程都有自己的 进程地址空间,不同 进程地址空间 中地址可能冲突,但实际上地址是独立的
  • 进程地址空间 可以让进程以统一的视角看待自己的代码和数据

不难发现,在 进程地址空间 中,存在 1 GB 的 内核空间,每个进程都有,而这 1 GB 的空间中存储的就是 操作系统 相关 代码 和 数据,并且这块区域采用 内核级页表 与 真实地址空间 进行映射

为什么要区分 用户态 与 内核态 ?

  • 内核空间中存储的可是操作系统的代码和数据,权限非常高,绝不允许随便一个进程对其造成影响
  • 区域的合理划分也是为了更好的进行管理

所谓的 执行操作系统的代码及系统调用,就是在使用这 1 GB 的内核空间

进程间具有独立性,比如存在用户空间中的代码和数据是不同的,难道多个进程需要存储多份操作系统的代码和数据吗?

  • 当然不用,内核空间比较特殊,所有进程最终映射的都是同一块区域,也就是说,进程只是将 操作系统代码和数据 映射入自己的 进程地址空间 而已
  • 而 内核级页表 不同于 用户级页表,专注于对 操作系统代码和数据 进行映射,是很特殊的

当我们执行诸如 open 这类的 系统调用 时,会跑到 内核空间 中调用对应的函数

而 跑到内核空间 就是 用户态 切换为 内核态 了(用户空间切换至内核空间)

这个 跑到 是如何实现的呢?

在 CPU 中,存在一个 CR3 寄存器,这个 寄存器 的作用就是用来表征当前处于 用户态 还是 内核态

  • 当寄存器中的值为 3 时:表示正在执行用户的代码,也就是处于 用户态
  • 当寄存器中的值为 0 时:表示正在执行操作系统的代码,也就是处于 内核态

通过一个 寄存器,表征当前所处的 状态,修改其中的 值,就可以表示不同的 状态,这是很聪明的做法

那么进程又是如何被调度的呢?

  1. 操作系统的本质
    - 操作系统也是软件啊,并且是一个死循环式等待指令的软件
    - 存在一个硬件:操作系统时钟硬件,每隔一段时间向操作系统发送时钟中断
  2. 进程被调度,就意味着它的时间片到了,操作系统会通过时钟中断,检测到是哪一个进程的时间片到了,然后通过系统调用函数 schedule() 保存进程的上下文数据,然后选择合适的进程去运行

2.3 信号处理过程

当在 内核态 完成某种任务后,需要切回 用户态,此时就可以对信号进行 检测 并 处理 了

情况1:信号被阻塞,信号产生/未产生

信号都被阻塞了,也就不需要处理信号,此时不用管,直接切回 用户态 就行了

情况2:当前信号的执行动作为 默认

大多数信号的默认执行动作都是 终止 进程,此时只需要把对应的进程干掉,然后切回 用户态 就行了

情况3:当前信号的执行动作为 忽略

当信号执行动作为 忽略 时,不做出任何动作,直接返回 用户态

情况4:当前信号的执行动作为 用户自定义

这种情况就比较麻烦了,用户自定义的动作位于 用户态 中,也就是说,需要先切回 用户态,把动作完成了,重新坠入 内核态,最后才能带着进程的上下文相关数据,返回 用户态

在 内核态 中,也可以直接执行 自定义动作,为什么还要切回 用户态 执行自定义动作?

  • 因为在 内核态 可以访问操作系统的代码和数据,自定义动作 可能干出危害操作系统的事
  • 在 用户态 中可以减少影响,并且可以做到溯源

为什么不在执行完 自定义动作 直接后返回进程?

  • 因为 自定义动作 和 待返回的进程 属于不同的堆栈,是无法返回的
  • 并且进程的上下文数据还在内核态中,所以需要先坠入内核态,才能正确返回用户态

注意: 用户自定义的动作,需要先切换至 用户态 中执行,执行结束后,还需要坠入 内核态

三、信号的捕捉

3.1 内核实现

如果信号的执行动作为 用户自定义动作,当信号 递达 时调用 用户自定义动作,这一动作称为 信号捕捉

用户自定义动作 是位于 用户空间 中的

        当 内核态 中任务完成,准备返回 用户态 时,检测到信号 递达,并且此时为 用户自定义动作,需要先切入 用户态 ,完成 用户自定义动作 的执行;因为 用户自定义动作 和 待返回的函数 属于不同的 堆栈 空间,它们之间也不存在 调用与被调用 的关系,是两个 独立的执行流,需要先坠入 内核态 (通过 sigreturn() 坠入),再返回 用户态(通过 sys_sigreturn() 返回)

3.2 sigaction

sigaction 也可以 用户自定义动作,比 signal 功能更丰富

#include <signal.h>

int sigaction(int signum, const struct sigaction *act,
                     struct sigaction *oldact);

struct sigaction 
{
	void     (*sa_handler)(int);	//自定义动作
	void     (*sa_sigaction)(int, siginfo_t *, void *);	//实时信号相关,不用管
	sigset_t   sa_mask;	//待屏蔽的信号集
	int        sa_flags;	//一些选项,一般设为 0
	void     (*sa_restorer)(void);	//实时信号相关,不用管
};

返回值:成功返回 0,失败返回 -1 并将错误码设置

参数1:待操作的信号

参数2:sigaction 结构体,具体成员如上所示

参数3:保存修改前进程的 sigaction 结构体信息

这个函数的主要看点是 sigaction 结构体

struct sigaction 
{
	void     (*sa_handler)(int);	//自定义动作
	void     (*sa_sigaction)(int, siginfo_t *, void *);	//实时信号相关,不用管
	sigset_t   sa_mask;	//待屏蔽的信号集
	int        sa_flags;	//一些选项,一般设为 0
	void     (*sa_restorer)(void);	//实时信号相关,不用管
};

其中部分字段不需要管,因为那些是与 实时信号 相关的,我们这里不讨论

sa_mask:当信号在执行 用户自定义动作 时,可以将部分信号进行屏蔽,直到 用户自定义动作 执行完成

也就是说,我们可以提前设置一批 待阻塞 的 屏蔽信号集,当执行 signum 中的 用户自定义动作 时,这些 屏蔽信号集 中的 信号 将会被 屏蔽(避免干扰 用户自定义动作 的执行),直到 用户自定义动作 执行完成

四、信号部分小结

截至目前,信号 处理的所有过程已经全部学习完毕了

信号产生阶段:有四种产生方式,包括 键盘键入、系统调用、软件条件、硬件异常

信号保存阶段:内核中存在三张表,blcok 表、pending 表以及 handler 表,信号在产生之后,存储在 pending 表中

信号处理阶段:信号在 内核态 切换回 用户态 时,才会被处理

Linux进程间的通信——信号处理 1、实现两个程序mysignal、mycontrl,mycontrl给mysignal发送SIGINT信号, 控制mysignal是否在屏幕打印“hello”字符串。 阅读详情

相关推荐

Linux系统编程(信号处理机制)

本篇文章我们来讲解信号的处理机制,信号处理在Linux操作系统中必不可少,这一点值得大家注意,信号又会与中断,异常一起讨论,那么下面我们就来看看到底什么是信号吧。本篇文章就讲解到这里,大家看完后可以好好实验一下。

m0_49476241的博客 1413

Linux信号处理

2、当信号处理完后可能会返回产生信号的代码继续运行,如果我们捕获并处理段错误、算术异常等信号可能会产生死循环,正确的处理段错误、算数异常信号应该是备份数据并直接结束程序。当程序执行到一些特殊操作时,不适合处理信号,此时可以让内核先屏蔽信号,等操作执行完成后再解除屏蔽重新发送信号。6、捕获并处理 (在信号发生前,先向内核注册一个函数,当信号来临时系统会自动执行该函数)当信号产生时,内核会在其维护的信号表中为对应的进程设置与该信号对应的标记,这个过程叫做递送。// 不附带其他信息的信号处理函数。...

weixin_72151098的博客 618

Linux 信号及处理过程详解与示例代码

我们讨论了信号的基本概念,包括信号的标识符和发送方式。我们还解释了信号的处理过程,并提供了一个示例代码来演示如何使用信号处理函数。可以使用 kill 命令向进程发送信号,进程也可以使用 kill 函数发送信号给其他进程。在本文中,我们将详细讨论 Linux 信号的处理过程,并提供一些示例代码来说明其使用方法。通过这个示例,您可以了解到如何使用信号处理函数来处理特定的信号,并在接收到信号时执行自定义的操作。最后,我们在主循环中执行一些任务,直到接收到 SIGINT 信号,此时程序将终止。

FcRuby的博客 258

【Linux】信号的处理

在前两篇linux文章中我们详细的讲解了信号的产生和信号的保存,今天来到最后一个重点信号的处理,对于信号的处理我们会重新引入进程地址空间的知识,并且我们会详细的介绍内核是如何对信号进行捕捉的以及什么是可重入函数。以上就是我们信号处理的所有内容了,对于信号处理这个章节我们需要理解进程地址空间以及内核是如何进行信号捕捉的,下一篇我们发布的linux文章是线程。

Sxy_wspsby的博客 3735

Linux 系统编程 - 进程概念、进程管理、信号处理

本指南介绍 Linux 系统编程中的进程概念、进程管理和信号处理。进程是操作系统中的一个基本概念,它代表一个正在运行的程序。进程管理涉及创建、终止和控制进程,而信号处理允许进程对特定事件(例如键盘输入或文件修改)做出反应。本指南介绍了 Linux 系统编程中的进程概念、进程管理和信号处理。通过遵循提供的算法和代码示例,开发人员可以创建健壮且可扩展的应用程序,这些应用程序可以有效地管理进程并对事件做出反应。

走向CTO的路上... 801

Linux进程信号与信号处理

通过注册信号处理函数,进程可以对接收到的信号进行相应的处理操作。在Linux系统中,进程间通信是非常重要的,而信号是一种常用的进程间通信机制。本文将介绍Linux中的进程信号以及信号处理的相关知识,并提供一些示例代码。信号处理函数是一个特殊的函数,用于处理接收到的信号。除了捕捉系统发送的信号,进程还可以捕捉其他进程发送的信号。在上述示例代码中,sigusr1_handler()函数是SIGUSR1信号的处理函数。在Linux中,可以使用kill命令向指定的进程发送信号。其中,为示例代码中打印的进程ID。

RmAlgorithm的博客 103

Linux进程信号【信号处理】

从信号产生到信号保存,中间经历了很多,当操作系统准备对信号进行处理时,还需要判断时机是否 “合适”,在绝大多数情况下,只有在 “合适” 的时机才能处理信号,即调用信号的执行动作。关于信号何时处理、该如何处理,本文中将会一一揭晓

北 海的博客 1万+

GNU/Linux进程模型:父子进程与信号处理

本文探讨了GNU/Linux环境下进程的创建、同步退出和信号处理机制。通过实例代码展示了如何使用fork创建子进程,并通过wait函数等待子进程退出。同时,介绍了信号处理的重要性,包括如何捕捉信号以及向其他进程发送信号,如kill和raise函数的使用。文章还讨论了在进程间同步和协调中信号的作用,以及传统进程API如exec和exit的用途。

weixin_42620563的博客 441

Linux进程信号处理(26)

这篇就是我们关于信号的最后一篇啦!马上就要到线程喽,进一步说,我们的Linux系统编程就要结束喽!从信号产生到信号保存,中间经历了很多,当操作系统准备对信号进行处理时,还需要判断时机是否 “合适”,在绝大多数情况下,只有在 “合适” 的时机才能处理信号结束了,开始进入线程!

tan180°的博客 1503

深入理解Linux信号处理与进程管理

本文深入探讨了Linux系统中信号处理和进程管理的核心概念。通过示例代码分析了如何使用alarm和信号捕获机制来管理密码输入时间,以及exit函数终止进程时的行为和对shell环境的影响。文章还详细解释了POSIX信号API,特别是sigaction函数的使用和其结构体的组成。此外,介绍了系统命令ps、top和kill的用法,这些命令对于进程监控和信号发送至关重要。

weixin_35762258的博客 885

STM32踩坑--NoST-LINK detected

这里出现的NoST-LINK detected是没有扫描到端口 在我使用一段Fly-MCU后,有一天突然发现出现如上错误,再检查的过程中检查以下几点 1.STM32 魔术棒的设置 1.1Debug设置 1.2 utilities 设置没有问题,与原来一样又看了下端口——在设备管理器中;也没有问题 ...

qq_53002477的博客 2万+

Linux进程信号信号处理

本文深入探讨了信号处理的关键机制与实现原理。首先分析了信号处理的时机选择,指出信号在内核态返回用户态时进行处理,以避免中断重要任务。文章详细阐述了用户态与内核态的转换机制,以及进程地址空间的管理方式,解释了信号处理过程如何利用CPU状态寄存器实现安全切换。重点介绍了sigaction函数的强大功能,包括信号屏蔽和自定义处理,并通过代码示例展示了其应用。此外,文章还补充了可重入函数、volatile关键字优化问题及SIGCHLD信号的子进程回收机制等关键知识,为理解Linux信号系统提供了全面视角。

2401_83603768的博客 1283

无刷电机控制避坑指南:六步换向 vs FOC的5个关键差异

本文深入对比了无刷电机控制中六步换向与FOC(磁场定向控制)的五大核心差异。从控制逻辑、性能表现、效率能耗、硬件成本到应用场景,详细解析了FOC如何通过矢量合成实现平滑的正弦波控制与更高效率,而六步换向则以低成本实现简单开关驱动。旨在帮助工程师根据项目需求,在性能、成本与复杂度间做出最佳选择。

weixin_29216957的博客 506

Linux进程操作(信号及信号处理--信号处理函数)

信号及信号处理信号处理函数设置信号处理函数发送信号向进程本身发送信号设置Linux定时器定时等待I/O挂起进程 信号处理函数 设置信号处理函数 Linux使用 signal 函数将处理函数加载,并且通知系统,其函数原型为: #include<signal.h> void (*signal (int signo,void(* func)(int))) (int); 参数说明: signal : 需要加载处理的信号的编号,例如SIGKILL; func : 是一个函数指针,这个函数捕捉第一个函

Mzcc_bbms的博客 2050

使用兮克 2.5G 交换机将北京联通 EPON 改为 ODI 猫棒接入

最近入手了兮克2.5G交换机(兮克SKS1200-8GPY1XF),有 8 个 2.5G 电口和 1 个 10G SFP+ 光口;支持多种组网模式,其中一种是支持使用猫棒接入,由路由器拨号后再回接到交换机,这样就可以替换掉光猫了。

啦啦啦啦 la 1万+

【正点原子STM32连载】第六十章 串口IAP实战:从Bootloader到APP的无缝升级

本文以正点原子STM32F103开发板为例,详细讲解了串口IAP(在应用编程)技术的实现原理与实战步骤。内容涵盖Bootloader与APP的分工、FLASH空间规划、核心代码解析以及Ymodem协议的应用,旨在帮助开发者掌握通过串口为嵌入式设备实现远程固件升级的关键技术,提升产品维护与迭代效率。

weixin_29161719的博客 445

Linux进程信号【信号处理】_linux 信号处理

搞清楚。

2401_86358687的博客 921

OPC UA 协议详解

OPC UA(统一架构)是新一代工业自动化标准通信协议,替代传统OPC Classic,具有跨平台、高安全性、标准化等优势。基于TCP协议,支持全平台部署,采用面向对象架构组织数据,提供实时读写、事件订阅、历史数据访问等功能。作为工业4.0核心协议,适用于智能制造、数字孪生等场景,能实现多品牌设备统一接入。相比Modbus和MQTT,OPC UA协议更规范安全但复杂度较高,是大型工业集群互联的主流选择。

eastyuxiao的专栏 723

Linux的多进程开发与信号处理

其中,prepare是fork之前执行的回调函数,parent是fork之后父进程执行的函数,child是fork之后子进程执行的函数。比如以下代码,实现了在fork之前屏蔽掉信号处理,fork之后再恢复,避免在fork过程中因为信号处理而出现异常。但是,如果我们希望父进程退出的时候,子进程也一并退出,可以使用prctl函数,注册一个父进程中止时的信号。在Linux系统中,使用fork创建子进程,是简单方便地进行多进程开发的方法。返回值为子进程的pid。,可以在创建子进程的之前、之后,执行自定义的函数。

hello world的博客 713

怎样让你的论文看起来“像人写的”?只用三招直接去除AI味(附提示词)

当然如果你在实际使用中还有其他需求,比如降重润色、改写翻译等,也可以结合七哥的专业写作平台来辅助,这个高级学术平台已经内置了ChatGPT4o、ChatGPT4.1、Claude3.7、满血版DeepSeek-R1等AI大模型,帮你写文献综述、干课题申报、写论文等学术任务绝对每一点问题。比如我自己的一套学术写作平台,其中的“降重与润色”模块整合了多种GPTs应用,除了能帮助调整语言风格、避免雷同表达,还可以顺带降个重,对于提升学术文本的整体质量还是非常有用的。一、为什么用AI写出来的文章会有AI味?

智能AI让学术科研更容易 1684

第51节:cesium 范围查询(含源码+视频)

cesium 范围查询

qq_29384639的博客 1496

linux系统下进程的信号处理流程

一、什么是信号? 1、信号本质 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。 2、信号来源 硬件来源: 用户按终端键,引起终端产生的信号(如:CTRL+C、CTRL+\,CTRL+Z等)。 硬件异常产生信号:内核检测到段错误、管道破裂等、除数为0、无效的

Chasing__Dreams的博客 2522

实战落地!Python抓取股票历史数据:开盘/收盘/成交量全维度爬取(附数据清洗+可视化)

股票历史数据抓取的核心是“数据准确性+完整性”,网页爬取适合小批量、个性化需求,API调用适合批量、标准化需求。多市场数据抓取:适配港股(00700.HK)、美股(AAPL)的抓取逻辑;高频数据抓取:抓取分钟级、小时级行情数据,用于短线量化策略;财务数据扩展:抓取市盈率、市净率、净利润等财务指标,结合价格数据做基本面分析;量化策略回测:将清洗后的数据接入Backtrader、VNPY等量化框架,验证策略有效性。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1739

Linux子进程信号处理机制

Linux子进程信号处理机制

李知恩的一只有理想的Uaena 757

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【Linux】进程信号 --- 信号处理

信号处理,图文并茂

Weraphael的博客 2060

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Linux进程通讯—信号处理

signal系统调用是 UNIX 和类 UNIX 系统(如 Linux)中用于处理信号的一个基础机制。信号是软件中断,它们可以被系统或者进程发送给另一个进程或线程,以通知它们发生了某个事件。这些事件可以是硬件中断(如外部设备请求服务)、软件异常(如除零错误)、用户请求(如用户请求停止进程)等。

weixin_45706195的博客 332

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: Linux进程信号 ----- (信号保存)
下一篇: Linux线程(一)剖析
chen_ever
博客等级 码龄4年 497粉丝 78原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值