
系统
文章平均质量分 84
操作系统、单片机、软件工程
hututu_404
Waiting Here~~~~~~~
展开
-
Linux内存管理(二):PTMalloc
1. ptmalloc简介2. 内存管理数据结构3. 内存分配4. 内存回收5. 配置选项6. 注意事项1. ptmalloc简介 Linux 中 malloc 的早期版本是由 Doug Lea 实现的,它有一个重要问题就是在并行处理时 多个线程共享进程的内存空间,各线程可能并发请求内存,在这种情况下应该如何保证分配 和回收的正确和高效。Wolfram Gloger 在 Doug Lea 的基础上改进使得 Glibc 的 malloc 可以支 持多线程——ptmalloc,在..转载 2022-07-29 16:36:59 · 842 阅读 · 0 评论 -
P问题、NP问题、NP完全问题和NP难问题
P问题、NP问题、NP完全问题和NP难问题转载 2022-07-29 16:31:01 · 565 阅读 · 0 评论 -
Linux中的进程栈和线程栈
Linux中的进程栈和线程栈转载 2022-04-19 20:38:41 · 2151 阅读 · 2 评论 -
IO设计模式之Reactor和Proactor
前言上面文章中,我们提到不同的操作系统实现的io策略可能不一样,即使是同一个操作系统也可能存在多重io策略,常见如linux上的select,poll,epoll,面对这么多不同类型的io接口,这里需要一层抽象api来完成,所以就演变出来两种高性能的io的设计模式,分别是Reactor(同步IO)和Proactor(异步IO)。一般情况下,I/O 复用机制需要事件分享器(event demultiplexor)。 事件分离器的作用,即将那些读写事件源分发给各读写事件的处理者,就像送快递的小哥,拉着一转载 2022-03-29 17:34:51 · 359 阅读 · 0 评论 -
理解IO模型
前言在谈到IO模型之前,我们先来了解下Liunx里面的几个概念:User space(用户空间)和 Kernel space(内核空间)。Linux里面这么设计的目的主要是为了安全,即使用户空间崩溃了,内核也不受影响。所以在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。此外还要理解阻塞,非阻塞,同步,异步这几个概念,这里不再详细介绍,我之前的文章中非常详细的介绍过。说下目前转载 2022-03-29 17:32:48 · 177 阅读 · 0 评论 -
搞懂进程组、会话、控制终端关系,才能明白守护进程干嘛的?
守护进程概念:守护进程,也就是通常所说的Daemon进程,是Linux中的后台服务进程。周期性的执行某种任务或等待处理某些发生的事件。Linux系统有很多守护进程,大多数服务都是用守护进程实现的。比如:像我们的tftp,samba,nfs等相关服务。UNIX的守护进程一般都命名为*d的形式,如httpd,telnetd等等。生命周期:守护进程会长时间运行,常常在系统启动时就开始运行,直到系统关闭时才终止。守护进程不依赖于终端从终端开始运行的进程都会依附于这个终端,这个终端称为转载 2022-03-17 15:02:03 · 720 阅读 · 0 评论 -
类Unix系统中,fd指的啥?
一、文件描述符(File Descriptor)简介socket的fd指什么?fd 是(file descriptor)即文件描述符,这种一般是BSD Socket的用法,用在Unix/Linux系统上。fd全称是file descriptor,是进程独有的文件描述符表的索引。维基百科上介绍:file descriptors index into a per-process file descriptor table maintained by the kernel, that in tur转载 2022-03-11 02:08:31 · 922 阅读 · 0 评论 -
Linux进程优先级设置简介
在配合开发调试过程中,发现进程因使用基于FIFO的实时优先级,而另一个与之交互的进程是使用普通调度的优先级,两个进程是互相通信的,它们在工作一段时间后都不能正常工作。初步分析为进程优先级的设定问题,分析问题过程中查找了一些资料,以加强自己的理解。Linux进程调度的三种策略(1)、SCHED_OTHER,分时调度策略(2)、SCHED_FIFO,实时调度策略,先到先服务(3)、SCHED_RR,实时调度策略,时间片轮转由于涉及相关内容比较多,很难讲的清楚,关于进程调度更详细的内容建议读Linux内转载 2022-03-04 17:12:15 · 4105 阅读 · 1 评论 -
进程优先级详解(prio、static_prio、normal_prio、rt_priority)
进程优先级详解(prio、static_prio、normal_prio、rt_priority)转载 2022-03-04 16:48:37 · 4431 阅读 · 3 评论 -
为什么栈要比堆速度要快
大部分开发人员都知道栈和堆的区别, 网上搜索也有一大堆, 但是, 具体解释栈和堆的速度差异, 找到的信息却是寥寥无几, 而且, 也都比较混乱. 在这里, 就我所知的情况, 大致描述一下栈为什么要比堆快的原因.首先, 栈是由CPU提供指令支持的, 在指令的处理速度上, 对栈数据进行处理的速度自然要优于由操作系统支持的堆数据.其次,栈是在一级缓存中做缓存的, 而堆则是在二级缓存中, 两者在硬件性能上差异巨大.再者,栈是本着LIFO原则的存储机制, 对栈数据的定位相对比较快速, 而堆则是随机分配...转载 2021-09-27 09:34:45 · 1212 阅读 · 0 评论 -
Linux 进程、线程、文件描述符的底层原理
Linux 进程、线程、文件描述符的底层原理说到进程,恐怕面试中最常见的问题就是线程和进程的关系了,那么先说一下答案: 在 Linux 系统中,进程和线程几乎没有区别 。Linux 中的进程其实就是一个数据结构,顺带可以理解文件描述符、重定向、管道命令的底层工作原理,最后我们从操作系统的角度看看为什么说线程和进程基本没有区别。一、进程是什么首先,抽象地来说,我们的计算机就是这个东西:这个大的矩形表示计算机的内存空间,其中的小矩形代表进程,左下角的圆形表示磁盘,右下角的图.转载 2021-09-22 10:31:03 · 210 阅读 · 0 评论 -
分段内存管理模型
x86 CPU 在实模式下的寄存器。表中每个寄存器都是 16 位的。实模式下的寄存器实模式下访问内存虽然有了寄存器,但是数据和指令都是存放在内存中的。通常情况下,需要把数据装载进寄存器中才能操作,还要有获取指令的动作,这些都要访问内存才行,而我们知道访问内存靠的是地址值。那问题来了,这个值是如何计算的呢?计算过程如下图。实模式下访问内存结合上图可以发现,所有的内存地址都是由段寄存器左移 4 位,再加上一个通用寄存器中的值或者常数形成地址,然后由这个地址去访问内存。这就是大名鼎鼎的分.原创 2021-08-15 15:23:01 · 357 阅读 · 0 评论 -
异常和中断的区别
1>异常:是指CPU内部出现的中断,即在CPU执行特定指令时出现的非法情况。同时异常也称为同步中断,因此只有在一条指令执行后才会发出中断,不可能在指令执行期间发生异常。a.产生的原因: 程序的错误产生的,编程异常通常叫做软中断(eg:除数为0) 内核必须处理的异常条件产生的(eg:缺页)产生的目的:Linux利用异常来达到两个截然不同的目的:·给进程发送一个信号以通报一个反常情况·管理硬件...转载 2021-05-06 20:44:03 · 1833 阅读 · 0 评论 -
OpenCL入门实践
(一)NDRange如何设置?Figure from 《Introduction to OpenCL》 Nivida,2010结合上图我们分析一下下面设置NDRange(Global Dimemsion Index Ranges)部分的代码。 123456 /* Set number of work-items in a work-group */size_t localWorkSize[1] = { 8 };int numWorkGroups转载 2021-04-15 13:48:57 · 856 阅读 · 1 评论 -
ARM体系架构下的同步操作
处理器在访问共享资源时,必须对临界区进行同步,即保证同一时间内,只有一个对临界区的访问者。当共享资源为一内存地址时,原子操作是对该类型共享资源同步访问的最佳方式。随着应用的日益复杂和SMP的广泛使用,处理器都开始提供硬件同步原语以支持原子地更新内存地址。CISC处理器比如IA32,可以提供单独的多种原子指令完成复杂的原子操作,由处理器保证读-修改-写回过程的原子性。而RISC则不同,由于除Load和Store的所有操作都必须在寄存器中完成,如何保证从装载内存地址到寄存器,到修改寄存器中的值,再到将寄存器转载 2021-04-07 11:43:54 · 1004 阅读 · 0 评论 -
Linux的原子操作与同步机制
Linux的原子操作与同步机制并发问题现代操作系统支持多任务的并发,并发在提高计算资源利用率的同时也带来了资源竞争的问题。例如C语言语句“count++;”在未经编译器优化时生成的汇编代码为。当操作系统内存在多个进程同时执行这段代码时,就可能带来并发问题。假设count变量初始值为0。进程1执行完“mov eax, [count]”后,寄存器eax内保存了count的值0。此时,进程2被调度执行,抢占了进程1的CPU的控制权。进程2执行“count++;”的汇编代码,将累加后的.转载 2021-04-07 11:31:59 · 184 阅读 · 0 评论 -
图形程序接口知多少 | OpenGL、OpenCL、Vulkan、OpenGL ES、WebGL、Metal、Directx
计算机图形程序接口 |Graphics API对于普通的电脑玩家来说这是一个不重要的东西,但对于游戏开发、玩游戏做三维的人来说,这部分知识可能会常常被提及,尤其是涉及到游戏相关的。计算机图形程序接口是一套可编程的开放标准,3D\2D 都需要这部分底层的 API 支持。如果你是一名游戏开发者,没有借助图形 API 来开发游戏的话,这意味着你的游戏想要调用系统硬件(GPU)的时候,这部分的程序需要自己独立开发,这无疑是增加了游戏开发的成本。Graphics API 就是解决这一难题的,开发者只要输入很小的.转载 2021-03-24 16:20:07 · 2589 阅读 · 0 评论 -
理解公钥与私钥
转载自:https://songlee24.github.io/2015/05/03/public-key-and-private-key/一直都对公钥和私钥的概念不清不楚,以至于在 腾讯面试 被问到“如何在一个不安全的环境中实现安全的数据通信?”时,并没有答上来。今天查阅了一些资料,决定写一篇总结文章来加深自己的理解。一、公钥算法与私钥算法1、私钥算法私钥加密算法,又称对称加密算法,因为这种算法解密密钥和加密密钥是相同的。也正因为同一密钥既用于加密又用于解密,所以这个密钥是不能公开的。常.转载 2021-02-02 11:08:52 · 1856 阅读 · 0 评论 -
地址空间的故事
转载自:https://zhuanlan.zhihu.com/p/25999484每个程序都面对一个或者多个地址空间。你写一个程序,说*(0x1234)=10,这里就索引了一个地址。所有可以被索引的地址,就构成一个地址空间。一个CPU上的程序可能不止一个地址空间,比Intel支持LPC的指令,用inX和outX指令索引的地址空间和用movb索引的地址空间就是两个相对独立的地址空间。有些比如哈佛构架的CPU,访问指令和访问数据内存也会使用不同的地址空间。一般冯诺伊曼计算机访问内存的是同一套指令,这套指转载 2021-02-01 16:17:49 · 351 阅读 · 0 评论 -
ARM MMU工作原理剖析
转载自:http://news.eeworld.com.cn/mcu/article_24319.html一、MMU的产生许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称...转载 2021-02-01 15:22:00 · 313 阅读 · 0 评论 -
VLIW的前世今生:为什么DL加速器都青睐于它
VLIW:(Very Long Instruction Word,超长指令字)一种非常长的指令组合,它把许多条指令连在一起,增加了运算的速度。 超长指令字(VLIW)是指令级并行,超线程(Hyper-Threading)是线程级并行,而多内核则是芯片级并行。这三种方式都是提高并行计算性能的有效途径。其中,VLIW(超长指令字)体系结构是美国Multiflow和Cydrome公司于20世纪80年代设计的体系结构,EPIC体系结构就是从VLIW中衍生出来的深度学习加速器,更宏观些应该称为处理器,我认为.转载 2021-01-07 15:03:18 · 2751 阅读 · 0 评论 -
关于TOCTTOU攻击的简介
关于TOCTTOU攻击的简介转载自:https://www.cnblogs.com/liqiuhao/p/9450093.html前言最近看到了一些以at结尾的Linux系统调用,在维基百科上面说这可以防御一些特定的TOCTTOU攻击,而在TOCTTOU对应页面中并没有中文版的介绍,而且百度的结果也比较少,于是决定抽空写一个关于 TOCTTOU攻击的简介,其中部分参考了英文版的维基百科。什么是竞争条件与TOCTTOU?在电路设计、软件开发、系统构建中,如果一个模块的...转载 2021-01-07 09:38:55 · 2405 阅读 · 0 评论 -
大小端介绍与分析
1. 字节序 字节序即字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,但是对于多字节数据,比如int,double等,就要考虑存储的顺序了。字节序是硬件层面的东西,通常只和你使用的处理器架构有关,而和编程语言无关。字节序分为大端序和小端序。 大端序:数据的高位字节存放在地址的低端 低位字节存放在地址高端。 小端序:数据的高位字节存放在地址的高端 低位字节存放在地址低端。0x1234567的大端字节序和小端字节序的写法如下图。可见,大端模式和字符串的存储模式类似...原创 2020-09-04 09:15:09 · 664 阅读 · 0 评论 -
eMMC---简介、分区管理、总线协议和工作模式
一、eMMC 简介eMMC 是embedded MultiMediaCard的简称。MultiMediaCard,即MMC, 是一种闪存卡(Flash Memory Card)标准,它定义了 MMC 的架构以及访问 Flash Memory 的接口和协议。而eMMC 则是对 MMC 的一个拓展,以满足更高标准的性能、成本、体积、稳定、易用等的需求。eMMC 的整体架构如下图片所示:图片: eMMC 整体架构eMMC 内部主要可以分为Flash Memory、Flash Contro...转载 2020-07-28 10:12:28 · 3357 阅读 · 0 评论 -
ELF 文件数据分析: 全局变量
先编译一个简单的 C 程序。#include <stdio.h>char* s = "Hello, World!";char* x;int i = 0x1234;int main(int argc, char* argv[]){x = "Ubuntu";printf("%s/n", s);return 0;}编译后,使用 objdump 输出 ELF Section 信息。我们通常关心只有 .text, .rodata, .data, .bss 这几个段。yu...转载 2020-06-30 12:24:51 · 5942 阅读 · 1 评论 -
linux中export与source的作用
以前一直觉得export可有可无,虽然知道export是干嘛的,不就是把本地变量变成全局变量么(实际中叫环境变量),但是感觉好像没有这货也没影响,今天看了这篇博文,终于恍然大悟。用自己的语言,思维方式重新整理一遍首先说明两个概念:父shell与子shell,从shellA中启动一个shell,称之为shellB。 shellA为父shell,shellB为子shell。最容易理解的情况就是在一个shell中执行一个gnome-terminal命令(不同桌面环境命令不一样),弹出一个新的shell最转载 2020-06-24 14:57:49 · 277 阅读 · 0 评论 -
ISO 26262中的ASIL等级确定与分解
ISO 26262中的ASIL等级确定与分解1. 引言 汽车上电子/电气系统(E/E)数量不断的增加,一些高端豪华轿车上有多达70多个ECU(Electronic Control Unit电子控制单元),其中安全气囊系统、制动系统、底盘控制系统、发动机控制系统以及线控系统等都是安全相关系统。当系统出现故障的时候,系统必须转入安全状态或者转换到降级模式,避免系统功能失效而导致人员伤亡。失效可能是由于规范错误(比如安全需求不完整)、人为原因的错误(比如:软件bug)、环境的影响( 比如:电磁...转载 2020-06-22 16:22:28 · 1569 阅读 · 1 评论 -
STM32 上电后的启动过程
微控制器(单片机)上电后,是如何寻找到并执行main函数的呢?很显然微控制器无法从硬件上定位main函数的入口地址,因为使用C语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配,这样一来main函数的入口地址在微控制器的内部存储空间中不再是绝对不变的。相信读者都可以回答这个问题,答案也许大同小异,但肯定都有个关键词,叫“启动文件”,用英文单词来描述是“Bootloader”。无论性...转载 2020-06-22 16:14:29 · 522 阅读 · 3 评论 -
ARM的三级流水线结构(一)
看到汇编中很多关于程序返回与中断返回时处理地址都很特别,仔细想想原来是流水线作用的效果。所以,决定总结学习下ARM流水线。ARM7处理器采用3级流水线来增加处理器指令流的速度,能提供0.9MIPS/MHz的指令处理速度。PS:MIPS(Million Instruction Per Second)表示每秒多少百万条指令。比如0.9MIPS,表示每秒九十万条指令。MIPS/MHz表示...转载 2020-04-19 20:57:23 · 2266 阅读 · 0 评论 -
多级反馈队列调度算法
多级反馈队列调度算法如果有很多任务排队等着被处理,哪个任务先被处理,哪个任务后处理,这个需要由操作系统决定,这就是调度。多级反馈队列调度算法是目前操作系统调度算法中被公认的一种较好的调度算法。它可以满足各种类型进程的需要,既能使高优先级的作业得到响应又能使短作业(进程)迅速完成。基本概念多级反馈队列调度算法是一种根据先来先服务原则给就绪队列排序,为就绪队列赋予不同的优先级数,...转载 2020-04-10 22:31:44 · 3972 阅读 · 1 评论 -
linux下日志文件系统
众所周知,文件系统是操作系统最为重要的一部分。每种操作系统都有自己的文件系统。文件系统直接影响着操作系统的稳定性和可靠性。Linux下的文件系统通常有两种,即日志文件系统和非日志文件系统,以下简单介绍两类文件系统。一、非日志文件系统非日志文件系统在工作时,不对文件系统的更改进行日志记录。文件系统通过为文件分配文件块的方式把数据存储在磁盘上。每...转载 2020-04-10 22:30:16 · 1682 阅读 · 0 评论 -
STM32的“外部中断”和“事件”区别和理解
凡从事过ST MCU应用开发的人往往会遇到事件、中断事件 中断三个概念或术语。这三个概念彼此关联,有时会让人有点混淆或犯迷糊。 先拿一件生活中的事情打比方对上述三个概念做个基本的粗略理解,之后再分享一个STM32 GPIO外部中断配置案例。比如一老师在教室里给学生们上课。课堂上的学生可能做出各种行为动作,比方做笔记、打哈气、翻书包、讲小话等,我们把这些行为统称为事件,其中有些行为老师往往只是...转载 2018-07-19 14:38:17 · 1637 阅读 · 0 评论 -
STM32的"异常“、“中断”和“事件”区别和理解
1 异常与中断(Cortex-M3)1.1 异常与中断原话: Cortex‐M3 在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。 其中,编号为 1-15 的对应系统异常,大于等于 16 的则全是外部中断。 除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。 所有能打断正常执行流的事件都称为异常。异常的概念包含中断的概念,即中断是异常的子集。异常与中断都是硬件支持的原创 2018-01-18 11:34:35 · 9635 阅读 · 2 评论 -
ARM处理器工作模式
一、ARM体系的CPU有以下7种工作模式:1、用户模式(usr):正常的程序执行状态2、快速中断模式(fiq):用于支持高速数据传输或通道处理3、中断模式(irq):用于普通中断处理4、管理模式(svc):操作系统使用的保护模式5、系统模式(sys):运行具有特权的操作系统任务6、数据访问终止模式(abt):数据或指令预取终止时进入该模式7、未定义指令终止模式(und):未定义的指令执行时进入该模转载 2018-01-18 10:49:30 · 667 阅读 · 0 评论 -
ARM的流水线与PC值的关系
一、两种结构:冯·诺依曼结构 和 哈佛结构:1、冯·诺依曼结构 冯·诺依曼结构又称作普林斯顿体系结构(Princetionarchitecture)。1945年,冯·诺依曼首先提出了“存储程序”的概念和二进制原理,后来,人们把利用这种概念和原理设计的电子计算机系统统称为“冯·诺依曼型结构”计算机。冯·诺依曼结构的处理器使用同一个存储器,经由同一个总线传输。冯·诺依曼结构处理器具有以下几个特点:转载 2018-01-18 10:21:18 · 1910 阅读 · 0 评论 -
RO段、RW段和ZI段
RO段、RW段和ZI段RO段、RW段和ZI段Posted by gavinkwoe一直以来对于ARM体系中所描述的RO,RW和ZI数据存在似是而非的理解,这段时间对其仔细了解了一番,发现了一些规律,理解了一些以前书本上有的但是不理解的东西,我想应该有不少人也有和我同样的困惑,因此将我的一些关于RO,RW和ZI的理解写出来,希望能对大家有所帮助。要了解RO,RW和ZI需要首先了解转载 2018-01-17 17:39:01 · 978 阅读 · 1 评论 -
STM32启动文件 Reset_Handler函数
该文件主要实现目的:设置初始SP设置初始PC=Reset_Handler设置向量表入口地址,并初始化向量表调用SystemInit,把系统时钟配制成72M,SystemInit在库文件system_stm32f10.c定义调转到标号_main,最终来到C程序文件; Reset handlerReset_Handler PROC EXPORT Re转载 2018-01-17 17:37:47 · 7530 阅读 · 3 评论 -
解析 STM32 的启动过程
一个工程代码总是以main作为入口函数,芯片上电时需要完成软硬件初始化工作,为执行main函数做准备。复位流程下图为MCU的映像文件部分内容:所谓映像文件,就是工程编译完成后生成的bin文件。映像文件起始位置存放中断向量表(Vector Table),然后依次存放程序代码和其他数据。中断向量表的第一项为栈顶指针MSP(Main Stack Pointer)的转载 2018-01-17 16:42:59 · 528 阅读 · 0 评论 -
Linux权限详解(chmod、600、644、666、700、711、755、777、4755、6755、7755)
注:原文转自http://blog.youkuaiyun.com/u013197629/article/details/73608613?locationNum=10&fps=1权限简介Linux系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功。Linux下文件的权限类型一般包括读,写,执行。对应字母为 r、转载 2018-01-05 18:38:59 · 3461 阅读 · 0 评论 -
int main(int argc,char* argv[])详解
argc是命令行总的参数个数 argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数 命令行后面跟的用户输入的参数,比如: int main(int argc, char* argv[]) { int i; for (i = 0; i i++) cout转载 2017-11-13 11:26:39 · 240 阅读 · 0 评论