多进程(Linux)
目录
一、管道文件
1、有名管道
2、无名管道
二、信号量
三、共享内存
四、消息队列
五、多线程通信
(1)、线程并发
(2)、线程同步:
1、信号量
2、互斥锁
3、条件变量(提供一种线程间通知的机制)
4、读写锁
5、fork
六、套接字文件
一、管道文件
半双工(单方向的)
写入管道的数据在内存中
1、有名管道
通过mkfifo创建管道文件,可以在任意两个进程间使用
写入数据
读取数据
测试用例:
2、无名管道
只能在父子进程间使用(注意父子进程需要关两次)
测试用例:这里fd[0]fd[1] 为什么分别是3,4呢?
标准输入,标准输出,标准错误输出占前三个
二、信号量
临界资源:只允许一个进程访问的资源
临界区:访问临界资源的代码段
信号量:特殊的变量,值>=0;
P操作:获取资源,信号量减一
V操作:释放资源,信号量加一
sem.h sem.c
a.c
b.c
测试用例:注意这里两个程序同时执行
编译的时候,也要加上sem.c
三、共享内存
sem1.h sem1.c
写:
读:
测试用例:
四、消息队列
通过ipcs -q查看相关信息
往消息队列里写数据
读数据
测试用例: (注意,这里每写入一次,消息数量加一次,读一次,减少一次)
五、多线程通信
(1)、线程并发
并行:两个线程同时运行
并发:两个线程交替运行
进程是操作系统资源分配的基本单位
线程是系统调度的基本单位
进程:一个正在运行的程序
线程:进程内部的一条执行路径(序列)
1、用户级线程
优点:创建开销小,缺点:无法使用多个处理器
2、内核级线程
优点:创建开销大,缺点:可以使用多个处理器(并行)
3、组合级线程
pthread_create();//创建一个线程
形参分别为(线程id,线程属性,子线程名,标记位)
pthread_exit();//退出一个线程(注意:不是进程)
参数为:一个变量(注意,一般为全局变量,不能为局部变量,因为受生存期影响) 可以为NULL
pthread_join();//等待一个线程结束或合并线程
参数为(线程id,退出线程的返回值)
测试用例:
注意:如果不等待线程执行完毕的话,可能会造成主程序直接退出了,线程不一定会被执行
测试用例:
思考:这里为什么是这样的顺序呢?而不是我们想象中的01234
因为我们在第15行传入的参数是i的地址,但是i的值一直在改变,所以这里是随机值
如果我们传入的参数是i本身的话,打印出来就会是01234了,但是顺序不一定一样
因为我们知道,线程是并发执行的,所以并没有执行先后顺序,可以理解为同时执行、
(2)、线程同步:
1、信号量
用信号量实现ABC交替打印
测试用例:
2、互斥锁
测试用例:
3、条件变量(提供一种线程间通知的机制)
测试用例:
线程安全:初识
注意:在多线程环境中,要保证同步且安全(可重入函数)
如果这里是strtok的话,在两个线程中strtok内部的静态指针可能被覆盖,会导致打印结果和预期的不一样
测试用例:
4、读写锁
测试用例:
5、fork
进程fork
这里明显看到,父进程被fork了
线程fork
六、套接字文件
多进程(Linux)相关推荐
- linux 面包店 多进程,Linux下的多进程编程(一)
什么是一个进程?进程这个概念是针对系统而不是针对用户的,对用户来说,他面对的概念是程序.当用户敲入命令执行一个程序的时候,对系统而言,它将启动一个进程.但和程序不同的是,在这个进程中,系统可能需要再启 ...
- linux下创建多进程,linux之多进程fork:进程创建
linux下实现多线程有两种函数调用:一种是通过pthread.h里面已经封装好的函数调用,另一种是通过unistd.h里面的fork函数调用.前面已经已经列举了pthread的使用,下面来书fork ...
- linux dhclient源码 多进程,Linux日志中出现大量dhclient mesage浅析
最近检查发现一台Linux服务器,发现其日志里面有大量下面信息,其中部分信息做了脱敏处理.其中一个地址A(192.168.AAA.AAA) 为DNS服务器地址,地址B(192.168.BBB.BBB) ...
- linux dhclient源码 多进程,Linux日志中出现大量dhclient mesage浅析,
Linux日志中出现大量dhclient mesage浅析, 最近检查发现一台Linux服务器,发现其日志里面有大量下面信息,其中部分信息做了脱敏处理.其中一个地址A(192.168.AAA.AAA) ...
- linux 生产者消费者 多进程,Linux多线程,生产者消费者算法和条件变量的使用
接着上一篇博文,原来双线程,现在为了实现 暂停/继续 功能,又加了一个线程.第三线程使用条件信号量,当用户按下S键,第三线程将检测到,并且将ifpause置为1,然后输出线程将在if语句成立后被条件信 ...
- linux消息队列非亲缘,linux进程
linux进程Tag内容描述: 1.linux消息队列进程通信 一.消息队列的基本概念消息队列(也叫做报文队列)是Unix系统V版本中3种进程间通信机制之一.另外两种是信号灯和共享内存.这些IPC机制 ...
- python和c混合编程 gil_终于搞明白python与gil
感想:东看一篇文章西看一篇文章,终于把gil的概念理顺了 我们都知道,比方我有一个4核的CPU,那么这样一来,在单位时间内每个核只能跑一个线程,然后时间片轮转切换.但是Python不一样,它不管你有几 ...
- 利用selenium 爬取豆瓣 武林外传数据并且完成 数据可视化 情绪分析
全文的步骤可以大概分为几步: 一:数据获取,利用selenium+多进程(linux上selenium 多进程可能会有问题)+kafka写数据(linux首选必选耦合)windows直接采用的是写my ...
- 资讯类网站增量式爬虫
一:网站增量式爬虫流程图 1)前提是A.B.C网站分类下历史数据已经爬取过 2)A.B.C网站下的同一网站下分类数据存储的表名有规律 二:代码实现 1)init初始化方法中添加基本的请求伪装信息 2) ...
- 【秋招】计算机视觉面试题
计算机视觉相关: 1.如果提高深层神经网络的特征表示能力? ①增加隐藏层个数 ②pooling操作 ③使用非线性激活 如何防止过拟合? ①使用L1 L2正则化 ②Dropout ③使用早停(现在基本不 ...
最新文章
- sql 差值_使用Blink CEP实现差值聚合计算
- 软件加密与授权管理的概念
- 【深度学习】卷积神经网络(CNN)详解
- linux的基础知识——捕捉SIGCHLD、信号传参,中断系统调用
- mysql中触发器中分隔符_php – 在触发器中使用分隔符的Mysql错误
- luogu1984 烧水问题 (找规律)
- Ubuntu Java环境配置
- 阿里云oss完成简单上传
- django之视图view小知识
- 算法设计与分析: 2-13 标准二维表问题
- 英语打卡3:可数名词
- [NowCoder5673E]Enigmatic Partition
- index+match函数/一对多查找匹配,可以代替Vlookup函数的使用。
- 如何优化在搜索引擎上的友好度
- 51 汇编语言编程--输入密码
- Detr的数据流,详细的维度信息
- 中国太空传感器市场现状研究分析与发展前景预测报告(2022)
- Vue+Cesium创建项目并加载地图全过程
- 团体的证件类型三证合一
- grub for dos 入门