信号量

进程间通信

让人想犯罪 __ 提交于 2019-11-29 12:20:45
消息队列 key_t ftok(char* pathname,char proj) //获得键值 返回文件名对应的键值。 pathname:文件名、路径 proj:项目名,不为0即可 int msgget(key_t key,int msgflg) //获取消息队列描述字 key:键值,通过ftok获得 msgflg:标志位 IPC_CREAT,IPC_EXCL,IPC_NOWAIT 例如 IPC_CREAT|0666; 返回与键值对应的消息队列描述字 int msgsnd(int msgid,struct msgbuf* msgp, int msgsz ,int msgflg) //向消息队列中发送一条消息 msqid 已打开的消息队列id msgp 存放消息的结构 struct msgbuf { long mtype; //消息类型,可以为int char mtext[1]; /消息数据的首地址,不一定是mtext[1] , } msgsz 消息数据长度 msgflg IPC_NOWAIT,当消息队列不够空间放要发送的消息时,指明msgsnd是否等待。 消息收发的类型要一样 int msgrcv(int msqid,struct msgbuf*msgp,int msgsz,long msgtyp,int msgflg) /

进程线程等学习笔记

柔情痞子 提交于 2019-11-29 12:19:56
总共分为12部分分别是:进程、线程、消息队列、信号量集、共享内存、PGSQL编程、MYSQL编程、网络编程、文件访问、标准I/O、系统数据文件和信息、信号 (一) 进程 1. 进程ID为0的进程通常是调度进程,常常被称为交换进程 进程ID为1的进程通常是init进程,在自举过程结束时由内核调用 进程ID为2的进程页守护进程,负责支持虚拟存储系统的分页操作 2. pid_t getpid( void ); 返回值:调用进程的进程ID #include <unistd.h> 3. pid_t getppid( void ); 返回值:调用进程的父进程ID 4. uid_t getuid( void ); 返回值:调用进程的实际用户ID 5. uid_t geteuid( void ); 返回值:调用进程的有效用户ID 6. gid_t getgid( void ); 返回值:调用进程的实际组ID 7. gid_t getegid( void ); 返回值:调用进程的有效组ID 8. pid_t fork( void );创建子进程,返回值:子进程返回0,父进程返回子进程ID,出错-1 9. #include<sys/wait.h> pid_t wait(int *statloc);//statloc 保存进程终止状态的指针 10. #include<sys/wait.h>pid_t

[技术干货] zabbix_agent信号量报错处理方法

微笑、不失礼 提交于 2019-11-29 09:35:42
Agent报错信息如下: zabbix_agentd [25937]: cannot create Semaphore: [28] No space left on device zabbix_agentd [25937]: unable to create mutex for log file 一、重启操作系统可以释放 二、清除相应用户(nzx_zabbix)的信号量 法1 1.查看具体用户的共享内存的id /usr/bin/ipcs -m | grep nzx_zabbix |awk '{print $2}' 2.删除对应共享内存的标识 /usr/bin/ipcrm -m xxx 法2 1查看具体用户的SemaphoreKey #/usr/bin/ipcs -s | grep nzx_zabbix |awk '{print $1}' 删除由SemaphoreKey 创建的信号标识和与其相关的信号量集和数据结构。 /usr/bin/ipcrm -S xxx 法3 1.查看具体用户的信息量标识 #/usr/bin/ipcs -s | grep nzx_zabbix |awk '{print $2}' 删除信号量标识 SemaphoreID 和与其相关的信号量集及数据结构。 /usr/bin/ipcrm -s xxx 三、增加信号量的上限 1./etc/sysctl.conf文件追加

Hystrix 隔离策略细粒度控制_一点课堂(多岸学院)

巧了我就是萌 提交于 2019-11-29 05:58:34
Hystrix 隔离策略细粒度控制 Hystrix 实现资源隔离,有两种策略: 线程池隔离 信号量隔离 对资源隔离这一块东西,其实可以做一定细粒度的一些控制。 execution.isolation.strategy 指定了 HystrixCommand.run() 的资源隔离策略: THREAD or SEMAPHORE ,一种基于线程池,一种基于信号量。 // to use thread isolation HystrixCommandProperties.Setter().withExecutionIsolationStrategy(ExecutionIsolationStrategy.THREAD) // to use semaphore isolation HystrixCommandProperties.Setter().withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE) 线程池机制,每个 command 运行在一个线程中,限流是通过线程池的大小来控制的;信号量机制,command 是运行在调用线程中,通过信号量的容量来进行限流。 如何在线程池和信号量之间做选择? 默认的策略 就是线程池。 线程池 其实最大的好处就是对于网络访问请求,如果有超时的话,可以避免调用线程阻塞住。

FreeRTOS--二元信号量--任务与中断的同步

我是研究僧i 提交于 2019-11-29 04:41:25
一般二元信号量用于任务同步,利用二元信号量对任务与中断同步,中断服务例程中只是释放信号量,相当于把中断应该处理的事情放到了任务里进行处理,如果某个中断处理任务特别紧急,则相应的任务优先级可以设置为最高,以保证此任务随时抢占系统中的其他任务。 使用一个定时器 TIM6,每隔 3中断一次秒释放一个信号量, TASK2设置优先级最高,等待信号量而被阻塞, TASK1每间隔一秒打印信息。 1 /* Create the thread(s) */ 2 /* definition and creation of vTask1 */ 3 osThreadDef(vTask1, Task1, osPriorityNormal, 0, 128); 4 vTask1Handle = osThreadCreate(osThread(vTask1), NULL); 5 6 /* definition and creation of vTask2 */ 7 osThreadDef(vTask2, Task2, osPriorityAboveNormal, 0, 128); 8 vTask2Handle = osThreadCreate(osThread(vTask2), NULL); 9 10 /* Task1 function */ 11 void Task1(void const * argument)

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-29 01:42:16
信号量 一、 1、 信号量的数据类型为结构 sem_t,它本质上是一个长整型的数。 2 、例如: typedef struct { struct _pthread_fastlock __sem_lock; int __sem_value; _pthread_descr __sem_waiting; } sem_t; 3、sem_t分为有名和无名。有名的sem_t通过sem_open来创建 用于进程通信; 而无名的 sem_t通过sem_init的初始化 是基于内存的信号量 。 4、 有名和无名的 sem_t主要区别: ( 1) 效率:有名 sem_t是放在文件,无名的sem_t是放在内存。 ( 2) 限制:有名的 sem_t可以用来同步多线程,任意多进程。而无名的sem_t可以用来同步多线程,以及Fork出来的进程间的同步。 (如果没有放到共享内存,就算将 pshared设置为1,也起不了作用。 ) ( 3)pshared传递一个非零将会使函数调用失败,属于无名信号量。 二、 1、sem_init: 用来初始化一个信号量。 1、int sem_init(sem_t *sem, int pshared, unsigned int value); ( 1)sem_init函数是Posix信号量操作中的函数, 作用是对由 sem指定的信号量进行初始化。sem_init()

进程间通信

Deadly 提交于 2019-11-28 21:54:45
进程间通信 文章目录 进程间通信 1 概述 2 管道 2.1 概述 2.2 管道系统调用 2.3 标准流管道 3 FIFO 3.1 概述 3.2 mkfifo函数 4 信号 4.1 概述 4.2 信号发送与捕捉 4.3 信号的处理 4.4 信号集函数组 5 信号量 5.1 概述 5.2 信号量的应用 6 共享内存 6.1 概述 6.2 共享内存的应用 7 消息队列 7.1 概述 7.2 应用 进程捕捉到信号并对其进行处理时,正在执行的指令序列被信号处理程序临时中断,先执行信号处理程序中的指令,若从信号处理程序返回,则继续执行捕捉到信号时正在执行的指令序列。但在信号处理程序中,不能判断捕捉到信号时进程执行到何处,故信号处理程序中应保证调用安全的函数(是可重入的并是异步信号安全的)。若在信号处理程序中调用不可重入函数,其结果是不可预测的。 不可重入信号: (1)使用静态数据结构。 (2)调用malloc或free。 (3)是标准I/O函数。 1 概述 进程间通信(InterProcess Communication, IPC)方式主要有以下几种: 管道 (Pipe)及 有名管道 (named pipe):管道可用于具有亲缘关系进程间的通信,有名管道具有管道所具有的功能且允许无亲缘关系进程间的通信。 信号 (Signal):信号是在软件层次上对中断机制的一种模拟,用于通知进程有某事件发生

线程

人走茶凉 提交于 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 线程机制分类和特性 用户级线程 :用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定。如果一个进程中的某一个线程调用了一个阻塞 的系统调用函数,那么该进程包括该进程中的其他所有线程也同时被阻塞。主要缺点是无法发挥多处理器的优势。 轻量级线程