
unix
文章平均质量分 82
ptgood
这个作者很懒,什么都没留下…
展开
-
异步IO实现和应用场景
前言 学习自用,还有很多不足的地方 异步IO和同步IO 当网卡有了数据,DMA会把数据拷贝到内核缓冲区(内核缓冲区的哪里呢);而从内核缓冲区拷贝到用户态需要用户调用read,同步地进行 异步则是注册个读完成事件,等其他用户态线程/内核进程拷贝到用户态后再提醒 aio最核心的需求就是解偶submit和wait for completion, 简单地说就是在submit的时候不要阻塞, 这样用户在submit之后可以做其它事情或者继续submit新的io, 从而获得更高的cpu利用率和磁盘带宽. 异原创 2020-09-21 10:48:52 · 1726 阅读 · 0 评论 -
条件变量为什么和mutex一起用
结论:mutex是用来保证A的23句是原子性的,如果原子性被破坏就可能会失去丢失唤醒的信号 这两个线程的所有运行情况,A先和B先 A先,A阻塞在con_wait里,并释放锁,B拿到锁后修改,并signal,A被唤醒后加锁解锁并继续运行 B先运行,拿到锁后设为true,发信号,后A运行,拿到锁后直接while不成立继续 如果没有mutex:即下图左边的代码,右边是一种运行可能,这种情况下会con.wait一直阻塞,B的signal丢失 为什么要用while 一个是为了防止spurious w..原创 2020-08-19 11:56:56 · 643 阅读 · 0 评论 -
linux的IO
前言 学习自用,文末的参考资料都是好文,这篇还得慢慢补充 正文 linux IO,首先应该看一下linux IO涉及到的层次图, 对于read系统调用在内核的处理,如上图所述(TODO),经过了VFS、具体文件系统,如ext2、页高速缓冲存层、通用块层、IO调度层、设备驱动层、和设备层 我们可以简单的把上面归类为用户层,内核层,设备层 从用户空间到内核空间再到设备层,各有一个缓存,C库的clib buffer,内核的page cache和设备层的disk cache 加这些层是为了一个缓冲,用原创 2020-08-03 13:56:29 · 207 阅读 · 0 评论 -
进程的装载过程
编译过程 预处理 宏展开,略 编译 词法分析,语法分析,语义分析,中间代码生成, 目标代码生成 这一步是将中间代码编程汇编代码,这个过程中会把符号换成地址,如果是外部的符号,则留下符号作为占位符,等以后再链接修改 汇编 把汇编码转为机器指令 静态链接 有个重定位关系 启动过程 整个装载的过程 首先操作系统会读取可执行文件的头部,检查文件的合法性,然后从头部中的“Program Header”(这个program header是什么)中读取每个“Segment”的虚拟地址、文件地址和原创 2020-08-03 10:41:30 · 375 阅读 · 0 评论 -
linux下进程和线程
前言 学习自用,这篇还比较没头绪,标题和内容很难对上 问题 子进程能继承父进程的什么东西?不能继承父进程的什么东西? fork以后会生成一个task_struct,还会修改页表吧,每个线程还都有自己的thread_info,在栈的底部(应该是线程栈吧),其中有一个成员指针指向task_struct 信号处理函数不能继承,毕竟在子进程里对应的处理函数的地址是无效的(来自APUE),未决信号集也是不能继承的, 而task_struct存有被阻塞的信号集 线程独立的资源 linux内核并没有.原创 2020-07-30 16:52:32 · 223 阅读 · 0 评论 -
linux下的同步机制的实现
前言 学习自用,有错麻烦提一下,,现在还没写完,,以后再慢慢补充 同步机制先大概列出这几种 spinlock • 用在哪: 比如说memory descritpor的保护,许多内核数据结构都用这个和semaphore; 比如中断处理函数只能用这个不调度的spinlock,还有TODO会用到 • 实现原理: 关闭中断吗? 原子操作 • 实现原理:一般是特定的指令,不支持的CPU则用关闭中断来实现 • 有atomic_32和(增加运算是啥来着) • 使用注意:int更快吧,大小也是个问题原创 2020-07-25 14:38:48 · 350 阅读 · 0 评论 -
linux进程空间的内存管理
前言 写的还很乱,没把全部知识点串起来,以后再来吧,另外感觉没图读起来确实不通顺..学习自用,有错麻烦提一下 进程空间的分配 进程空间的分配要与内核空间的分配区别开;一个进程会有相应的地址空间,这里说的进程要与磁盘上的程序(可执行文件)给区分开来,首先讲一下进程的空间结构: 进程的空间结构 编程语言里常说的内存五区 全局区 静态区 代码区 堆栈 而实际中进程的分为以下几段(放图TODO) data section,用来存可执行文件的已初始化全局变量,如原创 2020-07-01 21:00:08 · 461 阅读 · 0 评论 -
linux的VFS
前言 学习自用,有错麻烦提一下 正文 有不同的文件系统,比如ex2,ext3,FAT,NTFS,而对于程序来说,这些文件系统的使用都是差不多的,有着相同的API,平时几乎感受不到差别,而这几个文件系统的implementation实际是千差万别的,linux是通过一层抽象来实现的而这层抽象实际上是VFS, virtual file system或者virtual filesystem switch VFS层有四个重要的数据结构,Inode,superblock,file和dentry; Inode原创 2020-06-27 17:33:39 · 241 阅读 · 0 评论 -
linux内核的内存管理
内核内存管理总结 内核的内存分配不同于用户空间的内存分配,,balabala 内核里内存的分配主要有这么几种,首先是按页来请求内存,用alloc_pages()和它的几个兄弟函数可以实现,按页分配,即直接请求返回的是一个或者多个页框;而对于页框的管理,内存中不同页会被分为不同zones,区分标准是:比如DMA能直接操作的区域,HIGH memory区域(后面再讲),每个不同的区域分别让buddy system algorithm来接管分配,buddy system algorithm,即把页分为不同大小原创 2020-06-26 21:57:47 · 284 阅读 · 0 评论 -
linux的high memory
线性地址 这里掠过分段和分页的概念 线性地址概念:线性地址是分段变换后的地址 以下是啰嗦把版本的, CPU在保护模式下(保护模式是什么?),“段基址+段内偏移地址”叫做线性地址(是用分段来管理虚实地址转换吧,一直疑问分段在linux中应用),如果没开分页的话,线性地址则是物理地址;而如果开了分页,线性地址=虚拟地址, high memory 这里以32位来讲,有high memory原因是CPU寻址位数不够,导致寻址空间不足,,,而64位系统下不会有high memory 以linux为例子,原创 2020-06-24 17:26:45 · 302 阅读 · 0 评论