linux信号量

linux-线程同步之信号量

折月煮酒 提交于 2019-12-27 06:24:08
1.任务:用户从终端输入任意字符然后统计字符个数显示,输入end则结束 2.使用多线程实现:主线程获取用户输入并判断是否退出,子线程计数 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <pthread.h> 5 #include <semaphore.h> 6 7 char buf[200] = {0}; 8 sem_t sem; 9 void *func(void *arg); 10 //子线程程序,作用就是统计buf中的字符个数并打印 11 void *func(void *arg) 12 { 13 //子线程中首先应该有个循环,在等待主线程激活的时候要在循环中阻塞; 14 //子线程被激活后就去获取buf中的字符长度,然后打印;打印完成之后再次被阻塞 15 sem_wait(&sem); 16 while(strncmp(buf, "end", 3) != 0) 17 { 18 printf("输入了%d个字符\n",strlen(buf)); 19 memset(buf, 0, sizeof(buf)); 20 sem_wait(&sem); 21 } 22 pthread_exit(NULL); 23 } 24 25 int main(void) 26 { 27

(笔记)Linux内核学习(七)之内核同步机制和实现方式

好久不见. 提交于 2019-12-19 22:43:10
一 原子操作 指令以原子的方式执行——执行过程不被打断。 1 原子整数操作 原子操作函数接收的操作数类型——atomic_t //定义 atomic_t v;//初始化 atomic_t u = ATOMIC_INIT(0); //操作 atomic_set(&v,4); // v = 4 atomic_add(2,&v); // v = v + 2 = 6 atomic_inc(&v); // v = v + 1 = 7 //实现原子操作函数实现 static inline void atomic_add(int i, atomic_t *v) { unsigned long tmp; int result; __asm__ __volatile__("@ atomic_add\n"     "1: ldrex %0, [%3]\n"     " add %0, %0, %4\n"     " strex %1, %0, [%3]\n"     " teq %1, #0\n"     " bne 1b"   : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)   : "r" (&v->counter), "Ir" (i)   : "cc"); } 2 原子位操作 //定义 unsigned long word = 0; //操作

System V IPC

北城以北 提交于 2019-12-16 18:21:35
1、概述    System V IPC共有三种类型:System V消息队列、System V 信号量、System V 共享内存区。 System V IPC操作函数如下: 2、key_t键和ftok函数   三种类型的IPC使用key_t值作为他们的名字,头文件<sys/types.h>把key_t定义为一个整数,通常是一个至少32位的整数,由ftok函数赋予的。函数ftok把一个已存的路径和一个整数标识符转换成一个key_t值,称为IPC键。函数原型如下: #include <sys/types.h>#include <sys/ipc.h> key_t ftok(const char *pathname, int proj_id); //成功返回IPC键,出错返回-1 写个程序看看ftok是如何组合IPC键,程序如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <sys/types.h> 5 #include <sys/ipc.h> 6 #include <sys/stat.h> 7 #include <errno.h> 8 9 typedef unsigned long u_long; 10 11 int main(int argc,char *argv[])

进程通信和同步(转)

ぃ、小莉子 提交于 2019-12-09 21:24:53
概念 竞争条件 多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时许,称为竞争条件。 忙等待的互斥 几种实现互斥的方案: 屏蔽中断 1在单处理器系统中,最简单的方法是使每个进程在刚刚进入临界区后立即屏蔽所有中断,包括时钟中断。CPU 只有在发生中断的时候才会进行进程切换,这样在中断被屏蔽后 CPU 将不会被切换到其他进程。 锁变量 严格轮换法 while (TRUE) { while (turn != 0) critical_region(); turn = 1; noncritical_region(); } while (TRUE) { while (turn != 1) critical_region(); turn = 0; noncritical_region(); } 忙等待检查变量。使用忙等待的锁称为自旋锁。 Peterson 解法 #define FALSE 0 #define TRUE 1 #define N 2 /* number of processes */ int turn; /* whose turn is it? */ int interested[N]; /* all values initially 0 (FALSE) */ void enter_region(int process); /* process is 0 or 1 */ {

spinlock与linux内核调度的关系

烈酒焚心 提交于 2019-12-09 20:22:18
作者: 刘洪涛, 华清远见嵌入式学院 高级讲师,ARM公司授权ATC讲师。 关于自旋锁用法介绍的文章,已经有很多,但有些细节的地方点的还不够透。我这里就把我个人认为大家容易有疑问的地方拿出来讨论一下。 一、自旋锁(spinlock)简介 自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许存在于临界区中。这点可以应用在多处理机器、或运行在单处理器上的抢占式内核中需要的锁定服务。 二、信号量简介 这里也介绍下信号量的概念,因为它的用法和自旋锁有相似的地方。 Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。 三、自旋锁和信号量对比 在很多地方自旋锁和信号量可以选择任何一个使用,但也有一些地方只能选择某一种。下面对比一些两者的用法。 表1-1自旋锁和信号量对比 应用场合 信号量or 自旋锁 低开销加锁(临界区执行时间较快) 优先选择 自旋锁 低开销加锁(临界区执行时间较长) 优先选择 信号量 临界区可能包含引起睡眠的代码 不能选自旋锁,可以选择 信号量 临界区位于非进程上下文时,此时不能睡眠 优先选择 自旋锁 ,即使选择信号量也只能用 down_trylock 非阻塞的方式

操作系统 Linux操作系统编程开发

♀尐吖头ヾ 提交于 2019-12-08 05:12:37
Linux操作系统编程开发 预备知识:   1、进程操作:Linux系统是 多任务的操作系统 ,采用 进程 作为 任务调度的单位, 进程在Linux系统下的概念是程序代码的一次执行,包括运行的代码和运行需要的数据、参数等资源。   2、进程和程序的区别:一方面:在Linux系统下,进程是程序代码的执行,所以程序是一段运行的,有生命力的程序,是一个动态的概念;一个程序是指储存在磁盘或者其他存储介质中的静态代码。另一方面:一个进程是基于一个程序运行的,而一个程序可以被重复载入到内存,形成多个进程!   3、 CPU时间片(Linux系统大约1ms) :时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。   4、Linux系统中进程在宏观上是并行,在微观上是串行的(一个CPU)。 在宏观上是并行 :同时可以打开多个进程;每个进程都有一个时间片和优先级。 在微观上是串行 :在每一个CPU时间片中,每个进程都有机会运行,优先级高的进程被运行的概率更大。如果时间片结束,进程还在运行,CPU将剥夺并分配给另一个进程;如果进程在时间片结束之前结束或者进入阻塞状态,CPU立即进行切换!一个CPU,一次只能执行程序的一部分。   5、mmu和多进程系统:   6、PID(进程号Process ID):在Linux系统中,每个进程都有一个 进程号

linux上的进程通信学习笔记

大城市里の小女人 提交于 2019-12-07 00:17:42
参考资料 <<精通Linux C编程>> http://man7.org/linux/man-pages/man2/open.2.html https://www.cnblogs.com/52php/p/5840229.html 在 Android中的Handler的Native层研究 文章中研究一下一把Linux中的匿名管道的通信机制,今天这里Linux中的进程间通信补齐。 在Linux中,实现进程通信的方法包括管道(匿名管道和具名管道),消息队列,信号量,共享内存,套接口等。消息队列,信号量,共享内存统称为系统的(POSIX和System V)IPC,用于本地间的进程通信,套接口(socket)则运用于远程进程通信。 各个通信机制定义如下: 匿名管道(Pipe)和具名管道(named pipe):匿名管道用于具有亲缘关系进程间的通信,具名管道克服了管道没有名字的限制,因此除了具有匿名管道的功能外,还允许在无亲缘关系的进程中进行通信。 消息队列(Message):消息队列为消息的链接表,包括POSIX消息队列和System V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读取队列中的消息。 共享内存:是的多个进程可以访问同一块内存空间,是最快的可以IPC形式。是针对其他的通信机制运行效率较低而设计出来的。往往与其他通信机制,如信号量结合使用

多进程共享内存

瘦欲@ 提交于 2019-12-06 21:24:25
问题描述 一个大小为3的缓冲区,初始为空 2个生产者随机等待一段时间,往缓冲区添加数据,若缓冲区已满,等待消费者取走数据后再添加,重复6次 3个消费者随机等待一段时间,从缓冲区读取数据,若缓冲区为空,等待生产者添加数据后再读取,重复4次 说明: 显示每次添加和读取数据的时间及缓冲区里的数据 生产者和消费者用进程模拟 思路 这道题目涉及到的知识点有: 进程控制管理,包括进程的创建与销毁等 进程通信技术,如管道、共享内存等 解决思路主要是: 一个主进程负责创建和销毁子进程,负责创建共享内存区和公用信号量 五个子进程,两个是生产者,三个是消费者,通过信号量对共享内存进行互斥读写 创建互斥访问量 创建信号量如下: 信号量:EMPTY, FILLED, RW 初始化:EMPTY=3,FILLED=0,RW=1 说明: EMPTY 信号量指示缓冲区有多少个空位置没有被占用,因此初始值等于缓冲区数量; FILLED 指示缓冲区有多少个位置被占用,因此初始值等于0; RW 指示是否允许对共享内存进行读写操作,为防止进程并发执行导致的数据共享错误,每次仅允许一个进程对共享内存进行操作,因此初始值为1. 生产者消费者执行操作 生产者 P(EMPTY);//首先询问是否有空闲缓冲区,没有则阻塞,等待消费者拿出数据释放一个缓冲区;有则EMPTY-=1 P(RW);//是否可以对共享内存进行读写操作

消息通讯(IPC)

冷暖自知 提交于 2019-12-06 11:02:05
在PHP中使用共享内存段 在不同的处理进程之间使用共享内存是一个实现不同进程之间相互通讯的好方法。如果你在一个进程中向所共享的内存写入一段信息,那么所有其他的进程也可以看 到这段被写入的数据。非常方便。 在PHP中有了共享内存的帮助,你可以实现不同进程在运行同一段PHP脚本时返回不同的结果。或实现对PHP同时运行数量 的实时查询等等。共享内存允许两个或者多个进程共享一给定的存储区。因为数据不需要在*户机和*务器之间复制,所以这是最快的一种IPC。使用共享内存的唯一窍门是多个进程对一给定存储区的同步存取。 如何建立一个共享内存段呢?下面的代码可以帮你建立共享内存。$shm_id = shmop_open($key, $mode, $perm, $size);注意,每个共享内存段都有一个唯一的ID, 在PHP中,shmop_open会把建立好的共享内存段的ID返回,这里我们用$shm_id记录它。而$key是一个我们逻辑上表示共享内存段的 Key值。不同进程只要选择同一个Key id就可以共享同一段存储段。习惯上我们用一个串(类似文件名一样的东西)的散列值作为key id. $mode指明了共享内存段的使用方式。 这里由于是新建,因此值为’c’ –取create之意。如果你是访问已经建立过的共享内存那么请用’a’,-- 取access之意。$perm参数定义了访问的权限,8进制

linux中c多线程同步方法

我只是一个虾纸丫 提交于 2019-12-06 02:53:54
https://blog.csdn.net/jkx01whg/article/details/78119189 Linux下提供了多种方式来处理线程同步,最常用的是互斥锁、条件变量和信号量。 一、互斥锁(mutex)   锁机制是同一时刻只允许一个线程执行一个关键部分的代码。 1. 初始化锁   int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr); 其中参数 mutexattr 用于指定锁的属性(见下),如果为NULL则使用缺省属性。 互斥锁的属性在创建锁的时候指定,在LinuxThreads实现中仅有一个锁类型属性,不同的锁类型在试图对一个已经被锁定的互斥锁加锁时表现不同。当前有四个值可供选择: (1)PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。 (2)PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。 (3)PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,如果同一个线程请求同一个锁