Linux/Unix系统编程手册
文章平均质量分 59
kyowill
这个作者很懒,什么都没留下…
展开
-
进程间通信简介(IPC)--《linux/unix系统编程手册》
进程间通信简介(IPC)1.socket一般用于两个域,一个是unix,一个是internet2.unix系统上各种通信和同步工具,并根据功能将其分成三类:通信,关注进程之间的数据交换;同步,关注进程和线程操作之间的同步;信号,可以被看作是一种同步技术3.unix提供了下列同步工具:信号量,一个信号量是一个内核维护的整数,其值永远不会小于0,最常用的信号量是二元信号量0\1;文件锁,是原创 2015-08-15 10:20:27 · 414 阅读 · 0 评论 -
读书笔记Linux/Unix系统编程手册(63)
1.我们需要区分两种文件描述符准备就绪的通知模式:水平触发通知:如果文件描述符上可以非阻塞的执行的I/O系统调用,此时认为它已经就绪边缘触发通知:如果文件描述符自上次状态检查以来有了新的I/O活动(比如新的输入),此时需要触发通知2.select和poll采用水平触发模式,由于水平触发模式允许我们在任意时刻重复检查I/O状态没有必要每次当文件描述符就绪后需要尽可能多地执行I/O,与之相原创 2015-09-10 22:34:23 · 350 阅读 · 0 评论 -
其他备选的I/O模型--《linux/unix系统编程手册》
其他备选的I/O模型1.当从一个管道读取数据时,如果管道中恰好没有数据,那么通常read()会阻塞。而如果管道中没有足够的空间保存待写入的数据时,write()也会阻塞,当在其他类型的文件如FIFO和套接字上执行I/O操作时也会出现相似的行为2.非阻塞式I/O可以运用到管道,FIFO,套接字,伪终端以及其他一些类型的设备上3.I/O多路复用,信号驱动I/O以及epoll都是用来实现同一原创 2015-08-15 19:27:07 · 451 阅读 · 0 评论 -
读书笔记之linux/unix系统编程手册(31)
线程安全和每个线程的存储1.若函数可供多个线程安全调用,则成为线程安全函数2.保障非线程安全函数的手段之一是运用互斥锁来防护对该函数的所有调用。这种方法带来了并发性能的下降,因为同一时点只能有一个线程运行该函数。提升并发性能的另一个方法是:仅在函数中操作共享变量(临界区)的代码前后加入互斥锁。原创 2015-08-29 22:36:10 · 419 阅读 · 0 评论 -
读书笔记之linux/unix系统编程手册(30)
线程同步1.互斥量可以帮助线程同步,条件变量允许线程相互通知共享变量的状态发生变化2.互斥量有已锁定和未锁定两种状态3.如果互斥量已被锁定,那么mutex_lock()调用会一直阻塞,直至被解锁,那时才返回4.如果调用lock()之前,线程已经锁定,线程会陷入死锁5.每个线程成功的锁住一个互斥量,接着试图对已为另一个线程锁定的互斥量加锁,两个线程将死锁,两个线程分别锁定两个互斥原创 2015-08-28 21:47:51 · 650 阅读 · 0 评论 -
读书笔记之linux/unix系统编程手册(53)
POSIX 信号量1.命名信号量:这种信号量拥有一个名字。通过使用相同的名字调用sem_open(),不相关的进程能够访问同一个信号量2.未命名信号量:这种信号量没有名字,相反,它位于内存中一个预先商定的位置处。当进程之间共享时,信号量必须位于一个共享内存区域中。原创 2015-08-27 10:08:23 · 585 阅读 · 0 评论 -
读书笔记之linux/unix系统编程手册(47)
system V 信号量1.system V的信号量的常规步骤:(1)使用semget()创建或打开一个信号量集(2)使用semctl()setval或setall操作初始化集合中的信号量(3)使用semop()操作信号量值。使用信号量的进程通常会使用这些操作来表示一种共享资源的获取和释放(4)当所有的进程不再需要使用信号量集之后使用semctl()操作删除这个集合2.由于原创 2015-08-27 15:38:04 · 474 阅读 · 0 评论 -
读书笔记之linux/unix系统编程手册(44)
管道和FIFO1.管道是一个字节流意味着在使用管道时是不存在消息或消息边界的,从管道中读取数据的进程可以读取任意大小的数据块,而不管进程写入的数据块大小,如果需要实现离散消息的概念,最好使用其他的IPC机制如消息机制和数据报socket2.管道是单向的3.可以确保写入不超过pipe_buf字节的操作是原子的,只有在数据被传输到管道时候,pipe_buf限制才起作用,当写入的数据达到pi原创 2015-08-25 19:30:30 · 513 阅读 · 0 评论 -
读书笔记之linux/unix系统编程手册(43)
进程间通信介绍1.unix系统上各种通信和同步工具,并根据功能将他们分成了三类(1)通信:这些工具关注进程之间的数据交换(2)同步: 这些进程关注进程和线程操作之间的同步(3)信号:尽管信号的主要作用并不在此,但在特定场景下可以将它作为一种同步技术2.数据传输工具:为了通信,一个进程将数据写入IPC工具,另一个从中读取数据。这些工具要求在用户内存和内核内存之间进行两次数据传输:原创 2015-08-24 22:06:53 · 767 阅读 · 0 评论 -
读书笔记之linux/unix系统编程手册(25)
进程的终止1.无论进程是否正常终止,都会发生如下动作:(1)关闭所有打开的文件描述符、目录流、信息目录描述符(2)作为文件描述符关闭的后果之一,将释放该进程所持有的任何文件锁(3)分离任何已连接的systemV共享内存段,且对应于各段的计数器值将减一(4)进程为每个systemV信号量所设置的值会被加到信号量值中(5)将关闭进程打开的任何posix有名信号量(6)将关闭原创 2015-08-24 18:00:46 · 572 阅读 · 0 评论 -
读书笔记之linux/unix系统编程手册(24)
进程的创建1.从概念上说,可以将fork()认作对父进程程序段,数据段,堆栈段的拷贝2.现代unix采用两种技术来避免这种浪费:(1)内核将每一进程的代码标记为只读,从而使进程无法修改自身代码,父子进程共享同一代码段(2)对于父进程数据段、堆段、栈段中各页,内核采用写时复制技术来处理。3.调用fork()后,无法确定父子进程间谁将率先访问cpu。会造成资源竞争。原创 2015-08-24 15:27:55 · 740 阅读 · 0 评论 -
读书笔记之linux/unix系统编程手册(26)
int main(int argc, char* argv[]){ printf("hello world\n"); write(STDOUT_FILENO, "Ciao\n", 5); int pid = fork(); if(pid == -1) { exit(0); }else if(pid > 0) { int cid = wait(NULL); printf原创 2015-08-24 19:19:53 · 472 阅读 · 0 评论 -
读书笔记之linux/unix系统编程手册(20)
信号:基本概念1.信号是事件发生时对进程的通知机制。有时也成为软件中断。信号与硬件中断的相似之处在于打断了程序执行的正常流程,大多数情况下,无法预测信号到达的精确时间2.一个进程能够向另一个进程发送信号。信号的这一用法可作为一种同步技术,甚至是进程间通信的(IPC)的原始形式。进程也可向自身发送信号。3.内核为进程产生信号的各类事件如下:(1)硬件发生异常,如被0除,或者引用了无法原创 2015-08-23 16:15:25 · 1022 阅读 · 0 评论 -
关于单CPU,多CPU上的原子操作
所谓原子操作,就是”不可中断的一个或一系列操作” 。硬件级的原子操作: 在单处理器系统(UniProcessor)中,能够在单条指令中完成的操作都可以认为是” 原子操作”,因为中断只能发生于指令之间。 这也是某些CPU指令系统中引入了test_and_set、test_and_clear等指令用于临界资源互斥的原因。在对称多处理器(Symmetric Multi-Processor)结构中就不同了转载 2016-09-26 22:46:46 · 867 阅读 · 1 评论