信号量

信号量

Deadly 提交于 2019-12-18 04:58:03
文章目录 1 信号量简介 2 信号量结构 3 信号量接口 3.1 设计图示 3.2 示例代码(未完成...按照下面的代码,进程A和进程B始终无法产生冲突,待调试) 1 信号量简介 命名管道以及消息队列用于一个进程给另一个进程发送数据 与之相比,信号量并不是为了进程间通信,而是提供了一个多个进程间共享的计数器 计数器为正数,进程可以获取信号量(一个或者多个),这时候共享计数器减去进程拿走的数字;也可以放回信号量(一个或者多个),这时候共享计数器加上放回的数字 最重要的是:进程获取信号量时,会得到操作系统支持 [操作系统提示信号量不够减并且进程返回] 或者 [操作系统把调用进程挂起,直到信号量足够减去进程要求的数字时,调用进程返回] 2 信号量结构 IPC对象 信号量集 信号量不能单独表示,它存在于信号量集结构中:一个信号量集可能包含多个信号量 一个信号量集合对应一个IPC对象,使用一个sem_ds结构表示 3 信号量接口 3.1 设计图示 设计三个进程: 进程A负责创建信号量集/IPC 对象 并且该信号量拥有两个信号 信号量初始值设计为10 进程A对信号量1和2进行获取释放操作(一次9个),进程B01,B02分别对信号量01 02进行获取释放操作(一次2个),因为双方进行异步操作,势必发生冲突 3.2 示例代码(未完成…按照下面的代码,进程A和进程B始终无法产生冲突,待调试) 进程A

同步:生产者消费者模型(条件变量与信号量)

本小妞迷上赌 提交于 2019-12-18 02:16:00
同步 什么是同步: 通过条件判断实现对临界资源访问的合理性 实现: 条件变量:当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了。所以用条件变量可以睡眠的等待某一种条件出现。 原理: 向外提供一个等待队列,以及等待与唤醒的功能 生产者消费者模型 一、一个交易场所 二、两个角色:生产者和消费者 三、三种关系: 生产者和生产者:互斥 生产者和消费者:互斥与同步 消费者和消费者:互斥 优点: 解耦 支持并发 忙闲不均 pthread_cond_wait 调用等待时释放锁,唤醒时重新获得锁 生产者消费者模型 10 class BlockQueue 11 { 12 private : 13 queue < int > q ; 14 int cap ; 15 pthread_mutex_t lock ; 16 pthread_cond_t c_cond ; 17 pthread_cond_t p_cond ; 55 public : 56 BlockQueue ( int cap_ = 4 ) 57 : cap ( cap_ ) 58 { 59 pthread_mutex_init ( & lock , nullptr ) ; 60 pthread_cond_init ( & c_cond , nullptr ) ; 61 pthread_cond_init (

Java并发多线程 - 并发工具类JUC

爷,独闯天下 提交于 2019-12-18 01:11:33
安全共享对象策略 1. Java线程限制 : 一个被线程限制的对象,由线程独占,并且只能被占有它的线程修改 2.共享只读 : 一个共享只读的对象,在没有额外同步的情况下,可以被多个线程并发访问, 但是任何线程都不能修改它 3.线程安全对象 : 一个线程安全的对象或则容器,在内部通过同步机制来保证线程安全, 所以其他线程无需额外的同步就可以通过公共接口随意访问它 4.被守护对象 : 被守护对象只能通过获取特定的锁来访问 线程安全 - 同步容器 采用synchronized关键字同步,缺点 : 不能完成做到线程安全 性能差 ArrayLisy -> Vector, Stack HashMap -> HashTable (key、value不能为null) Collections.synchronizedXXX(List、Set、Map) 线程安全 - 并发容器 J.U.C ArrayList -> CopyOnWriteArrayList HashSet、TreeSet -> CopyOnWriteArraySet ConcurrentSkipListSet HashMap、TreeMap -> ConcurrentHashMap ConcurrentSkipListMap AbstractQueuedSynchronizer - AQS 使用Node实现FIFO队列

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[])

Oracle-安装

有些话、适合烂在心里 提交于 2019-12-16 13:51:18
一、关闭防火墙   (1)[root@oracle ~]# vim /etc/selinux/config     [root@oracle ~]# setenforce 0     [root@oracle ~]# getenforce   (2)[root@oracle ~]# systemctl stop firewalld.service      [root@oracle ~]# systemctl status firewalld.service 二、创建用户和组及安装目录,安装依赖包 (1)创建用户和组   [root@oracle ~]# groupadd oinstall   [root@oracle ~]# groupadd dba   [root@oracle ~]# useradd -g oinstall -G dba -m oracle   [root@oracle ~]# passwd oracle (2)创建安装目录,上传oracle压缩包,并解压,给新建的目录设置权限   [root@oracle ~]# mkdir -p /ora/oracle   [root@oracle database]# chown -R oracle:oinstall /ora/   [root@oracle database]# chmod -R 755 /ora/  

perl 信号量 Semaphore

大兔子大兔子 提交于 2019-12-16 12:40:57
信号量作为锁使用事例。 #!/usr/bin/perl # use strict; use IPC::Semaphore; use IPC::SysV qw(IPC_PRIVATE S_IRUSR S_IWUSR IPC_CREAT IPC_NOWAIT SEM_UNDO); our $sem = IPC::Semaphore->new(IPC_PRIVATE, 1, S_IRUSR | S_IWUSR | IPC_CREAT); $sem->setval(0,1); my $pid = fork(); die "fork failed" unless defined $pid; if ($pid > 0) { $sem->op(0,-1,SEM_UNDO); my $i = 10; while($i > 0){ print "parent process i= $i\n"; $i--; } $sem->op(0,1,SEM_UNDO); } elsif ($pid == 0){ $sem->op(0, -1, SEM_UNDO); my $i = 10; while($i > 0) { print "child process i = $i\n"; $i--; } } $sem->remove() if defined $sem; -> # ./testsem.pl parent

记一次腾讯面试:进程之间究竟有哪些通信方式?如何通信? ---- 告别死记硬背

試著忘記壹切 提交于 2019-12-16 10:54:33
有一次面试的时候,被问到进程之间有哪些通信方式,不过由于之前没深入思考且整理过,说的并不好。想必大家也都知道进程有哪些通信方式,可是我猜很多人都是靠着”背“来记忆的,所以今天的这篇文章,讲给大家详细着讲解他们是如何通信的,让大家尽量能够理解他们之间的区别、优缺点等,这样的话,以后面试官让你举例子,你也能够顺手拈来。 1、管道 我们来看一条 Linux 的语句 netstat -tulnp | grep 8080 学过 Liux 命名的估计都懂这条语句的含义,其中”|“是管道的意思,它的作用就是把前一条命令的输出作为后一条命令的输入。在这里就是把 netstat -tulnp 的输出结果作为 grep 8080 这条命令的输入。如果两个进程要进行通信的话,就可以用这种管道来进行通信了,并且我们可以知道这条竖线是没有名字的,所以我们把这种通信方式称之为匿名管道。 并且这种通信方式是单向的,只能把第一个命令的输出作为第二个命令的输入,如果进程之间想要互相通信的话,那么需要创建两个管道。 居然有匿名管道,那也意味着有命名管道,下面我们来创建一个命名管道。 mkfifo test 这条命令创建了一个名字为 test 的命名管道。 接下来我们用一个进程向这个管道里面写数据,然后有另外一个进程把里面的数据读出来。 echo "this is a pipe" > test // 写数据 1

Spring Cloud第五篇 | 服务熔断Hystrix

筅森魡賤 提交于 2019-12-16 07:09:24
​ 本文是Spring Cloud专栏的第五篇文章,了解前四篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cloud第二篇 | 使用并认识Eureka注册中心 Spring Cloud第三篇 | 搭建高可用Eureka注册中心 Spring Cloud第四篇 | 客户端负载均衡Ribbon 一、微服务高可用技术 大型复杂的分布式系统中,高可用相关的技术架构非常重要。 高可用架构非常重要的一个环节,就是如何将分布式系统中的各个服务打造成高可用的服务,从而足以应对分布式系统环境中的各种各样的问题,避免整个分布式系统被某个服务的故障给拖垮。 比如: 服务间的调用超时 服务间的调用失败 要解决这些棘手的分布式系统可用性问题,就涉及到了高可用分布式系统中的很多重要的技术,包括: 资源隔离 限流与过载保护 熔断 优雅降级 容错 超时控制 监控运维 二、服务降级、熔断、限流概念 1、服务雪崩效应 服务雪崩效应产生与服务堆积在同一个线程池中,因为所有的请求都是同一个线程池进行处理,这时候如果在高并发情况下,所有的请求全部访问同一个接口,这时候可能会导致其他服务没有线程进行接受请求,这就是服务雪崩效应效应。 2、服务降级 在高并发情况下,防止用户一直等待,使用服务降级方式(直接返回一个友好的提示给客户端

并发库:同步工具类

限于喜欢 提交于 2019-12-16 06:17:58
1、Semaphore计数信号量 Semaphore计数信号量维护了一个许可集,用于限制访问某些资源的线程数目,并提供同步机制。 通俗来说,就是可以控制让多个线程拿到许可,拿到许可的线程可以并发管理同一个资源,这些拿到许可的线程可以看做一个整体。 如果是单个信号量的Semaphore对象,就可以实现互斥锁的功能,而且,可以由一个线程获得许可,另一个线程去释放许可。可以应用于死锁恢复的一些场合。 创建信号量对象 第二个构造的第二个参数表示当有一个许可被释放之后,替补的线程是以什么方式去拿到这个许可,如果为true,则表示是公平的,谁先来谁上;false表示是竞争上岗。 让线程获取许可 在线程内调用Semaphore对象的acquire方法,从此信号量中获取一个许可。 让线程释放许可 在线程内调用Semaphore对象的release方法,来释放一个许可。 获取可用的许可数 2、CyclicBarrier 一个同步辅助类,它要求一组线程互相等待,直到全部到达某个公共屏障点。还可以设置全部到齐之后再去做什么事情。 两个构造方法如下: 设置公共屏障点 3、CountDownLatch 类似倒计时计数器,调用CountDownLatch的countDown方法将计数器减1,当计数到达0时,所有等待的线程开始执行。 CountDownLatch类的等待方法 4、Exchanger

进程之间的通信

南笙酒味 提交于 2019-12-16 00:07:03
进程通信 今天的这篇文章,讲给大家详细着讲解他们是如何通信的,让大家尽量能够理解他们之间的区别、优缺点等 1、管道 我们来看一条 Linux 的语句 netstat -tulnp | grep 8080 学过 Linux 命名的估计都懂这条语句的含义,其中”|“是管道的意思,它的作用就是把前一条命令的输出作为后一条命令的输入。在这里就是把 netstat -tulnp 的输出结果作为 grep 8080 这条命令的输入。如果两个进程要进行通信的话,就可以用这种管道来进行通信了,并且我们可以知道这条竖线是没有名字的,所以我们把这种通信方式称之为匿名管道。 并且这种通信方式是单向的,只能把第一个命令的输出作为第二个命令的输入,如果进程之间想要互相通信的话,那么需要创建两个管道。 居然有匿名管道,那也意味着有命名管道,下面我们来创建一个命名管道。 mkfifo test 这条命令创建了一个名字为 test 的命名管道。 接下来我们用一个进程向这个管道里面写数据,然后有另外一个进程把里面的数据读出来。 echo "this is a pipe" > test // 写数据 这个时候管道的内容没有被读出的话,那么这个命令就会一直停在这里,只有当另外一个进程把 test 里面的内容读出来的时候这条命令才会结束。接下来我们用另外一个进程来读取 cat < test // 读数据 我们可以看到