中国科学技术大学计算机系 陈香兰(0512- ) Spring 2011

Slides:



Advertisements
Similar presentations
Linux 操作系统分析 中国科学技术大学计算机系 陈香兰( 0512 - ) Autumn 2010.
Advertisements

3 的倍数的特征 的倍数有 : 。 5 的倍数有 : 。 既是 2 的倍数又是 5 的倍数有 : 。 12 , 18 , 20 , 48 , 60 , 72 , , 25 , 60 ,
7.1 内置对象概述及分类 JSP 视频教学课程. JSP2.2 目录 1. 内置对象简介 1. 内置对象简介 2. 内置对象分类 2. 内置对象分类 3. 内置对象按功能区分 3. 内置对象按功能区分 4. 内置对象作用范围 4. 内置对象作用范围.
高级服务器设计和实现 1 —— 基础与进阶 余锋
阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
Linux 系统. 操作系统发展需求 1 没有操作系统 2 简单批处理操作系统 3 多道程序设计的批处理 4 多道程序设计的分时操作系统 5 多处理机并行系统 6 网络操作系统 7 分布式操作系统.
Bionic libc & ucore 沈彤 张超 Bionic libc 编译 前期:只下载 bionic libc 的源码 – 修改 bionic libc 使之能编译通过,东拼西凑,费 力不讨好 – 隐患:很多宏不知道是否应该定义,可能对代 码造成较大影响.
进 程. “ 程序 ” 和 “ 进程 ” 进程是 OS 对 CPU 执行的程序的运行过程的一种抽象。进程有自 己的生命周期,它由于任务的启动而创建,随着任务的完成(或 终止)而消亡,它所占用的资源也随着进程的终止而释放。 Linux 内核中通常把进程称为任务,每个进程主要通过一个称为进程描 述符(
嵌入式操作系统 陈香兰 Spring 2006 中国科学技术大学计算机系.
嵌入式操作系统 陈香兰 Spring 2007 中国科学技术大学计算机系.
LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
Oracle数据库 Oracle 子程序.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
Hadoop I/O By ShiChaojie.
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
管理信息结构SMI.
走进编程 程序的顺序结构(二).
网络常用常用命令 课件制作人:谢希仁.
临界区软件互斥软件实现算法.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512- )
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2010
第十章 IDL访问数据库 10.1 数据库与数据库访问 1、数据库 数据库中数据的组织由低到高分为四级:字段、记录、表、数据库四种。
中国科学技术大学计算机系 陈香兰(0512- ) Sprint 2011
本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
逆向工程-汇编语言
临界区软件互斥软件实现算法 主讲教师:夏莹杰
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
SOA – Experiment 2: Query Classification Web Service
内容摘要 ■ 课程概述 ■ 教学安排 ■ 什么是操作系统? ■ 为什么学习操作系统? ■ 如何学习操作系统? ■ 操作系统实例
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
第四章 MCS-51定时器/计数器 一、定时器结构 1.定时器结构框图
陈香兰 年7月 VxWorks及其应用开发 陈香兰 年7月.
第四章 团队音乐会序幕: 团队协作平台的快速创建
第二章 Java基本语法 讲师:复凡.
进程概念.
Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512- )
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
Web安全基础教程
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
信号量(Semaphore).
iSIGHT 基本培训 使用 Excel的栅栏问题
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
临界区问题的硬件指令解决方案 (Synchronization Hardware)
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
Python 环境搭建 基于Anaconda和VSCode.
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
WSAAsyncSelect 模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2009
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Chinese Virtual Observatory
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第四章 UNIX文件系统.
第十七讲 密码执行(1).
第十二讲 密码执行(上).
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
本节内容 SEMAPHORE 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
学习目标 1、什么是列类型 2、列类型之数值类型.
Presentation transcript:

中国科学技术大学计算机系 陈香兰(0512-87161312) xlanchen@ustc.edu.cn Spring 2011 Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512-87161312) xlanchen@ustc.edu.cn Spring 2011

Linux中的信号

信号 信号在最早的Unix系统中就已经被引入了,用于在用户态进程间通信。 内核也用信号通知进程系统所发生的事情 2018/11/11 Linux OS analysis

信号 信号是很短的消息 标准信号 通常使用一个数字来标识一个信号 信号可以被发送到一个进程或一组进程。 标准信号没有给参数、消息或是其他相随的信息留有空间 通常使用一个数字来标识一个信号 信号可以被发送到一个进程或一组进程。 2018/11/11 Linux OS analysis

软件中断的概念 信号的产生和处理方式跟中断有些相似 信号是典型的异步事件 (当然也有一些事件是同步错误或异常) 大多数产生信号的事件对进程而言是随机出现 进程不可能做轮询来测试某个标志位或者变量来判别是否发生了一个信号,而是必须告诉内核“在某个信号发生时,应该执行如下操作”,这点跟中断处理例程相似,所以也不难理解标准信号不带参数或者是其他的信息 跟硬件中断一样,任何动作,包括终止进程,都只能由接收到信号的进程来执行,也就是在本进程的上下文中执行 2018/11/11 Linux OS analysis

信号的作用 使用信号的两个主要目的是: 让进程知道已经发生了一个特定的事件 强迫进程执行它自己代码中的信号处理程序 很多应用程序提供自己的信号处理程序 系统也会定义一些缺省的信号处理程序 2018/11/11 Linux OS analysis

信号的生成 异常 当一个进程出现异常(比如试图执行一个非法指令,除0,浮点溢出等),内核通过向进程发送一个信号来通知进程异常的发生 其他进程 一个进程可以通过kill或是sigsend系统调用向另一个进程或一个进出组发送信号。一个进程也可以向自身发送信号 终端 某些键盘字符如ctrl+c等会向终端的前台进程发送信号 2018/11/11 Linux OS analysis

作业控制 配额限制 通知 闹钟 发送信号给那些想要读或写终端的后台进程。比如shell使用信号来管理前台和后台进程 当一个进程使用超过分配给它的cpu时间或是文件大小的限制,内核发送一个信号给这个进程 通知 一个进程也许要求能被通知某些事件的发生。比如设备已经就绪等待I/O操作 闹钟 定时器产生的信号,由内核发送给进程 2018/11/11 Linux OS analysis

Linux/i386中的部分信号 2018/11/11 Linux OS analysis

2018/11/11 Linux OS analysis

信号举例: “Ctrl+c”组合键 假设用户在console下按下“ctrl+c”,这将产生终端中断 tty驱动程序能识别出这个组合键,并向自己的前台进程发送一个SIGINT信号。 当对应进程被调度执行时,它将在上下文切换返回到用户态时检查到这个信号。 此外,通常前台进程就是被ctrl+c中断的current进程。当进程从中断返回时,也会检查到这个信号。 检查到信号后,系统就会让进程执行相应的动作。 2018/11/11 Linux OS analysis

信号举例:异常 前面讲过,异常也是通过信号来实现的。 当程序发生除0错误或是有非法指令时,将引起一个内核态的trap。 2018/11/11 Linux OS analysis

异 常 处 理 程 序 异 常 处 理 程 序 发 出 的 信 号 2018/11/11 Linux OS analysis

例如:除0错 traps_32.c 在do_trap中 针对内核 针对用户 2018/11/11 Linux OS analysis

又如:用户态访问越界 在do_page_fault中: 。。。 。。。 。。。 2018/11/11 Linux OS analysis

与信号相关的系统调用 2018/11/11 Linux OS analysis

信号传递的两个不同阶段 信号产生 信号传递 内核更新进程描述符中跟信号相关的数据结构来表示一个信号被发送给了这个进程 内核强迫目标进程通过以下方式对信号作出反映: 或改变目标进程的执行状态, 或开始执行一个特定的信号处理程序, 或者两者都是 2018/11/11 Linux OS analysis

挂起信号 已经产生但还没有传递的信号称为挂起信号。 任何时候,一个进程仅存在给定类型的一个挂起信号,同一进程同种类型的其他信号不被排队,只被简单的丢弃。 2018/11/11 Linux OS analysis

信号的挂起时间长度往往不可预知,原因在于: 信号通常只被current进程传递 进程可以选择阻塞某种信号。 这种情况下,在取消阻塞之前进程将不接收这个信号 当进程执行一个信号处理程序函数时,通常屏蔽相应的信号,即自动阻塞这个信号直到处理程序结束。因此,所处理的信号的另一次出现不能中断信号处理程序 2018/11/11 Linux OS analysis

信号的应答方式和响应时机 进程以三种方式对一个信号做出应答 1,显式的忽略这个信号 2,执行系统默认的缺省操作,可以是: 多数信号都可以使用这种方式进行处理。 2,执行系统默认的缺省操作,可以是: Terminate:进程被杀死 Dump:进程被杀死,且如果可能,创建包含进程上下文的可用于调试的core文件 2018/11/11 Linux OS analysis

3,捕获信号 Ignore:简单的忽略信号 Stop:进程被停止,状态置为TASK_STOPPED Continue:如果进程被挂起,则状态置为TASK_RUNNING。否则忽略该信号 3,捕获信号 为了执行用户希望的对某个事件的处理,可以由用户指定某个信号的处理函数。 2018/11/11 Linux OS analysis

信号的应答方式和响应时机 注意1:阻塞≠忽略 阻塞仅仅推迟了传递的时间 忽略的信号总是被传递,但是没有进一步的操作 注意2:有两种信号不可以被显式的忽略、捕获或阻塞:SIGKILL和SIGSTOP。因为它们向超级用户提供一种终止或停止进程的可靠的方法 2018/11/11 Linux OS analysis

信号的应答方式和响应时机 内核在如下时机检查进程的信号 1 ,从系统调用/中断返回到用户态之前,在ret_from_intr中执行这个检查 这个检查几乎在每个定时中断时都发生(约10ms) 代码在i386\kernel\entry_32.S中 2,进程从一个可中断的事件醒来后 2018/11/11 Linux OS analysis

代码阅读 thread_info中的相关标志: 2018/11/11 Linux OS analysis

Flag的位定义 2018/11/11 Linux OS analysis

信号相关标志位的设置与清除操作的调用情况 2018/11/11 Linux OS analysis

下面阅读Entry_32.S中部分相关的代码 除这里列出的标志之外的其他所有标志,包括信号挂起 2018/11/11 Linux OS analysis

Entry_32.S中部分相关的代码 2018/11/11 Linux OS analysis

重复直到没有信号(或其他)要处理 2018/11/11 Linux OS analysis

2018/11/11 Linux OS analysis

2018/11/11 Linux OS analysis

内核在处理信号时需要注意的地方 记住每个进程阻塞哪些信号 当从内核态切换到用户态时,要检查是否有信号到达进程 确定是否可以忽略信号。这发生在下列条件都满足时 目标进程没有被另一个进程跟踪 信号没有被阻塞 信号被目标进程忽略 处理这样的信号,即信号可能在进程运行期间的任一时刻请求把进程切换到一个信号处理函数,并在这个函数返回以后恢复原来进程的执行 2018/11/11 Linux OS analysis

与信号相关的数据结构 在进程描述符中与信号处理相关的字段有: Thread_info的flag 如果有信号被挂起,就设置这个标志,前面的 Entry_32.S就根据这个快速判断有无挂起信号, 并根据这个标志调用do_signal 信号描述符 信号处理描述符 被阻塞信号的掩码和临时掩码 记录被挂起的信号 信号处理程序备用堆栈的的地址和大小 驱动程序用于阻塞某些信号相关的函数、 参数和掩码 2018/11/11 Linux OS analysis

2018/11/11 Linux OS analysis

信号位数组 信号个数 Byte Per Word 2组×32位信号, 第一组sig[0]为32个标准信号 第二组为实时信号 2018/11/11 Linux OS analysis

信号描述符signal_struct,用来跟踪挂起的信号 还包括一些其他与信号处理关系并不密切的字段 与信号处理有关的字段包括: 计数器 Wait4()等待队列 接收信号的线程组中最后一个进程 共享挂起信号 2018/11/11 Linux OS analysis

信号处理描述符 Sigaction数据结构 计数器 各个信号的处理操作 2018/11/11 Linux OS analysis

sa_handler,表示如何处理这个信号,可能的值包括: 1,SIG_DFL,即0,表示执行缺省操作 2,SIG_IGN,即1,表示忽略这个信号 3,指向一个信号处理程序的指针,表示按照用户指定的程序处理 2018/11/11 Linux OS analysis

sa_flags:一个标志集,指定必须怎样处理信号 sa_mask:指定处理本信号时,应当屏蔽的信号 仅用于SIGCHLD,当进程被停止时, 不向父进程发送SIGCHLD信号 仅用于SIGCHLD,当进程被停止时, 不向创建僵死状态 带info 使用备用栈 自动的重新开始执行被中断的协调调用 执行信号处理程序时不屏蔽信号 执行信号处理程序后,重新设置缺省操作 2018/11/11 Linux OS analysis

2018/11/11 Linux OS analysis

挂起信号队列 共享挂起信号队列,信号描述符中的shared_pending 私有挂起信号队列,pending 被挂起的信号的相 关信息组成的队列 数据结构为sigqueue 指出挂起的信号是什么 2018/11/11 Linux OS analysis

信号的产生 内核通过调用 这几个函数来产生信号。这些函数只是更新目标进程的进程描述符相关的域。但在条件满足的情况下它们可以唤醒进程让目标进程接收信号 2018/11/11 Linux OS analysis

传递信号 内核在返回到用户态时调用do_signal()来处理非阻塞的挂起信号: 参数: struct pt_regs *regs; //pt_regs结构,指向当前进 //程内核态堆栈中保存的寄存器 2018/11/11 Linux OS analysis

do_signal()一位一位的检查当前被挂起的非阻塞信号,其编号由dequeue_signal()返回,对应于上面介绍的action结构中指定的处理方法: 如果是SIG_IGN(忽略信号) 2018/11/11 Linux OS analysis

如果是SIG_DFL(缺省操作) 2018/11/11 Linux OS analysis

如果信号有一个专门的处理程序,do_signal就调用handle_signal()强迫执行该处理程序 2018/11/11 Linux OS analysis

Handle_signal 信号处理程序是用户态进程所定义的函数,并且包含在用户态的代码段中 问题: 1,必须返回用户态执行信号处理程序 2,必须按照原来进入内核的方式返回用户态 3,一旦返回用户态,内核堆栈就被清空,如何保存内核堆栈的内容 2018/11/11 Linux OS analysis

Linux采用的解决办法: 把保存在内核态堆栈中的上下文拷贝到当前进程的用户态堆栈中 建立好信号处理程序所需的堆栈环境 当信号处理程序运行结束时,调用sigreturn()系统调用把上面保存的内核堆栈的内容再拷贝回内核堆栈 然后正常返回 2018/11/11 Linux OS analysis

2018/11/11 Linux OS analysis

关于系统调用的重新执行 对于一次系统调用,内核可能无法立即满足 此时,进程通常进入等待状态,TASK_INTERRUPTIBLE或者TASK_UNINTERRUPTIBLE 对于前者,进程会因信号而被唤醒,此时系统调用没有完成 不重新执行 强制重新执行 依赖SA_RESTART是否设置。若设置,则重新执行 2018/11/11 Linux OS analysis

信号处理的实现是比较复杂的,本课程不再一一细讲 2018/11/11 Linux OS analysis

与信号处理相关的系统调用 kill(pid, sig)系统调用 阅读sys_kill 发送信号,对应于sys_kill() 对于pid的值 1,如果大于0,发送信号给指定的进程 2,如果=0,把信号发送给同组的所有进程 3,如果=-1,把信号发送给除0号、1号以及current进程之外的所有进程 4,如果小于-1,把信号发送给指定的进程组中的所有的进程 阅读sys_kill 2018/11/11 Linux OS analysis

sigaction(sig, act, oact)系统调用 允许用户为信号指定(改变)一个操作,对应于sys_sigaction() 参数: sig,指明是哪一个信号 act,指定新的操作 oact,可选,用来存放旧的操作 阅读sys_sigaction 2018/11/11 Linux OS analysis

signal(sig, handler)系统调用 设置信号处理程序为handler,对应于sys_singal() 2018/11/11 Linux OS analysis

sigpending()检查挂起的阻塞信号 Sigsuspend()把进程设置为TASK_INTERRUPTIBLE状态 …… 2018/11/11 Linux OS analysis

用户设置信号处理程序举例: 2018/11/11 Linux OS analysis

在copy_signal中: 2018/11/11 Linux OS analysis

Thanks! The end.