第 7 章 进程间的通信.

Slides:



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

Linux 环境及 Shell 程序 操作系统实验 1. 二、 Shell 编程与进程通信 常用 shell 命令 文件及文件属性操作 ls 、 cp 、 mv 、 rm ln 、 ln –s 、 chmod 、 groupadd 、 useradd 输入输出操作 echo 、 cat >> 、
© 2001 孟静制作 版权所有 第二章 CPU 管理和进程、线程管理 2.1 CPU 管理概述 2.2 进程管理 2.3 进程模型实例分析 :UNIX 早期版本的 CPU 管理 子系统 ( 进程模型 ) 2.4 处理机管理实例分析 (2):linux CPU 管理(进程 模型) 2.5 线程模型.
进 程. “ 程序 ” 和 “ 进程 ” 进程是 OS 对 CPU 执行的程序的运行过程的一种抽象。进程有自 己的生命周期,它由于任务的启动而创建,随着任务的完成(或 终止)而消亡,它所占用的资源也随着进程的终止而释放。 Linux 内核中通常把进程称为任务,每个进程主要通过一个称为进程描 述符(
港股通首单分拆合并业务技术培训. 恒发洋参 4 : 1 合并股份 根据恒发洋参控股有限公司(恒发洋参)之股份合并建议,每 4 股每股面值 港元之现有股份( “ 现有股份 ” )将合并为 1 股每股面值 港元之股份 (“ 合并股份 ”) 。合并股份的开始买卖日期预计为 2016.
提高社会组织的自律能力 履行社会组织的社会责任
第3章 中文字处理软件Word 年秋.
第 20 章 檢視系統資訊.
好習慣是這樣養成的 夏欣 著 Shared by Leu C. D..
上課教材 Database Slide Windows筆電 (32 bit)
開南大學 資訊管理學系 學分學程相關說明.
Microsoft Office Microsoft Office是微软影响力最为广泛的产品之一,常用组件有 Word、Excel、Powerpoint等。 课时分配 Word部分 Excel部分 PPT部分 大学计算机基础(一) 12 8 大学计算机基础(二) 4.
我國專利法修正草案 之醫藥議題 經濟部智慧財產局 王局長美花 2011年6月.
第十章 UNIX系统内核结构 10.1 UNIX系统概述 10.2 进程的描述和控制 10.3 进程的同步与通信 10.4 存储器管理
方正数字图书馆.
大型、高负载网站架构和应用初探.
第七章 操作系统接口 7.1 联机用户接口 7.2 Shell命令语言 7.3 系统调用 7.4 UNIX系统调用 7.5 图形用户接口.
一年級評估安排.
我的家乡——福鼎.
UNIX的程序與工作控制 程序的定義與特性 程序的建立 相關指令 背景執行 調整程序優先權 signal與kill 工作控制
香港普通話研習社科技創意小學 周順強老師.
项目进度管理.
操作系统 Operating System.
營建自動化 -營建管理資訊化 授課老師:劉俊杰 副教授 中華民國89年9月27日.
第六节 管道仪表流程图的绘制 (一)图样的内容 (二)PID的图面布置 (三)PID的绘制要点 (四)读图举例 (五)绘制步骤
项目二 MastercamX2的基础操作 任务2.1 MatercamX2的工作界面 任务2.2 MatercamX2的基本操作
权力的行使:需要监督 北京市京源学校 冯 悦.
何娜 求职经验交流 何娜
中央广播电视大学计算机课程 操 作 系 统.
Confidential Property
chapter 1-Introduction
中国科学技术大学计算机系 陈香兰(0512- ) Spring 2011
第4章 作業系統的介紹及操作.
第7章 Linux环境编程.
多进程编程.
國立中央大學機械系網管小組 指導老師:葉則亮 教授 張新民 助教 邱創文 助教 專案成員:劉柏清 簡永懿
1-1-1作業系統的功能 提供使用者操作介面 提供程式執行環境 控制輸入\輸出程序 分配系統資源 管理與維護磁碟中的檔案
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2010
线程(Thread).
进程操作.
Process management(程序管理)
Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512- )
第3章 認識處理元.
第 23 讲 操作系统接口与UNIX系统内核结构 李元金 计算机与信息工程学院 1.
实验一、进程控制 一、实验目的 1、加深对进程的理解,进一步认识并发执行的实质; 2、分析进程争用资源现象,学习解决进程互斥的方法;
7.1.1 设备管理的功能(P95) 分配设备:按设备的不同类型和操作系统选用的算法分配。包括分配相应的通道、设备控制器以及对未分配到的任务或怍业进行排队等; 控制和实现真正的输入输出操作。包括通道程序控制、启动设备、及时响应及处理中断讯号等; 对输入输出缓冲区进行管理。例如逻辑名的管理,多个缓冲区的分时以及串并行操作,同类多个外部设备的均衡工作,避免“忙的忙”和“闲的闲”;
第二章 UNIX系统安装与常用命令.
作業系統 第三章 作業系統結構.
实验三、共享内存与进程同步 一、实验目的 1、掌握Linux下共享内存的概念与使用方法; 2、掌握环形缓冲的结构与使用方法;
实验三、共享内存与进程同步 一、实验目的与要求 二、实验内容
Word -基本操作 資訊教育.
作業系統 第三章 作業系統結構.
教育概論 答題要訣.
核心系统数据库组 了解应用服务器 核心系统数据库组
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
台灣大學計算機及資訊網路中心 教學研究組 張傑生
某公司基于战略地图的KPIS分解和提取.
程序管理 蘇偉順助教.
程序管理 蘇偉順助教.
架构师成长感悟 吴隆烽
实验二:添加Linux系统调用及熟悉常见系统调用
动态扫描显示(实验四) 查询式键盘(实验五)
论文答辩PPT模板 答辩学生:PPT宝藏 指导老师:PPTBZ.COM.
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
第六章 文件系统与文件管理 6.4 Linux文件管理 1、比较MS DOS 与 Linux的目录结构 一、Linux文件系统的树形结构
2019 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab7.
第六章 直接成本法.
《操作系统设计与实现》 Linux系统编程.
Presentation transcript:

第 7 章 进程间的通信

本章重点 进程通信中信号概念及信号处理 进程间的管道通信编程 进程间的内存共享编程

7.1.1 信号及其使用 信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。 信号事件的发生有两个来源: 硬件来源,如按下了键盘Delete键或者鼠标单击,通常产生中断信号(SIGINT)或者其它硬件故障。 软件来源,如使用系统调用或者是命令发出信号。最常用发送信号的系统函数是kill、raise、alarm、setitimer、sigation和sigqueue函数,软件来源还包括一些非法运算等操作。

7.1.1 信号及其使用 例7.1:列出系统所支持的所有信号列表。 (1)使用系统命令:[root@localhost root]#kill -l (2)分析: SIG信号 SIGRTMIN信号是从UNIX系统中继承下来的称为不可靠信号(也称为非实时信号)。 SIGRTMAX是为了解决前面“不可靠信号”问题而进行更改和扩充的信号,称为可靠信号(也称为实时信号)。 可靠信号(实时信号):支持排队,发送用户进程一次就注册一次,发现相同信号已经在进程中注册,也要再注册。 不可靠信号(非实时信号):不支持排队,发送用户进程判断后注册,发现相同信号已经在进程中注册,就不再注册,忽略该信号。前面显示的31种“SIG”开头的,也属于非实时信号。

7.1.1 信号及其使用 一旦有信号产生,用户进程对信号的响应有3种方式: 执行默认操作。Linux对每种信号都规定了默认操作。 捕捉信号。定义信号处理函数,当信号发生时,执行相应的处理函数。 忽略信号。不希望接收到的信号对进程的执行产生影响,而让进程继续进行时,可以忽略该信号,即不对信号进程任何处理。

常见信号的含义及其默认操作

7.2.1 信号操作的相关函数

7.2.1 信号操作的相关函数 1. 信号发送 信号发送的关键,是使系统知道向哪个进程发送以及发送什么信号。能否向某一进程发送某一特定信号是和用户的权限密切相关的。

7.2.1 信号操作的相关函数 例7.2:设计一个程序,要求用户进程复制出一个子进程,父进程向子进程发出信号,子进程收到此信号,结束子进程。 源程序代码: 编译成功后,运行可执行文件,此时系统会显示子进程的进程号(PID)、kill 函数的返回值和SIGKILL信号所结束进程的进程号(PID)。 由此例可知,系统调用kill函数和raise函数,都是简单地向某一进程发送信号。kill函数用于给特定的进程或进程组发送信号,raise函数用于向一个进程自身发送信号。

7.2.1 信号操作的相关函数

7.2.1 信号操作的相关函数 2. 信号处理 当某个信号被发送到一个正在运行的进程时,该进程即对此特定信号注册相应的信号处理函数,以完成所需处理。

7.2.1 信号操作的相关函数 例7.3:设计一个程序,要求程序运行后进入无限循环,当用户按下中断键(Ctrl+C)时,进入程序的自定义信号处理函数,当用户再次按下中断键(Ctrl+C)后,结束程序运行。 源程序代码 : signal函数主要用于前31种非实时信号的处理,不支持信号传递信息(函数类型是void),但使用简单、方便,只需把要处理的信号和处理函数列出即可,因此受到许多软件工程师欢迎。

7.2.1 信号操作的相关函数

7.2.1 信号操作的相关函数 3. 信号阻塞 有时既不希望进程在接收到信号时立刻中断进程的执行,也不希望此信号完全被忽略掉,而是延迟一段时间再去调用信号处理函数,这个时候就需要信号阻塞来完成。

7.2.1 信号操作的相关函数 例7.4:设计一个程序,要求程序主体运行时,即使用户按下的中断键(Ctrl+C),也不能影响正在运行的程序,等程序主体运行完毕后才进入自定义信号处理函数。 源程序代码 :

7.2.1 信号操作的相关函数

7.2 管道 在Linux中,管道是一种特殊的文件,对一个进程来说,管道的写入和读取与一个普通文件没有区别。 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程); 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。

7.2.1 低级管道操作 低级管道操作时,建立管道用pipe函数,建立管道后Linux系统会同时为该进程建立2个文件描述符pipe_fd[0]和pipe_fd[1]。pipe_fd[0]用来从管道读取数据,pipe_fd[1]用来把数据写入管道。

7.2.1 低级管道操作 例7.5:设计一个程序,要求创建一个管道,复制进程,父进程往管道中写入字符串,子进程从管道中读取前输出字符串。 源程序代码:

7.2.1 低级管道操作

7.2.2 高级管道操作 例7.6:设计一个程序,要求用popen创建管道,实现“ls -l|grep 7-6”的功能。 源程序代码 : 使用popen函数读写管道,实际上也是调用pipe函数建立一个管道,再调用fork函数建立子进程,接着会建立一个shell环境,并在这个shell环境中执行参数指定的进程。

7.2.2 高级管道操作

7.2.3 命名管道 若要在两个不相关的进程之间用管道通信,需要用到命名管道FIFO。 命名管道FIFO是通过Linux系统中的文件进行通信。命名管道的创建一般用mkfifo函数,创建成功后,就使用open、read、write等函数传输数据。

7.2.3 命名管道 例7.7:设计两个程序,要求用命名管道FIFO,实现简单的聊天功能。

7.2.3 命名管道 源程序7-7zhang.c代码:

7.2.3 命名管道 7-7li.c程序代码如下:

7.2.3 命名管道 mkfifo函数说明 memset函数说明

7.3 消息队列 消息队列,就是一个消息的链表,是一系列保存在内核中的消息的列表。用 消息队列的优势:对每个消息指定特定消息类型,接收的时候不需要按队列次序,而是可以根据自定义条件接收特定类型的消息。 可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读取消息。 消息队列的常用函数

7.3 消息队列 例7.8:设计一个程序,要求创建消息队列,输入的文字添加到消息队列后,读取队列中的消息输出。 源程序代码: 由此例可知,进程间通过消息队列通信,主要是创建或打开消息队列、添加消息、读取消息和控制消息队列这四种操作。

ftok函数说明 msgget函数说明 msgsnd函数说明 msgrcv函数说明

7.4 共享内存 共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,所以是最快的一种进程间通信机制。 共享内存原理:

7.4 共享内存 共享内存可以通过mmap()系统调用(特殊情况下还可以采用匿名映射)机制实现,也可以通过系统V共享内存机制实现。应用接口和原理很简单,内部机制复杂。为了实现更安全通信,往往还与信号灯等同步机制共同使用。 常用函数 :

7.4.1 mmap系统调用 例7.9:设计一个程序,要求复制进程,父子进程通过匿名映射实现共享内存。 源程序代码:

7.4.1 mmap系统调用 mmap函数说明 munmap函数说明

7.4.2 系统V共享内存 系统V共享内存指的是把所有共享数据放在共享内存区域(IPC shared memory region),任何想要访问该数据的进程都必须在本进程的地址空间新增一块内存区域,用来映射存放共享数据的物理内存页面。 系统V共享内存是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信。

7.4.2 系统V共享内存 例7.10:设计两个程序,要求通过系统V共享内存通信,一个程序写入系统V共享区域,另一个程序读取系统V共享区域。 7-10write.c程序代码:

7.4.2 系统V共享内存 7-10read.c程序代码:

7.4.2 系统V共享内存 结论: 系统V共享内存中的数据,从来不写入到实际磁盘文件中去;而通过mmap()映射普通文件实现的共享内存通信可以指定何时将数据写入磁盘文件中。 系统V共享内存是随内核持续的,即使所有访问共享内存的进程都已经正常终止,共享内存区仍然存在(除非显式删除共享内存),在内核重新引导之前,对该共享内存区域的任何改写操作都将一直保留。 通过调用mmap()映射普通文件进行进程间通信时,一定要注意考虑进程何时终止对通信的影响。而通过系统V共享内存实现通信的进程则不然。

7.4.2 系统V共享内存 shmget函数说明 shmat函数说明 shmdt函数说明

思考与实验 设计一个程序,要求程序运行后进入一个无限循环,当用户按下中断键(Ctrl+Z)时,进入程序的自定义信号处理函数,当用户再次按下中断键(Ctrl+Z)后,结束程序运行。 设计一个程序,要求程序主体运行时,即使用户按下的中断键(Ctrl+C),也不能影响正在运行的程序,等程序主体运行完毕后才进入自定义信号处理函数。 设计一个程序,要求创建一个管道PIPE,复制进程,父进程运行命令“ls -l”,把运行结果写入管道,子进程从管道中读取“ls -l”的结果,把读出的作为输入接着运行“grep 7-5”。

思考与实验 设计两个程序,要求用命名管道FIFO,实现简单的文本文件或图片文件的传输功能。 设计两个程序,要求用消息队列,实现聊天程序,每次发言后自动在后面增加当前系统时间。增加结束字符,比如最后输入“88”后结束进程。 设计两个程序,要求用mmap系统,实现简单的聊天程序。