Linux内核与操作系统
xunshuidezhu
这个作者很懒,什么都没留下…
展开
-
SIGBUS SIGSEGV
SIGSEGV只读映射区写数据SIGBUS一些硬件内存对齐要求原创 2020-04-29 17:20:15 · 267 阅读 · 0 评论 -
EINTR
慢系统调用可能永远阻塞的系统调用EINTR调用系统调用被中断,返回错误码EINTR触发例子,永远阻塞的系统调用进程,接收到信号,执行注册的信号回调函数,慢系统调用被中断,触发EINTR处理重复系统调用忽略错误...原创 2020-04-27 17:48:25 · 852 阅读 · 0 评论 -
用户态到内核态
通过系统调用,外围设备中断,异常都可以进入到内核态,主要说一下系统调用过程。PCBPCB是进程控制块,是一个存放进程信息的结构体,主要包括 进程id 进程的状态:就绪,运行,挂起,停止 进程切换时需要保存和恢复的一些寄存器 文件描述符 用户id,组id 信号相关信息 信号信号本质是给PCB写入信息,改变进程相关信息,进程去处理...原创 2020-03-12 10:43:02 · 183 阅读 · 0 评论 -
linux内核(二) epoll源码之锁的使用
本文重点针对epoll源码中锁的使用,2.6.22.6源码中,epoll使用了三个锁,一个spin_lock,一个mtx,一个全局的mtx1.ep->lock (spinlock)使用自旋锁的原因是poll 回调函数可能会从wake_up()调用,可能涉及到中断上下文,而中断是不能被睡眠的,所以只能用自旋锁.2.ep->mtx (mutex)因为poll事件循环可能涉及...原创 2019-12-24 17:55:13 · 318 阅读 · 0 评论 -
linux内核(一)linux内核同步,spin_lock与中断以及内核抢占,信号量和互斥锁,屏障,原子操作,BLK大内核锁,读写锁(一)
注:代码为linux内核版本为2.6.22.6以及4.4.32,不代表其他版本内核的实现方式spin_lock与spin_lock_irqsave自旋锁是内核中最常见的锁,也就是线程争用被持有的自旋锁时,并不会睡眠挂起而是在busyloop等待锁重新可用,因此自旋锁更适用于时间短,加锁不睡眠的场景,由于信号量和互斥锁在挂起的时候需要让出cpu执行别的线程,因此涉及到两次上下文切换,当上下文...原创 2019-12-21 15:28:58 · 207 阅读 · 0 评论 -
gcc linux利用CAS实现无锁编程
利用__sync_bool_compare_and_swap(),实现无锁编程CAS即compare and swap,每次都会和old 值进行比较,如果没有发生更改再用new值给ptr赋值,然后返回true#include <bits/stdc++.h>#include <pthread.h>#include <stdlib.h>#includ...原创 2019-12-11 18:28:19 · 898 阅读 · 0 评论 -
gcc linux 利用原子操作实现无锁编程
_ATOMIC_ADD_和_ATOMIC_SUB_是我实现的两个宏,分别对应__sync_fetch_and_add(x, y) __sync_fetch_and_sub(x,y)x需要传地址,y为要加/减的数,可以替代多线程mutex编程#include <bits/stdc++.h>#include <pthread.h>#include &...原创 2019-12-11 16:37:15 · 366 阅读 · 0 评论 -
linux内核问题
1) Linux中主要有哪几种内核锁?2) Linux中的用户模式和内核模式是什么含意?3) 怎样申请大块内核内存?4) 用户进程间通信主要哪几种方式?5) 通过伙伴系统申请内核内存的函数有哪些?6) 通过slab分配器申请内核内存的函数有?7) Linux的内核空间和用户空间是如何划分的以32位系统为例)?8) vmalloc()申请的内存有什么特点?9) 用户程...转载 2019-11-30 22:03:56 · 248 阅读 · 0 评论 -
k-v存储引擎设计
存储引擎设计存储引擎会设计成k-v,也就是键值对,按时间序列和图像帧以及雷达帧进行存取。核心数据结构采用跳表-哈希表-双向链表,具体分为时间序列-帧序列跳表,通道号(根据通道号可分辨雷达数据or图片数据)哈希表,数据存储链表。时间序列-帧序列跳表的key会分为2个级别,第一个级别的key存储的是时间序列,由于同一时间序存在多个帧序列,而帧序列可以看成时间序列的子序列,因此按第一级跳表可以找到某...原创 2019-10-31 15:46:19 · 637 阅读 · 0 评论 -
gcc __thread
__thread 变量__thread 标识符修饰的全局或静态变量是线程独立的,线程对该变量的操作对其它线程来说是不可见的。然而线程之间共享内存空间的,因此要达到如些效果就需要针对该变量为每个线程分配变量的存储位置。在 Glibc 中, 所有的 __thread 变量是与 pthread 关联存储的,通过相对于 pthread 变量地址的偏移实现对变量的寻址。即是说,pthread 变量的地址...原创 2019-07-12 10:21:57 · 791 阅读 · 0 评论 -
线程资源分配与释放(转载)
很好的文章,提到内核线程与用户态线程以及资源的分配管理释放https://www.jianshu.com/p/ea692d4f5e27转载 2019-07-12 10:18:10 · 1641 阅读 · 0 评论 -
c和c++内存模型
C分为四个区:堆,栈,静态全局变量区,常量区C++内存分为5个区域(堆栈全常代 ): 堆 heap : 由new分配的内存块,其释放编译器不去管,由我们程序自己控制(一个new对应一个delete)。如果程序员没有释放掉,在程序结束时OS会自动回收。涉及的问题:“缓冲区溢出”、“内存泄露” 栈 stack : 是那些编译器在需要时分配,在不需要时自动清除的存储区。存放局部变...原创 2019-07-15 22:16:26 · 341 阅读 · 0 评论 -
线程同步,互斥量与条件变量,两个线程交叉打印数据
多线程同步一直是一个难点,利用linux的互斥锁与条件变量实现了两个线程交叉打印数据,并且进行初步封装,可重用/************************************************** * 两个线程交叉打印 * ************************************************/#include <pthread.h...原创 2019-07-11 15:34:12 · 319 阅读 · 0 评论 -
锁与锁的粒度
锁及锁粒度的详细比喻今天看到一篇文章,很详细的描述了锁和锁粒度的概念,如下为什么要加锁?加锁是为了防止不同的线程访问同一共享资源造成混乱。打个比方:人是不同的线程,卫生间是共享资源你在上洗手间的时候肯定要把门锁上吧,这就是加锁,只要你在里面,这个卫生间就被锁了,只有你出来之后别人才能用。想象一下如果卫生间的门没有锁会是什么样?什么是加锁粒度呢?所谓加锁粒度就是你要锁...原创 2019-06-10 19:23:05 · 729 阅读 · 0 评论 -
进程饥饿与死锁
1.饥饿是指系统不能保证某个进程的等待时间上界,从而使该进程长时间等待,当等待时间给进程推进和响应带来明显影响时,称发生了进程饥饿。当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义时称该进程被饿死。2.死锁是指在多道程序系统中,一组进程中的每一个进程都无限期等待被该组进程中的另一个进程所占有且永远不会释放的资源。相同点:二者都是由于竞争资源而引起的。不同点: 从进...原创 2019-06-11 21:19:47 · 1281 阅读 · 0 评论 -
事件驱动与异步io
https://blog.csdn.net/qq_34173549/article/details/80212101原创 2019-07-09 16:32:01 · 137 阅读 · 0 评论 -
服务器设计:心跳机制
心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制。应用场景:在长连接下,有可能很长一段时间都没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活什么是心跳机制?...原创 2019-07-13 12:05:38 · 931 阅读 · 0 评论 -
操作系统批处理调度算法与进程调度算法
常见的批处理作业调度算法1.先来先服务调度算法(FCFS):就是按照各个作业进入系统的自然次序来调度作业。这种调度算法的优点是实现简单,公平。其缺点是没有考虑到系统中各种资源的综合使用情况,往往使短作业的用户不满意,因为短作业等待处理的时间可能比实际运行时间长得多。2.短作业优先调度算法(SPF): 就是优先调度并处理短作业,所谓短是指作业的运行时间短。而在作业未投入运行时,并不能知道它实...原创 2019-06-28 19:10:58 · 918 阅读 · 0 评论 -
进程间通信与线程间通信(二)
一、进程间的七大通信方式signal、file、pipe、shm、sem、msg、socket1,signal信号通信的目的:某某事件发生!此时需要处理什么,进程间(可以是不相关的进程)传递信号场景:信号又被称之为中断,需要处理什么对应的是中断处理函数,此时设置断点,形参入栈,保存现场信息,然后去执行中断处理函数,当处理完成之后,恢复现场信息,程序继续往下执行Linux下可以通...原创 2019-07-04 13:24:18 · 186 阅读 · 0 评论 -
进程间通信与线程间通信(一)
很多书或者博客都说了进程间通信有几种方式,线程间通信有几种方式,我说一下进程间通信与线程间通信的本质以及要注意的问题。1.一个进程如何把信息传递给另一个进程2.确保两个或更多的进程在活动中不会出现交叉,比如,两个工作进程不会服务于一个任务进程, 一个工作进程也不会服务两个任务进程3.正确的执行顺序,比如进程A为创建进程,进程B为消费进程, 则需要A进程先执行,B进程后执行以上都是关...原创 2019-07-04 13:25:41 · 192 阅读 · 0 评论 -
linux条件变量pthread_cond,生产者消费者模型
1.初始化条件变量pthread_cond_init#include <pthread.h>int pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr);返回值:函数成功返回0;任何其他返回值都表示错误初始化一个条件变量。当参数cattr为空指针时,函数创建的是一个缺省的条件变量。...原创 2019-07-04 17:24:03 · 533 阅读 · 0 评论 -
进程线程协程纤程
任务、作业(Job,Task,Schedule)在进程的概念出现之前,进程有着这样的称谓。进程为了使多个程序能够并发(同一时刻只有一个在运行,但感觉起来像多个同时运行;并行(同一时刻真的多个在运行,不是感觉像多个))的执行,操作系统需要一个结构来抽象和表示这个程序的运行。进程是操作系统对一个正在运行的程序的一种抽象结构。 进程是指在操作系统中能独立运行并作为资源分配的基本单位,由...原创 2019-07-04 19:18:49 · 558 阅读 · 0 评论 -
reactor模式与事件驱动
https://blog.csdn.net/baidu20008/article/details/41378761转载 2019-07-14 13:48:24 · 336 阅读 · 0 评论 -
cpu,寄存器,控制器,运算器
关于CPU寄存器CPU除了有控制器、运算器还有寄存器。其中寄存器的作用就是进行数据的临时存储。CPU的运算速度是非常快的,为了性能CPU在内部开辟一小块临时存储区域,并在进行运算时先将数据从内存复制到这一小块临时存储区域中,运算时就在这一小块临时存储区域内进行。我们称这一小块临时存储区域为寄存器。对于arm64系的CPU来说, 如果寄存器以x开头则表明的是一个64位的寄存器,如...原创 2019-06-13 19:27:43 · 6497 阅读 · 0 评论