摘要:
在线程对共享相同内存操作时,就会出现多个线程对同一资源的使用,为此,需要对这些线程进行同步,以确保它们在访问共享内存的时候不会访问到无效的数值。以下是线程的几种同步方式:1、互斥量。 通过使用pthread的互斥接口保护数据,确保同一时间只有一个线程访问数据。互斥量从本质上讲是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。如下例所示,就是互斥量对共享数据的操作:#include <stdio.h>
#include <pthread.h>
int value = 5;//共享变量
pthread_mutex_t mutex;//互斥变量
voi 阅读全文
摘要:
Linux进程间通信之信号量信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语。在UNIX下有三种分别如下:Posix有名信号量;Posix基于内存的信号量;System V信号量。在这里只和大家分享下有关System V信号量。System V通过定义计数信号量集来对信号量的操作,计数信号量集是一个或多个信号量构成一个集合,其中每个都是计数信号量。对于系统中的每个信号量集,内核维护一个如下的信息结构,它定义在<sys/sem.h>头文件中。struct semid_ds{struct ipc_perm sem_perm; /* operation permis 阅读全文
摘要:
Linux进程间通信之共享内存 共享内存区是可用IPC形式中最快的。一旦这样的内存区映射到共享它的进程的地址空间,这些进程间数据的传递就不再涉及内核(这里说的不涉及内核的含义是:进程不再通过执行任何进入内核的系统调用来彼此传递数据)。然而往该共享内存区存放信息或从中取走信息的进程间通常需要某种形式的同步,同步的方式有多种,比如:信号量、互斥锁等等。以下两图分别描述了读写消息时,一个要进入内核,而一个不进入内核的情况:对于System V共享内存区,内核维护如下的信息结构,它定义在<sys/shm.h>头文件中:struct shmid_ds{struct ipc_perm shm_ 阅读全文
摘要:
浅谈Linux进程作者:嵌入式学院武汉华嵌中心技术支持涂佩君内容清单:1. 在 Linux 内核内进程表示2. 在 Linux 内进程管理3. 在 Linux 内核创建一个进程引言 Linux的用户空间进程的创建和管理所涉及的原理与 UNIX有很多共同点,但也有一些特定于 Linux 的独特之处。在本文中,了解 Linux 进程的生命周期,探索用户进程创建、内存管理内幕。Linux 是一种动态系统,能够适应不断变化的计算需求。Linux 计算需求的表现是以进程 的通用抽象为中心的。进程可以是短期的(从命令行执行的一个命令),也可以是长期的(一种网络服务)。因此,对进程及其调度进行一般管理就显得 阅读全文
摘要:
一、用户空间内存分配:malloc、calloc、realloc1、malloc原型如下:extern void *malloc(unsigned int num_bytes);功能:分配长度为num_bytes字节块。工作机制:malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。2、calloc原型如下:voi 阅读全文
摘要:
李家凯老师结合教学案例和一些网上的资料整理了如下一文一、预备知识—程序的内存分配由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等。其操作方式类似于数据结构中的栈。2、堆区(heap):一般由程序员分配释放(malloc/free、new/delete),若程序员不释放,程序结束时可能由操作系统回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。3、全局区(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束 阅读全文
摘要:
信号量的数据类型为结构sem_t,它本质上是一个长整型的数。函数sem_init()用来初始化一个信号量。它的原型为: extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value)); sem为指向信号量结构的一个指针;pshared不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共享;value给出了信号量的初始值。 函数sem_wait( sem_t *sem )被用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减一,表明公共资源经使用后减少。函数sem_trywai.. 阅读全文