进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)...
注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料。此书出版较早,分析的版本为2.4.16,故出现的一些概念可能跟最新版本内核不同。
此书已经开源,阅读地址 http://www.kerneltravel.net
一、管道
当用户进程通过系统调用刚进入内核的时候,CPU会自动在该进程的内核栈上压入下图所示的内容:
1、之所以把EIP的值设置成信号处理函数的地址,是因为一旦进程返回用户态,就要去执行信号处理程序,所以EIP要指向信号处理程序而不是原来应该执行的地址。
2、之所以要把frame从内核栈拷贝到用户栈,是因为进程从内核态返回用户态会清理这次调用所用到的内核栈(类似函数调用),内核栈又太小,不能单纯的在栈上保存另一个frame(想象一下嵌套信号处理),而我们需要EAX(系统调用返回值)、EIP这些信息以便执行完信号处理函数后能继续执行程序,所以把它们拷贝到用户态栈以保存起来。
1
2 |
(By default, the signal handler is invoked on the normal process stack. It is possible to arrange that the signal handler
uses an alternate stack; see sigaltstack(2) for a discussion of how to do this and when it might be useful.) |
1
2 3 4 5 6 7 8 9 10 |
struct ipc_perm
{ key_t key; /* 键 */ ushort uid; /* 对象拥有者对应进程的有效用户识别号和有效组识别号 */ ushort gid; ushort cuid; /* 对象创建者对应进程的有效用户识别号和有效组识别号 */ ushort cgid; ushort mode; /* 存取模式 */ ushort seq; /* 序列号 */ }; |
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
(1)系统中每个信号量的数据结构(sem)
struct sem { int semval; /* 信号量的当前值 */ unsigned short semzcnt; /* # waiting for zero */ unsigned short semncnt; /* # waiting for increase */ int sempid; /*在信号量上最后一次操作的进程识别号*/ }; (2)系统中表示信号量集合(set)的数据结构(semid_ds) (3)系统中每一信号量集合的队列结构(sem_queue) |
1
2 3 4 5 6 |
struct sembuf
{ ushort sem_num; /* 在数组中信号量的索引值 */ short sem_op; /* 信号量操作值(正数、负数或0) */ short sem_flg; /* 操作标志,为IPC_NOWAIT 或SEM_UNDO*/ }; |
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
(1)消息缓冲区(msgbuf)
/* msgsnd 和msgrcv 系统调用使用的消息缓冲区*/ struct msgbuf { long mtype; /* 消息的类型,必须为正数 */ char mtext[1]; /* 消息正文 */ }; (2)消息结构(msg) (3)消息队列结构(msgid_ds) |
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/* 在系统中 每一个共享内存段都有一个shmid_ds 数据结构. */
struct shmid_ds { struct ipc_perm shm_perm; /* 操作权限 */ int shm_segsz; /* 段的大小(以字节为单位) */ time_t shm_atime; /* 最后一个进程附加到该段的时间 */ time_t shm_dtime; /* 最后一个进程离开该段的时间 */ time_t shm_ctime; /* 最后一次修改这个结构的时间 */ unsigned short shm_cpid; /*创建该段进程的 pid */ unsigned short shm_lpid; /* 在该段上操作的最后一个进程的pid */ short shm_nattch; /*当前附加到该段的进程的个数 */ /* 下面是私有的 */ unsigned short shm_npages; /*段的大小(以页为单位) */ unsigned long *shm_pages; /* 指向frames -> SHMMAX 的指针数组 */ struct vm_area_struct *attaches; /* 对共享段的描述 */ }; |
2、主进程和所有子进程通过一个共享的工作队列来同步,子进程都睡眠在该工作队列上。当有新的任务到来时,主进程将任务添加到工作队列中。这将唤醒正在等待任务的子进程,不过只有一个子进程获得新任务的“接管权”,它可以从工作队列中取出并执行之,而其他子进程将继续睡眠在工作队列上。
进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)...相关推荐
- Linux 进程间通信:管道、共享内存、消息队列、信号量
进程间通信 管道 共享内存 消息队列 信号量 进程间通信 https://blog.csdn.net/qq_35423154/article/details/105294963 在之前的一篇博客中讲过 ...
- Linux下进程间通信方式之管道、信号、共享内存、消息队列、信号量、套接字
/* 1,进程间通信 (IPC ) Inter-Process Communication比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息.2,linux下IPC机制的分类:管道.信号. ...
- VxWorks中的任务间通信(信号量、共享内存、消息队列、管道、信号、事件、套接字socket)
文章目录 信号量 共享内存 消息队列 管道 信号 事件 套接字(socket) 总结 VxWorks5.5中,为了保证各个独立的任务可以协同工作,提供了一整套任务间的通信机制,主要包括信号量,共享内存 ...
- 【Linux Program】信号量、共享内存和消息队列
系列文章: 文件操作 数据管理 进程和信号 POSIX 线程 进程间通信:管道 信号量共享内存和消息队列 套接字 文章目录 1. 信号量 1.1 信号量的定义 1.2 Linux 的信号量机制 1.3 ...
- ipcs命令详解——共享内存、消息队列、信号量定位利器【转】
(转自:https://blog.csdn.net/dalongyes/article/details/50616162?utm_medium=distribute.pc_relevant.none- ...
- php 共享内存列队,php中对共享内存,消息队列的操作
消息队列中的数据同样受到大小的约束,具体约束范围可通过msg_stat_queue的msg_qbytes看到.这段代码唯一有点小改动的地方就在接受消息时,指定了MSG_IPC_NOWAIT,不然如果目 ...
- Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)
本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...
- android线程间通信的几种方法_Android线程间通信机制
讲解Handler机制的博文很多,我也看了很多,但说实话,在我对Handler几乎不怎么了解的情况下,每一篇文章我都没太看懂,看完之后脑子里还是充满了疑问.究其原因,是因为几乎每一篇文章一上来就开始深 ...
- Android线程间通信机制
Android线程间通信机制 当android应用程序运行时,一个主线程被创建(也称作UI线程),此线程主要负责处理UI相关的事件,由于Android采用UI单线程模型,所以只能在主线程中对UI元素进 ...
- 《linux程序设计》--读书笔记--第十四章信号量、共享内存和消息队列
信号量:用于管理对资源的访问: 共享内存:用于在程序之间高效的共享数据: 消息队列:在程序之间传递数据的一种简单方法: 一.信号量 临界代码:需要确保只有一个进程或者一个执行线程可以进入这个临界代码并 ...
最新文章
- what does boston dynamics do?
- 神奇的幻方(NOIP2015)(真·纯模拟)
- OpenCASCADE:Mac OS X平台使用Xcode构建OCCT
- 如何用crontab每隔1分钟执行一个命令行脚本
- 为什么只看重结果_猫很现实?猫只是看重结果
- 工作401-普通编译模式
- ubuntu实现简单的划词工具
- 出现类似于 ”IDD_DLG_WAIT 未声明的标识符“ 这样的错误怎么办
- php redis主从自动切换,Redis 集群的主从切换
- Python数据分析与挖掘实战第三章笔记之贡献度分析代码
- 国潮正当时,把优秀传统文化融入时代脉搏
- 产品经理:个人能力提升方法
- linux常见的swap配置方式,Linux环境下Swap配置方法
- 汪延谈王志东离职问题 (转)
- jQuery打字练习小游戏代码带音效
- 状语从句不是简单句_简单句、复合句Gloria总结
- mysql微擎用户名密码_微擎后台管理员密码忘记怎么办?教你一个简单的方法
- “老鲜肉”陈坤参加了“汇新杯”新兴科技+互联网创新大赛!
- 一些忠告给想转行当程序员的你
- 一个简单的问卷调查管理系统
热门文章
- Python爬虫--urllib
- 使用手机访问vue项目
- 计算机网络rip 图片,计算机网络-RIP协议
- 软考笔记(数据结构篇)———— 二叉树、树、森林转换
- js声明数组的四种方式
- java程序拦截dde漏洞问题_Office DDE漏洞学习笔记
- 2021-08-24梦笔记
- error LNK2019: 无法解析的外部符号 ,该符号在函数 中被引用
- Cause: the class org.apache.tools.ant.taskdefs.optional.ANTLR was not found.
- VirtualBox虚拟机的samba也有问题