共享内存

5-共享内存

巧了我就是萌 提交于 2020-02-28 12:44:05
1. 套接字超时 1.1 accept/read/write超时 如何设置accept()函数等待连接时的超时时长? 答: accept() 函数本身会一直阻塞到有连接请求而无法计时,因此可以设置由内核监听连接并计时。即由 select()/epoll()/poll() 函数来计时。 如何设置read()/write()的等待时长? 答: read() 函数要一直监测缓冲区中有数据才能解除阻塞读数据,因此可以同 accept() 函数一样,由内核监测。而 write() 函数要一直监测缓冲区未满才能解除阻塞写数据,因此也可以由内核检测。 //1.设置监听时间 fd_set rdset ; FD_ZERO ( & rdset ) ; FD_SET ( fd , & rdset ) ; struct timeval timeout = { 10 , 0 } ; //2.设置为内核检测 int ret = select ( fd + 1 , & rdset , % rdset , NULL , & timeout ) ; if ( ret == 0 ) //若无描述符变化 { //监测超时 } else if ( ret > 0 ) //若有变化 { //accept则接受链接 struct sockaddr addr ; int len = sizeof ( addr ) ; int

进程间的八种通信方式

孤人 提交于 2020-02-26 15:11:21
1.无名管道( pipe ): 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 2.高级管道(popen): 将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。 3.有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 4.消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 5.信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 6.信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。 7.共享内存( shared memory ) : 共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用

Linux服务器性能评估

随声附和 提交于 2020-02-24 09:57:58
一、影响 Linux服务器性能的因素 1. 操作系统级 CPU 内存 磁盘 I/O带宽 网络 I/O带宽 2. 程序应用级 二、系统性能评估标准 影响性能因素 影响性能因素 评判标准 好 坏 糟糕 CPU user% + sys%< 70% user% + sys%= 85% user% + sys% >=90% 内存 Swap In(si)=0Swap Out(so)=0 Per CPU with 10 page/s More Swap In & Swap Out 磁盘 iowait % < 20% iowait % =35% iowait % >= 50% 其中: %user:表示CPU处在用户模式下的时间百分比。 %sys:表示CPU处在系统模式下的时间百分比。 %iowait:表示CPU等待输入输出完成时间的百分比。 swap in:即si,表示虚拟内存的页导入,即从SWAP DISK交换到RAM swap out:即so,表示虚拟内存的页导出,即从RAM交换到SWAP DISK。 三、系统性能分析工具 1.常用系统命令 Vmstat、sar、iostat、netstat、free、ps、top等 2.常用组合方式 • 用vmstat、sar、iostat检测是否是CPU瓶颈 • 用free、vmstat检测是否是内存瓶颈 • 用iostat检测是否是磁盘I/O瓶颈 •

Golang并发编程之channel

青春壹個敷衍的年華 提交于 2020-02-23 02:14:47
channel 单纯将函数实现并发是没有任何意义的,函数与函数之间需要交换数据才能够体现并发执行函数的意义。 虽然可以使用共享内存进行数据交换,但是共享内存在不同的 goroutine 中容易发生竞态情况。为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,这种做法肯定会造成性能影响。 Go语言的并发模型是 CSP ,提倡通过通信共享内存而不是通过共享内存而实现通信。 如果说 goroutine 是Go程序并发的执行体, channel 就是他们之间的连接。 channel 是可以让一个 goroutine 发送特定值到另一个 goroutine 的通信机制。 Go语言中的通道(channel)是一种特殊的类型,通道像一个传送带或者队列,总是遵循先入先出(FIFO)的规则,保证收发数据的顺序。每一个通道都是一个具体类型的导管,也就是声明 channel 的时候需要为其制定元素类型。 channel类型 声明通道类型的格式如下: var 变量 chan 元素类型 举几个例子 var a1 chan int // 声明一个int类型的chan var a2 chan str // 声明一个str类型的chan var a3 chan []int // 声明一个int slice的chan 创建channel channel是一个引用类型

进程间通信方式

拈花ヽ惹草 提交于 2020-02-22 15:07:17
管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 命名管道 (named pipe) : 命名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。 套接字( socket ) : 套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。 来源: https:/

进程间的通信方式

本秂侑毒 提交于 2020-02-22 15:03:47
几种进程间的通信方式 (1) 管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有血缘关系的进程间使用。进程的血缘关系通常指父子进程关系。 (2)有名管道(named pipe):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间通信。 (3)信号量(semophore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它通常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 (4)消息队列(message queue):消息队列是由消息组成的链表,存放在内核中 并由消息队列标识符标识。消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 (5)信号(signal):信号是一种比较复杂的通信方式,用于通知接收进程某一事件已经发生。 (6)共享内存(shared memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问,共享内存是最快的IPC方式,它是针对其他进程间的通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。 (7)套接字(socket):套接口也是一种进程间的通信机制,与其他通信机制不同的是它可以用于不同及其间的进程通信。 来源:

进程间通信方式解释

倖福魔咒の 提交于 2020-02-22 15:03:12
# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 # 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 # 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 # 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 # 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。 # 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。 # 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

Python跨进程共享内存测试

核能气质少年 提交于 2020-02-22 06:27:42
跨进程读写内存想要高效,肯定是能不加锁就不加锁,进程锁对效率有很大影响。 通常进程之间交换数据最快就是共享内存了,于是写了关于如下测试程序,只是实现一个进程写,一个进程读的单生产单消费者模型 测试不休息,一秒可传输30万次,虽然不如线程之间高效,但在进程之间还可以吧 import time import random from multiprocessing import Process import mmap class Write(Process): def __init__(self,name,share_memname): super().__init__() self.name=name self.share_memname = share_memname self.share_memlen= 100 def run(self): self.process_run_init() start_time = time.time() for i in range(0,100000): bytes_buffer = str(i).encode('UTF-8') self.write(bytes_buffer) self.wait_read() end_time = time.time() print(end_time-start_time) def write(self

Linux命令行工具之free命令

蹲街弑〆低调 提交于 2020-02-21 07:24:35
原创转载请注明出处: https://www.cnblogs.com/agilestyle/p/11524691.html 使用 free 查看整个系统的内存使用情况 Note:不同版本的free输出可能会有所不同 第一列,total 是总内存大小; 第二列,used 是已使用内存的大小,包含了共享内存; 第三列,free 是未使用内存的大小; 第四列,shared 是共享内存的大小; 第五列,buffers是缓冲区的大小 第六列,cached是缓存的大小 使用 top 查看进程的内存使用情况 top 输出界面的顶端,也显示了系统整体的内存使用情况,这些数据跟 free 类似。接着看下面的内容,跟内存相关的几列数据,比如 VIRT、RES、SHR 以及 %MEM 等。 这些数据,包含了进程最重要的几个内存使用情况。 VIRT 是进程虚拟内存的大小,只要是进程申请过的内存,即便还没有真正分配物理内存,也会计算在内。 RES 是常驻内存的大小,也就是进程实际使用的物理内存大小,但不包括 swap 和共享内存。 SHR 是共享内存的大小,比如与其他进程共同使用的共享内存、加载的动态链接库以及程序的代码段等。 %MEM 是进程使用物理内存占系统总内存的百分比。 除了要认识这些基本信息,在查看 top 输出时,还要注意两点。 第一,虚拟内存通常并不会全部分配物理内存。从上面的输出

C++编译与底层相关知识点复习笔记

你。 提交于 2020-02-18 23:28:13
一、C++源文件从文本到可执行文件经历的过程? 预处理阶段:将 头文件 和 宏定义 进行分析和替换,生成 预编译文件 。 编译阶段:将预编译文件转换成特定 汇编代码 ,生成汇编文件 汇编阶段:将编译阶段生成的汇编文件转化成 机器码 ,生成 可重定位目标文件 链接阶段:将 多个目标文件及所需要的库连接 成最终的可执行目标文件 二、include头文件的顺序? 对于include的头文件来说,如果在文件a.h中声明一个在文件b.h中定义的变量,而不引用b.h。那么要在a.c文件中引用b.h文件,并且要先引用b.h,后引用a.h,否则汇报变量类型未声明错误。 三、双引号和尖括号的区别? 双引号的查找顺序: 1、当前的头文件目录 2、编译器指定的头文件路径 3、系统变量指定的头文件路径 尖括号没有1. 四、C++的虚拟内存 1、代码段,包括只读存储区和文本区。前者存储字符串常量,后者存储机器代码。 2、数据段:存储程序中 已初始化 的 全局变量 和 静态变量 。 3、bss 段:存储未初始化的全局变量和静态变量(局部+全局),以及所有被初始化为0的全局变量和静态变量。 4、堆区:调用new/malloc函数时在堆区动态分配内存,同时需要调用delete/free来手动释放申请的内存。 5、映射区:存储动态链接库以及调用mmap函数进行的文件映射。 6、栈:使用栈空间存储函数的 返回地址