笔记 嵌入式Linux C
笔记 嵌入式Linux C
笔记 嵌入式Linux C01 嵌入式Linux C_进程与线程
原创转载链接:https://blog.csdn.net/weixin_45781914/article/details/108916984
进程是资源分配的单元,线程是资源调度的单元。两者就像生活中房子(进程)和房间(线程)的关系。
线程只能属于一个进程,但一个进程可以有多个线程。
1). 通信方式上:
进程间通信,通过管道,共享内存,消息队列,socket,信号量共5种方式。
线程间通信,通过全局变量,锁,文件方式。
2). 执行效率上:
进程在切换时,需要重新把线程移至缓存,耗时大。相较于线程直接从缓存中找要慢很多。二者本制区别是地址切换。
特例补充说明:
前后两个执行的任务都在同一个进程中,则不存在太多的地址切换。不过发生的概率比较低。
Q1:既然线程比进程执行速度块,创建代码的时候,只用线程好了,不用进程可以吗?
A1:不可以。从健壮性和安全性考虑的话,不能只创建线程,而不创建进程。
Q2:什么时候用线程,进程?
A2:从以下三个方面考虑:
判断这个任务和当前进程任务的紧密程度;
该任务崩溃后,影响大不大;
执行效率考虑。
# 01嵌入式Linux C_进程与线程
02 嵌入式Linux C_栈和堆
栈的内存 ,Linux是8KB,由编译器自动分类与释放;
堆的内存,最多申请3GB(进程空间最大为3GB),实际取决于进程实际空间,由程序员手动分配(malloc函数)与释放(free函数)。
栈是自顶向下增长,堆则是自下而上使用。
备注:
栈的大小可以更改,Linux提供ulimit -s指令来对栈的大小进行修改。
Q1:如果系统处于用户态,用malloc函数申请堆的内存,系统崩溃,没有被释放的内存,会不会被释放掉?
A1:会。进程回调,会有的引用和内存会被释放掉。
03 嵌入式Linux C_中断
Q1:为什么有中断?
A1:响应,处理外部设备的特殊事件。
Q2:中断和轮询?区别?选择?
A2:中断时被动的响应外部请求,非实时,不可控;
轮询是主动询问请求,实时,可控。
二者共用(NAPI技术实现),二者适用于不同的场景,在于设备本身的特性。
Q3:中断类型,与异常的区别?
A3:外部中断,内部中断。中断和异常都是处理的一种方式,异常极有可能引发中断,用中断的方式处理当前的异常。
Q4:如何处理中断?中断的应用场景,如何被使用?使用时注意哪些?什么是中断上下文,进程上下文?怎么设计中断?
A4:中断上下文:可以理解为硬件传递过来的这些参数和内核需要保存的一些环境,主要是被中断的进程的环境。
进程上下文:当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。
响应中断时,先现场保持(存储任务,环境),然后布置中断入口。
中断上文响应紧急事务(不可以睡眠,也不可以处理其他调用),返回后,中断上文结束;
中断下文处理不是很紧急的任务(但有实时性要求)。
注意:中断可以及时响应,不代表会及时执行。整个事情完成后才叫中断。
04 嵌入式Linux C_用户态和内核态
Q1:用户态和内核态区别?
A1:资源操作权限不同。
用户态无法调用内核态相关资源,内核态也不会干涉用户态的资源使用,二者相互协作。
运行空间不同。
Linux中0-3GB作为用户态使用,3-4GB作为内核态使用(内核只有一个)。所有的用户态进程共享一个内核,二者不可以互相访问(执行权限不同)。
Q2:内核态能否访问用户空间的一些数据?
A2:可采用短暂更改内核空间的方式。由3-4GB改为0-3GB,访问完后再改回来。
Q3:用户态如何访问内核态,有几种方式?***重点***
A3:系统调用(不同于C函数调用,区分开);中断(中断返回的时候处于内核态);异常。
备注:从用户态到内核态,需要进行权限切换,地址空间切换。
Q4:为什么把系统调用叫做用户态切换到内核态,或内核态帮助用户态执行相应的执行任务,或用户态嵌入到内核态?
A4:每一个任务都有一个结构体记录当前的任务,当做了一个系统调用(通过异常,中断等方式),pid(指向当前CPU正在执行的任务是谁)改变,内核不认识pid,实际任务指向的进程,还是用户态指向的进程且是在内核态执行的。
Q5:用户态和内核态如何通信?
A5:IO-Controler;发消息;socket;文件。
05 嵌入式Linux C_锁
只有有限个人可以占有,锁住的是关键结构,数据,区域。
种类:自旋锁(原子锁),信号量,互斥锁,读写锁。
自旋锁:多个CPU同时进入一个关键的数据结构,锁CPU。禁止了中断,调度,常应用于中断中。
信号量:可以睡眠,可以被调度,不可以用于中断。
备注:自旋锁不可以嵌套互斥量。
扩充:内存屏障,挡住编辑器进行优化,按照设定的顺序执行。当物理存储信息和内存存储的信息是不对称时,有可能是还没有回写造成的。
06 嵌入式Linux C_字节对齐
Q1:为什么结构体本身需要字节对齐?
A1:平台原因(移植原因):
不是所有的硬件平台都能访问任意地址上的任意数据;某些硬件平台只能在某些地址处取特定类型的数据,否则会抛出异常。
性能原因:
数据结构(尤其是栈)应该尽可能在自然边界上对齐,原因在于,为了访问未对齐的内存,处理器需要做两次内存访问,而对齐的内存访问仅需要一次访问。
例题1:结构体,三部分组成,char,int,char,sizeof(结构体) = 12B
解析:字节对齐中,既要数据本身字节对齐,结构体本身也要对齐。
例题2:
#pragma pack(2)
struct AA {
int a; //长度4 > 2 按2对齐;偏移量为0;存放位置区间[0,3]
char b; //长度1 < 2 按1对齐;偏移量为4;存放位置区间[4]
short c; //长度2 = 2 按2对齐;偏移量要提升到2的倍数6;存放位置区间[6,7]
char d; //长度1 < 2 按1对齐;偏移量为7;存放位置区间[8];共九个字节
};
#pragma pack()
扩充:对于同步和异步,单任务时,不需要考虑同步和异步。多任务或进程执行时,才会考虑此问题。
强关联,严格时间关系用同步;弱关联用异步。
07 嵌入式Linux C_实时系统和非实时系统
Q1:区别?判断标准?
A1:实时系统,VxWorks,freeRTOS;非实时系统,Windows,Linux,Android。
嵌入式实时系统:能够准确预估当前任务被执行的时间;如生活中的地铁,汽车则不是。
Q2:实时系统和非实时系统的本制区别?
A2:任务调度方式不同。
大部分实时系统是可抢占式的,高优先级任务优先得到执行(实时操作系统的中断,尽量采用轮询的方式,可控性);非实时操作系统,调度复杂。
使用场景不同。
扩充:看门狗分为软件看门狗和硬件看门狗,通过重启来实现。
08 嵌入式Linux C_TCP UDP
TCP UDP同属于TCP/IP协议(依次是物理层,数据链路层,网路层,传输层和应用层,实际使用)的传输层。
TCP:可靠,构建了可靠的传输通道,双方确认信息;开销大,网络时延不稳定;以数据流的方式传输,建立TCP服务器端口时,需要Accept。
UDP:不可靠;开销小,实时性很好;以报文的方式传输,建立UDP服务器端口时,不需要Accept,只需要IP地址和端口。
第一次:客户端向服务器发送SYN j 包;
第二次:服务器向客户端发送ACK+SYN;
第三次:客户端向服务器发送ACK包。
第一次:客户端向服务器发送FIN报文,请求断开;
第二次:服务器向客户端发送ACK,表示已经收到客户端的请求,还需要等待一下;(收拾一下建立连接的东西,即现场开销,需要一定时间来回收)
第三次:服务器向客户端发送FIN,确认客户端可以断开连接;
第四次:客户端向服务器发送ACK应答。
09 嵌入式Linux C_MTU和MSS
Q1:MTU与MSS区别与联系?
A1:以太网传输时,每次报文传输的大小 <= 1512字节。
MTU(最大传输单元):以太报文中,上限是1512字节。MTU值可以改变。
MSS(最大分节大小):MSS值是MTU值减去TCP,IP头部的报文值(IP,TCP头各至少20B)。即一次可以接收报文的大小。
笔记 嵌入式Linux C相关教程
-
从零开始做自动驾驶定位-学习笔记-3-软件框架
从零开始做自动驾驶定位-学习笔记-3-软件框架 从零开始做自动驾驶定位-学习笔记-3-软件框架 从零开始坐自动驾驶学习笔记,主要参考 任乾老师的知乎 进行实践记录 ubuntu18.04 pcl 1.9 glog ceres 1.4 g2o 编译任乾老师的工程,需要预安装一些库,这里进行踩坑
-
安装乌班图系统,并且演示有趣的linux命令,你还怕对linux无兴趣
安装乌班图系统,并且演示有趣的linux命令,你还怕对linux无兴趣吗 进去系统后配置网络 Ctrl+Alt+T 出现终端 然后开始操作命令行 sudo apt-get install sl 输入命令 发现报错 修改软件源 在设置里 软件源 关闭防火墙 开启ssh 服务 首先是进入超级管理权限 可
-
数据结构学习笔记之——栈和队列
数据结构学习笔记之——栈和队列 栈和队列 1.1、栈的基本概念 1.1.1、栈的定义 栈(Stack) : 只允许在一端进行插入或删除操作的线性表 。首先栈是一种线性表,但是限定这种线性表只能在一端进行插入和删除操作。如图: 栈顶(Top) : 线性表允许进行插入和
-
Python学习笔记交互对话环境IPython
Python学习笔记:交互对话环境IPython 文章目录 一、IPython安装 1、在CMD窗口利用pip安装IPython 2、安装Anaconda,自带了IPython 3、手工下载IPython之后进行安装 二、启动IPython 1、在普通的CMD窗口启动IPython 2、在Anaconda命令窗口里启动IPython 3、
-
linux 意外删除与恢复
linux 意外删除与恢复 virm.sh#!/bin/bash##linux删除huishou=~/.temp(($#==0)){echoNoparaments!;exit1;}if[!-d$huishou];thenmkdir$huishoufiforiin$*doiftest-e$ithencd$(dirname$i)mv-f$(basename$i)$huishou/$(find$(pwd)-maxdepth1-name$(basename$i)|
-
RF24l01模组2.4G发送和接收模式相互切换功能笔记
RF24l01模组,2.4G发送和接收模式相互切换功能笔记 各位网上大神大家好,小编最近使用2.4G模组,在使用过程中发送和接收相互切换后2.4G一直进入“ 达到最大重发次数 ”,将解决方案在此记录,若大家有好的方法可以一起讨论,谢谢! 模组照片 解决方法: 在配
-
Linux 命令之alias
Linux 命令之alias 设置一个别名,即为一个长命令起一个新的名字 alias 查看系统当前所有的别名 alias alias_name=‘origin_command’ alias_name 系统命令自定义的别名 orgin_command 系统命令 注意:这种方式只是临时生效,需要永久生效,需要把这个别名命
-
Linux和UNIX操作系统的关系及区别(详解)
Linux和UNIX操作系统的关系及区别(详解) 摘要: 通过介绍 linux 和 unix 的发展历史,说明 unix 与 Linux 的关系与区别。最后阐述了 unix / Linux 系统的结构(内核层、shell层、应用层)。 UNIX 与 Linux 之间的关系是一个很有意思的话题。在目前主流的服