unix环境高级编程 -- 59




1 2 3 4 5 6

200x200


概述linux 中最常用的 IO 模型是同步 IO,在这个模型中,请求发出后应用程序会阻塞直到满足条件(阻塞 IO),或在不满足条件的情况下立即返回

#读书笔记    #技术帖    #linux    #apue   
共享存储共享内存允许两个或更多个进程共享一个给定的存储区域,这是最快的一种 IPC但是,当某个进程正在读写共享存储的某个区域时,其他进程同时不应该对该区域进行操作,信号量通常被用来实现对共享存储访问的同步,当然,记录所也可以用于这种场合,但是记录锁在时间上要比信号量多消耗约 60% 共享内存描述结构 -- shmid_ds 结构内核为每个共享存储段设置了一个 shmid_ds 结构struct shmid_ds { struct ipc_perm shm_perm; // 权限结构 size_t shm_segsz; // 存储段大小(字节数) pid_t shm_lpid; // 最后一个操作共享内存段的进程 ID pid_t shm_cpid; // 创建共享内存段的进程 ID shmatt_t shm_nattch; // 连接计数 time_t shm_atime; // 最后执行 attach 操作的时间 time_t shm_dtime; // 最后执行 detach 操作的时间 time_t shm_ctime; // 最后执行 change 操作的时间 ... ... } 各系统的具体实现会包含额外的字段 共享存储的创建与
#读书笔记    #技术帖    #linux    #unix   

200x200


信号量信号量与其他的 IPC (管道、FIFO、消息队列、域套接字)都有所不同,他是一个计数器,用于多进程对共享数据对象的访问当进程需要获得共享资源时,需要进行下列操作: 

#读书笔记    #技术帖    #linux    #unix   
消息队列此前已经介绍了 XSI PIC 的基本概念和一些用法XSI IPC 简介  这里我们介绍一下 XSI IPC 中的消息队列消息队列简称队列,其标识符被称为队列 ID(queue ID) 消息被添加到队列尾端,包含一个正长整型类型字段,一个非负长度以及实际数据字节消息队列并不一定要以先进先出次序取消息,也可以按照消息的类型字段取消息 消息队列结构 -- msqid_dsstruct msqid_ds { struct ipc_perm msg_perm; // ipc 权限结构 msgqnum_t msg_qnum; // 队列中的数据数 msglen_t msg_qbytes; // 队列的最大字节容量 pid_t msg_lspid; // 最近插入队列数据的进程 ID pid_t msg_lrpid; // 最近取出数据的进程 ID time_t msg_stime; // 最近入队时间 time_t msg_rtime; // 最近出队时间 time_t msg_ctime; // 最近更新时间 ... ... }  该结构描述了队列的当前状态,各系统的具体实现会包含额外的字段
#读书笔记    #技术帖    #龙潭书斋    #apue   
概述有三种 IPC 被称为“XSI IPC”:消息队列信号量共享内存 他们之间有很多相似之处 标识符和键每个内核中的 IPC 结构(消息队列、信号量、共享内存)都用一个非负整数的标识符加以引用与文件描述符不同,IPC 标识符不是小的整数,当一个 IPC 结构被创建,与该结构相关的标识符连续加 1,直到达到整型最大数值,然后再从 0 开始加 由于标识符的数字难以使用和记忆,因此标识符仅被作为 IPC 对象的内部名,而“键”则是 IPC 对象的外部名供程序使用,键是 key_t 类型的数据,定义于 sys/type.h 中,通常为长整型外部调用使用键,由内核转化为标识符 但是,当客户进程与服务端进程通信的过程中,怎么保证“键”与标识符及 IPC 结构在服务端进程与客户进程之间会合呢?主要有下列方法:服务器进程可以指定键 IPC_PRIVATE 创建一个新的 IPC 结构(键 IPC_PRIVATE 保证服务器进程创建的 IPC 结构是一个新的结构),将返回的标识
#读书笔记    #技术帖    #龙潭书斋    #套接字   
问题描述开始阅读 nginx 源码的时候就一直伴随着一个问题,那就是多进程的 nginx 模型是怎么保证多个进程同时写入一个文件不发生数据交错呢?猜想中,主要有以下几种解决方案:最传统的,正在写文件的进程加锁,其他进程等待,但是这样的情况是绝对不允许的,效率太过低下写 log 前测试锁状态,如果已经锁定,则写入进程自己的缓冲区中,等待下次调用时同步缓冲区,这样做的好处是无需阻塞,提高了效率,但是就无法做到 log 的实时了,这样做工程中也是绝对无法接受的,一旦发生问题,将无法保证 log 是否已经被写入,因此很难定位一个进程专门负责写 log,其他进程通过域套接字或者管道将 log 内容发送给他,他持续阻塞在 epoll_wait 上,直到收到信息,立即写入,但是众所周知,nginx 是调用同一个函数启动所有进程的,并没有专门调用函数启动所谓的 log 进程,除了 master 和 worker,nginx 也确实没有 log 进程存在那么就是进程启动后,全部去竞争某个锁,竞争到该锁的 worker 执行 log&n
#技术帖    #linux    #unix    #socket   

200x200


概述FIFO 有时被称为“命名管道”管道只能由相关进程使用,这些相关进程必须有共同的祖先进程,但通过 FIFO,即便是不相关的进程也可以相互通信FIFO 的创建函数原型i

#读书笔记    #技术帖    #unp    #unix网络编程   

200x200


最简单的进程之间传递信息的方式是通过 fork 或 exec 传送已打开的文件,或两进程通过打开相同的文件来进行数据的共享进程之间通信还有其他技术 -

#读书笔记    #技术帖    #linux    #unix   

200x200


简介STREAMS 就是流流在用户进程和设备驱动程序之间提供了一条全双工通道,从而无需和实际的硬件设备直接会话,也因此,流可以用来构造伪设备驱动程序任意数量的处理模块可以被压入流,流类似于栈

#读书笔记    #linux    #unix    #龙潭书斋   
1 2 3 4 5 6



京ICP备15018585号