操作系统
wb_snail
这个作者很懒,什么都没留下…
展开
-
read write、mmap、directBuffer、sendfile傻傻分不清楚?
当讨论到文件数据、网络数据的读写时,我们可以看到有多种方案,read write、mmap、directBuffer、sendfile这些大家都多多少少看到过,本文旨在讲述但这几种方案的原理,并做出对比pageCache以及DMA名词解释:由于后续内容多次涉及到pageCache以及DMA,这里先做下名词解释pageCache: 操作系统会为每个文件单独维护一个pageCache,其本质是内核中的一段内存,用户进程对于文件的大多数读写操作会直接作用到pageCache上,相当于...原创 2020-05-11 12:50:37 · 1169 阅读 · 0 评论 -
信号量与管程实现生产者消费者模型
生产者消费者模式是实际应用中常见的场景,一个或多个生产者线程往缓冲区添加数据,一个或多个消费者线程从缓冲区取数据,有这样几个正确性要求:1.缓冲区是共享变量,一般由数组或者链表实现,是线程不安全的,同一时刻,只能有一个线程操作缓冲区(要求互斥);2.当发现缓冲区满后,生产者必须等待消费者(要求同步);3.缓冲区空后,消费者必须等待生产者(要求同步)基于信号量解决这个模型,设计思路如...原创 2020-04-10 11:15:52 · 399 阅读 · 0 评论 -
光有lock可不够,信号量与管程原理
实际场景中,光有锁和互斥是不够的,还需要一些复杂的同步机制,比如读写锁(多个读操作可以同时进行),比如生产者消费者模型(生产者消费者需要一定的同步机制),在这种情况下,我们只使用锁机制就不够了,需要更高层的同步互斥的语义来实现两个名词解释,有助于接下来的理解:临界区(critical section):一段需要读写共享资源的代码互斥(Mutual exclusion):一个线程进入临...原创 2020-04-10 09:41:22 · 260 阅读 · 0 评论 -
lock是如何实现的,凭啥你lock后我就得等
多线程并发访问共享资源的现象称为Race condition(竞态条件),由于无法确定CPU调度指令的顺序,当出现竞态条件时,就会存在结果的不确定性(就是我们常说的并发安全问题),以及不可重现性的情况(安全问题也是偶发的,往往不容易复现,所以出现问题时,很难排查原因)举个获取进程ID的例子:(如果你对并发问题如何发生的比较清楚,可以跳过这一段,不影响下面的理解)当前next_pid=10...原创 2020-04-08 16:33:47 · 403 阅读 · 0 评论 -
深入理解中断,异常,系统调用
应用程序的运行过程中,往往会需要外部设备的干预,比如键盘敲击输入文字、鼠标点击确认按钮,并且应用程序自己可能需要一些系统服务,比如文件读写、网络通讯,另外,在运行过程中,可能还会产生一些意料之外的异常,不论是主动调起还是被动触发,都会产生一个CPU信号,这些信号分为三类,中断/异常/系统调用,信号发出后,CPU都会交给操作系统进行处理。那么三者的区别是什么呢?下面从来源、触发时机与处理方式、处...原创 2020-04-07 18:05:55 · 4731 阅读 · 2 评论 -
进程与线程的比较真的有必要吗
在没有线程的时代,一个进程内的所有动作就只能依次执行,如果有并发执行需求,就得用多进程,既然多进程可以搞定,为啥操作系统又引入了线程呢?大家都知道,因为线程更轻量,那线程到底轻在哪里?我们前面说过,进程开启后,操作系统会为其维护一个进程控制块PCB,同样的,线程开启后,会为其维护一个线程控制块TCB,这两个控制块的大小决定了它们体积上的轻重进程/线程作为CPU调度单元,都包含操作系统对其进...原创 2020-04-06 10:05:22 · 356 阅读 · 0 评论 -
深入理解上下文切换
对于CPU来说,它只知道取指令,执行指令,然后执行下一条指令,他可不关心当前执行的指令是从哪个进程来的,这是上面的操作系统需要关心的。由于程序总归免不了读写内存,读写磁盘,或者网络交互,这些动作比CPU的速度慢了很多个数量级,为了不让cpu忙等这些操作,就得想办法让多个程序"同时"运行,a程序执行io读写时把cpu交给b程序,b程序发送网络包时再把cpu让给c程序,尽力提高CPU的使用率,操作系统...原创 2020-04-04 20:55:55 · 1137 阅读 · 0 评论