信号量

(1)IPC简介

笑着哭i 提交于 2020-01-13 19:20:27
Unix/Linux IPC简介 简述 1. 消息传递演变过程 2. 同步形式演变 进程、线程与信息共享 IPC对象的持续性 名字空间 fork、exec和exit对IPC对象的影响 总结 参考资料 简述 IPC是进程间通信(interprocess communication)的简称。用来描述运行在一个操作系统之上的不同进程间各种消息传递的方式。 IPC在使用过程中需要同步参与一起运行。 1. 消息传递演变过程 管道(pipe):只能在具有共同祖先(指父子进程关系)的进程间使用,有名管道fifo可以在任意进程间使用 System V消息队列:可在同一主机上有亲缘关系或无亲缘关系的进程间使用。 Posix消息队列:可在同一主机上有亲缘关系或无亲缘关系的进程间使用。 远程过程调用: 2. 同步形式演变 使用文件系统特性同步 记录上锁(record-locking) System V信号量 Posix信号量和Posix共享内存区 互斥锁(mutex)和条件变量(condition variable):主要用于线程间同步,也能提供进程间的同步 读写锁(read-write-lock) 进程、线程与信息共享 unix/linux间信息共享的三种方式 两个进程共享存储在文件系统中的某个文件上的信息。访问该文件,每个进行都要经过内核(如read,write,lseek等)

进程通信之IPC通信对象——信号灯

对着背影说爱祢 提交于 2020-01-13 13:58:08
进程间通过信号灯的通信。 信号灯的创建函数semget(): 信号灯的删除函数semctl(): 例子1:信号灯的创建和删除,通过semget函数创建,调用semctl函数删除。 #include"sys/types.h" #include"signal.h" #include"unistd.h" #include"stdio.h" #include"stdlib.h" #include"sys/sem.h" int main() { int semid; semid=semget(IPC_PRIVATE,3,0777); if(semid<0) { printf("creat semaphore failure\n"); return -1; } printf("creat semaphore success\n"); system("ipcs -s"); //delete semaphore semctl(semid,0,IPC_RMID,NULL); system("ipcs -s"); return 0; } 运行结果如图: 成功创建3个信号灯后,又成功删除了。 例子2:一般我们可以用全局变量来实现父子线程之间的同步,如下thread.c的内容:通过定义一个全局变量thread_inter来实现父子线程的同步问题。 #include<pthread.h> #include

操作系统进程管理常见问题(进程和线程的概念、临界区和临界资源的概念)

雨燕双飞 提交于 2020-01-11 02:37:11
1.什么是进程 i:进程是程序的一次执行。 ii:进程是一个程序及其数据在处理机上顺序执行时所发生的活动。 iii:进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。 2.现代操作系统中的进程为何有多种状态?请列举几种常见的进程状态。 进程有三种基本状态(不同系统设置的进程状态数目不同) 就绪状态:一个进程已经具备执行条件,但由于无CPU暂时不能执行的状态 运行状态:进程占有CPU,并在CPU上执行 阻塞状态:指进程因等待某种事件的发生而暂时不能执行的状态 其他状态 新建状态:OS(操作系统)已完成为创建一进程所必要的工作 终止状态:程序终止后移入该状态 3.请画图描述进程基本状态的转换。 4.系统是如何管理进程的? 系统管理进程一般由原语来实现。 5.我们要运行一个程序时,操作系统是如何为我们创建一个进程的? i:申请空白PCB,赋予一个进程标识符 ii:为新进程分配资源 如内存 iii:初始化进程控制块 iv:为新进程插入就绪队列 6.现代操作系统为何需要同步机制?有哪些常见的进程同步机制?设计同步机制时需要遵循哪些准则? 现代操作系统往往需要多个进程中发生的事件存在某种时序关系,需要互相合作,共同完成一项任务。 锁机制、信号量机制、管程机制 同步机制的准则 空闲让进:当无进程在互斥区时,任何有权使用互斥区的进程可进入 忙则等待

SYS/BIOS知识整理汇总

泪湿孤枕 提交于 2020-01-10 17:31:14
本文主要整理BIOS相关组件的执行原理及使用,这里主要包括了硬件中断Hwi模块、软件中断Swi模块、时钟Clock模块、任务Tsk模块、信号量Sem模块。 1.SYS/BIOS概述 SYS/BIOS是一个可扩展的实时内核(或者说是操作系统),其提供了许多模块化的APIs(应用程序接口),支持抢占式多线程,硬件抽象,实时分析和配置工具,其设计目的是为了最大限度地减少对内存和CPU的要求。其拥有很多实时嵌入式操作系统的功能,如任务的调度,任务间的同步和通信,内存管理,实时时钟管理,中断服务管理等。有了它,用户可以编写复杂的多线程程序,并且会占用更少的CPU和内存资源。 SYS/BIOS的早期版本是DSP/BIOS,更名的原因,是因为SYS/BIOS不仅可以用于DSP,而且也可以嵌入到ARM等其他Soc中去。SYS/BIOS是一个可用于实时调度、同步,主机和目标机通信,以及实时分析系统上的一个可裁减实时内核,它提供了抢占式的多任务调度,对硬件的及时反应,实时分析和配置工具等。同时也提供标准的API接口,易于使用。它是TI的eXpressDSP实时软件技术的的一个关键部分。 2.开发环境 CCS支持SYS/BIOS的开发,用户单独下载安装bios组件即可运行,能够大大方便用户编写多任务应用程序。 3.SYS/BIOS相比裸机的优点 适用于复杂系统,在需要同时处理多个事件时SYS

进程与线程

核能气质少年 提交于 2020-01-10 13:26:26
文章目录 进程与线程 进程通信 无名管道: 命名管道:FIFO 消息队列: 信号量: 共享内存: Socket通信: 线程之间的同步 互斥锁:互斥锁就是一种锁机制 条件变量 读写锁 自旋锁 信号量 总结: 进程与线程 概念:什么是线程:是操作系统能够进行运算调度的最小单位。什么是进程:是计算机中某一次数据集合的运行活动,是操作系统分配资源的最小单位。线程依赖于进程,进程就是线程的容器。 上面的描述比较官方,我的理解就是:想要通过计算机来完成某件事件那么你就得有一个进程来帮助你完成这个任务,也就是说,进程等价于利用计算机完成任务的一种手段,操作系统会为进程去分配各种资源,内存什么的,那么线程就是把进程分配成一个个小任务去执行,也就是说是进程执行的最小单位。 两个问题: 进程就是一个个跑在操作系统上的程序,那么如果想让两个进程或者多个进程之间通信怎么办? 线程是进程运行的最小单位,那么如果两个线程用到了同一个资源,怎么进行同步,否则这个资源的使用就乱套了 也就是说:进程要解决通信问题,否则就是单击小程序,线程要解决同步问题,也就是资源共享在线程中的问题。 进程通信 在Linux中进程通信有六种基本的方式: 无名管道: 是一种不属于任何文件系统的特殊文件,可以使用read和write 原型 #include <unistd.h>2 int pipe(int fd[2]); // 返回值

信号量Semaphore,读写锁ReadWriteLock,计数器CountDownLatch,循环栅栏CyclicBarrier运用

不羁的心 提交于 2020-01-10 06:20:53
1.信号量Semaphore: 像synchronized, ReentrantLock等这些对临界区资源进行同步后,所有对临界区资源进行访问的线程都得串行排队,而信号量允许指定的线程数同时进行访问 demo: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class TestSemaphore implements Runnable{ private static Semaphore semaphore = new Semaphore(5); //允许同时5个线程进行访问 不会阻塞 @Override public void run(){ try { semaphore.acquire(); System.out.println(System.currentTimeMillis() +" "+ Thread.currentThread().getName()); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); }finally { semaphore.release(

无聊的哲学家进餐问题

不问归期 提交于 2020-01-10 05:47:57
1 描述 一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭,如图所示。哲学家们倾注毕生精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿的时候,才试图拿起左、右两根筷子(一根一根地拿起)。如果筷子已在他人手上,则需等待。饥饿的哲学家只有同时拿到了两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考。 2 分析 1) 关系分析。 5名哲学家与左右邻居对其中间筷子的访问是互斥关系。 2) 整理思路。 显然这里有五个进程。本题的关键是如何让一个哲学家拿到左右两个筷子而不造成死锁或者饥饿现象。那么解决方法有两个,一个是让他们同时拿两个筷子;二是对每个哲学家的动作制定规则,避免饥饿或者死锁现象的发生。 3) 信号量设置。 定义互斥信号量数组Ch0PstiCk[5] = {l, 1, 1, 1, 1}用于对5个筷子的互斥访问。对哲学家按顺序从0~4编号,哲学家i左边的筷子的编号为i,哲学家右边的筷子的编号为(i+l)%5。 semaphore chopstick[5] = {1,1,1,1,1}; //定义信号量数组chopstick[5],并初始化 Pi(){ //i号哲学家的进程 while(1){ P(chopstick[i]); //取左边筷子 P(chopstick[(i+1)%5]); //取右边篌子 eat; V

哲学家进餐问题

好久不见. 提交于 2020-01-10 00:32:51
参考:https://blog.csdn.net/fuziwang/article/details/79809994 1.问题描述: 哲学家进餐问题描述有五个哲学家,他们的生活方式是交替地进行思考和进餐,哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,平时哲学家进行思考,饥饿时便试图取其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐,该哲学家进餐完毕后,放下左右两只筷子又继续思考。 约束条件 (1)只有拿到两只筷子时,哲学家才能吃饭。 (2)如果筷子已被别人拿走,则必须等别人吃完之后才能拿到筷子。 (3)任一哲学家在自己未拿到两只筷子吃完饭前,不会放下手中已经拿到的筷子。 2.求解方法 (1).信号量的设置 放在桌子上的筷子是临界资源,在一段时间内 只允许一位哲学家 使用,为了实现对筷子的互斥访问,可以用一个信号量表示筷子,由这 五个信号量构成信号量数组 。 semaphore chopstick[5] = {1,1,1,1,1}; while(true) { /*当哲学家饥饿时,总是先拿左边的筷子,再拿右边的筷子*/ wait(chopstick[i]); wait(chopstick[(i+1)%5]); // 吃饭 /*当哲学家进餐完成后,总是先放下左边的筷子,再放下右边的筷子*/ signal(chopstick[i]); signal

STM32基于Rt-thread3.12系统的串口通讯

泪湿孤枕 提交于 2020-01-06 23:10:32
前言 STM32的串口收发可以说是对这个芯片学习的一个基础,相信接触过STM32的朋友首先学会的就是它的GPIO和USART。对GPIO和串口初始化的操作我在这里不做赘述,这些在STM32的例程里面很容易找到学会。我们在这里重点介绍STM32的串口中断接收,以及在RTT系统中我们如何把串口device注册到系统的对象容器里。 关于RT-Thread3.12系统 作为国产小型嵌入式系统中的翘楚,RTT也是被大多数产品所使用。我参与的这个项目RTT的主要工作就是多线程调度和串口device的控制。对于线程的调度先不详细说明,我们这里只介绍串口通讯一个线程的东西。 RTT对象 在 RT-Thread中,所有的数据结构都称之为对象。 其中线程,信号量,互斥量、事件、邮箱、消息队列、内存堆、内存池、设备和定时 器在 rtdef.h 中有明显的枚举定义,即为每个对象打上了一个数字标签。我们这里的对象就特指设备,而我们的设备就特指串口。 那么我们使用这个对象有什么用处呢,我私以为有两个最大的用处,一是有利于设备管理,二是基于程序安全考虑。我使用这一功能的时候基本与第一个用处不沾边,因为我们就一个串口设备。主要还是基于安全的考虑才使用RTT对象。 使用系统的对象也就是把硬件驱动注册到系统中,让系统对就硬件进行操控,我们再通过系统操控硬件。 串口注册到系统

同步、异步、互斥、信号量、阻塞、非阻塞

微笑、不失礼 提交于 2020-01-04 04:55:37
(1)临界资源   在操作系统中, 进程是占有资源的最小单位 (线程可以访问其所在进程内的所有资源,但线程本身并不占有资源或仅仅占有一点必须资源)。但对于某些资源来说,其在同一时间只能被一个进程所占用。这些一次只能被一个进程所占用的资源就是所谓的临界资源。 (2)同步、互斥   相交进程之间的关系主要有两种: 同步 与互斥(一定要记住:不是同步和异步)。所谓互斥,是指散布在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它 们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。所谓同步,是指散步在不同进程之间的若干程序片断,它们的运行必须严格按照规定的 某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。   显然,同步是一种更为复杂的互斥,而互斥是一种特殊的同步。   也就是说互斥是两个线程之间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才能运行,而同步也是不能同时运行,但他是必须要安照某种次序来运行相应的线程(也是一种互斥)!   互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。   同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥