实验一、进程控制 一、实验目的 1、加深对进程的理解,进一步认识并发执行的实质; 2、分析进程争用资源现象,学习解决进程互斥的方法;

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 内核中通常把进程称为任务,每个进程主要通过一个称为进程描 述符(
美味料理 5223汪芮臣.
第 20 章 檢視系統資訊.
第十章 UNIX系统内核结构 10.1 UNIX系统概述 10.2 进程的描述和控制 10.3 进程的同步与通信 10.4 存储器管理
“八皇后”问题 崔萌萌 吕金华.
行程(process).
四資二甲 第三週作業 物件導向程式設計.
第七章 操作系统接口 7.1 联机用户接口 7.2 Shell命令语言 7.3 系统调用 7.4 UNIX系统调用 7.5 图形用户接口.
第一章 C语言概述 计算机公共教学部.
UNIX的程序與工作控制 程序的定義與特性 程序的建立 相關指令 背景執行 調整程序優先權 signal與kill 工作控制
马志强 软件学院501室 网络应用开发 马志强 软件学院501室
第七章 异常控制流 CPU控制流的概念 进程上下文切换 异常和中断的基本概念 异常和中断的响应和处理
基于操作系统的编程复习 张玉宏
第 5 章 文件I/O操作.
升學應選擇符合自己性向、興趣或能力的學校就 讀,有五專、高職、高中、綜合高中或進修學校, 可要多花些時間了解一下哦!
南京天石软件技术有限公司 陈锺 (QQ: Solaris 10 C编程 南京天石软件技术有限公司 陈锺 (QQ:
chapter 1-Introduction
system(const char *string)
Shell Script 程式設計.
中国科学技术大学计算机系 陈香兰(0512- ) Spring 2011
編譯環境介紹.
第七章. 文件系统 (lab5).
Linux Programming – Process & Signal
第7章 Linux环境编程.
程序讲解 第一题: 将指定文件的m行到n行字符写到显示屏上,m和n值从键盘输入。 运行时输入及结果: please enter m,n:
本單元介紹何謂變數,及說明變數的宣告方式。
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
进程及进程管理 第4章 进程及进程管理.
实践演练 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
Introduction to the C Programming Language
作業系統實習課(一) -處理程序相關指令介紹-
进程操作.
Process management(程序管理)
程式設計 博碩文化出版發行.
Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512- )
作業系統實習課(四) -檔案管理- 實驗室:720A 助教:鄧執中.
Linux 文件操作——系统调用和标准 IO 库
計數式重複敘述 for 迴圈 P
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
編譯程式設計 期末專題說明 V1.1 May 2004.
第2章 进程管理 2.1 进程概念 2.2 线程 2.3 进程管理 2.4 进程间通信 2.5 经典进程同步问题 2.6 管程
第2章 进程和线程 内容提要: 2.1 进 程 概 念 2.2 进程的状态和组成 2.3 进 程 管 理 2.4 线 程.
序及第0章.
Linux Debugging ls,ps,top,etc. printk() /proc i386提供的调试机制(断点,信号,单步执行)
程式結構&語法.
实验三、共享内存与进程同步 一、实验目的 1、掌握Linux下共享内存的概念与使用方法; 2、掌握环形缓冲的结构与使用方法;
实验三、共享内存与进程同步 一、实验目的与要求 二、实验内容
作業系統 第三章 作業系統結構.
3.5 线程 问题的提出 进程的引入使操作系统得以完成对并发执行的多道程序动态特征的描述和资源共享的管理,因而进程既是调度的基本单位又是资源分配的基本单位。进程所具有的这两个特点构成了程序并发执行的基础,但同时又导致进程切换过程中由于进程映像过大而带来的时空开销。因此,如果系统中创建的进程过多,或进程切换的频率过高,则会使系统效率下降,限制了并发度的进一步提高。
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 类型、对象、运算符和表达式.
1.3操作系统提供的服务和用户接口 操作系统提供的用户接口 程序接口与系统调用 操作接口与系统程序
第 7 章 进程间的通信.
程序管理 蘇偉順助教.
挑戰C++程式語言 ──第9章 函數.
程序管理 蘇偉順助教.
Computer Science & Information Management
实验二:添加Linux系统调用及熟悉常见系统调用
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab4.
作業一: 安裝Linux於btrfs上 中正大學 作業系統實驗室 指導教授:羅習五
第6章 嵌入式软件开发基础.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
2019 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab7.
Introduction to the C Programming Language
《操作系统设计与实现》 Linux系统编程.
隨機函數.
Presentation transcript:

实验一、进程控制 一、实验目的 1、加深对进程的理解,进一步认识并发执行的实质; 2、分析进程争用资源现象,学习解决进程互斥的方法; 3、掌握Linux进程基本控制; 4、掌握Linux系统中的软中断和管道通信。

二、实验内容 编写程序,演示多进程并发执行和进程软中断、管道通信。 父进程使用系统调用pipe( )建立一个管道,然后使用系统调用fork()创建两个子进程,子进程1和子进程2; 子进程1每隔1秒通过管道向子进程2发送数据: I send you x times. (x初值为1,每次发送后做加一操作) 子进程2从管道读出信息,并显示在屏幕上。 父进程用系统调用signal()捕捉来自键盘的中断信号(即按Ctrl+C键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child Process l is Killed by Parent! Child Process 2 is Killed by Parent! 父进程等待两个子进程终止后,释放管道并输出如下的信息后终止 Parent Process is Killed!

三、预备知识 1、Linux文件编辑 vi :Linux古老的、功能强大的全屏幕编辑器 --$vi 文件名 打开已有的文件或编辑新文件 启动方式: --$vi 文件名 打开已有的文件或编辑新文件 --$vi 先编辑,之后命名存盘 Vi的三种模式:命令模式、输入模式和末行模式 gedit:图形编辑器

2、编辑、编译、执行/调试 $vi $cc –o test -g test.c $cc –o sub1 sub1.c $gdb $./test

3、Linux进程管理命令——进程查看 ps命令:报告进程标识、用户、CPU时间消耗及其他属性 top命令:显示CPU占用率为前几位的进程 命令单独使用可以看到前台执行的进程;后台进程可以使用带参数的ps命令(如ps -ax) 提供进程的一次性查看,结果不连续 结果数据很精确,但数据量庞大 top命令:显示CPU占用率为前几位的进程 动态显示,输出结果连续 消耗较多的系统资源 pstree命令:列出当前的进程,以及它们的树状结构 将当前的执行程序以树状结构显示,弥补ps命令的不足 支持指定特定程序(PID)或使用者(USER)作为显示的起始

3、Linux进程管理命令—进程终止 终止一个进程或终止一个正在运行的程序 kill命令:根据PID向进程发送信号,缺省操作是停止进程 pkill命令:终止同一进程组内的所有进程。允许指定要终止的进程名称,而非PID Killall命令:与pkill应用方法类似,直接杀死运行中的程序 数据库服务器的父进程不能用这些命令杀死(容易产生更多的文件碎片导致数据库崩溃)

4、Linux进程控制函数——进程创建 pid=fork(); 创建一个子进程,被创建的子进程是父进程的进程映像的一个副本 (除proc结构外) 。 67

4、 Linux进程控制函数—修改进程 函数族exec() :启动另外的进程取代当前的进程 #include <unistd.h> int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg, const char *envp[]); int execv(const char *path, const char *argv[]); int execve(const char *path, const char *argv[], const char *envp[]; int execvp(const char *file, const char *argv[]); 实例: pid_t p1; if ((p1=fork()) == 0) { execv("./get",NULL); } else { //main ……… }

4、 Linux进程控制函数—进程属性操作 设置进程属性 获取进程属性 nice():改变进程执行的优先级 setpgid():将指定进程的组进程设为指定的组识别码 setpgrp():将目前进程的组进程识别码设为目前进程的进程识别码,等价于setpgid(0,0) setpriority():设置进程、进程组和用户的执行优先权 获取进程属性 getpid():获取目前进程的进程标识 getpgid():获得参数pid指定进程所属的组识别码 getpgrp():获得目前进程所属的组识别号,等价于getpgid(0) getpriotity():获得进程、进程组和用户的执行优先权

4、 Linux控制函数—进程退出 正常退出:在main()函数中执行return、调用exit()函数或_exit()函数 异常退出:调用abort()函数、进程收到信号而终止 区别 exit是一个函数,有参数,把控制权交给系统 return是函数执行完后的返回,将控制权交给调用函数 exit是正常终止进程,abort是异常终止 exit中参数为0代表进程正常终止,为其他值表示程序执行过程中有错误发生 exit()在头文件stdlib.h中声明,先执行清除操作,再将控制权返回给内核 _exit()在头文件unistd.h中声明,执行后立即返回给内核

4. Linux控制函数—等待进程终止 wait(); waitpid(); ① wait() 语法格式: pid=wait(stat_addr); wait()函数使父进程暂停执行,直到它的一个子进程结束为止,该函数的返回值是终止运行的子进程的PID。参数status所指向的变量存放子进程的退出码,即从子进程的main函数返回的值或子进程中exit()函数的参数。如果status不是一个空指针,状态信息将被写入它指向的变量。 ② waitpid() 语法格式:waitpid(pid_t pid,int * status,int options) 用来等待子进程的结束,但它用于等待某个特定进程结束。 参数pid指明要等待的子进程的PID,参数status的含义与wait()函数中的status相同。 76

5. 进程的软中断通信 即信号机制,提供一种简单的处理异步事件的方法,在一个或多个进程之间传递异步信号 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 76

当某个信号出现时,系统有三种处理方式: 功能 忽略信号:大多数信号使用,但SIGKIL和SIGSTOP不能被忽略 捕捉信号:通知内核在某种信号发生时,调用一个用户函数 执行系统默认动作:异常终止(abort)、退出(exit)、忽略(ignore)、停止(stop)或继续(continue) 功能 发送信号:发送进程把信号送到指定进程信号域的某一位上,如目标进程正在一个可被中断的优先级上睡眠,核心便将其唤醒 预置对信号的处理方式:进程处于核心态时,即使受到软中断也不予理睬;只有当它返回到用户态后,才处理软中断信号 收受信号的进程按事先规定完成对相应事件的处理 76

5. 进程的软中断通信——函数的使用 向一个进程或一组进程发送一个信号:int kill(pid, sig) pid>0时,核心将信号发送给进程pid pid<0时,核心将信号发送给与发送进程同组的所有进程 pid=-1时,核心将信号发送给所有用户标识符真正等于发送进程的有效用户标识号的进程 预置信号接收后的处理方式:signal(sig, function) function=1时,屏蔽该类信号 function=0时,收到sig信号后终止自己 function为非0、非1类整数时,执行用户设置的软中断处理程序 76

int main(void) { if(signal(SIGUSR1, my_func) == SIG_ERR) printf("can't catch SIGUSR1.\n'"); if(signal(SIGUSR2, my_func) == SIGUSR2.\n'"); if(signal(SIGINT, my_func) == SIGINT.\n'"); kill(getpid(),SIGINT); while(1); return 0; } include<stdio.h> #include<stdlib.h> #include<signal.h> void my_func(int sig_no) { if(sig_no == SIGUSR1) printf("Receive SIGUSR1.\n"); if(sig_no == SIGUSR2) printf("Receive SIGUSR2.\n"); if(sig_no == SIGINT) { printf("Receive SIGINT.\n"); exit(0); }

6. Linux进程间通信—管道和有名管道 管道用于具有亲缘关系进程间的通信 管道是半双工的,数据只能单向流动(双方通信需建立两个管道) 管道只能用于父子进程或兄弟进程之间 管道对于管道两端的进程而言就是一个文件,并单独构成一种文件系统,存在于内存中 写管道的内容添加在管道缓冲区的末尾,读管道则从缓冲区头部读出 有名管道在普通管道具备功能基础上,通过给管道命名的方法变成管道文件,允许无亲缘关系进程间通过访问管道文件进行通信

6. 管道通信的使用—无名管道的使用 int pipefd[2]; int pipe(pipefd); /*创建无名管道*/ pipefd[0]只能用于读; pipe[1]只能用于写 将数据写入管道:write() 管道长度受到限制,管道满时写入操作将被阻塞,直到管道中的数据被读取 fcntl()可将管道设置为非阻塞模式 从管道读取数据:read() 当数据被读取后,数据将自动被管道清除 不能由一个进程向多个进程同时传递同一个数据 fcntl()可将管道读模式设置为非阻塞模式 关闭管道:close() 关闭读端口时,在管道上进行写操作的进程将收到SIGPIPE信号 关闭写端口时,进行读操作的read()函数将返回0

6. 管道通信的使用—命名管道的创建与读写 创建命名管道: int mknod(const char *path, mode_t mod, dev_t dev); int mkfifo(const char *path, mode_t mode); 命名管道必须先调用open()将其打开 同时用读写方式(O_RDWR)打开时,一定不会导致阻塞 以只读方式(O_RDONLY)打开时,调用open()函数的进程将会被阻塞直到有写方打开管道 以写方式(O_WRONLY)打开时,阻塞直到有读方打开管道

四、实验指导 main( ) { 创建无名管道; 设置软中断信号SIGINT; 创建子进程1、2; 等待子进程1、2退出; 关闭管道; } 父进程信号处理 { 发SIGUSR1给子进程1; 发SIGUSR2给子进程2; }

子进程2 { 设置忽略信号SIGINT; 设置信号SIGUSR1; while(1) { 接收管道数据; 显示数据; } 子进程1 { 设置忽略信号SIGINT; 设置信号SIGUSR1; while(1) { 发送数据至管道数据; 计数器++; 睡眠1秒; } SIGUSR1信号处理 { 关闭管道; 显示退出信息; 退出; }