Linux环境编程

Linux环境编程IPC共享内存出处:http://blog.csdn.net/lijun538/article/details/52549159共享内存区是可用IPC形式里面最快的。共享内存允许多个进程同时访问同一内存区,进程会将内存区映射到自己的地址空间中。这样进程间数据的传递不再涉及内核,减少了数据复制的动作。例如一个客户从服务器读的操作,使用管道消息队列等形式的话,需要内核将数据复制到进

大家好,又见面了,我是你们的朋友全栈君。

IPC

共享内存

出处:http://blog.csdn.net/lijun538/article/details/52549159

共享内存区是可用IPC形式里面最快的。共享内存允许多个进程同时访问同一内存区,进程会将内存区映射到自己的地址空间中。这样进程间数据的传递不再涉及内核,减少了数据复制的动作。例如一个客户从服务器读的操作,使用管道消息队列等形式的话,需要内核将数据复制到进程空间的服务器上,然后服务器写到内核空间的IPC上。这样一次读取或者写入需要将数据复制两次。 
  这里写图片描述
  使用共享内存 
  

  • 进程必须首先分配它
  • 随后需要访问这个共享内存块的每一个进程都必须将这个共享内存绑定到自己的地址空间中
  • 当完成通信之后,所有进程都将脱离共享内存,并且由一个进程释放该共享内存块

/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一个共享内存区的最大字节数shmmax,系统范围内最大共享内存区标识符数shmmni等,可以手工对其调整,但不推荐这样做。

这里写图片描述
共享内存的使用,主要有以下几个API:ftok()、shmget()、shmat()、shmdt()及shmctl()。

#include <sys/shm.h>
void *shmat(int shm_id, const void *shm_addr, int shmflg);
int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
int shmdt(const void *shm_addr);
int shmget(key_t key, size_t size, int shmflg);
  
  
  
  • 1
  • 2
  • 3
  • 4
  • 5

shmget():创建一个新的共享内存区,或者访问一个已经存在的内存区。 
shmat():创建或者打开后,通过shmat把它连接到调用进程的地址空间。 
shmdt():断开连接的内存区。当一个进程终止时,它所有链接的共享内存区都会自动断掉,注意这个函数并不删除共享内存区。 
shmctl():提供对共享内存区的多种操作,例如删除。

出处:http://blog.csdn.net/caoli98033/article/details/44599273

在一个linux服务器上,共享内存的总体大小是有限制的,这个大小通过SHMMAX参数来定义(以字节为单位),您可以通过执行以下命令来确定 SHMMAX 的值:

  
  
  
  1. # cat /proc/sys/kernel/shmmax 

如果机器上创建的共享内存的总共大小超出了这个限制,在程序中使用标准错误perror可能会出现以下的信息:

  
  
  
  1. unable to attach to shared memory 

解决方法:

1、设置 SHMMAX

SHMMAX 的默认值是 32MB 。一般使用下列方法之一种将 SHMMAX 参数设为 2GB :

通过直接更改 /proc 文件系统,你不需重新启动机器就可以改变 SHMMAX 的默认设置。我使用的方法是将以下命令放入 />etc/rc.local 启动文件中:

  
  
  
  1. # echo "2147483648" &gt; /proc/sys/kernel/shmmax 

您还可以使用 sysctl 命令来更改 SHMMAX 的值:

  
  
  
  1. # sysctl -w kernel.shmmax=2147483648 

最后,通过将该内核参数插入到 /etc/sysctl.conf 启动文件中,您可以使这种更改永久有效:

  
  
  
  1. # echo "kernel.shmmax=2147483648&gt;&gt; /etc/sysctl.conf 

2、设置 SHMMNI

我们现在来看 SHMMNI 参数。这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是 4096 。这一数值已经足够,通常不需要更改。

您可以通过执行以下命令来确定 SHMMNI 的值:

  
  
  
  1. # cat /proc/sys/kernel/shmmni 
  2. 4096 

3、设置 SHMALL

最后,我们来看 SHMALL 共享内存内核参数。该参数控制着系统一次可以使用的共享内存总量(以页为单位)。简言之,该参数的值始终应该至少为:

  
  
  
  1. ceil(SHMMAX/PAGE_SIZE) 

SHMALL 的默认大小为 2097152 ,可以使用以下命令进行查询:

  
  
  
  1. # cat /proc/sys/kernel/shmall 
  2. 2097152 

SHMALL 的默认设置对于我们来说应该足够使用。

注意: 在 i386 平台上 Red Hat Linux 的 页面大小 为 4096 字节。但是,您可以使用 bigpages ,它支持配置更大的内存页面尺寸。

出处:http://blog.csdn.net/lijun538/article/details/52549159

使用过哪些进程间通讯机制,并详细说明 主要介绍一下Linux下面的几种进程通讯方式。

  1. 管道:管道的名字挺形象的,就一个一个先进先出的队列,一个进程从一端读,另一个进程从另一端写,是一个环形缓冲区。管道有字节缓冲区,因此有大小限制。同时,管道分为命名管道(FIFO)和匿名管道。只有父子之间的经常才可以共享匿名管道,就是受fork限制,而命名管道可以在无亲缘关系的进程间使用,使用mififo函数创建,指定pathname作为路径名。
#include<sys/types.h>#include<sys/stat.h>int mkfifo(const char *pathname, mode_t mode);      
  • 1
  • 2
  • 3
  • 4

PS:创建后打开管道,必须读或者写,不能既读又写,属于半双工。 
 2. 消息队列:消息队列就像一个信箱,有人投递有人取。消息队列具有内核持续性,一个进程往某个队列写入一些消息,终止后,另一个进程可以读取。因此说是一个链表更为合适。注意发送者可以设置优先级,优先级最高的最早消息总是位于队列的头部。 
 3. 共享内存:共享内存是UNIX提供的进程通讯手段中最快的。前面已经介绍过了。注意一下需要自己提供同步的手段。 
 4.信号:信号和信号量看起来很像。信号是指signal,用于向一个进程通知发生异步事件的机制,而信号量是一种同步手段,就是PV原语那些东西。信号的传递是通过修改信号所发到的进程的某一个位域完成的。只有一位,无法排队。进程可以选择执行默认行为(如终止),执行一个信号处理函数或者忽略该信号。 
  
简单看一下unix常用的信号: 
注意前面32个是传统的unix信号,无法排队,因此可能造成信号的丢失。而后面32是可靠信息,可靠的意思是信息可以排队,信号不丢失。

lijun0914:~/workspace/bomb $ kill -l
1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

这里写图片描述

 5.套接字:socket,上面介绍的通讯手段限制了作用域,套接字编程应用则更为广泛,可用于不同机器之间的通讯。网络的两端都建立一个socket对象,然后通过socket对象进行数据的传输。《unix网络编程卷一》对socket编程有详细的介绍。

静态链接库和动态链接库

Linux动态链接库的后缀名: .so
Windows:DLL

堆和栈

栈和线程相关, 默认1MB预留, 初次递交8KB, 自动增长, 具体使用要看线程调用栈了. 所以如果进程中有N个线程. 默认情况下, 有N*1MB的栈预留空间, 和小于这个数字的实际使用.




堆和Heap管理有关, 默认存在系统堆和CRT堆. 具体大小取决于程序本身对内存的分配和使用, 可以调用HeapSize看实际使用大小. 




另外还有虚拟内存, 独立于对堆外, 直接通过VirtualAlloc预留或分配. 也属于进程动态分配的内存.


32位就是4G的寻址空间,linux将其分为两部分,虚拟地址从0xC0000000到0xffffffff用于内核,为系统空间。较低的3G字节为用户空间。理论上每个进程最多可以使用3G堆内存。而实际上一般限制到2G。 
  而线程的栈空间大小在linux下可以使用ulimit -s查询,我的环境下默认是8192字节。windows下一说默认1M,一说2M。


I/O多路复用

HTTP请求

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/137656.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Java中重载与重写的特点和区别[通俗易懂]

    Java中重载与重写的特点和区别[通俗易懂]一、重载(overload)重载:发生在Java的同一个类里面,通过定义相同的方法,定义不同的参数列表来区分开这些相同的方法,参数列表的不同可以是参数的类型、参数的个数和参数的顺序。当我们调用这些方法的时候通过传入参数的不同,在运行时Java虚拟机会自行调用不同的方法来进行处理。由于Java的修饰符都可以访问同一个类里面的方法,所以方法的重载与方法的修饰符无关;Java的返回值不能区别这些方法,因为返回值是在运行后才体现出来的,而两个参数列表相同仅仅是返回值相同的方法在Java编译时就会报错,虚拟机在运行

  • SpringBoot自动配置的原理及实现

    SpringBoot自动配置的原理及实现SpringBoot自动配置的实现原理SpringBoot的核心就是自动配置,自动配置又是基于条件判断来配置Bean。关于自动配置的源码在spring-boot-autoconfigure-2.0.3.RELEASE.jar回顾配置属性在通常需要我们在property中配置信息时,通常使用@ConfigurationProperties(pefix=“前缀”)注解的方式从配置文件中获取配置…

  • MATLAB 之 wavedec2函数详解

    MATLAB 之 wavedec2函数详解wavedec2函数:1.功能:实现图像(即二维信号)的多层分解,多层,即多尺度.2.格式:[c,s]=wavedec2(X,N,’wname’)    [c,s]=wavedec2(X,N,Lo_D,Hi_D)(我不讨论它)3.参数说明:对图像X用wname小波基函数实现N层分解,这里的小波基函数应该根据实际情况选择,具体选择办法可以搜之或者hel

  • TB6612FNG 驱动学习笔记

    TB6612FNG是东芝半导体公司生产的一款直流电机驱动器件,它具有大电流MOSFET-H桥结构,双通道电路输出,可同时驱动2个电机。TB6612FNG每通道输出最高1.2A的连续驱动电流,启动峰值电流达2A/3.2A(连续脉冲/单脉冲);4种电机控制模式:正转/反转/制动/停止;PWM支持频率高达100kHz;待机状态;片内低压检测电路与热停机保护电路;工作温度:-20~85℃;SSOP…

  • MATLAB GUI图形界面设计一个学生管理系统

    MATLAB GUI图形界面设计一个学生管理系统设计一个简单的学生成绩管理程序,包含如下功能:1、可创建不少于100名学生成员;2、每名成员的记录包括:学号、姓名、专业和5门课程的成绩; 3、能够实现添加、删除、修改学生成员;(增加非法字符警告)4、能够实现添加、删除、修改学生成员的课程成绩;(增加非法字符警告)5、分别计算每一门课程的平均成绩;6、每一门课程单独排序,输出由高到低的课程、姓名、成绩信息。7、提供图形界面实现上述功能,界面包含 系统登录界面 添加、删除、修改界面 被选中学生信息显示界面(基本信息,课程成绩,平均成

  • 2022最新短视频API解析接口源码

    2022最新短视频API解析接口源码2022最新短视频API解析接口分发管理源码,全新UI,全新系统源码支持去水印接口分发功能,支持注册分发个人独立去水印接口功能,带有后台管理系统,支持注册账号在线充值和购买包邮套餐,源码对接了支付宝当面付,官方支付放心收款,套餐可随意设置包点数或包月等源码下载稍后上传更新下载地址…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号