进程间通讯之共享内存

Windows 共享内存实现进程间通讯 c++ windows 共享内存 加 事件对象 互斥对象 实现进程间通讯 阅读详情
进程间通讯之共享内存
一、引言:

管道、信号、信号量虽然满足了进程之间通讯的需要,但是还有一种没有满足,那就是进程之间需要共享大量的数据。就像一家人一样,他们彼此之间每天都在交流,但是对于家里面的一些共有物品,如电视,餐厅等等都是共享的,而我们所说的进程之间也是一样的,他们虽然互相独立存在,但是还有很多数据都是共享使用的,而进程之间的数据共享就是共享内存。

二、共享内存理论及其分析:

共享内存就是两个进程共同拥有同一片内存区域。这片区域中的内容,二者都可以访问。要使用共享内存进行通讯,一个进程首先创建一片内存空间专门作为通信使用,而其他的进程则将这片内存空间映射到自己的(虚拟)地址空间。这样就通过读写自己地址空间中对应的的共享内存区域时,就是在和其他的进程进行通信了。

通过这里的了解,是不是感觉共享内存和我们前面博客讲的管道很像呢,管道也是在一片内存区域上作为进程间通信的媒介,但是这里的共享内存和管道是不一样的,首先,使用共享内存时两个进程必须在同一台物理机器上,其次,共享内存的访问方式是随机的,而不是只能从一端写,另一端写,因此这也是共享内存的一大优点,所以共享内存传递的信息也比较多,随之而来大量信息的传递也使得传递时比较复杂。

如图所示,共享内存的图解:


那么共享内存与管道,信号量,信号等等通信有啥区别呢?
共享内存是最快的一种IPC通信方式,在各个进程都有指针指向开辟出来的内存区域,访问的时候当做进程中的一个内存控制直接操作,也就是说对于一个内存而言,共享内存就是进程的一部分,直接通过指针操作这片区域,少了内核的陷入过程;进程直接通过指针操作共享内存区域,少了用户态和内核态之间数据的拷贝。

区别图解:


但是共享内存也有它的缺点:由于共享内存是进程中通信最快的的,且信息量较大,也造成了它的管理复杂,且两个进程必须在同一台物理机器上才能进行通讯,另外一个缺点就是,安全性低,当两个进程共享一片内存区域进行通讯时,如果一个进程感染了病毒,很容易会传给(感染)另外一个进程。就像一家人一样,一个人感冒了,有些东西是公用的,到时候用的时候会很容易感染给别人,这是同样的道理。
再就是需要注意的是:使用全局变量在同一个进程的线程间实现通信不叫共享内存,它们是使用进程中的资源,线程只是进程内部的一个执行序列,后期将会进行分析说明。

共享内存使用时,是一个临界资源,所以进程之间使用必须做同步控制,而这里能更好的达到同步控制需要利用我们前面所说的信号量。

三、共享内存的使用函数:

头文件sys/types.h和sys/ipc.h被shm.h自动包含进程序。

shmget函数:
创建共享内存,获得一个共享内存标识符;
int shmget(key_t key,  size_t size,  int shmflg);
第一个参数是程序提供的一个键值,为共享内存命名,shmget函数返回一个共享内存标识符,后面的其他函数会使用。
第二个参数:size以字节为单位指定需要共享的内存容量。
第三个参数:如果共享内存存在则获取,不存在,使用IPC_CREAT创建,创建可以给设置权限标志 Onnn,这样允许创建共享内存的进程写入数据,设置其他的用户创建的进程只能以读取该共享内存。
返回值:创建成功,返回一个非负整数,即共享内存标识符,失败,则返回-1.

shmat函数:
将共享内存的段连接到进程的地址空间中。
void *shmat(int shm_id,  const *shm_addr,  int shmflg);
第一个参数shm_id是shmget函数的返回的共享内存标识符。
第二个参数shm_addr是:共享内存将要连接到当前进程中的地址位置,它通常是一个NULL,表示让系统来选择共享内存出现的地址。
第三个参数shmflg:是一组位标志,取值为:SHM_RND与shm_addr联合使用用来控制共享内存区域连续的地址        和SHM_RDONLY(它使得连续的内存只读)。
返回值:如果shmat调用成功,返回一个指向共享内存第一个字节的指针,如果失败,则返回-1.

shmdt函数:
断开连接;此函数只会断开连接,而不会删除共享内存。
int shmdt(void *addr);
addr参数是以前调用shmat函数的时的返回值,如果成功,shmdt将相关shmid_ds结构中的shm_nattch计数器值减1.

返回值:成功返回0,失败返回-1.


shmctl函数:
删除内核对象;
int shmctl(int shm_id,  int command,  struct shmid_ds *buf);
shmid_ds结构:
struct shmid_ds
{
uid_t  shm_perm.uid;
uid_t  shm_perm.gid;
mode_t  shm_perm.mode;
}
第一个参数shm_id是shmget返回的共享内存标识符
第二个参数command是要采取的动作,取以下三个值:
IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值
IPC_SET :如果进程有足够权限,把共享内存的当前关联值设置为shmid_ds结构中的值;
IPC_RMID:删除共享内存段;
第三个参数buf是一个指针,它指向包含共享内存模式和访问权限的结构。
返回值:成功时返回0;失败时返回-1;

基于intel的Linux系统上的存储区布局:



四、共享内存的测试题:


题目:A进程接收用户输入,B进程统计字符个数,遇到end结束!
代码如下:

信号量sem.c中信号量初始值为1;data.val = 1;,其他信号量封装函数见博客目录中的《进程通讯之信号量》

void sem_get()
{
	//获取信号量集
	semid = semget((key_t)1234,1,0666);
	if (semid == -1)
	{
		//完成创建信号量集
		semid = semget((key_t)1234, 1, 0666 | IPC_CREAT);
		assert(semid != -1);
		if (semid == -1)
		{
			printf("error\n");
			exit(0);
		}
		//完成初始化
		union sembuff data;
		data.val = 1;
		semctl(semid,0,SETVAL,data);

	}
}

文件:shma.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <sys/shm.h>
#include "sem.h"

void main()
{
 	int shmid = shmget((key_t)1234,128,IPC_CREAT | 0666);
	assert(shmid != -1);
	char *ptr = shmat(shmid,NULL,0);
	assert(ptr != NULL);
	sem_get();
	while(1)
	{
		sem_p();
		printf("please input: ");
		fflush(stdout);
		fgets(ptr,128,stdin);
		if (strncmp(ptr,"end",3) == 0)
		{
			break;
		}
		ptr[strlen(ptr)-1] = 0;
		sem_v();
		
	}
 }

文件:shmb.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <sys/shm.h>
#include "sem.h"

void main()
{
	int shmid = shmget((key_t)1234,128,IPC_CREAT | 0666);
	assert(shmid != -1);
	char *ptr = shmat(shmid,NULL,0);
	assert(ptr != NULL);
	sem_get();
	while(1)
	{
		sem_p();
		if (strncmp(ptr,"end",3) == 0)
		{
			break;
		}
		sleep(5);
		printf("size : %d\n",strlen(ptr));
		sem_v();
	}
}
Linux终端下编译命令:
shma.c文件:gcc -o  shma   shma.c  sem.c
shmb.c文件:gcc -o  shmb   shmb.c  sem.c

结果:

A进程用户:


B进程计算:


测试目的:为了更好的使用共享内存进行进程间的通讯,以及对于进程间使用共享内存熟练使用,得到加强,并且融入信号量,进程对共享内存访问时,是同步控制的。

qt中进程间共享内存通讯 共享内存是进程间通讯最快捷的方法,qt中是有QSharedMemory类提供相关接口,配合着QBuffer缓存,QDataStream数据流这些类完成。 QSharedMemory m_sm; m_sm.setKey(tr("mysharememory")); void MainWindow::on_btnSmWrite_clicked() { QBuffer buffer; QDataStream datas; int size; if(m_sm.isAttac... 阅读详情

相关推荐

缓冲区设计—进程间通讯(POSIX 共享内存)

在《缓冲区设计-线程间通讯》一文中,完成了BufQueue的模版类的设计。这个模版类定义如下:template >class BufQueue; 其中的模版参数Alloc可以订制为不同的环冲内存形式。在线程间的通讯中,这个参数当然是最简单的,它只要简单的分配空间就可以了,因为同一进程中的线程是共享进程的内存空间的。 但是,如果要在进程间使用这个环形缓冲区,则需要

海涛的专栏 3053

Linux中fork创建兄弟子进程,验证进程之间全局变量不共享,exec函数族

文章目录编程环境:并行和并发:并发:一个时间段,处理请求的个数并行:多个进程同时进行任务分配:PCB 和 进程的五种状态:进程控制块 PCB:进程的五种状态:进程控制块,父进程创建子进程的分析 ????:父进程如何创建多个兄弟子进程(不含孙进程)????:进程之间是否共享全局变量:????显示当前进程的状态 ps:删除执行中的程序或工作 kill:exec 函数族 ????:执行指定目录下的程序 execl():执行 P...

3912

使用C语言实现进程间的通讯之共享内存使用

CreateFileMapping是 Windows API 中用于创建一个新的文件映射对象的函数。它通常与MapViewOfFile一起使用,用于在多个进程之间共享内存。

jackiendsc的博客 832

linux fork 父 子进程 访问 共享全局变量,linux fork 进程后 主进程的全局变量

fork一个进程后,复制出来的task_struct结构与系统的堆栈空间是父进程独立的,但其他资源却是与父进程共享的,比如文件指针,socket描述符等不同的进程使用不同的地址空间,子进程被创建后,父进程的全局变量,静态变量复制到子进程的地址空间中,这些变量将相互独立#include #include #include #include int count = ;int main(){if(for...

weixin_34771903的博客 578

鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式

看到这里你应该不会问共享内存的作用和为啥它是最快的进程间通讯方式了,如果还有这两个问题说明还要再看一遍 😛 ,另外细心的话会发现共享内存会有个小缺点,就是同时访问的问题,所以需要使用互斥锁来保证同时只有一个进程在使用,和在以上的四个步骤中都有出现。//互斥锁,共享内存本身并不保证操作的同步性,所以需用互斥锁#define SYSV_SHM_LOCK() (VOID)LOS_MuxLock(&g_sysvShmMux, LOS_WAIT_FOREVER) //申请永久等待锁。

maniuT的博客 1267

【回眸】Linux 内核 (十三)进程间通讯 之 共享内存

前面介绍了进程间通信的几种方法诸如:管道、消息队列等等,接下来是更加高级的进程间通讯的方法:共享内存。

啤酒鸭的物联网开发记录博客 378

(26)Linux 进程通信之共享内存(共享储存空间)

共享内存是System V版本的最后一个进程间通信方式。共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内存连接到他们自己的地址空间中,所有的进程都可以访问共享内存中的地址。如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。

ayf9999的博客 1632

从“氛围编程“到“智能体工程“:AI编程范式的认知跃迁与工程实践

摘要: 2026年,ClaudeCode负责人鲍里斯·切尔尼提出用“智能体工程”(Agent Engineering)替代流行的“氛围编程”(Vibe Coding),认为后者过于主观,无法体现AI编程的系统化与工程化本质。智能体工程强调记忆系统、工具编排、任务分解、可观测性等核心技术,将AI编程从“玄学辅助”升级为可度量、可规模化的工程学科。本文通过对比术语差异、构建知识体系,并结合代码实例(如带记忆系统的代码生成Agent和可观测性系统),展示了智能体工程的实际应用。行业案例(如ClaudeCode的并

yyq916的博客 1061

Linux系统编程——证明线程共享全局变量

线程中默认共享数据段,代码段等地址空间,常用的是全局变量。而进程不共享全局变量。 下面写一个程序,证明线程之间是共享全局变量的。 #include #include #include #include int var=100; void *tfn(void *arg) { var=200; printf("pthread\n"); return NULL;

sum_TW的博客 4649

告别QWebEngineView!用QtLocation+SQLite打造离线地图应用(附完整源码)

本文详细介绍了如何利用QtLocation模块与SQLite数据库构建高性能离线地图引擎,解决传统QWebEngineView方案在网络依赖、内存占用和定制化方面的不足。通过多级缓存机制、异步写入优化和纹理压缩技术,实现工业级应用的稳定运行和高效渲染,特别适合车载导航和野外勘探等场景。

weixin_30431445的博客 362

宇树机器狗go2—slam建图(1)点云格式

上一篇番外文章教大家如何在宇树机器狗go2的gazebo仿真环境中实现简单的导航运动,本期文章会教大家如何让宇树的机器狗go2在仿真环境中进行slam建图时经常会遇到的一些点云格式,在后续的slam建图和slam算法解析的时候会经常与这些点云信息打交道。宇树机器狗go2仿真会作为一个长期项目来进行不定期更新,仿真不只限于在gazebo上实现,后面还会在isaac sim等仿真平台上教大家如何搭建,其目的还是帮助各位都能以较低的成本加入到宇树机器狗go2的学习中。

古月居 3271

全局内存_global memory shared memory(共享内存)

1 全局内存 GPU的全局内存之所以是全局的,主要是因为GPU与CPU都可以对它进行写操作。任何设备都可以通过PCI-E总线对其进行访问。GPU之间不通过CPU,直接将数据从一块GPU卡上的数据传输到另一个GPU卡上。 CPU主机端处理器可以通过以下三种方式对GPU上的内存进行访问: 【1】显式地阻塞传输 【2】显式地非阻塞传输 【3】隐式的使用零内存复制。 2 ...

weixin_43282858的博客 4643

UVM环境复位--stop_sequences()

在UVM验证环境中, stop_sequences是一个用于强制终止所有正在运行的 Sequence 的方法,通常用于动态控制激励生成流程。1.通过uvm_config_db传递事件和严格的同步机制,此方案符适用于复杂复位场景和动态测试控制。组件耦合:Driver 和 Sequence 不再直接依赖env,通过标准接口通信。竞争条件:确保 Driver 完成清理后再终止 Sequence。代码健壮性:使用非阻塞操作和事件监听,避免死锁。

qq_42779035的博客 3014

进程间通讯-共享内存、信号量

共享内存是将分配的物理空间直接映射到进程的⽤户虚拟地址空间中, 减少数据在内核空间缓存。注意 : 在使⽤ IPC_RMID 时,第 三个参数会被忽略, 下⾯是帮助⽂档中的说明。成功 : 根据不同的命令有不同的返回值, 可以查看帮助⽂档关于 RETURN 的说明。IPC_NOWAIT : ⾮阻塞,在信号量的值为 0 时, 会⽴即返回。: ⼀般指的是信号量 的值为 1, 可以理解为只对应⼀个资源。信号量编号, 从 0 开始, 在 sem_op 的帮助⽂档中。

interese的博客 647

【Python】解决 ERROR: Exception:Traceback (most recent call last):(亲测有效)

1、遇到问题2、问题解决

Fanjufei的博客 1万+

YOLOv8独家原创改进:原创自研 | 自研独家创新DSAM注意力 ,基于BiLevelRoutingAttention注意力升级

提出新颖的注意力DSAM(Deformable Bi-level SpatialAttention Module),创新度极佳,适合科研创新,效果秒杀CBAM,Channel Attention+Spartial Attention升级为新颖的Deformable Bi-level Attention+Spartial Attention

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1512

进程间通讯 IPC 共享内存

1 ,共享内存是多个进程共享同一内存空间,使用时可能会产生竞态,为了解决这一问题,共享内存一般会跟信号灯量一起使用,完成进程的同步。4,使用共享内存,和正常使用指针一样的,使用时,无需再进行用户空间与内核空间的切换,共享内存是所有进程间通讯方式中。2,共享内存相比消息队列:消息队列能够保证数据的不丢失性,共享内存能够保证数据的失效性。——————————————学习中——————————————————————————3,对共享内存读取的操作不是一次性的,当读取后,数据依然存在。

2403_87663181的博客 522

25、格式化字符串攻击全解析

本文深入解析了格式化字符串攻击的原理与利用方式,涵盖缓冲区溢出与格式化字符串漏洞的区别,详细介绍了printf函数的工作机制、常见格式化说明符及其安全隐患。文章分析了三类典型编程错误导致的漏洞,并展示了如何通过恶意格式化字符串实现拒绝服务、内存读取和写入攻击。同时,提供了有效的防御措施,包括输入验证、使用安全函数、避免直接使用用户输入作为格式化字符串以及启用编译器安全选项,帮助开发者防范此类高危漏洞。

beer8的博客 83

Qt进程间通讯——共享内存

Qt进程间通讯——共享内存

qq_28107929的博客 222

RK3576 调试ov2735 mipi-csi摄像头

摘要:本文记录了基于RK3576平台调试OV2735 MIPI摄像头的全过程。开发环境采用Linux 6.1内核和Buildroot文件系统。调试步骤包括:1)硬件检查(电源、晶振和引脚连接);2)驱动配置(设备树节点、ISP通道设置);3)驱动验证(通过ID检测和I2C工具测试);4)推流测试(使用v4l2和gstreamer工具)。重点解决了复位引脚配置、时钟命名匹配等关键问题,并通过寄存器检查确保初始化正常。最终实现了摄像头数据流的成功输出,为嵌入式视觉应用开发提供了完整参考方案。

qq_45147279的博客 1060

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

QT 使用共享内存 实现进程间通讯

QT 使用共享内存 实现进程间通讯。

hss2799的专栏 1147

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【Linux】Linux进程间通讯-共享内存

要使用一块共享内存,进程必须首先分配它。随后需要访问这个共享内存块的每一个进程都必须将这个共享内存绑定到自己的地址空间中。在 Linux 系统中,每个进程的虚拟内存是被分为许多页面的。这些内存页面中包含了实际的数据。每个进程都会维护一个从内存地址到虚拟内存页面之间的映射关系。尽管每个进程都有自己的内存地址,不同的进程可以同时将同一个内存页面映射到自己的地址空间中,从而达到共享内存的目的。分配一个新的共享内存块会创建新的内存页面。

Antonio915的博客 1207

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

进程(六):进程间通讯:共享内存

进程间通讯:共享内存

Linux 384

进程间通讯(五)--共享内存(文件映射)

进程间通讯之共享内存

对着世界说你好 481

Windows环境下使用共享内存实现进程间通讯

Windows环境下使用共享内存实现进程间通讯 创建共享内存 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示; 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示; 全新的 KaTeX数学公式 语法; 增加了支持甘特图的mermaid语法1 功能; 增加了 多屏幕编辑 Markdown文章功能; 增加了 焦点写作模式、预览模式、简洁...

weixin_44055512的博客 351
上一篇: 进程通讯之消息队列
下一篇: 线程管理一
IT_model
博客等级 码龄9年 61粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值