APUE到Linux内核
the cool grass
Advanced Programming in the UNIX Environment
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
深入探究进程与线程
线程与进程在Linux下,程序可执行文件是一个静态的实体,它只是一组指令的集合,没有执行的含义。进程是一个动态的实体,有自己的生命周期。线程是操作系统进程调度器可以调度的最小执行单元。一个进程可能包含多个线程。有人说,不必非要使用线程,多个进程也能做到这点。的确如此。那么线程是不是一种设计上的冗余呢?其实不是这样的。进程之间,彼此的地址空间时独立的,但线程会共享内存地址空间。同一个进程...原创 2019-05-04 13:15:06 · 258 阅读 · 0 评论 -
浅谈Linux内存管理
浅谈Linux内存管理lecury1. 扫盲篇1.1 操作系统存储层次常见的计算机存储层次如下:寄存器:CPU提供的,读写ns级别,容量字节级别。CPU缓存:CPU和CPU间的缓存,读写10ns级别,容量较大一些,百到千节。主存:动态内存,读写100ns级别,容量GB级别。外部存储介质:磁盘、SSD,读写ms级别,容量可扩展到TB级别。CPU内的缓存示意图如下:其中 L1d 和 L1i 都是CP...转载 2019-06-18 23:13:41 · 381 阅读 · 1 评论 -
System V消息队列
管道和FIFO都是字节流的模型,这种模型不存在记录边界。如果从管道里面读出100字节,你无法确认这100字节是单次写入的100字节,还是分10次写入的。管道或FIFO里的数据如何解读,完全取决于写入进程和读取进程之间的约定。从这个角度上讲,System V消息队列和POSIX消息队列都是由于管道和FIFO的。原因是消息队列机制中,双方是通过消息来通信的,无需花费精力从字节流中解析出完整的消息。...原创 2019-05-07 21:47:03 · 289 阅读 · 1 评论 -
标识符与IPC Key
System V IPC未遵循“一切都是文件”的Unix哲学,而是采用标识符ID和键值来标识一个System V IPC对象。每种System V IPC都有一个相关的get调用,该函数返回一个整形标识符ID,System V IPC后续的函数操作都要作用在该标识符ID上。System V IPC对象的作用范围是整个操作系统,内核没有维护引用计数。调用各种get函数返回的ID是操作系统范围内的标...原创 2019-05-07 14:48:19 · 1266 阅读 · 0 评论 -
IPC清晰的分类总结
进程间的通信大体可以分为两类第一类是通信类,这类手段是进程之间传递消息来实现通信。细分的话有如下:一种是通过传递消息来通信的(消息队列),另一种是通过共享一块内存区域,交换数据实现通信(共享内存)。第二类是同步类,这类手段的目的是协调进程之间的操作。在多进程的情景下,某些操作无法同时或即时执行,否则可能会产生错误,这时就需要同步类工具来协调。通信类:同步类...原创 2019-05-06 23:49:31 · 2768 阅读 · 0 评论 -
进程间通信:管道
进程间通信(IPC)总结信号也是进程间通信的一种机制,尽管其主要作用不是这个。但不建议将信号作为进程间通信的常规手段。线程在Linux中被实现为轻量级的进程,线程之间的同步手段(互斥量和条件等待),本质也是进程间的通信。进程间通信的手段,大体可以分成以下两类:第一类是通信类。这类手段的作用是在进程之间传递消息,交换数据。若细分下来,通信类也可以分为两种,一种是用来传递消息的(比如消息队列...原创 2019-05-06 22:34:14 · 328 阅读 · 0 评论 -
System V共享内存
1. 共享内存概述共享内存是所有IPC手段中最快的一种。它之所以快是因为共享内存一旦映射到进程的地址空间,进程之间数据的传递就不需要涉及内核了。管道、FIFO和消息队列,任意两个进程之间想要交换信息,都必须通过内核,内核在其中发挥了中转站的作用:发送信息的一方,通过系统调用(write或msgsnd)将信息从用户层拷贝到内核层,由内核暂存这部分信息。提取信息的一方,通过系统调用(r...原创 2019-05-09 15:49:19 · 368 阅读 · 0 评论 -
动态库与静态库
1. 动态库与静态库一般情况下,库文件的开发者会同时提供两个版本,它们都各自的优缺点。静态库在链接阶段,会被直接链接进最终的二进制文件中,因此最终生成的二进制文件体积会比较大,但是可以不再依赖于库文件。而动态库并不是被链接到文件中的,只是保存了依赖关系,因此最终生成的二进制文件体积较小,但是在运行阶段需要加载动态库。2. 编译生成和使用动态库首先,我们来编译并生成一个动态库:#includ...原创 2019-05-18 23:54:07 · 327 阅读 · 0 评论 -
System V信号量
1. 信号量概述System V信号量又被称为System V信号量集,信号量的作用和消息队列不太一样,消息队列的作用是进程之间传递消息。而信号量的作用是为了同步多个进程的操作。一般来说,信号量和某种预先定义的资源相关联的。信号量元素的值,表示与之关联的资源个数。内核会负责维护信号量的值,并确保其值不小于0。使用最广泛的信号量是二值信号量。对于这种信号量而言,它只有两种合法值:0和1,对应一...原创 2019-05-09 10:34:15 · 645 阅读 · 1 评论 -
多线程和多进程的选择及区别
鱼还是熊掌:浅谈多进程多线程的选择关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了,选的不好,会让你深受其害。&n...转载 2019-05-13 23:36:27 · 288 阅读 · 0 评论 -
深入理解Linux线程 2.0
TLS(线程局部存储)errno变量是线程局部存储的典型案例。我们可以通过该案例来理解引入线程局部存储的意义自从引入了多线程之后,情况发生了变化。如果errno仍然是进程内的全局变量,就会引起混乱。这时候,线程局部存储就横空出世了。使用线程局部存储(Thread Local Storage)技术就能满足上述的要求。该技术为每一个线程都分别维护一个变量的副本,尽管名字相同却分别存储,并行不悖。...原创 2019-05-06 14:06:54 · 213 阅读 · 0 评论 -
条件等待
条件等待时线程间同步的另一种方法线程经常会遇到这种情况:要想继续执行,可能依赖某种条件。如果条件不满足,它能做的事情就是等待,等到条件满足为止。通常条件的达成很可能取决于另一个线程,比如生产者-消费者模型。当另外一个线程发现条件符合的时候,它会选择一个时机去通知等待在这个条件的线程。有两种可能的方式,一种是唤醒一个线程,一种是广播,唤醒其他所有等待队列上的线程。为什么要有条件等待?可以考虑一...原创 2019-05-06 00:13:55 · 1482 阅读 · 0 评论 -
读写锁设计策略与性能详细分析
读写锁很多时候,对共享变量的访问有以下特点:大多数情况下线程只是读取共享变量的值,并不修改,只有极少数情况下,线程才会真正地修改共享变量的值。对于这种情况,读请求之间之间是无需同步的,他们之间的并发访问是安全的。但是必须互斥写请求和其他读请求。这种情况在实际中是存在的,比如配置项。大多数时间内,配置是不会发生变化的,偶尔会出现修改配置的情况。如果使用互斥量,完全阻止读请求并发,则会造成性能的...原创 2019-05-05 14:51:04 · 1031 阅读 · 0 评论 -
互斥量和临界区
为什么需要互斥量?大部分情况下,线程使用的数据都是局部变量,变量的地址在线程栈空间内,这种情况下,变量属于单个线程,其他线程无法获取这种变量。如果所有的变量都是如此,将会省去无数的麻烦。但实际的情况是,很多变量都是多个线程共享的,这样的变量称为共享变量。可以通过数据得到共享,完成多个线程之间的交互与通信。但是多个线程并发的操作共享变量会带来问题。++操作,并不是一个原子操作(atomic ...原创 2019-05-05 09:55:02 · 1379 阅读 · 0 评论 -
信号的一生及其与线程的关系
信号简述信号是一种软件中断,用来处理异步事件。内核递送这些异步事件到某个进程,告诉进程某个特殊事件发生了。这些异步事件,可能来自硬件,比如访问了非法的内存地址,或者除以0了,可能来自用户的输入,比如shell终端上用户在键盘上敲击了Ctrl+C;还可能来自另一个进程,甚至来自进程自身。信号的本质是一种进程间的通信,一个进程向另一个进程发送信号,内核至少传递了信号值这个字段。实际上,通信的内容不...原创 2019-05-04 22:19:23 · 2165 阅读 · 3 评论 -
线程的创建及其在内核空间存在的形式详解
pthread_create函数#include <pthread.h>int pthread_create(pthread_t *restrict thread,const pthread_attr_t *restrict attr,void *(*start_routine)(void*),void *restrict arg);pthread_create函数的第一...原创 2019-05-04 18:29:36 · 741 阅读 · 0 评论 -
上传图片到github真的很难受
WebServer democode cout cloc.jpg原创 2019-06-04 11:56:46 · 701 阅读 · 0 评论
分享