实验、进(线)程同步与通信 一、实验目的 1、掌握Linux系统用户界面中键盘命令的使用。 2、学会一种Linux下的编程环境。

Slides:



Advertisements
Similar presentations
实验二 Linux 线程及信号灯 一、目的 了解并掌握 Linux 线程及信号灯。 二、要求 1 、了解 Linux 线程与信号灯使用: ( 1 ) Linux 线程 ( 2 ) Linux 信号灯 ( 3 )线程互斥 ( 4 )线程同步.
Advertisements

阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
Linux 系统. 操作系统发展需求 1 没有操作系统 2 简单批处理操作系统 3 多道程序设计的批处理 4 多道程序设计的分时操作系统 5 多处理机并行系统 6 网络操作系统 7 分布式操作系统.
Oracle数据库 Oracle 子程序.
图表的创建.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
OpenMP简介和开发教程 广州创龙电子科技有限公司
第三章 文本编辑器vi.
Linux环境高级编程实验.
多进程编程.
进程及进程管理 第4章 进程及进程管理.
实践演练 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
走进编程 程序的顺序结构(二).
辅导课程六.
网络常用常用命令 课件制作人:谢希仁.
临界区软件互斥软件实现算法.
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2010
DM81X 视频采集处理 ——简单采集显示例程讲解 广州创龙电子科技有限公司
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
文件读写实践 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
如何生成设备节点 广州创龙电子科技有限公司
临界区软件互斥软件实现算法 主讲教师:夏莹杰
实验三 使用Linux高级IPC 陈毅东.
第七章 操作符重载 胡昊 南京大学计算机系软件所.
实验一、进程控制 一、实验目的 1、加深对进程的理解,进一步认识并发执行的实质; 2、分析进程争用资源现象,学习解决进程互斥的方法;
Gzip编译及调试 曹益华
实验二、线程同步与通信 一、实验目的 1、掌握Linux下线程的概念; 2、了解Linux线程同步与通信的主要机制;
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
内容摘要 ■ 课程概述 ■ 教学安排 ■ 什么是操作系统? ■ 为什么学习操作系统? ■ 如何学习操作系统? ■ 操作系统实例
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
$9 泛型基础.
实验三、共享内存与进程同步 一、实验目的 1、掌握Linux下共享内存的概念与使用方法; 2、掌握环形缓冲的结构与使用方法;
实验三、共享内存与进程同步 一、实验目的与要求 二、实验内容
本节内容 随机读取 视频提供:昆山爱达人信息技术有限公司.
实验四、TinyOS执行机制实验 一、实验目的 1、了解tinyos执行机制,实现程序异步处理的方法。
姚金宇 MIT SCHEME 使用说明 姚金宇
3.5 线程 问题的提出 进程的引入使操作系统得以完成对并发执行的多道程序动态特征的描述和资源共享的管理,因而进程既是调度的基本单位又是资源分配的基本单位。进程所具有的这两个特点构成了程序并发执行的基础,但同时又导致进程切换过程中由于进程映像过大而带来的时空开销。因此,如果系统中创建的进程过多,或进程切换的频率过高,则会使系统效率下降,限制了并发度的进一步提高。
工业机器人知识要点解析 (ABB机器人) 主讲人:王老师
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
Select模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
信号量(Semaphore).
第4章 Excel电子表格制作软件 4.4 函数(一).
iSIGHT 基本培训 使用 Excel的栅栏问题
第二章 类型、对象、运算符和表达式.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab7.
VRP教程 2011.
临界区问题的硬件指令解决方案 (Synchronization Hardware)
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
工业机器人知识要点解析 (ABB机器人) 主讲人:王老师
实验二:添加Linux系统调用及熟悉常见系统调用
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
本节内容 导出表 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
WEB程序设计技术 数据库操作.
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第四章 UNIX文件系统.
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
本节内容 SEMAPHORE 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
2019 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab7.
《操作系统设计与实现》 Linux系统编程.
Presentation transcript:

实验、进(线)程同步与通信 一、实验目的 1、掌握Linux系统用户界面中键盘命令的使用。 2、学会一种Linux下的编程环境。

二、预备知识 1、Linux下的信号灯及其P、V操作。 在Linux中信号灯是一个数据集合(信号量数组),可以单独使用这一集合的每个元素。 有关的系统调用命令: 1)semget:返回一个被内核指定的整型的信号灯索引。 2)semop:执行对信号灯集的操作。 3)semctl:执行对信号灯集的控制操作。

信号灯的定义: 数据结构的原型是semid_ds,在linux/sem.h中定义: struct semid_ds{ struct ipc_perm sem_perm; /*permissions..seeipc.h*/ time_t sem_otime; /*last semop time*/ time_t sem_ctime; /*last change time*/ struct sem *sem_base;/*ptr to first semaphore in array*/ struct wait_queue *eventn; struct wait_queue *eventz; struct sem_undo *undo; /*undo requests on this array*/ ushort sem_nsems; /*no. of semaphores in array*/ };

信号量的创建: 使用系统调用semget()创建一个新的信号量集,或者存取一个已经存在的信号量集. 原型:int semget(key_t key, int nsems, int semflg); 返回值:如果成功,则返回信号量集的IPC标识符。如果失败,则返回-1. key:通过相同的key值调用semget semflg:标记集合,类似open函数的标记。 一般用:IPC_CREAT | 0666 nsems:信号灯的个数

信号量的操作:. 系统调用semop(); 调用原型:int semop(int semid,struct sembuf 信号量的操作: 系统调用semop(); 调用原型:int semop(int semid,struct sembuf *sops,unsigned nsops); 返回值:0—成功。-1—失败 semid:semget函数返回的信号量标识符 sops:指向结构数组的指针: struct sembuf{ ushort sem_num;/*将要处理的信号量的下标*/ short sem_op; /*要执行的操作*/ short sem_flg; /*操作标志,IPC_NOWAIT */ } nsops:操作次数,一般为1

P操作 void P(int semid,int index) { struct sembuf sem; sem.sem_num = index; sem.sem_op = -1; sem.sem_flg = 0; //操作标记:0或IPC_NOWAIT等 semop(semid,&sem,1); //1:表示执行命令的个数 return; }

V操作 void V(int semid,int index) { struct sembuf sem; sem.sem_num = index; sem.sem_op = 1; sem.sem_flg = 0; semop(semid,&sem,1); return; }

信号量的赋值:系统调用semctl() 原型:int semctl(int semid,int semnum,int cmd,union semun arg); 返回值:如果成功,则为一个正数。 ·IPC_RMID将信号量集从内存中删除(不用时删除)。  ·SETALL设置信号量集中的所有的信号量的值。  ·SETVAL设置信号量集中的一个单独的信号量的值(第四个参数指定)。 arg.val=1; semctl(semid,1,SETVAL,arg)

2、线程 1)线程创建 pthread_create(pthread_t. thread, pthread_attr_t 2、线程 1)线程创建 pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *),void *arg); 2)pthread_join(pthread_t th, void **thread_retrun); 作用:挂起当前线程直到由参数th指定的线程被终止为止。

3、共享内存 使用共享内存是运行在同一计算机上的进程进行进程间通信的最快的方法。 int shmget(key_t key,int size,int shmflg) shmflg:IPC_CREAT|0666 int shmat(int shmid, char *shmaddr, int shmflg) shmid:共享内存句柄,shmget调用的返回值 shmaddr:一般用NULL shmfg:SHM_R|SHM_W S = (char *)shmat(shmid1,NULL,SHM_R|SHM_W) 一旦绑定,对共享内存的操作即变为对局部变量S的操作

共享存储区的控制shmctl:对其状态信息进行读取和修改。 int shmctl(int shmid, int cmd, struct shmid_ds * buf); 其中,buf是用户缓冲区地址,cmd是操作命令。 (1)用于查询有关共享存储区的情况。 (2)用于设置或改变共享存储区的属性。 (3)对共享存储区的加锁和解锁命令。 (4)删除共享存储区标识符等。 如shmctl(shmid,IPC_RMID,0)

4、进程控制 fork与execv系统调用 pid_t p1 if ((p1=fork()) == 0) { //sub puts("get created\n"); execv("./get",NULL); } else { //main ……… }

5、编译、编辑、调试 cc –o test -g test.c –lpthread cc –o sub1 sub1.c vi gdb

Linux文件编辑 vi Linux古老的、功能强大的全屏幕编辑器 启动方式: --$vi 文件名 打开已有的文件或编辑新文件 --$vi 先编辑,以后命名存盘

Linux文件编辑(续) Vi的三种状态 命令态 Command mode:接受编辑命令 插入态 Insert mode: 做文字输入,按Esc键可到 Command mode 。 最后一行态Last line mode:将文件写入或离开编辑器,亦可设定编辑环境, 如寻找字串、列出行号..等。

Linux文件编辑(续) 命令态 Command mode i : 插入, 从目前光标所在之处插入所输入之文字。 #x : 例, 3x 表删除 3 个文字。 dd : 删除光标所在之行。

Linux文件编辑续 Last line mode 在命令态按 ‘:’ 或 ‘/’ 即可进入最后一行态Last line mode。Vi底部出现:或/。 --列出行号  :set nu  取消行号 :set nonumber 多行拷贝 :3,10 co 20 存盘 :w 存盘退出:wq 强制存盘退出:wq! --寻找字串  /word  (由首至尾寻找)

Linux进程查看 ps命令 该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等 语法格式如下:   ps [选项]   常用选项说明:   -e 显示所有进程。   -f 全格式。

三、实验内容 1、线程的同步与互斥 2、进程的同步与互斥

实验一的程序要求: 两个线程,共享公共变量a 线程1负责计算(+1) 线程2负责打印 程序结构

线程同步: #include 头文件pthread.h、sys/types.h、linux/sem.h等 P、V操作的函数定义: void P(int semid,int index) void V(int semid,int index) 信号灯、线程句柄定义: int semid; pthread_t p1,p2; 线程执行函数定义:void *subp1();void *subp2();

void. subp1() { for (. ) { P(……. ); 打印; V(… void *subp1() { for (......) { P(…….); 打印; V(…..); } return; subp2负责计算,如何定义?

主函数:main() { 创建信号灯; 信号灯赋初值; 创建两个线程subp1、subp2; 等待两个线程运行结束; 删除信号灯; }

进程同步 问题:在Linux下编程实现誊抄问题,通过多个进程合作将源文件复制到目标文件中 程序的组成:main、get、copy、put四个可执行程序。 main:初始化信号灯、缓冲区,创建三个子进程,等待子进程运行结束后做善后处理; get :读源文件,送入缓冲区S; copy:从S复制信息到T; put :将T中信息写入目标文件

main程序的结构: if ((p1=fork()) == 0) { //sub execv("./get",NULL); }else { //main if ((p2=fork())==0) { //sub execv("./copy",NULL); }else { //main if ((p3=fork()==0)) { execv("./put",NULL); }}} 等待get/copy/put结束; 删除信号灯/共享内存等; } main程序的结构: <linux/shm.h>等; main () {   创建4个信号灯并赋初值;    创建共享缓冲区S、T并赋初值;

get程序的结构: #include 头文件 变量定义; main() {   4个信号灯申请,不赋初值;   缓冲区S申请,初值?     打开源文件;   while (…….) { P(….); 读入S; V(….);     判断结束标记; ……… } }

#include ... copy程序的结构: main() { 4个信号灯申请,不赋初值; 缓冲区S申请,初值? 缓冲区T申请、初值; while (1) { P(…);P(…); T=S; V(….);V(…..); 判断是否结束; }

put程序的结构 #include ..... main() { 信号灯申请; 缓冲区T的申请; 打开目标文件;    while(… ) { P(….); 写目标文件;      V(….);   判断是否结束; }  }