随笔分类 - 操作系统相关
摘要:转: 解密内存屏障(注释补充) 你真的理解“内存屏障”了吗? 为什么需要内存屏障 简介:以下虽非java内存屏障的例子,但很大具有参考对比性) 内存屏障是一种底层原语,在不同计算机架构下有不同的实现细节。本文主要在x86_64处理器下,通过Linux及其内核代码来分析和使用内存屏障 对大多数应用层开
阅读全文
摘要:前言: 对于rcu平时写代码用到不是特别的多,可能是自己对rcu的理解不够深入透彻,不能发挥其强大的特性,写个博客学习一下,以便更深入的理解RCU的机制 rcu简述: RCU(Read-Copy Update),是 Linux 中比较重要的一种同步机制。更新数据的时候,需要先复制一份副本,在副本上完
阅读全文
摘要:问题: 一台客户现场机器,运行一周左右偶然发生一次应用段错误或者double free问题,cpu可能是arm、mips、x86等架构,有什么好的方法捕捉异常日志? 困难点: 1. 研发环境常使用gdb+coredump技术解决此类问题,客户现场等非研发环境的偶现应用异常问题,不方便使用,操作起来有
阅读全文
摘要:一、linux的内存布局 1、32位模式下内存的经典布局 图1 32位模式下内存经典布局 注:这种内存布局模式是linux内核2.6.7以前的默认内存布局形式 说明: (1)在32的机器上,loader将可执行文件的各个段次依次载入到从0x80048000(128M)位置开始的空间中。程序能够
阅读全文
摘要:schedule 函数的调用过程 asmlinkage __visible void __sched schedule(void) { struct task_struct *tsk = current; sched_submit_work(tsk); do { preempt_disable();
阅读全文
摘要:抢占式调度 两种情况: 执行太久, 需切换到另一进程; 高优先级进程被唤醒 切换到另一进程实现: 时钟中断处理函数会调用 scheduler_tick()查看是否是需要抢占的时间点 void scheduler_tick(void) { int cpu = smp_processor_id(); s
阅读全文
摘要:调度策略与调度类 进程分为实时进程和普通进程,分别对应实时调度策略和普通调度策略 在 task_struct 中,有一个成员变量,我们叫调度策略 unsigned int policy; 它有以下几个定义: #define SCHED_NORMAL 0 #define SCHED_FIFO 1 #d
阅读全文
摘要:信号概述 在 Linux 操作系统中,为了响应各种各样的事件,也是定义了非常多的信号 # kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10)
阅读全文
摘要:Linux/Unix进程创建相关基本知识 linux中的0号、1号进程 1. 进程0 Linux引导中创建的第一个进程,完成加载系统后,演变为进程调度、交换及存储管理进程(也就是说0号进程自从创建完1号进程后就不会再次去创建其他进程了,之后由1号进程负责新子进程的创建) Linux中1号进程是由0号
阅读全文
摘要:本文以32位机器为准,串讲一些内存管理的知识点 1. 虚拟地址、物理地址、逻辑地址、线性地址 虚拟地址又叫线性地址。linux没有采用分段机制,所以逻辑地址和虚拟地址(线性地址)(在用户态,内核态逻辑地址专指下文说的线性偏移前的地址)是一个概念。物理地址自不必提。内核的虚拟地址和物理地址,大部分只差
阅读全文
摘要:问题: 1. 内核态内存映射函数 vmalloc、kmap_atomic 是如何工作的; 2. 内核态页表是放在哪里的,如何工作的? 3. swapper_pg_dir 是怎么回事; 4. 出现了内核态缺页异常应该怎么办? 内核页表 注意:和用户态页表不同,在系统初始化的时候,我们就要创建内核页表了
阅读全文
摘要:mmap 的原理 每一个进程都有一个列表 vm_area_struct 1 struct mm_struct { 2 struct vm_area_struct *mmap; /* list of VMAs */ 3 ...... 4 } 5 6 7 struct vm_area_struct {
阅读全文
摘要:前言: 重点讲解slub分配器原因: 内核里小内存分配一共有三种,SLAB/SLUB/SLOB,slub分配器是slab分配器的进化版,而slob是一种精简的小内存分配算法,主要用于嵌入式系统。慢慢的slab分配器或许会被slub取代,所以对slub的了解是十分有必要的。 slab分配器的弊端: s
阅读全文
摘要:物理内存的组织方式 物理内存的布局平坦内存模型: 由于物理地址是连续的,页也是连续的,每个页大小也是一样的。因而对于任何一个地址,只要直接除一下每页的大小,很容易直接算出在哪一页。每个页有一个结构 struct page 表示,这个结构也是放在一个数组里面,这样根据页号,很容易通过下标找到相应的 s
阅读全文
摘要:1 #include <vector> 2 3 class CTask 4 { 5 protected: 6 string m_strTaskName; //任务的名称 7 void* m_ptrData; //要执行的任务的具体数据 8 public: 9 CTask(){} 10 CTask(s
阅读全文
摘要:用户态和内核态的划分 内存管理信息: task_struct 的 mm_struct 中 整个虚拟内存空间: 1)是用户态地址空间 2)是内核态地址空间 那这两部分的分界线在哪里呢?这就要 task_size 来定义 1 #ifdef CONFIG_X86_32 2 /* 3 * User spac
阅读全文
摘要:分段机制的原理 分段机制下的虚拟地址由两部分组成,段选择子和段内偏移 量 分段机制下的虚拟地址由两部分组成,段选择子和段内偏移量 段描述符 段寄存器的值是通过段描述符填充的。 GDT(全局描述符表) LDT(局部描述符表) 当我们执行类似MOV DS, AX指令时,CPU会查表,根据AX的值来决定查
阅读全文
摘要:计算机进行计算 包括2方面: 1) 进程和线程对cpu的使用 2) 内存管理 独享内存空间的原理 每个进程都有自己独立的内存空间,如果直接使用物理空间,多个程序同时执行会有占用冲突。所以程序使用虚拟地址,系统负责把虚拟地址和物理地址映射起来 1、会议室和物理内存的关系 和会议室一样,内存都被分成一块
阅读全文
摘要:Linux 多线程编程之 线程池 的原理和一个简单的C实现,提高对多线程编 程的认知,同步处理等操作,以及如何在实际项目中高效的利用多线程开 发。 1. 线程池介绍 为什么需要线程池??? 目前的大多数网络服务器,包括Web服务器、Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必
阅读全文
摘要:内存屏障缘由 1. 单处理器下的乱序问题 2. 多处理器下的内存同步问题 举例: 在如图的这种系统模型中,假设存在如下的内存访问操作: 由于处理器出于效率而引入的乱序执行(out-of-order execution)和缓存的关系, 对于内存来说, 最后x和y的值可以有如下组合: 因此,对于在操作系
阅读全文

浙公网安备 33010602011771号