随笔分类 -  Linux并发

摘要:以下整理转载自【1】。 1、可靠信号与不可靠信号 1)信号值小于SIGRTMIN(Red hat 7.2中,SIGRTMIN=32,SIGRTMAX=63)的信号都是不可靠信号。主要问题如下: ① 进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal... 阅读全文
posted @ 2011-09-21 19:01 浪里飞 阅读(1428) 评论(0) 推荐(0)
摘要:5)sigaddset#include<signal.h>int sigaddset(sigset_t *set,int signum);① sigaddset()用来将参数signum 代表的信号加入至参数set 信号集里。② int sigdelset(sigset_t * set,int signum); //从信号集中删除③ int sigemptyset(sigset_t *set); //将参数set信号集初始化并清空④ int sigfillset(sigset_t * set); //sigfillset()用来将参数set信号集初始化(调用sigemptyset) 阅读全文
posted @ 2011-09-21 18:36 浪里飞 阅读(489) 评论(0) 推荐(0)
摘要:1、最简单的安装信号示例1View Code #include <iostream>using namespace std;#include <signal.h>void func(int sig){ cout<<"用户自定义"<<endl;}int main(){ signal(SIGUSR1,func); pid_t pid = getpid(); kill(pid, SIGUSR1);/*用户自定义信号,kill具有发信号的功能,这行代码向“自身进程pid发信号SIGUSR1,执行的最终结果是触发SIGUSR1信号*/} 阅读全文
posted @ 2011-09-21 18:34 浪里飞 阅读(951) 评论(0) 推荐(0)
摘要:1、posix共享内存区涉及两个步骤:1)指定一个名字参数调用shm_open,以创建一个新的共享内存区对象或打开一个以存在的共享内存区对象。2)调用mmap把这个共享内存区映射到调用进程的地址空间。传递给shm_open的名字参数随后由希望共享该内存区的任何其他进程使用。2、函数(1)创建#include <sys/mman.h>int shm_open(const char *name,int oflag,mode_t mode);1)name 共享内存区的名字2)oflag 标志位3)mode 权限位,它指定O_CREAT标志的前提下使用。(2)删除int shm_unlin 阅读全文
posted @ 2011-09-18 11:07 浪里飞 阅读(1726) 评论(0) 推荐(0)
摘要:1、IPC缺陷 1)XSI IPC都是内核相关的,存在于整个系统范围,但并没有引用计数,可能浪费资源或数据不安全。因此进程结束的时候需要显式地删除结构里面的内容。不像管道那样,进程一结束,管道就被完全删除了。 2)使用独立的命名空间,添加了很多新的系统调用,导致操作系统复杂。XSI IPC结构在文件系统中没有名字,所有可用于文件的函数都无法使用,为了支持他们不得不增加十几条全新的... 阅读全文
posted @ 2011-09-17 12:41 浪里飞 阅读(2317) 评论(0) 推荐(0)
摘要:1、特点:① 进程相关的② 与XSI共享内存一样,需要与同步原语一起使用③ 只能是有共同祖先的进程才能使用2、使用系统调用mmap()用于共享内存的两种方式: (1)使用普通文件提供的内存映射: 适用于任何进程之间。此时,需要打开或创建一个文件,然后再调用mmap()典型调用代码如下:fd=open(name, flag, mode); if(fd<0) ...ptr=mmap(NULL, len , PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0); 通过mmap()实现共享内存的通信方式有许多特点和要注意的地方,可以参看UNIX网络编程第二卷。【3 阅读全文
posted @ 2011-09-15 19:32 浪里飞 阅读(3472) 评论(0) 推荐(0)
摘要:1、key_t ftok( char * fname, int id )fname指定的文件名(已经存在的文件名),一般使用当前目录;id是子序号。一般UNIX实现中,是将文件的索引节点号(ls -i)取出,前面加上子序号得到key_t的返回值。系统建立IPC通讯 (消息队列、信号量和共享内存)时必须指定一个ID值。通常情况下,该id值通过ftok函数得到。 #include <sys/types.h> #include <sys/ipc.h> key = ftok(".", 1);参考【1】 http://baike.baidu.com/view/ 阅读全文
posted @ 2011-09-14 23:57 浪里飞 阅读(939) 评论(0) 推荐(0)
摘要:1、定义#include <unistd.h>#include<sys/types.h>pid_t fork( void );pid_t 是一个宏定义,其实质是int,被定义在#include<sys/types.h>中返回值:若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-12、函数说明:一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。子进程是父进程的副本,它将获得 阅读全文
posted @ 2011-09-14 20:01 浪里飞 阅读(969) 评论(0) 推荐(0)
摘要:1、共享内存1)分类XSI 共享内存匿名共享内存mmap2)原理:地址空间:一个连续的内存地址单元物理地址空间:物理内存地址组成的地址空间,其空间大小与物理内存一致。虚拟地址空间:CPU MMU 提供的功能,可将虚地址转换为物理地址,所有的虚地址组成的连续空间叫虚地址空间,有时候也叫线性空间。其空间大小与机器字长相关。32位机器上为2^32,4G左右3)特性: 内核相关的;需要与同步原语一起使用才能保证数据一致性(Mutex,读写锁、信号量);最快速,copy较少4)APIint shmget(key_t key, size_t size, int shmflg);得到一个共享内存标识符或创建 阅读全文
posted @ 2011-09-14 07:44 浪里飞 阅读(926) 评论(0) 推荐(0)
摘要:1、XSI system V的信号量是信号量集,可以包括多个信号灯(有个数组),每个操作可以同时操作多个信号灯 posix是单个信号灯,POSIX有名信号灯支持进程间通信,无名信号灯放在共享内存中时可以用于进程间通信。 2、POSIX信号量在有些平台并没有被实现,比如:SUSE8,而SYSTEM V大多数LINUX/UNIX都已经实现。两者都可以用于进程和线程间通信。 3、... 阅读全文
posted @ 2011-09-13 16:45 浪里飞 阅读(1806) 评论(0) 推荐(0)
摘要:sem_open(3)initialize and open a named semaphoresem_init(3)initialize an unnamed semaphoresem_wait(3)P 操作sem_post(3)V 操作sem_close(3)close a named semaphoresem_destroy(3)destory an unnamed semaphoresem_unlink(3)remove a named semaphore 无名信号量可以用在共享内存的情况下,比如实现进程中各个线程之间的互斥和同步。命名信号量通常用于不共享内存的情况下,比如不共享内存的 阅读全文
posted @ 2011-09-13 16:26 浪里飞 阅读(1593) 评论(0) 推荐(0)
摘要:1、XSI(System Interface and Headers),代表一种Unix系统的标准,为unix系统定义一个界面。【1】2、XSI IPC,依托标识符和键来实现的,如同管道靠文件描述符来实现一样。3、XSI IPC使用一般步骤:1)IPC对象进程内部用标识符identifier,进程外部标识用key2)首先用semget,shmget,msgget等函数根据key创建或获取IPC对象的identifier3)然后根据identifier用semctrl,shmctrl等控制函数做某些修改,这步可选4)最后用各个IPC特有操作函数如semop,shmat等函数操作4、信号量使用示例 阅读全文
posted @ 2011-09-13 00:15 浪里飞 阅读(1544) 评论(0) 推荐(0)
摘要:IPC通信1、pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。管道的缓冲区是有限的(管道存在于内存中,在管道创建时,为缓冲区分配一个页面大小);管道所传送的是无格式字节流,要求管道的读出方和写入方必须事先约定好数据的格式。2、命名管道(fifo):命名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。诸如不支持lseek()等文件定位操作。 3、信号量(semophore 阅读全文
posted @ 2011-09-11 10:49 浪里飞 阅读(618) 评论(0) 推荐(0)
摘要:1、IPC的持久性1)进程相关的:IPC中数据一直存在到最后一个关联进程关闭时pipe、fifo等2)内核相关的IPC:IPC中数据一直存在,除非内核重启或删除消息队列,共享内存等3)文件系统相关的IPC:IPC中数据一直存在,除非显式删除文件2、管道匿名管道(pipe):只能用于同一个祖先的进程组有名管道(fifo):不相关的进程也可以使用3、匿名管道int pipe(int filedes[2]);fildes[0] 用于从管道中读取数据fildes[1] 用于将数据写入管道不需要open,直接read/write 等系统调用系统自动删除,进程不需要考虑示例View Code #inclu 阅读全文
posted @ 2011-09-10 21:27 浪里飞 阅读(1069) 评论(0) 推荐(0)
摘要:1、在Linux2.2内核中,并不存在真正意义上的线程。当时Linux中常用的线程pthread实际上是通过进程来模拟的,也就是说Linux中的线程也是通过fork()创建的“轻”进程,并且线程的个数也很有限,最多只能有4096个进程/线程同时运行。 2、Linux2.4内核消除了这个线程个数的限制,并且允许在系统运行中动态地调整进程数上限。当时采用的是LinuxThread线程库,它对应的线程... 阅读全文
posted @ 2011-08-18 20:41 浪里飞 阅读(491) 评论(0) 推荐(0)
摘要:3)合并线程:pthread_join int pthread_join(pthread_t* thread, void **ret); 第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。关于什么是可joinable的线程,参见[3]。4)通过到斥实现线程同步(1)声明互斥锁变量:pthread_mutext_tmutex; pthread_mutex_t为不公开的数据类型,其中包含一个系统分配的属性对象。(2)互斥锁初始化:pthr 阅读全文
posted @ 2011-08-16 21:12 浪里飞 阅读(965) 评论(0) 推荐(0)
摘要:1、在Linux中,线程一般被认为是“轻量级的进程”。 Linux 创建进程所使用的函数是fork()或者vfork()。而对线程的创建和管理Linux可以使用POSIX的线程库pthreads提供的APIs。2、使用fork()创建进程和使用POSIX线程库差别: 使用fork() 创建进程的特点:① 代价昂贵,通常子进程需要拷贝父进程的整个上下文,比如数据等。② 进程间的通信方式比较复杂,比如使用管道、消息、共享内存等方法。③ 操作系统在实现进程间的切换比线程切换更费时。 使用POSIX pthreads库创建线程的特点:① 线程可使用存在于进程中的资源,因此创建进程比创建线程更快。② 线 阅读全文
posted @ 2011-08-16 21:11 浪里飞 阅读(1153) 评论(0) 推荐(0)
摘要:线程取消的方法是向目标线程发Cancel信号,但如何处理Cancel信号则由目标线程自己决定,或者忽略、或者立即终止、或者继续运行至Cancelation-point(取消点),由不同的Cancelation状态决定。线程接收到CANCEL信号的缺省处理(即pthread_create()创建线程的缺省状态)是继续运行至取消点,也就是说设置一个CANCELED状态,线程继续运行,只有运行至Cancelation-point的时候才会退出。(1)什么是线程取消点根据POSIX标准,pthread_join()、pthread_testcancel()、pthread_cond_wait()、pt 阅读全文
posted @ 2011-08-15 21:15 浪里飞 阅读(2377) 评论(0) 推荐(0)
摘要:说明:本文由【2,3】整理而得。这篇文章主要从一个 Linux 下一个 pthread_cancel 函数引起的多线程死锁小例子出发来说明 Linux 系统对 POSIX 线程取消点的实现方式,以及如何避免因此产生的线程死锁。目 录:1. 一个 pthread_cancel 引起的线程死锁小例子2. 取消点(Cancellation Point)3. 取消类型(Cancellation Type)4. Linux 的取消点实现5. 对示例函数进入死锁的解释6. 如何避免因此产生的死锁7. 结论8. 参考文献1. 一个 pthread_cancel 引起的线程死锁小例子下面是一段在Linux 平 阅读全文
posted @ 2011-08-15 20:45 浪里飞 阅读(9200) 评论(2) 推荐(2)
摘要:以下内容根据【1】进行整理。关于取消点,将在后面进一步讨论。1、一般来说,Posix的线程终止有两种情况:正常终止和非正常终止。线程主动调用pthread_exit()或者从线程函数中return都将使线程正常退出,这是可预见的退出方式;非正常终止是线程在其他线程的干预下,或者由于自身运行出错(比如访问非法地址)而退出,这种退出方式是不可预见的。2、线程终止时的清理 不论是可预见的线程终止还是异常终止,都会存在资源释放的问题,在不考虑因运行出错而退出的前提下,如何保证线程终止时能顺利的释放掉自己所占用的资源,特别是锁资源,就是一个必须考虑解决的问题。 最经常出现的情形是资源独占锁的使用:线程. 阅读全文
posted @ 2011-08-15 20:42 浪里飞 阅读(5385) 评论(0) 推荐(0)