信号量

Linux命令:ipcs/ipcrm命令

断了今生、忘了曾经 提交于 2019-12-04 15:22:44
ipcs/ipcrm命令 是linux/uinx上提供关于一些进程间通信方式的信息,包括共享内存,消息队列,信号 多进程间通信常用的技术手段包括共享内存、消息队列、信号量等等,Linux系统下自带的ipcs命令是一个极好的工具,可以帮助我们查看当前系统下以上三项的使用情况,从而利于定位多进程通信中出现的通信问题。 ipcs -a命令可以查看当前使用的共享内存、消息队列及信号量所有信息,对于该选项对应的结果,介绍以下几个部分: 1、信号量在创建时分信号量集和信号量的概念,该命令的查询结果中,Semaphore Arrays下面每一行代表一个信号量集,其中perms对应信号量集的权限,nsems对应信号量集中信号量的个数,对于信号量集的创建方法可以查询semctl相关的函数使用方法。 2、对于消息队列Message Queues而言,可以看到msqid对应创建队列时得到的id值,从messages中可以看到当前队列中存在的消息个数,从used_bytes中可以看到当前所有消息占用的字节数,所以单个消息的字节数则为总字节数除以消息数,同时如果消息个数不为零则说明消息队列中的消息没有得到及时处理,可以据此判断是否存在队列阻塞的风险。 1. 命令格式   ipcs [resource-option] [output-format]   ipcs [resource-option] -i id

Delphi线程同步(临界区、互斥、信号量)

限于喜欢 提交于 2019-12-04 09:14:31
转载自: https://www.cnblogs.com/xumenger/p/4450659.html 当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源。   例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件的字符数。当然,在整个文件调入内存之前,统计它的计数是没有意义的。但是,由于每个操作都有自己的线程,操作系统会把两个线程当做是互不相干的任务分别执行,这样就可能在没有把整个文件装入内存时统计字数。为解决此问题,你必须使两个线程同步工作   存在一些线程同步地址的问题,Win 32 提供了许多线程同步的方式。这里将会讲到:临界区、互斥、信号量和事件   为了检验这些技术,首先来看一个需要线程同步解决的问题。假设有一个整数数组,需要按照升序赋初值。现在要在第一遍把这个数组赋初值为1~128,第二遍将此数组赋初值为128~255,然后结果显示在列表中。要用两个线程来分别进行初始化。下面的代码给出了没有做线程同步的代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

【转】 Zuul 超时、重试、并发参数设置

僤鯓⒐⒋嵵緔 提交于 2019-12-04 06:26:53
转自: https://blog.csdn.net/xx326664162/article/details/83625104 一、 Zuul 服务网关 服务网关 = 路由转发 + 过滤器 1、路由转发:接收一切外界请求,转发到后端的微服务上去; 2、过滤器:在服务网关中可以完成一系列的横切功能,例如权限校验、限流以及监控等,这些都可以通过过滤器完成(其实路由转发也是通过过滤器实现的)。 Spring Cloud Zuul包含了对Hystrix和Ribbon的依赖,下面将一一介绍 二、ribbon 参数配置 提供客户端的负载均衡功能,spring cloud的负载均衡都用到这个库。例如:fegin 它提供了超时重试的功能,配置如下: ribbon: ReadTimeout: 2000 ConnectTimeout: 1000 MaxAutoRetries: 1 MaxAutoRetriesNextServer: 1 ribbon.ConnectTimeout:该参数用来设置路由转发请求的时候,创建请求连接的超时时间。若出现路由请求连接超时,会自动进行重试路由请求,如果重试依然失败,Zuul会抛出异常。 ribbon.ReadTimeout:该参数用来设置路由转发请求的超时时间。它的处理与ribbon.ConnectTimeout相似,若出现路由请求连接超时,会自动进行重试路由请求

Linux 多线程编程(实现生产者消费者模型)

我是研究僧i 提交于 2019-12-04 01:47:08
Linux 多线程编程 线程分类 线程按照其调度者可以分为用户级线程和内核级线程两种。 内核级线程 在一个系统上实现线程模型的方式有好几种,因内核和用户空间提供的支持而有一定程度的级别差异。最简单的模型是在内核为线程提供了本地支持的情况,每个内核线程直接转换成用户空间的线程。这种模型称为“1:1线程模型(threading)”,因为内核提供的线程和用户的线程的数量是1:1。该模型也称为“内核级线程模型(kernel-level threading)”,因为内核是系统线程模型的核心。 Linux 中的线程就是“1:1线程模型”。在linux内核中只是简单地将线程实现成能够共享资源的进程。线程库通过系统调用 clone() 创建一个新的线程,返回的“进程”直接作为用户空间的线程。也就是说,在Linux上,用户调用线程和内核调用线程基本一致。 Linux的线程实现是在核外进行的,核内提供的是创建进程的接口do_fork()。内核提供了两个系统调用clone()和fork(),最终都用不同的参数调用do_fork()核内API。当然,要想实现线程,没有核心对多进程(其实是轻量级进程)共享数据段的支持是不行的,因此,do_fork()提供了很多参数,包括CLONE_VM(共享内存空间)、CLONE_FS(共享文件系统信息)、 CLONE_FILES(共享文件描述符表)、CLONE

GCD 信号量控制并发 (dispatch_semaphore)

邮差的信 提交于 2019-12-03 16:28:30
当我们在处理一系列线程的时候,当数量达到一定量,在以前我们可能会选择使用NSOperationQueue来处理并发控制,但如何在GCD中快速的控制并发呢?答案就是 dispatch_semaphore ,对经常做unix开发的人来讲,我所介绍的内容可能就显得非常入门级了,信号量在他们的多线程开发中再平常不过了。   信号量是一个整形值并且具有一个初始计数值,并且支持两个操作:信号通知和等待。当一个信号量被信号通知,其计数会被增加。当一个线程在一个信号量上等待时,线程会被阻塞(如果有必要的话),直至计数器大于零,然后线程会减少这个计数。   在GCD中有三个函数是semaphore的操作,分别是:   dispatch_semaphore_create   创建一个semaphore   dispatch_semaphore_signal   发送一个信号   dispatch_semaphore_wait    等待信号    简单的介绍一下这三个函数,第一个函数有一个整形的参数,我们可以理解为信号的总量,dispatch_semaphore_signal是发送一个信 号,自然会让信号总量加1,dispatch_semaphore_wait等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让 信号总量-1,根据这样的原理

iOS笔记(一)GCD多线程:信号量和条件锁

纵饮孤独 提交于 2019-12-03 16:27:49
1.信号量 dispatch_semaphore_t 在NSOperation中,可以直接设置最大并发数来控制并发数量,在GCD中,控制并发数量由信号量来完成。 信号量是一个整形值并且具有一个初始计数值,并且支持两个操作:信号通知和等待。当一个信号量被信号通知,其计数会被增加。当一个线程在一个信号量上等待时,线程会被阻塞(如果有必要的话),直至计数器大于零,然后线程会减少这个计数。   在GCD中有三个函数是semaphore的操作,分别是:   dispatch_semaphore_create   创建一个semaphore   dispatch_semaphore_signal   发送一个信号   dispatch_semaphore_wait    等待信号   简单的介绍一下这三个函数,第一个函数有一个整形的参数,我们可以理解为信号的总量,dispatch_semaphore_signal是发送一个信号,自然会让信号总量加1,dispatch_semaphore_wait等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让信号总量-1,根据这样的原理,我们便可以快速的创建一个并发控制来同步任务和有限资源访问控制。 //信号量:整数值,最多有10个线程并发 dispatch_semaphore_t semaphore = dispatch

线程的相关技术总结

荒凉一梦 提交于 2019-12-03 10:46:43
--CountDownKatch CountDownLatch 内部维护了一个整数 n ,n(要大于等于0)在 当前线程 初始化 CountDownLatch 方法指定。当前线程调用 CountDownLatch 的 await() 方法阻塞当前线程,等待其他调用 CountDownLatch 对象的 CountDown() 方法的线程执行完毕。 其他线程调用该 CountDownLatch 的 CountDown() 方法,该方法会把 n-1 ,直到所有线程执行完成, n 等于 0 ,当前线程 就恢复执行 --CyclicBarrier CyclicBarrier 是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点(CommonBarrierPoint)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环的 barrier 。 -- Semaphore Semaphore 直译为信号。实际上 Semaphore 可以看做是一个信号的集合。不同的线程能够从 Semaphore 中获取若干个信号量。当 Semaphore 对象持有的信号量不足时,尝试从 Semaphore 中获取信号的线程将会阻塞。直到其他线程将信号量释放以后,阻塞的线程会被唤醒,重新尝试获取信号量。 --说说 CountDownLatch 与 CyclicBarrier 区别

Linux网络编程

心已入冬 提交于 2019-12-03 07:04:21
Linux网络环境 : 僵尸进程、孤儿进程、守护进程、进程组、会话、前台进程组、后台进程组 Linux下进程通信的八种方法 Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量(semaphore),信号(signal),套接字(Socket) (1) 管道(pipe):管道允许一个进程和另一个与它有共同祖先的进程之间进行通信; (2) 命名管道(FIFO):类似于管道,但是它可以用于任何两个进程之间的通信,命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建; (3) 信号(signal):信号是比较复杂的通信方式,用于通知接收进程有某种事情发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了支持UNIX早期信号语义函数signal外,还支持语义符合POSIX.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD即能实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数的功能); (4) 内存映射(mapped memory):内存映射允许任何多个进程间通信

信号量及一个简单的生产者消费者应用

你离开我真会死。 提交于 2019-12-03 04:39:54
信号量的使用是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。当信号量的值为正的时候,说明它空闲, 所测试的线程可以锁定而使用它。若为 0 , 说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。 信号量分为有名信号量和无名信号量。 有名信号量,其值保存在文件中,可以用来进程间的同步。无名信号量,其值保存在内存中,主要用来线程间同步。 有名信号量的创建: #include <semaphore.h> sem_t *sem_open(const char *name, int oflag, ... /* mode_t mode, unsigned int value */ ); 返回值:若成功则返回指向信号量的指针,若出错则返回SEM_FAILED 如果使用一个现存的有名信号量,我们只需指定两个参数:信号量名和oflag (oflag 取0 )。把oflag 设置为O_CREAT 标志时,如果指定的信号量不存在则新建一个有名信号量;如果指定的信号量已经存在,那么打开使用,无其他额外操作发生 如果我们想要确保我们在创建一个新的信号量,可以把oflag 参数设置为:O_CREAT|O_EXCL 。如果信号量已经存在的话,这会导致sem_open 调用失败。 无名信号量的创建: 信号量的函数都以sem_ 开头,线程中使用的基本信号函数有4 个

进程和线程的对比和区别

天大地大妈咪最大 提交于 2019-12-03 04:31:37
一、什么是进程,什么是线程? 1.1 进程 进程中包括有多个线程,进程与进程之间是相对比较独立的。 进程中有一个 逻辑内存 ,每个进程都会有分配到一个独立的内存空间,还分配了一个文件/网络句柄, 句柄类似一个标识符,所有的进程所或多或少都有一定的句柄数的引用, 句柄实际上是一个指针,指向一块包含具体信息数据的内存, 所以句柄是当你要访问该进程时取得的,使用完必须释放。(打个比方,我要使用redis需要打开6379端口,这个时候需要访问句柄,获取到内存地址去访问获取对应的资源来执行该进程) 一个进程可以拥有多个句柄数目,但是只有一个进程ID 进程不同时刻所引用的句柄数目是不一定的 进程结构 1.2 线程 线程中有一个栈内存(很多人把它称为堆栈),主要用来存储局部变量资源或者内存地址 还有一个PC块,主要是存储下一条执行指令的地址,PC是指向一块共同的内存(进程里面的被系统分配到的逻辑内存)。 TCS : ThreadLocalStorage 主要存储线程自己定义的变量,不想和其他线程进行共享,理解为线程的私有变量。 线程共享进程的资源主要有: 进程代码块、进程的全局和静态变量、进程打开的文件描述符、信号的处理器、进程当前的目录、进程ID、进程组ID 。 二、进程和线程的区别 进程是程序资源分配的最小单位,线程是程序执行的最小单位。 进程有自己的内存地址空间,线程包含在进程的地址空间中