事件机制
1、同步阻塞(bio)、同步非阻塞(nio)、select、poll、epoll、信号驱动式io、异步io1.1 同步阻塞1、阻塞式IO,客户端发送请求,服务端接收请求,服务端处理请求,服务端返回结果,客户端接收结果。
客户端会先去访问文件描述符状态,如果文件描述符就绪,则读取数据;如果文件描述符未就绪,则会阻塞等待。数据经过网卡,dma拷贝到内核环形缓冲区后,触发一个中断,将文件描述符改到就绪态,将数据拷贝到用户空间,然后返回。
1.2 同步非阻塞相比与阻塞式IO,非阻塞式IO在等待数据就绪时不会阻塞。直接在发送或者读的时候返回负1,然后通过轮询的方式来检查数据是否就绪。注意文件描述符是需要同步内核的本质上,也还是会阻塞,读的时候就是阻塞的,只不过是在等待的过程中没有阻塞
1.3 selectselect本身是阻塞的,它通过一个数组,将一组文件描述符加入到这个数组中,然后发给内核,内核去同步有没有写或者读事件,如果有,就将对应数据的描述符位置为1,然后返回。这样就知道那个文件描述符就绪了。select的缺点是每次都要将所有的文件描述符都发给内核,然后内核再去同步。
说明select这 ...
makefile语法
学习环境搭建Linux(以Ubuntu为例)1sudo apt install gcc g++ make
Windows学习与演示过程以Windows为主,Windows上装MinGW环境,MinGW官网: https://www.mingw-w64.org/之前我们提过两个版本的环境,MingW-W64-builds和w64devkit推荐使用w64devkit套件,里面工具比较齐全,还提供模拟了许多Linux命令,用这个套件环境来学习可以保持在Linux与Windows上Makefile书写方式一致。以下是w64devkit与其他包一些命令的区别
w64devkit(模拟Linux)
MingW-W64-builds或其他套件(Windows cmd命令)
make
mingw32-make
cc
gcc
rm
del
touch
ls
dir
sh
mv
cp
copy/xcopy
sed
学习材料make官方文档: https://www.gnu.org/software/make/manual/make.ht ...
新进程创建为什么要通过fork后execve方式创建
在 Unix/Linux 系统中,新进程通过 fork() 后 execve()(或 exec 系列函数)的方式创建,是一种经过长期实践验证的经典设计,核心原因在于分离进程创建与程序加载的职责,同时兼顾灵活性、效率和历史设计哲学。
1. 分工明确:分离”复制进程”与”替换程序”
fork() 的作用是创建一个与父进程几乎完全相同的子进程:子进程会复制父进程的地址空间(代码段、数据段、堆、栈)、文件描述符、信号处理方式等大部分属性,唯一显著区别是进程 ID(PID)和父进程 ID(PPID)。
execve() 的作用是用新程序替换当前进程的地址空间:它会加载新的可执行文件,覆盖原进程的代码、数据、堆、栈,仅保留进程 ID 等少数核心属性(如 PID、文件描述符表)。
这种”先复制、再替换”的分离设计,遵循了 Unix “单一职责”的哲学——每个系统调用只做一件事,却能组合出强大的功能。
2. 灵活性:允许子进程在执行新程序前”自定义配置”在 fork() 之后、execve() 之前,子进程可以做一系列自定义操作,再加载新程序。这是这种设计最核心的优势,例如:
修改文件描 ...
linuxC
1 、系统调用和库函数1-1 、库函数由两类函数组成
1、不需要调用系统调用,不需要切换到内核空间即可完成函数的全部功能,并且将结果反馈给应用程序,如strcpy、bzero等字符串操作函数。
2、需要调用系统调用,需要切换到内核空间,这类函数通过封装的系统调用去实现相应的功能,如printf、fread等
1-2、系统调用与库函数的关系
并不是所有系统调用都被封装成为库函数,
系统提供的很多功能必须通过系统调用才能实现。
也就是大部分的库函数都是由系统调用封装而来。
只不过库函数拥有缓冲区,
减少了系统调用的次数
1-2-1、系统调用特点
系统调用是需要时间的,
频繁的系统调用会降低程序的运行效率。
当运行内核代码时,
cpu工作在内核态,
在系统调用发生前需要保存用户态的栈和内存环境,
然后转入内核态工作。
结束调用后又返回用户态。
1-2-2、库函数的好处
库函数访问文件的时候需要根据需要设置不同类型的缓存区,
从而减少了直接调用io系统调用
的次数,
提高了访问的效率。
如:应用程序调用printf时,如下图
1、进程当一个系统启动后,会先 ...
chrony工具移植
chrony工具移植123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960#!/bin/bash# 设置交叉编译环境export PATH=/usr/local/go/bin:$PATHexport CROSS_COMPILE=/home/tuling/project/optTL/fuhanV500/arm-fhv512c-linux-uclibcgnueabihf-b2/bin/arm-fhv512c-linux-uclibcgnueabihf-export PATH=/home/tuling/project/optTL/fuhanV500/arm-fhv512c-linux-uclibcgnueabihf-b2/bin:$PATHname=arm-fhv512c-linux-uclibcgnueabihf# 设置编译器和链接器export CC=${name}-gccexport CXX=$ ...
进程
2、进程调度多任务系统有两种类型:抢占式多任务和非抢占式多任务系统。linux是抢占式内核。早期有非抢占式版本。进程调度有两种算法:O(1)和反转楼梯最后期限调度算法。O(1)算法:这个算法在交互式桌面上表现不佳,后来转为linux的交互式桌面提出了反转楼梯最后期限调度算法。进程可分为I/O消耗型和CPU消耗型进程。
2-1、程序调度优先级linux系统偏向于调度I/O消耗型进程,I/O消耗型进程的优先级比CPU消耗型进程高。但并不是忽略cpu消耗型进程。linux有设定两种优先级配置。一种时用nice值来设置优先级,优先级越大,nice值越小。范围是-20到19,-20是最高优先级,19是最低优先级。使用ps -el查看进程表,其中标记NI就是nice值。第二种是实时优先级,ps -eo pid,rtprio,comm命令可以查看实时优先级。这两个优先级相互不统筹。
2-2、时间片时间片会影响I/O消耗型和cpu消耗型。I/O消耗性不需要长时间片,cpu消耗型则越长越好,以增加高速缓冲的命中率。linux并不是直接分配时间片到进程,而 ...
系统调用
1、系统调用号asmlinkageasmlinkage:asmlinkage 是 Linux 内核中用于定义系统调用的函数的修饰符。asmlinkage 表示该函数是内核函数,不能被用户空间程序调用。只从栈中获取参数,返回结果也只通过栈返回。在 Linux 系统中,每个系统调用都有一个唯一的系统调用号,用户空间程序通过这些系统调用号来请求内核执行特定的系统调用。不同的 Linux 内核版本和架构(如 x86、ARM 等)的系统调用号可能会有所不同。以下为你分别介绍常见架构下的部分系统调用及其系统调用号:
x86_64 架构在 x86_64 架构下,系统调用通过 syscall 指令发起,下面是一些常见系统调用及其系统调用号:
系统调用名
系统调用号
功能描述
read
0
从文件描述符读取数据
write
1
向文件描述符写入数据
open
2
打开文件或设备
close
3
关闭文件描述符
stat
4
获取文件状态信息
fstat
5
通过文件描述符获取文件状态信息
lstat
6
获取符号链接的状态信息
poll
7
等待文件描述符上的 I ...
shell语法
shell函数例子 start()和stop()就是函数
1234567891011121314151617181920212223242526272829303132333435363738394041#!/bin/sh## Start logging#SYSLOGD_ARGS=-nKLOGD_ARGS=-n[ -r /etc/default/logging ] && . /etc/default/loggingstart() { printf "Starting logging: " start-stop-daemon -b -S -q -m -p /var/run/syslogd.pid --exec /sbin/syslogd -- $SYSLOGD_ARGS start-stop-daemon -b -S -q -m -p /var/run/klogd.pid --exec /sbin/klogd -- $KLOGD_ARGS echo "OK" ...
AI人工智能深度学习-视觉基础
准备篇rk的sdk编译后,buildrootd的output生成了两个目录,alientek_rv1126存放的是文件系统镜像和交叉编译工具,而alientek_rv1126_recovery存放的是内核kerner,设备树dtb,ramdisk组成的根文件系统。alientek_rv1126的build中的文件是从buildroot中的dl中解压过去的。
rv1126进行学习
1、 图像相关知识点1-1、 RKAIQ宏定义 图像传感器获取的数据是raw数据,没有经过任何处理的图像数据。是光源信号转化为数字信号最原始的数据,如果raw图像没有经过任何的优化,没有经过任何的处理,是无法被人类查阅的。
raw数据是无损画质的图像,但是占的空间很大
1-2、文件系统分区文件系统可以使用ls /dev查看,文件分区分为用户层区和保存一些签名的,内核ubot相关的分区,在linux系统中可以采用以下的方式查看分区信息
12345678910111213141516171819202122一、查看设备节点 `ls /dev/`二、使用 ...
AI人工智能深度学习-正式篇
对与3568没有rkmedia但是有rockit
1、RK宏定义ips模块,有一些芯片内部是有isp模块,有的没有,例如imx6u,一种是编写软件转换,还有也可以找isp芯片。有的摄像头带有isp模块,如ov5640,有的不带im415,不带的无法直接出图。要使用isp,就需要加载rkaiq模块,aiq模块在cmake中定义。
12345if(USE_RKAIQ) find_package(RkAiq REQUIRED) include_directories(${RKAIQ_INCLUDE_DIRS}) add_definitions(-DRKAIQ)endif()
bayer raw 数据,raw数据,同一个意思,因为摄像头拍摄用到了拜耳阵列。拜耳格式有四种BGGR、RGGB、GBRG、GRBG四种。码流:简称视频流isp和ispp就是rkisp2.0模块摄像头拍摄到数据,利用iq文件进行初步调整,得到流到/dev/videoX。RKMedia的rga模块和linux-rga模块一样,是RKMedia去封装linux-rga ...










