嵌入式总结-------第九周

一、
(1)信号:
信号是一种向进程发送通知,告诉其某件事情发生了的一种简单通信机制。
(2)信号的产生:
①另一个进程发送信号;
②内核发送信号;
③底层硬件发送信号。
(3)信号列表:常用信号。
信号宏名 信号编号 说明系统 默认处理方式
SIGABRT 6 终止进程,调abort函数是产生 终止,产生cre文件
SIGALRM 14 超时,调用alarm函数时产生 终止
SIGBUS 7 硬件故障 终止,产生core文件
SIGCHLD 17 子进程状态改变 忽略
SIGINT 2 终止进程(ctrl+c) 终止
SIGIO 29 异步通知信号 终止
SIGKILL 9 无条件终止一个进程,不可以被捕获或忽略 终止
SIGPIPE 13 写没有读权限的管道文件时 终止
SIGPOLL 8 轮询事件,涉及POLL机制 终止
SIGQUIT 3 终止进程(ctrl+\) 终止,产生core文件
SIGSEGV 11 无效存储访问(指针错误) 终止,产生core文件
SIGTERM 15 终止,kill PID时,默认发送的就是这个信号 终止
SIGUSR1 10 用户自定义信号1 终止
SIGUSR2 12 用户自定义信号2 终止
(4)信号发送:
int kill(pid_t pid, int sig);
int raise(int sig);
unsigned int alarm(unsigned int seconds);
void abort ();
(5)进程挂起pause
(6)信号处理的方式:
①忽略;
②执行用户需要执行的动作(捕获);
③默认处理。
(7)信号处理API:sighandler_t signal(int signum, sighandler_t handler);
二、线程概述:
(1)线程是任务调度和执行的基本单位。
(2)为什么会有线程?
①进程实现多任务的缺点:
a.进程间切换的计算机资源开销很大,切换效率非常低;
OS是通过虚拟内存机制来实现进程空间独立的,进程在并发运行时需要相互间的切换,切换时必然需要涉及虚拟内存机制的控制,但是虚拟内存机制比较复杂,所以在进行进程间切换时,会耗费高昂的cpu、缓存(cache)、内存等计算机资源,也非常耗费切换时间。
b.进程间数据共享的开销也很大。
当程序涉及多进程时,往往会涉及到进程间的通信,但是由于进程空间的独立性,OS提供了各种各样的通信机制,这些通信机制共同原理就是,通过OS来转发进程间的数据,但是调用OS提供的这些通信机制的函数时,这些OS函数的运行也是需要消耗相当cpu、内存等计算机资源的,同时也很耗费时间。
②线程和进程的关系:
a.线程是进程的一个执行单元,是进程内的调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程;
b.同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间;
c.进程退出,进程中所有线程全部退出;
d.一个进程崩溃后,不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉,所以多进程要比多线程健壮;
e.线程不可能完全替代进程;
f. 线程拥有独立的属性:
每个线程拥有自己独立的线程ID<TID;
每个线程有独立的切换状态;
调度优先级;
有自己独立的函数栈;
自己独立的错误号;
每一个线程有自己独立的信号屏蔽字和未决信号集;
每个线程有自已独立的tack struct结构体。
(3)线程的特点:
①线程切换的开销很低(实质是函数的切换);
②线程通信机制简单(全局变量)。
(4)线程操作:
①线程函数是由谁提供的?
非OS,而是线程库libpthread.a/.so B
线程控制函数有: pthread_create、pthread_join、pthread_detach、pthread_cancel、pthread_ exit等。
②线程库和函数手册的安装:
sudo apt-get install glibc-doc
安装线程库
sudo apt get install manpages posix dev: 安装线程库的函数手册
③线程创建 :
int pthread_create(pthread_t*thread,const pthread_attr_t * attr,void *(*start_ routine)(void *),void *arg);
代码实例:创建两个次线程,主线程和两个次线程一起的向同一个文件中写"hello”“world\n”
④线程退出:
被动退出: int pthread_.cancel(pthread_t thread);
主动退出:void pthread_ exit(void retval); return返回。
注册线程退出处理函数:
void pthread_ cleanup_ push(void ( routine)(void *), void * arg);
void pthread_ cleanup_ pop(int execute);
单线程退出处理函数的几种条件:
如果线程是调用pthread_ exit函数退出的,也会弹栈
如果线程是被别人调用pthread_.canceI取消的,也会弹栈
注: return退出的话,是不会自动弹栈的,要弹栈的话,必须主动调动thread_ cleanup_ pop(!0)。
⑤线程等待:
等待线程的目的:
保证线程的退出顺序:保证一个线程退出并 且回收资源后允许下一个进程退出;
回收线程退出时的资源情况:保证当前线程退出后,创建的新线程不会复用刚才退出线程的地址空间;
获得新线程退出时的结果是否正确的退出返回值,这个有点类似回收僵尸进程的wait,保证不会发生内存泄露等问题。
int pthread_join(pthread_t thread, void **retval);线程资源为什么不采用进程退出之后一起回收?
⑥线程状态:
可结合态:这种状态下的线程是能够被其他进程回收其资源或杀死的;
分离态:这种状态下的线程是不能够被其他线程回收或杀死的:它的存储资源在它终止时由系统自动释放;
默认情况下,线程被创建成可结合的!
如何避免多线程退出导致的内存泄漏?
每个可结合线程需要显示的调用pthread_join回收
将其变成分离态的线程;线程分离函数–pthread_ detach

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值