linux信号量

System V信号量

柔情痞子 提交于 2019-11-29 22:25:36
目录 1. System V IPC 概述 IPC键和ftok函数 ipc_perm结构 创建与打开IPC对象 ipcs和ipcrm命令 2. System V信号量 计数信号量集 semget semop semctl 3. 测试程序 代码实现 semcreate.c semrmid.c semsetvalues.c semgetvalues.c semops.c 运行测试 1. System V IPC 概述 以下三种类型的IPC合称为System V IPC: System V信号量 System V消息队列 System V共享内存 System V IPC在访问它们的函数和内核为它们维护的信息上有一些类似点,主要包括: IPC键和ftok函数 ipc_perm结构 创建或打开时指定的用户访问权限 ipcs和ipcrm命令 下表汇总了所有System V IPC函数。 信号量 消息队列 共享内存 头文件 sys/sem.h sys/msg.h sys/shm.h 创建或打开IPC的函数 semget msgget shmget 控制IPC操作的函数 semctl msgctl shmctl IPC操作函数 semop msgsnd msgrcv shmat shmdt IPC键和ftok函数 三种类型的System V IPC都使用IPC键作为它们的标识

Posix信号量

孤街浪徒 提交于 2019-11-29 15:39:37
目录 1. Posix IPC 概述 IPC名字 创建与打开IPC 读写权限与创建标志 用户访问权限 IPC对象的持续性 2. 信号量概述 信号量定义及分类 信号量操作 信号量、互斥锁和条件变量的差异 3. Posix有名信号量 创建和打开 关闭和删除 等待和挂出 获取信号量的值 4. Posix无名信号量 5. Posix信号量限制 1. Posix IPC 概述 以下三种类型的IPC合称为Posix IPC: Posix信号量 Posix消息队列 Posix共享内存 Posix IPC在访问它们的函数和描述它们的信息上有一些类似点,主要包括: IPC名字 创建或打开时指定的读写权限、创建标志以及用户访问权限 下表汇总了所有Posix IPC函数。 信号量 消息队列 共享内存 头文件 semaphore.h mqueue.h sys/mman.h 创建、打开或删除IPC的函数 sem_open sem_close sem_unlink sem_init sem_destroy mq_open mq_close mq_unlink shm_open shm_unlink 控制IPC操作的函数 mq_getattr mq_setattr ftruncate fstat IPC操作函数 sem_wait sem_trywait sem_post sem_getvalue mq_send

linux内核信号量和互斥锁使用

二次信任 提交于 2019-11-29 03:17:05
信号量概念 Linux 内核的信号量在概念和原理上与用户态的 System V 的 IPC 机制信号量是一样的,但是它绝不可能在内核之外使用,因此它与 System V 的 IPC 机制信号量毫不相干。 信号量在创建时需要设置一个初始值,表示同时可以有几个任务可以访问该信号量保护的共享资源,初始值为 1 就变成互斥锁(Mutex),即同时只能有一个任务可以访问信号量保护的共享资源。 一个任务要想访问共享资源,首先必须得到信号量,获取信号量的操作将把信号量的值减 1,若当前信号量的值为负数,表明无法获得信号量,该任务必须挂起在该信号量的等待队列等待该信号量可用;若当前信号量的值为非负数,表示可以获得信号量,因而可以立刻访问被该信号量保护的共享资源。 当任务访问完被信号量保护的共享资源后,必须释放信号量,释放信号量通过把信号量的值加 1 实现,如果信号量的值为非正数,表明有任务等待当前信号量,因此它也唤醒所有等待该信号量的任务。 内核信号量核心结构 内核中使用 struct semaphore 结构来描述一个信号量,结构定义如下: struct semaphore { raw_spinlock_t lock; unsigned int count; //信号值,只要这个值为正数,则信号可用, 一般情况设置 0 或 1。 struct list_head wait_list; };

Linux线程间同步的几种方式

删除回忆录丶 提交于 2019-11-29 02:43:27
信号量 信号量强调的是线程(或进程)间的同步:“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在sem_wait的时候,就阻塞在那里)。当信号量为单值信号量时,也可以完成一个资源的互斥访问。信号量测重于访问者对资源的有序访问,在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。 有名信号量 可以用于不同进程间或多线程间的互斥与同步 创建打开有名信号量 sem_t *sem_open(const char *name, int oflag); sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value); //成功返回信号量指针;失败返回SEM_FAILED,设置errno name是文件路径名,但不能写成/tmp/a.sem这样的形式,因为在linux下,sem都是在/dev/shm目录下,可写成"/mysem"或"mysem",创建出来的文件都是"/dev/shm/sem.mysem",mode设置为0666,value设置为信号量的初始值.所需信号灯等已存在条件下指定O_CREAT|O_EXCL却是个错误。 关闭信号量,进程终止时,会调用它 int sem

线程

人走茶凉 提交于 2019-11-28 21:54:44
线程 文章目录 线程 1 概述 1.1 线程机制分类和特性 1.2 线程标识 2 线程编程 2.1 线程基本编程 3 线程间的同步与互斥 3.1 互斥锁线程控制 3.2 信号量线程控制 4 线程属性 4.1 概述 4.2 函数 5 生产者消费者实验 5.1 概述 5.2 解决方案 5 生产者消费者实验 5.1 概述 5.2 解决方案 1 概述 线程进程内独立的一条运行路线,处理器调度的小单元,也可以称为轻量级进程。线程可以对进程的内存空间和资 源进行访问,并与同一进程中的其他线程共享。 典型进程只有一个控制线程,有多个控制线程后,进程在某一时刻能做不止一件事。 为每种事件类型分配单独的处理线程,可简化处理异步事件的代码。 多个线程可自动访问相同的存储地址空间和文件描述符。一个进程的所有信息对进程的所有线程共享。 分解问题从而提高程序吞吐量,单线程进程完成多任务需把任务串行化,而多线程中相互独立的处理可以交叉进行。 使用多线程可改善响应时间。 注 :多线程程序在单处理器上运行也能改善响应时间和吞吐量。 1.1 线程机制分类和特性 用户级线程 :用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定。如果一个进程中的某一个线程调用了一个阻塞 的系统调用函数,那么该进程包括该进程中的其他所有线程也同时被阻塞。主要缺点是无法发挥多处理器的优势。 轻量级线程

线程基础

﹥>﹥吖頭↗ 提交于 2019-11-28 17:33:45
摘要:在计算机发展早期,CPU的资源十分昂贵,如果一个CPU只能运行一个程序,那么当读写磁盘是CPU就只能处于空闲状态,造成了极大的浪费。从而有了 多道程序 的方式,即编译一个监控程序,当程序不需要使用CPU时,将其他在等待CPU的程序启动。该方式大大提高了CPU的利用率,但它的弊端是不分轻重缓急,有时候一个交互操作可能要等待数十分钟。 分时系统 :每个CPU运行一段时间后,就主动让出给其他CPU使用。Windows早期版本和Mac OS版本都是采用的这种分时系统来调度程序的。但是一旦有任何程序出现问题无法主动让出CPU给其它程序的话那么操作系统也没有办法,其它程序只能等待,造成死机假象。 多任务系统 :操作系统接管了所有的硬件资源,并且本身运行在一个受硬件保护的级别。所有的应用都以进程的方式运行在比操作系统更低的级别,每个进程都有自己独立的地址空间,使得进程之间的地址空间相互隔离。CPU由操作系统进行同一分配,每个进程根据进程优先级的高低都有机会获得CPU,但如果运行超过一定的时间,CPU会将资源分配给其他进程,这种CPU分配方式是抢占式,操作系统可以强制剥夺CPU资源并且分配给它认为目前最需要的进程。如果操作系统分配每个进程的时间很短,就会造成很多进程都在同时运行的假象,即所谓的宏观并行,微观串行。 什么是线程 线程(Thread),有时被称为轻量级进程(Lightweight

python多任务编程---进程

和自甴很熟 提交于 2019-11-28 12:49:23
多任务编程 意义:充分利用计算机CPU的多和资源,同时处理多个应用程序任务,一次提高程序的运行效率. 实现方案:多进程,多线程 进程(process) 进程理论基础 定义:程序在计算机中的一次运行. 程序是一个可执行的文件,是静态的战友磁盘. 进程是一个动态的过程描述,占有计算机运行资源,有一定的生命周期 系统中如何产生一个进程 用户空间通过调用程序接口或者命令发起请求 操作系统接受用户请求,开始创建进程 操作系统调配计算机资源,确定进程状态等 操作系统将创建的进程提供给用户使用 进程基本概念 CPU时间片:如果一个进程占有CPU内核则称这个进程在cpu时间片上. PCB(进程控制块):在内存中开辟的一块空间,用于存放进程的基本信息,也用于系统查找识别进程 进程ID(PID):系统为每个进程分配的一个大于0的整数,作为进程ID.每个ID不重复     Linux查看进程ID:ps - aux 父子进程:系统中每一个进程(除了系统初始化进程)都有唯一的父进程,可以有0个或者多个子进程.父子进程关系便于进程管理     查看进程树: pstree 进程状态 三态 就绪态:进程具备执行条件,等待分配CPU资源 运行态:进程占有CPU时间片正在运行 等待态:进程暂时停止运行,让出CPU 五态(在三态基础上增加新建和终止) 新建: 创建一个进程,获取资源过程 终止:进程结束,释放资源过程

python多任务编程---进程

不想你离开。 提交于 2019-11-27 16:56:32
多任务编程 意义:充分利用计算机CPU的多和资源,同时处理多个应用程序任务,一次提高程序的运行效率. 实现方案:多进程,多线程 进程(process) 进程理论基础 定义:程序在计算机中的一次运行. 程序是一个可执行的文件,是静态的战友磁盘. 进程是一个动态的过程描述,占有计算机运行资源,有一定的生命周期 系统中如何产生一个进程 用户空间通过调用程序接口或者命令发起请求 操作系统接受用户请求,开始创建进程 操作系统调配计算机资源,确定进程状态等 操作系统将创建的进程提供给用户使用 进程基本概念 CPU时间片:如果一个进程占有CPU内核则称这个进程在cpu时间片上. PCB(进程控制块):在内存中开辟的一块空间,用于存放进程的基本信息,也用于系统查找识别进程 进程ID(PID):系统为每个进程分配的一个大于0的整数,作为进程ID.每个ID不重复     Linux查看进程ID:ps - aux 父子进程:系统中每一个进程(除了系统初始化进程)都有唯一的父进程,可以有0个或者多个子进程.父子进程关系便于进程管理     查看进程树: pstree 进程状态 三态 就绪态:进程具备执行条件,等待分配CPU资源 运行态:进程占有CPU时间片正在运行 等待态:进程暂时停止运行,让出CPU 五态(在三态基础上增加新建和终止) 新建: 创建一个进程,获取资源过程 终止:进程结束,释放资源过程

Linux内核同步方法

百般思念 提交于 2019-11-27 00:43:34
1、原子操作,是其它同步方法的基础。 2、自旋锁,线程试图获取一个已经被别人持有的自旋锁,当前线程处于忙等待,占用cpu资源。 3、读写自旋锁,根据通用性和针对性的特点,普通自旋锁在特定场景下的表现会退化。因此,提供了读写自旋锁,读锁可以加读锁,不能加写锁,写锁不能加任何锁。 4、需要注意的几项:   普通自旋锁是不能递归的。读锁可以递归,写锁也不能递归。   表面上锁的是代码,实际上锁的是共享数据。   使用读写锁的时候,需要注意,读锁可以加读锁,多个线程都占用读锁,必须所有的线程都释放,才能加上写锁,这往往会导致写锁长时间处于饥饿状态。 5、自旋锁存在的问题,线程试图获取一个已经被别人持有的自旋锁,当前线程处于忙等待,占用cpu资源。怎么解决这个问题?   使用信号量,信号量是一种睡眠锁。一个任务试图获取被别人占有的信号量,信号量会将其推进一个等待队列,让其睡眠,当请求的信号量被释放,处于等待队列的任务被唤醒,并获得信号量。 6、需要注意的是,信号量是一种睡眠锁,但它本身也会带有开销,上下文切换,被阻塞的线程要换出换入,也即是说让其睡眠并唤醒它,花费一定的开销。如果每个线程锁的时间很短,一般使用自旋锁,忙等待的时间也很短。如果锁的时间长,使用信号量。 7、相比自旋锁,信号量还有更广泛的用处,使用PV操作不仅能保护共享资源,还能够控制同时访问的数量,还能够控制访问顺序。对于锁

System V IPC 之信号量

流过昼夜 提交于 2019-11-27 00:39:13
本文继《 System V IPC 之共享内存 》之后接着介绍 System V IPC 的信号量编程。在开始正式的内容前让我们先概要的了解一下 Linux 中信号量的分类。 信号量的分类 在学习 IPC 信号量之前,让我们先来了解一下 Linux 提供两类信号量: 内核信号量,由内核控制路径使用。 用户态进程使用的信号量,这种信号量又分为 POSIX 信号量和 System V 信号量。 POSIX 信号量与 System V 信号量的区别如下: 对 POSIX 来说,信号量是个非负整数,常用于线程间同步。而 System V 信号量则是一个或多个信号量的集合,它对应的是一个信号量结构体,这个结构体是为 System V IPC 服务的,信号量只不过是它的一部分,常用于进程间同步。 POSIX 信号量的引用头文件是 "<semaphore.h>",而 System V 信号量的引用头文件是 "<sys/sem.h>"。 从使用的角度,System V 信号量的使用比较复杂,而 POSIX 信号量使用起来相对简单。 本文介绍 System V 信号量编程的基本内容。 System V IPC 信号量 信号量是一种用于对多个进程访问共享资源进行控制的机制。共享资源通常可以分为两大类: 互斥共享资源,即任一时刻只允许一个进程访问该资源 同步共享资源,即同一时刻允许多个进程访问该资源