linux信号量

Linux进程管理: 多进程编程

六眼飞鱼酱① 提交于 2020-01-17 02:13:11
多进程编程 mind-Mapping 保存有xmind原始文件,可直接获取 无名管道PIPE 命名管道FIFO POSIX共享内存 POSIX消息队列 POSIX信号量 SYS V共享内存 SYS V消息队列 SYS V信号量 来源: CSDN 作者: Z_Stand 链接: https://blog.csdn.net/Z_Stand/article/details/104011127

多线程之间信号量

丶灬走出姿态 提交于 2020-01-16 10:01:32
1. 什么是信号量 linux sem 信号量是一种特殊的变量,访问具有原子性, 用于解决进程或线程间共享资源引发的同步问题。 用户态进程对 sem 信号量可以有以下两种操作: 等待信号量 当信号量值为 0 时,程序等待;当信号量值大于 0 时,信号量减 1,程序继续运行。 发送信号量 将信号量值加 1 通过对信号量的控制,从而实现共享资源的顺序访问。 2. 相关函数说明 linux 信号量相关函数都声明头文件 semaphore.h 头文件中,所以使用信号量之前需要先包含头文件 #include <semaphore.h> 1 信号量的创建就像声明一般的变量一样简单,例如:sem_t sem,之后对该信号量进行初始化和使用。 2.1 sem_init 该函数用于创建信号量,其原型如下: int sem_init(sem_t *sem, int pshared, unsigned int value); 1 该函数初始化由 sem 指向的信号对象,并给它一个初始的整数值 value。 pshared 控制信号量的类型,值为 0 代表该信号量用于多线程间的同步,值如果大于 0 表示可以共享,用于多个相关进程间的同步 参数 pshared > 0 时指定了 sem 处于共享内存区域,所以可以在进程间共享该变量 2.2 sem_wait int sem_wait(sem_t *sem);

线程认识

落爺英雄遲暮 提交于 2020-01-14 08:37:30
线程是为了让程序更好的利用cpu资源,在并行/并发处理下比进程切换cpu使用所要的花销要小。 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。一切进程至少都有一个执行线程。线程在进程内部运行,本质是在进程地址空间内运行。在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化( Linux中可以称为轻量级进程(LWP) )。透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。 结合生活中的例子,创建一个进程就相当于工厂新建了一个厂子, 而创建一个线程就相当于在原厂的基础上增加一条生产线 ,在这方面也能看出创建新进程会分配新的虚拟地址空间,而 创建新的线程则会共用原来的虚拟地址空间(创建进程会拷贝原有的PCB并指向原有的虚拟地址空间) 。那么进程和线程的区别是什么呢?进程的作用更多是资源的管理(管理内存、文件),而 线程的作用更多是负责资源的调度和执行(也是抢占式的调度)。 ------>线程之间共用虚拟地址空间和文件描述符表 ------>线程之间不共用的资源:①栈(函数调用栈、局部变量),每个线程的栈是不共用的但不是私有的,别的线程也可以用②上下文信息(cpu中寄存器数据保存在内存中,方便下次执行)③errno错误码

线程认识

我的未来我决定 提交于 2020-01-14 08:37:20
线程是为了让程序更好的利用cpu资源,在并行/并发处理下比进程切换cpu使用所要的花销要小。 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。一切进程至少都有一个执行线程。线程在进程内部运行,本质是在进程地址空间内运行。在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化( Linux中可以称为轻量级进程(LWP) )。透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。 结合生活中的例子,创建一个进程就相当于工厂新建了一个厂子, 而创建一个线程就相当于在原厂的基础上增加一条生产线 ,在这方面也能看出创建新进程会分配新的虚拟地址空间,而 创建新的线程则会共用原来的虚拟地址空间(创建进程会拷贝原有的PCB并指向原有的虚拟地址空间) 。那么进程和线程的区别是什么呢?进程的作用更多是资源的管理(管理内存、文件),而 线程的作用更多是负责资源的调度和执行(也是抢占式的调度)。 ------>线程之间共用虚拟地址空间和文件描述符表 ------>线程之间不共用的资源:①栈(函数调用栈、局部变量),每个线程的栈是不共用的但不是私有的,别的线程也可以用②上下文信息(cpu中寄存器数据保存在内存中,方便下次执行)③errno错误码

(1)IPC简介

笑着哭i 提交于 2020-01-13 19:20:27
Unix/Linux IPC简介 简述 1. 消息传递演变过程 2. 同步形式演变 进程、线程与信息共享 IPC对象的持续性 名字空间 fork、exec和exit对IPC对象的影响 总结 参考资料 简述 IPC是进程间通信(interprocess communication)的简称。用来描述运行在一个操作系统之上的不同进程间各种消息传递的方式。 IPC在使用过程中需要同步参与一起运行。 1. 消息传递演变过程 管道(pipe):只能在具有共同祖先(指父子进程关系)的进程间使用,有名管道fifo可以在任意进程间使用 System V消息队列:可在同一主机上有亲缘关系或无亲缘关系的进程间使用。 Posix消息队列:可在同一主机上有亲缘关系或无亲缘关系的进程间使用。 远程过程调用: 2. 同步形式演变 使用文件系统特性同步 记录上锁(record-locking) System V信号量 Posix信号量和Posix共享内存区 互斥锁(mutex)和条件变量(condition variable):主要用于线程间同步,也能提供进程间的同步 读写锁(read-write-lock) 进程、线程与信息共享 unix/linux间信息共享的三种方式 两个进程共享存储在文件系统中的某个文件上的信息。访问该文件,每个进行都要经过内核(如read,write,lseek等)

进程通信之IPC通信对象——信号灯

对着背影说爱祢 提交于 2020-01-13 13:58:08
进程间通过信号灯的通信。 信号灯的创建函数semget(): 信号灯的删除函数semctl(): 例子1:信号灯的创建和删除,通过semget函数创建,调用semctl函数删除。 #include"sys/types.h" #include"signal.h" #include"unistd.h" #include"stdio.h" #include"stdlib.h" #include"sys/sem.h" int main() { int semid; semid=semget(IPC_PRIVATE,3,0777); if(semid<0) { printf("creat semaphore failure\n"); return -1; } printf("creat semaphore success\n"); system("ipcs -s"); //delete semaphore semctl(semid,0,IPC_RMID,NULL); system("ipcs -s"); return 0; } 运行结果如图: 成功创建3个信号灯后,又成功删除了。 例子2:一般我们可以用全局变量来实现父子线程之间的同步,如下thread.c的内容:通过定义一个全局变量thread_inter来实现父子线程的同步问题。 #include<pthread.h> #include

进程与线程

核能气质少年 提交于 2020-01-10 13:26:26
文章目录 进程与线程 进程通信 无名管道: 命名管道:FIFO 消息队列: 信号量: 共享内存: Socket通信: 线程之间的同步 互斥锁:互斥锁就是一种锁机制 条件变量 读写锁 自旋锁 信号量 总结: 进程与线程 概念:什么是线程:是操作系统能够进行运算调度的最小单位。什么是进程:是计算机中某一次数据集合的运行活动,是操作系统分配资源的最小单位。线程依赖于进程,进程就是线程的容器。 上面的描述比较官方,我的理解就是:想要通过计算机来完成某件事件那么你就得有一个进程来帮助你完成这个任务,也就是说,进程等价于利用计算机完成任务的一种手段,操作系统会为进程去分配各种资源,内存什么的,那么线程就是把进程分配成一个个小任务去执行,也就是说是进程执行的最小单位。 两个问题: 进程就是一个个跑在操作系统上的程序,那么如果想让两个进程或者多个进程之间通信怎么办? 线程是进程运行的最小单位,那么如果两个线程用到了同一个资源,怎么进行同步,否则这个资源的使用就乱套了 也就是说:进程要解决通信问题,否则就是单击小程序,线程要解决同步问题,也就是资源共享在线程中的问题。 进程通信 在Linux中进程通信有六种基本的方式: 无名管道: 是一种不属于任何文件系统的特殊文件,可以使用read和write 原型 #include <unistd.h>2 int pipe(int fd[2]); // 返回值

Linux进程间通信

一曲冷凌霜 提交于 2020-01-01 16:10:02
写在前面 为什么 要进行进程间通信? 因为进程间具有独立性(每一个进程都有自己的虚拟地址空间,进程A并不知道进程B的虚拟地址空间中的内容),因此导致了进程之间协作的问题 进程间通信的 目的 : 数据传输:一个进程需要将它的数据发送给另一个进程 数据共享:多个进程间需要共享同样的数据、资源 进程控制:一个进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变 进程间通信 分类 : 管道 System V IPC POSIX IPC 网络 是当前最大的进程间通信 本篇文章中只针对管道及System V中的共享内存、消息队列和信号量进行解释 管道 概念: 我们把从一个进程连接到另一个进程的一个数据流称为一个管道 管道是Unix中最古老的进程间通信的形式。它本质是一个内核中的内存,也可以将这块内存称为缓冲区,当其中的数据被读走后,管道就为空 管道是半双工的,即数据只能由一个流向 匿名管道 # include <unistd.h> int pipe(int fd[2]); 功能:创建一个匿名管道 参数:fd[]:文件描述符数组,fd[0]表示读端,fd[1]表示写端,使用这一对文件描述符访问内存 返回值:成功返回0,失败返回-1 【注】: 1、pipe()函数的参数是 输出型参数 ,也就是意味着需要传入一个int类型数组,数组大小为2

并发技术、进程、线程和锁拾遗

点点圈 提交于 2020-01-01 00:48:07
并发技术、进程、线程和锁拾遗 Part1. 多任务 计算机发展起初,CPU 资源十分昂贵,如果让 CPU 只能运行一个程序那么当 CPU 空闲下来(例如等待 I/O 时),CPU 资源就会被浪费,为了使 CPU 资源得到更好的利用,先驱编写了一个监控程序,如果发现某个程序暂时无需使用 CPU 时,监控程序就把另外的正在等待 CPU 资源的程序启动起来,以充分利用 CPU资源。这种方法称为 - 多道程序(Multiprogramming) 对于多道程序,最大的弊端是各程序之间不区分轻重缓急,对于用户交互式的程序来说,对 CPU 计算时间的需求并不多,但是对于响应速度却有比较高的要求。而对于计算类程序来说则相反,对响应速度要求低,但需要长时间的 CPU 计算。想象一个场景:我在同时在浏览网页和听音乐,我们希望浏览器能够快速响应,同时也希望音乐不停,这时候 多道程序 就没法达到我们的要求了。 于是人们改进了 多道程序 ,使得每个程序运行一段时间之后,都主动让出 CPU 资源,这样每个程序在一段时间内都有机会运行一小段时间。这样像浏览器这样的交互式程序就能够快速地被处理,同时计算类程序也不会受到很大影响。这种程序协作方式被称为 分时系统(Time-Sharing System) 。 在分时系统的帮助下,我们可以边用浏览器边听歌了。 但是 如果某个程序出现了错误,导致了死循环

信号量与条件变量的区别

。_饼干妹妹 提交于 2020-01-01 00:22:59
注意信号量与条件变量的区别 信号量内容可见:http://www.cnblogs.com/charlesblc/p/6142868.html 信号量、共享内存,以及消息队列等System V IPC三剑客主要关注 进程间通信 ; 而条件变量、互斥锁,主要关注 线程间通信 。 下面内容参考: http://blog.chinaunix.net/uid-27164517-id-3282242.html pthread_cond_wait指的是 条件变量 ,总和一个 互斥锁结合使用 。在 调用pthread_cond_wait前要先获取锁 。pthread_cond_wait函数执行时先 自动释放 指定的锁,然后等待条件变量的变化。在函数调用返回之前,自动将指定的互斥量 重新锁住 。 int pthread_cond_signal(pthread_cond_t * cond); pthread_cond_signal通过条件变量 cond发送消息 ,若多个消息在等待,它 只唤醒一个 。 pthread_cond_broadcast可以唤醒所有。调用pthread_cond_signal后要 立刻释放互斥锁 ,因为pthread_cond_wait的最后一步是要将指定的互斥量重新锁住,如果pthread_cond_signal之后没有释放互斥锁,pthread_cond_wait仍然要阻塞