Linux环境编程

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请求

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux环境编程图文指南是一本详细介绍在Linux系统下进行编程的指南。它包含了图文并茂的内容,帮助读者理解和掌握Linux环境下的编程技巧和方法。 首先,该指南会介绍Linux系统的基本组成和架构,帮助读者了解Linux的工作原理和基本操作。它还会详细介绍如何在Linux系统上安装和配置开发环境,包括编译器、编辑器和调试工具的选择和设置。 其次,该指南会深入讲解Linux环境下的编程语言和工具。它会介绍C语言、Python和Shell脚本等常用的编程语言,并提供详细的语法和示例代码。此外,它还会介绍一些常用的开发工具和库,如GCC、Make、GDB和GTK+等,帮助读者更高效地进行编程和调试。 除了基本的编程技巧,该指南还会介绍Linux系统的特性和机制。它会介绍Linux的进程管理、文件系统和网络编程等相关内容,帮助读者深入理解Linux系统的工作原理,并能够针对特定需求进行系统级的编程和定制。 最后,该指南还会提供一些实际案例和示例项目,帮助读者将所学知识应用到实际的项目开发中。这些案例涵盖了网络应用、系统管理和嵌入式开发等不同领域,读者可以根据自己的兴趣和需求选择学习和实践。 总之,Linux环境编程图文指南为读者提供了一个全面而系统的学习资源,帮助他们在Linux系统下进行编程并取得成功。无论是初学者还是有一定经验的开发者,该指南都可以成为他们的参考和指导。 ### 回答2: Linux环境编程图文指南是一本介绍在Linux操作系统下进行编程的指南。本书旨在帮助读者从零基础开始学习Linux环境下的编程知识,并提供实用的例子和案例,帮助读者更好地理解和应用所学的知识。 首先,本书会介绍Linux操作系统的基础知识,包括Linux的发行版、命令行界面、文件系统结构等。读者可以逐步学习如何在Linux环境下进行基本的文件操作、目录管理和进程管理等。 接着,本书会详细介绍Linux下的编程环境和工具,如GCC编译器、GNU调试器、Makefile等。读者可以学习如何配置和使用这些工具来进行程序的开发、编译和调试。 同时,本书还会介绍各种编程语言在Linux环境下的应用,如C、C++、Python、Shell等。读者可以学习这些语言的基本语法和特性,并了解如何在Linux环境下使用这些语言编写各种类型的程序。 在实际编程方面,本书将提供大量的实例和案例,涵盖了各种不同的应用场景,如网络编程、多线程编程、系统编程等。读者可以通过这些实例和案例的学习和实践,掌握不同类型的编程技巧和方法。 最后,本书还会介绍一些常用的软件开发工具和技术,如版本控制系统(如Git)、协作开发工具(如GitHub)、自动化测试工具等。读者可以了解和应用这些工具和技术,提高编程效率和代码质量。 总而言之,Linux环境编程图文指南是一本全面介绍在Linux操作系统下进行编程的指南。通过阅读本书,读者可以系统地学习和掌握在Linux环境下的编程知识和技能,为自己的编程之路打下坚实的基础。 ### 回答3: Linux环境编程是一种在Linux操作系统下进行软件开发和编程的技术。它提供了一个强大的开发环境,可以满足各种不同的编程需求。 首先,我们需要熟悉Linux操作系统的基本命令和操作。这些包括文件和目录的创建、删除、复制、移动等操作,以及文件权限、用户管理等基本概念。掌握这些基础知识将有助于我们更好地理解和使用Linux环境。 其次,我们需要选择一个适合的集成开发环境(IDE)或文本编辑器。常用的IDE包括Eclipse、NetBeans和Code::Blocks,它们提供了强大的代码编辑、调试和项目管理功能,可以提高开发效率。另外,对于轻量级编程任务,使用文本编辑器(如Vim或Emacs)也是不错的选择。 接下来,我们需要具备编程语言的基本知识。在Linux环境下,常用的编程语言包括C、C++、Java、Python等。我们需要学习这些语言的语法、数据结构、算法等基础知识,以便能够编写出高效、可靠的程序。 在编写程序时,我们可以利用Linux环境提供的各种工具和库。例如,我们可以使用gcc编译器来编译C和C++程序,使用Java虚拟机(JVM)来运行Java程序。此外,Linux环境还提供了丰富的库,如GNU C库(glibc)、GTK+和Qt等,它们能够帮助我们进行图形界面开发、网络编程等任务。 最后,我们还需要学会使用调试工具来调试程序。在Linux环境下,我们可以使用gdb来进行源代码级别的调试,它提供了诸如设置断点、查看变量、追踪函数调用等功能,帮助我们定位和修复程序中的错误。 总之,掌握Linux环境编程需要建立在对Linux操作系统的基本了解和掌握的基础上,并结合相应的编程语言和工具。只有理论和实践相结合,才能真正掌握这一技能,并在实际项目中得到应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值