- 博客(155)
- 收藏
- 关注
转载 大碰撞!当Linux多线程遭遇Linux多进程
本文是描述多进程多线程编程中遇到过的一个坑,并从内核角度分析其原理。这里说的多进程多线程并不是单一的**多进程或多线程**,而是**多进程和多线程**,往往会在写一个大型应用时才会用到多进程多线程的模型。这是怎么样的一个坑呢?假设有下面的代码:童鞋们能分析出来,线程函数```sub_pthread```会被执行多少次么?线程函数打印出来的ID是父进程ID呢?还是子进程ID?还是父子进程都...
2019-08-25 23:02:05
392
原创 知识总结(17):Git
集中式版本控制主要特点是集中存放所有资料,所有人的所有变动都更新到中央服务器中。同时所有相关人员想要进行相关浏览和修改,都需要从中央服务器下载最新版资料才能开展工作,所以对网络比较依赖。如何直接修改忘记下载最新版或者网络断掉,整个工作就会受到影响,适合小项目。分布式版本控制系统的特点就是每一个相关人员的电脑都是关键结点,记录自己的更新和改动,当有网络的时候向整个系统提交更新,每个人都知道我做了...
2019-08-18 18:51:49
347
原创 STL个各个容器的内部实现
vector连续空间(像数组一样),只能向尾端插入,空间可以增长,空间增长是一个非常好性能的事增长三部曲:另觅更大空间 将原数据复制过去 释放原空间三部曲list环形双向链表dequedeque空间是分段连续,给人造成一种连续的假象,每一个元素都是指针,指向另外一段真正连续的空间(称作缓冲区),缓冲区才是真正存放数据的地方,因为他是分段连续的...
2019-08-13 14:25:11
659
原创 LCD驱动
FrameBufferFrameBuffer又叫帧缓冲,是Linux为操作显示设备提供的-一个用户接口。用户应用程序可以通过FrameBuffer透明地访问不同类型的显示设备。从这个方面来说,FrameBuffer是硬件设备的显示缓存区的抽象。Linux抽象出FrameBuffer这个帧缓冲区可以供用户应用程序直接读写,通过更改FrameBuffer中的内容,就可以立刻显示在LCD显示屏上...
2019-08-12 16:56:11
239
原创 setjmp()和longjmp()
C 标准库 -<setjmp.h>setjmp.h头文件定义了宏setjmp() 函数longjmp() 变量类型jmp_bufjmp_buf该变量类型会绕过正常的函数调用和返回规则。jmp_buf这是一个用于存储宏setjmp()和函数longjmp()相关信息的数组类型。宏int setjmp(jmp_buf environm...
2019-08-07 22:57:34
310
原创 宏定义中##和#的作用
##是一个连接符号,用于把参数连在一起#define FOO(arg) my##argint myxy =3;cout<<FOO(xy);//输出3注意:如果##后的参数本身也是一个宏的话,##会阻止这个宏的展开 。#是“字符串化”的意思。出现在宏定义中的#是把跟在后面的参数转换成一个字符串 #define STRCPY(dst...
2019-08-07 16:46:31
248
原创 C语言字符串初始化关于数字
先判断下面的代码: char str1[] = "\0123"; printf("size = %d\n", sizeof(str1));可能你会大声的说出:5有可能你的理由是:第一个:\第二个:0第三个:1第四个:2第五个:3还有可能你的理由是:第一个:\0第二个:1第三个:2第四个:3第五个:\0如果你的理由是最上面那个,那么你应...
2019-08-05 14:53:28
609
原创 实时系统和实时操作系统
实时系统:必须再有限和确定的时间内对外部事件做出响应的信息系统。评判实时系统是处理事件的时间的可预见性和确定性。一个实时系统是指计算的正确性不仅取决于程序的逻辑正确性,也取决于结果产生的时间,如果系统的时间约束条件得不到满足,将会发生系统出错。无论是逻辑还是时序出现偏差,都将引起严重的后果。非实时系统追求系统的平均响应时间和用户使用的方便性。 实时系统主要考虑在最坏情况下系统的行为的可预...
2019-08-02 19:59:55
1772
原创 C++智能指针
什么是智能指针?智能指针的原理将基本类型指针封装为类对象指针(这个类肯定是个模板,以适应不同基本类型的需求),并 在析构函数里编写delete语句删除指针指向的内存空间。智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针。智 能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动被释放,智能指针就是一种栈上创建的对象,函数退出时会调用其析构函数,这个析构...
2019-08-02 14:19:32
207
原创 C语言位段
有时,存储1个信息不必占用1个字节,只需二进制的1个(或多个)位就够用。如果仍然使用结构类型,则造成内存空间的浪费。为此,C语言引入了位段类型。位段的概念与定义所谓位段类型, 是一种特殊的结构类型,其所有成员均以二进制位为单位定义长度,并称成员为位段。例如,CPU的状态寄存器,按位段类型定义如下:struct status{ unsigned sign:1;/*...
2019-08-01 20:01:02
469
原创 VGA、DVI和HDMI三种主机与显示器连接的线缆
1、VGAVGA(视频图形阵列)最早指的是显示器640X480这种显示模式,VGA是一个使用模拟信号的电脑显示标准,这个标准已对于现今的个人电脑市场已经十分过时。即使如此,VGA仍然是最多制造商所共同支持的一个低标准(一般为了节省部分成本的设备都会有这个接口)。2、DVIDVI,即数字视频接口。分为DVI...
2019-08-01 14:04:01
1086
原创 字符串暴力算法和KMP
暴力int index(SqString s,SqString t){ int i=0, j=0; while (i<s.length && j<t.length) { if (s.data[i]==t.data[j]){ //继续匹配下一个字符 i++; //主串和子串依次匹配下一个字符 ...
2019-07-31 09:37:50
266
原创 GNU binutils工具集(1):addr2line
如果使用gcc 作为编译器,那么在开发过程中一定离不开使用与之配套的一个工具集(tool chain),即binutils。工具集中的部分工具除了被gcc在后台使用为我们创建程序文件?外,其他的则有助于方便开发和调试。在binutils工具集中,以下工具是我们在做嵌入式软件开发时需要掌握的。as:是汇编编译器,用于将汇编代码转换为目标文件。 addr2line:用来把程序地址转换为文件名...
2019-07-22 15:17:52
507
原创 C语言标准库函数qsort
qsort 函数包含在<stdlib.h>的头文件里。qsort 函数声明如下:void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *));参数说明如下:base: 要排序的数组 nmemb: 数组中的元素数目 size: ...
2019-07-22 08:21:00
337
原创 Linux用户态与内核态通信的几种方式
Linux内核态与用户态通信的常用方法procfs(/proc) sysctl(/proc/sys) sysfs(/sys) netlink 套接口 ioctl(系统调用) 共享内存procfs(/proc)procfs 是 进程文件系统 的缩写,它本质上是一个伪文件系统,为什么说是 伪 文件系统呢?因为它不占用外部存储空间,只是占用少量的内存,通常是挂载在 /proc 目...
2019-07-17 15:00:32
1180
原创 udev,mdev,devfs,sysfs,uevent之间的关系
什么是Linux设备文件系统首先我们不看定义,定义总是太抽象很难理解,我们先看现象。当我们往开发板上移植了一个新的文件系统之后(假如各种设备驱动也移植好了),启动开发板,我们用串口工具进入开发板,查看系统/dev目录,往往里面没有或者就只有null、console等几个系统必须的设备文件在这儿外,没有任何设备文件了。那我们移植好的各种设备驱动的设备文件怎么没有啊?如果要使用这些...
2019-07-17 13:54:18
998
原创 使用字符串编程的模板
在刷题的过程中总结了一些规律,然后再抽象出模板,方便以后面试用。对函数参数判断一个函数的参数判断是应该最先考虑的,一般判断下面的条件。if (chars == NULL) return 0;if (chars[0] == '\0') return -1;字符串双指针的模板很多时候我们会用双指针从两边遍历字符串,下面就是简单的模板bool is...
2019-07-16 08:55:27
628
原创 Linux的I2C驱动
因为IIC设备种类丰富,如果为每一一个 IIC设备写一个驱动程序,那么Linux内核中关于IIC设备的驱动将非常庞大。这种设计方式不符合软件工程中的代码复用规则,所以需要对IIC设备驱动中的代码进行层次化组织。实现分层后,多个设备(client)可以共用一个驱动(driver),多个驱动可以共用一个适配器(adapter)——————————————————————————————————...
2019-07-15 14:17:57
582
原创 Linux系统调用全过程详解
系统调用(SYSTEM CALL) OS内核中都有一组实现系统功能的过程,系统调用就是对上述过程的调用。编程人员利用系统调用,向OS提出服务请求,由OS代为完成。一般情况下,进程是不能够存取系统内核的。它不能存取内核使用的内存段,也不能调用内核函数,CPU的硬件结构保证了这一点。只有系统调用是一个例外。统调用是用户态进入内核态的唯一入口:一夫当关,万夫莫开。常用系统调用:控制硬...
2019-07-14 16:29:20
2947
原创 二分查找法模板
历史上,二分查找算法虽然思想简单,但引起了人们的足够重视和关注。1、算法和程序设计技术的先驱 Donald Ervin Knuth(中文名:高德纳):Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky ......
2019-07-14 09:54:37
334
原创 Shell学习(1):概述
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Shell 在线工具Shell 脚本Shell 脚本(shell script),是一种为 shell 编写的脚本程序。业界所说的 shell 通常都是指...
2019-07-13 13:33:19
157
原创 虚拟地址、逻辑地址、线性地址、物理地址
虚拟地址 指由程序产生的由段选择符和段内偏移地址组成的地址。 逻辑地址 指由程序产生的段内偏移。有时候直接把逻辑地址当做虚拟地址。 线性地址 指虚拟地址到物理地址变换的中间层,是处理器可寻址的内存空间中的地址。程序代码会产生逻辑地址,也就是段中的偏移地址,加上相应的段基址就成了线性地址。如果开启了分页机制,那么线性地址需要再经过变换,转为为物理地址。如果无分页机制,那么线性地址就是物理地...
2019-07-10 13:27:47
813
原创 为何 C 语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
之前看了很多关亍uboot的分析,其中就有说要为C诧言的运行,准备好堆栈。 而自己在Uboot的start.S汇编代码中,关亍系统初始化,也看到有堆栈指针初始化返个劢作。但 是,从来叧是看到有人说系统初始化要初始化堆栈,即正确给堆栈指针sp赋值,但是却从来没 有看到有人解释,为何要初始化堆栈。所以,接下来的内容,就是绊过一定的探究,试图来解释 一下,为何要初始化堆栈,即: 为何C诧言的函数调用要用...
2019-07-07 10:15:40
637
原创 USB总线学习
USB:UniversalSerialBus(通用串行总线)USB网络采用阶梯式星形拓扑结构。一个USB网络中只能有一个主机。主机内设置了一个根集线器,提供了主机上的初始附属点。主机定时对集线器的状态进行查询。当一个新设备接入集线器时,主机会检测到集线器状态改变,主机发出一个命令使该端口有效并对其进行设置。位于这个端口上的设备进行响应,主机收到关于设备的信息,主机的操作系统确定对这...
2019-07-05 16:56:17
1169
原创 串口通信总结
UART:universal asynchronous receiver and transmitter通用异步收/发器USART:universal synchronous asynchronous receiver and transmitter通用同步/异步收/发器UART:通用异步收发器,全双工串行异步通信,由发送器,接收器,控制单元,波特率发生器等组成。 ...
2019-07-05 10:13:26
919
原创 SPI学习
SPI = Serial Peripheral Interface:串行外围设备接口SPI总线是串行外围设备接口,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线.SPI的通信原理很简单,它以主从方式工作,通常有一个主设备和一个或多个从设备,需要至少4根线。MISO – 主设备数据输出,从设备数据输入 MOSI – 主设备数据输入,从设备数据输...
2019-07-05 10:11:27
748
原创 I2C学习
串行半双工,每个IIC器件都有一个地址,i2C总线在IC之间进行双向数据传送,典型速度100Kbit/S,快速模式达400Kbit/S,后来增加了高速模式达3.4Mbit/S。它只有两根双向信号线。一根是数据线SDA(serial data I/O),另一根是时钟线SCL(serial clock)。1 数据位的有效性规定:SCL为高电平期间,数据线上的数据必须保持稳定,只有S...
2019-07-05 10:10:04
885
原创 C++类型萃取(traits)技术
STL简述STL(Standard Template Library)是C++泛型编程(template技术)的集大成者, 迭代器在STL中发挥重要的作用. 在STL中有3个重要的概念:容器:包括顺序容器(vector, list)和关联容器(map, set) 算法:各种操作容器的函数模版(count, count_if) 迭代器:作为算法和容器的桥梁, 让算法独立于容器发展...
2019-07-03 16:00:41
2345
原创 C++模板全特化和偏特化
模板特化,任何针对模板参数进一步进行条件限制设计的特化版本。《泛型思维》全特化就是全部特化,即针对所有的模板参数进行特化。《c++ primer》偏特化就是部分特化,即针对部分模板参数进行特化。《c++ primer》全特化和偏特化的定义不是很严格,所以有的时候不容易让人理解。全特化#include <iostream>using namespace std;...
2019-07-03 11:09:21
258
原创 STL学习(21):容器适配器
容器适配器不是二级容器,它可以在一级容器的基础上再次封装如:queue<string, deque<string> > t; //在双端队列上封装stack<int, vector<int> > s; //在vector上封装适配器并不是第一类容器,因为它们并没有提供与元素的保存形式有关的真正数据结构实现,并且适配器...
2019-07-02 18:05:55
383
原创 C++错误总结
在Linux上编译出现undefined reference to `std::cout'gcc 后面要加 -lstdc++ 或者用g++
2019-07-01 10:27:20
195
原创 STL学习(20):自己常用的功能总结
变异算法对一个容器进行逆序vector<int> ret_arr;reverse(ret_arr.begin(), ret_arr.end());
2019-07-01 07:23:01
208
原创 函数调用栈空间以及fp寄存器
R13(SP):堆栈指针R14(LR):程序链接寄存器:存放子程序调用返回的地址,或者异常返回的地址R15(PC):程序计数器:指向当前指令的下两条指令的地址。CPSR:当前程序状态寄存器SPSR:备份程序状态寄存器Arm上函数调用的规则在ARM System Developer's Guide文档中的ATPCS部分有详细的定义,这里主要通过函数调用过程中函数栈的情况来说明fp...
2019-06-27 14:01:11
678
原创 CodeBlocks实现C文件生成汇编文件
所有的重点只是在“设置—>编译器和调试器设置—>全局编译器设置”。首先选择“可执行工具链”,将动态库链接器修改为“gcc.exe”;然后选择“其他设置”,将“编译器记录”选用“完整的命令行”:接着点击下面“高级选项”,选“是”进入“编译器高级选项”;整个过程围绕gcc-Etest.c-otest.i gcc-Stest.i-o...
2019-06-26 21:10:41
2712
2
原创 如果你这样回答“什么是线程安全”,面试官都会对你刮目相看
不是线程的安全面试官问:“什么是线程安全”,如果你不能很好的回答,那就请往下看吧。论语中有句话叫“学而优则仕”,相信很多人都觉得是“学习好了可以做官”。然而,这样理解却是错的。切记望文生义。同理,“线程安全”也不是指线程的安全,而是指内存的安全。为什么如此说呢?这和操作系统有关。目前主流操作系统都是多任务的,即多个进程同时运行。为了保证安全,每个进程只能访问分配给自己的内存空间...
2019-06-26 20:26:43
169
原创 内存的分段和分页机制
内存分段一个 C 编译器可能会创建如下段:,代码 全局变量 堆(内存从堆上分配) 每个线程使用的栈 标准的C库段式存储管理地址变换机构逻辑地址 = 段的基地址 + 段内地址 程序中各个段对应的情况图 内存分页基...
2019-06-26 16:55:50
1881
1
原创 C++的布局new操作符
传统的new操作符只能在动态内存中得到空间,如果我们想要重一个静态内存中得到一个空间,该怎么做呢?就用布局new操作符#include <iostream>#include <new>using namespace std;int main(){ char buffer[10]; char *p = new (buffer) char[sizeof(b...
2019-06-26 10:57:29
683
原创 准确的延时函数
CLOCKS_PER_SEC:表示每秒钟包含多少个时钟单位clock():表示当前时钟数#include <iostream>#include <ctime>using namespace std;void print_time(void);time_t timep;int main(){ clock_t delay = 10 * CLOCK...
2019-06-26 10:21:32
523
原创 同样学习Linux, 为何差别这么大? - 论打通Linux进程和内存管理任督二脉
我在多年的工程生涯中发现很多工程师碰到一个共性的问题:Linux工程师很多,甚至有很多有多年工作经验,但是对一些关键概念的理解非常模糊,比如不理解CPU、内存资源等的真正分布,具体的工作机制,这使得他们对很多问题的分析都摸不到方向。比如进程的调度延时是多少?Linux能否硬实时?多核下多线程如何执行?系统的内存究竟耗到哪里去了?我写的应用程序究竟耗了多少内存?什么是内存泄漏,如何判定内存是否真的泄...
2019-06-24 18:09:56
215
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人