2

操作系统死锁

最近看了一套北大老师的《操作系统原理》课程,发现很有启发,特意转载过来。希望能够帮助更多程序员解开诸如 并发,IO,死锁,文件系统,内存管理等等核心技术问题。#程序员#

数据库死锁,每天都出现这种问题,应该怎样从根源解决?现在天天被投诉说,系统很慢,这里查不了数,那里怎样。

遇到慢这种情况,其实我们也很无奈。服务器升级过不久,短时间不会升级的。另外太多人使用,查询的时间过长等等原因。

目前处理办法就是,将进程关掉。这样就没有阻塞和死锁。但是,踢掉也没多大用处,很快又死锁了。

怎么搞?没法搞了吧?

程序员徒弟小杨非常好学,虽然工作时间不长,但经常问我一些非常有意思的问题。今天他就问了一个问题:慢sql会引起死锁吗?

听过死锁的程序员很多,但真正理解了的不多。虽然很多人工作中遇到死锁的机会不多,但面试的时候还是很多人会被问到的。今天我就给大家通俗易懂地介绍下什么是死锁吧,同学们,板凳坐稳了,我们开始了[呲牙]。

和死锁比较类似的一个生活中的例子:就像两个人打架,互相掐住了对方的脖子,谁都不肯先放手,都想等对方先放手自己再放,结果可想而知。

死锁的概念应该很多人会背:当并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态。

概念有点抽象,还是用图来说明比较直白,我做了一张mysql数据库里发生死锁情况的图(如图)。

这张图的场景其实很简单,事务1更新两条数据,事务2也更新了两条数据,但注意这四条更新语句执行的时机和顺序:事务1更新t表里id=1的行 —> 事务2更新t表里id=2的行 —> 事务1更新t表里id=2的行 —> 事务2更新t表里id=1的行。

大家应该都知道mysql(InnoDB引擎)在更新数据的时候是会加锁的,事务1在等待事务2释放 id=2 的行锁,而事务2在等待事务1释放 id=1 的行锁。 事务1和事务2在互相等待对方的资源释放,就是进入了死锁状态。

今天我是用个简单mysql数据库的例子来解释了什么是死锁,其他的多线程语言比如java等涉及到死锁的原理其实也是一样的,理解了数据库发生死锁的场景理解其他的死锁就很容易了。

听了我的讲解,小杨高兴地点了点头,同学们,你们理解了没,喜欢的话来个关注,后面还有。

旁边做网管&运维的同事说,连谷歌都宕机了,所以我们小网站上周末的宕机事故就显得可以原谅了,我们宕机的原因是数据库太大导致备份时间长而产生了数据死锁。

#谷歌服务器宕机原因找到了#,是用户登录验证系统的存储配额Bug导致空间满,继而出现谷歌产品某段时间内全球用户都无法使用,这是灾难性的事故。我虽然没受到任何影响,还是吃了一回瓜。

微软、亚马逊、Facebook、腾讯、阿里和百度等互联网巨头的软件产品也都出现过类似事件,这是高科技软件公司无法避免的偶然事故么?有没有什么一劳永逸的方法能避开呢?

有价值的科技真知将被更多人习得,关注我一起评论与分享,把有趣有料有用的知识分享给更多人,让知识成为力量。

一同事在公司充当研发救火员的角色,部门项目生产环境上出现问题,项目的研发人员开发环境和测试环境都无法复现,实在搞不定了就找他。他也都通过日志和相关代码把问题搞定了,基本上生产问题都和并发有关系。有些简单的存储过程id自增函数未考虑并发,并发引起的死锁,有些代码他给我看了一下,一些函数上千行,不少系统是十年前的。最坑的是这种救火情况经常是该系统问题晚上必须搞定。

#西安头条# 有位行业内朋友分析:

本次崩溃,官方的说法是用户访问量暴增导致的,这块就有点疑问了,前几天使用量也很大,为什么没有出现崩溃,如果真的是流量太大,扩容是能在较短时间恢复的,为什么十几个小时才恢复。

朋友认为,认为有下面三点可能:第一、一码通被黑客DDOS攻击(可能性低),也就是流量攻击,异常的请求将带宽占满,正常用户请求不能触达到服务器,也就是打不开页面的原因;第二、这几天临时增加了新功能上线,没有充分的压测,导致BUG被带入了线上(可能性最大),然后开发人员不断打补丁。因为访问量太大了,各个微服务被逐个击溃,这种情况用户会因为异常不断刷新不断刷新,服务器压力是平常的几百倍,最大的问题是导致了数据库的崩溃,CPU100%,连接数异常等等,总结下就是“雪崩”;第三、最近一周数据量暴增,达到了数据库的瓶颈(可能性也比较大),这也是本次修复这么久没成功的原因,数据库问题要解决是非常复杂的,甚至要进行架构和代码的重构,因此修复的时间会比较久。就在刚才我发现,一码通已经不显示是否已经注射疫苗,这块就是进行了查询逻辑的简化,将服务器的查询压力降到最低。

结合一码通崩溃案例,给我们也响了个警钟,要防患以未然,要做到:1、坚决不能在高峰期更新系统,必须更新的情况要做好充分的压测准备;2、做好监控,系统压力超过70%就不能抱侥幸心理了,这时候就必须进行服务扩容;3、多使用缓存和文档数据库降低mysql数据库的压力,mysql数据库必须保护好,不能被高并发击穿;4、数据库表中数据大于100万就必须进行拆分了,拆成小表,防止大表死锁;5、每个月进行代码review,不能让垃圾代码在线上跑。

运维巡检需要有什么内容呢?

数据库巡检:磁盘空间、检查系统日志和数据库应用日志、备份检查、检查数据库死锁、slowlog检查。

服务器巡检:硬件检查、磁盘空间检查、检查系统日志、内存使用率、CPU 负载、使用率、监控客户端是否正常。

每天自动生成巡检报告,需要的是一个结果,不用太详细的记录,只要保证服务正常即可。

#运维#

C#复习学习笔记

最近用到串口数据接收和图形显示,就复习和学习C#编程做些笔记。

1、C#作为微软.NET平台的一个编程工具,随着.NET不断完善和升级也是不断增加新的概念和工具。注意随着其发展,早期的一些技术细节由于不稳定、有替代等原因逐渐被摒弃。关于其整体的概貌参见相关书籍。

2、单就串口开发来看,微软的.NET平台与自家的Windows操作系统结合得更好些,资源相对多些。至于网络编程、数据库开发等联系不紧密的部分暂不讨论。

3、关于面向对象编程(OOP),相关书籍里有丰富的概念类比和理论阐述,应该重新反思和认识。其核心是类(Class),通过抽象、封装、继承、多态等手段来灵活地映射现实世界,消减了复杂度增加了可控性。使得避免“重复造轮子”,可以像搭积木一样解决现实的编程问题。单从编程角度来看,类的设计是抽象的,真正在计算机内存里运行需要实例化。因此程序中会出现大量的关键字“new”。

4、虽然C#是高级语言,但掌握计算机原理和汇编语言仍然是有益的,个人觉得[1]中从堆栈角度来阐述非常棒。如果有其它语言(C、Java等)编程基础,理解C#中的数据类型、运算符、函数(方法)、参数等等更容易,因为这些都受计算机结构和原理的约束。

5、C#的几个特色和难点,便于理解总结如下:

1)异常。C#有独特的内存垃圾处理机制,一定程度避免了C++等语言内存处理的复杂性。另外,通过异常处理机制可以更好地加强控制和发现错误。不过何时何地设置异常处理是一件需要实际反复揣摩的事。

2)委托和事件。[1]中把委托视为指针还是挺恰当的。指针是个很底层的概念,本质上是指向内存上的地址。处理不当单片机是程序“跑飞”,PC机上程序故障后果也是很严重的。委托提供了一种更安全的方法机制,可以灵活地增减,多个委托还可以“批处理”(多播委托)。而事件相当于带触发机制的委托,比如点个按钮完成某个动作。事件在C#中被大量使用。

3)接口与泛型。接口相当于提供一个简单框架,具体的实现交给用户。也是一种规范性和灵活性的结合。泛型正如[6]中所言,是数据类型的模板化,处理机制和方法固定,但角色待定。

4)多线程。其本质还是多任务状态下对计算机资源的分配和管理。有意思的是讨论多线程的书籍不多,大多是早期的作品。其中有大量与操作系统相关的概念,如进程与线程、调度策略、优先级、死锁、线程池等等。在某些应用中(比如串口)还是有必要考虑的。

5)其它。C#提供了丰富的窗体控件和工具,很容易设计出漂亮的界面,其背后的灵魂还是事件处理机制。另外,在文件处理和绘图方面处理等方面也采用了一些特殊有效的方法和手段,比如流的概念、双缓冲技术。

最后,C#参考书籍较多,有的随.NET升级形成系列,不过注意有些部分改动较大。另外国人的良心作品还是很有参考价值的,如[5]—[8].

2021.08.01

 

参考资料:(书籍读秀格式)

[1] (美)索利斯著;苏林等译.C# 4.0图解教程. 

[2] (美)内格尔等著. C#高级编程 C# 5.0 & .NET 4.5.1 第9版

[3] (美)特罗尔森著. C#与.NET4高级程序设计(第5版)

[4] (美)KarliWatso,(美)ChristianNagel著. C#入门经典 第5版

[5] 张子阳著. NET之美:NET关键技术深入解析

[6] 金旭亮著. .NET4.0面向对象编程漫谈 基础篇

[7] 金旭亮著. .NET4.0面向对象编程漫谈 应用篇

[8] 梁斌玉编译. 叩响C#之门

嵌入式数据库 LMDB

超快速、超紧凑、防崩溃、键值、嵌入式数据存储

闪电内存映射数据库

Symas LMDB 是我们为 OpenLDAP 项目开发的速度极快、内存效率极高的数据库。通过内存映射文件,LMDB 具有纯内存数据库的读取性能,同时保留了标准基于磁盘的数据库的持久性。

最重要的是,只有 32KB 的目标代码,LMDB 可能看起来很小。但它是正确的 32KB。紧凑和高效是硬币的两面;这就是 LMDB 如此强大的部分原因。

探索能力

有序映射接口

      键总是排序的;支持范围查找

完全事务性

      具有 MVCC

读取器/写入器事务的完整 ACID 语义

      读取者不会阻止写入者;writers 不会阻塞 reader

完全序列化的 writers

      写入总是无死锁

极其便宜的读取事务

      可以不使用 malloc 或任何其他阻塞调用执行

支持多线程和多进程并发

      环境可以由同一主机上的多个进程打开

多个子数据库可以创建

      事务覆盖所有子数据库

内存映射

      允许零拷贝查找和迭代

免维护

      无需外部进程或后台清理或

压缩

      无需日志或崩溃恢复过程

无需应用程序级缓存

      LMDB 充分利用操作系统的缓冲区缓存

32KB 的目标代码和 6KLOC 的 C

      适合 CPU L1 缓存以获得最佳性能

管道和过滤器软件架构

该软件体系结构模式将执行复杂处理的任务分解为一系列可重复使用的独立元素,其中处理将逐步执行。

有四个主要组成部分:

数据源:原始未处理数据

数据接收器:最终处理的数据

过滤器:执行处理的组件

管道:将数据从数据源传递到过滤器,或从过滤器传递到另一个过滤器,或从过滤器传递到数据接收器的组件

优点:

由于处理过程直观,适合于需要清晰,系统的步骤才能转换连续数据的处理

只要数据输入和数据输出保持相同,就可以轻松修改每个过滤器

过滤器是可重用的,旧过滤器可以替换为新过滤器,或者可以轻松地将新过滤器插入处理流程中-只要过滤器之间的数据输入和输出兼容

每个组件都实现为单独的,独立的任务,因此自然而然地将关注点分离

缺点:

在整个管道和过滤器系统中传递完整的数据集效率低下且不便,因为并非每个组件都需要完整的数据集

如果组件之间的途中数据丢失,则可靠性可能是一个问题。

筛选器过多可能会减慢您的应用程序的速度,如果一个特定的筛选器处理缓慢或失败,则会导致瓶颈或死锁

原文:网页链接

#每天读一段《经济学人》# #读书笔记#

Facebook用户本周经历了长时间的网络奔溃。Facebook 社交媒体平台及其子公司 WhatsApp 和 Instagram 宕机数小时。该公司股价周一下跌了 4.9%。它将责任归咎于内部故障,并表示没有证据显示用户的数据被泄露。

Facebook users experienced a long outage this week. The social­media platform and its subsidiaries, WhatsApp and Instagram, were down for several hours. The firm’s share price fell by 4.9%>

某同学:蚂蚁金服Java社招,常见的面试题分享,难度一般。

一,常规类:

1.自我介绍

2.离职原因

3.工作内容

4.职业规划

二.技术类:

1.介绍一个成功的项目,有什么挑战?工作有哪些亮点,解决了什么技术问题?

2.详细解释微服务,如何实现服务发现与注册,如果某个服务挂掉,如何通知调用者?

3.如何写出健壮的代码?项目中如何做的日志打印?讲讲领域模型设计(DDD)?

4、数据异步处理如何实现,服务如何拆分,数据统计为何增量统计?

5、有没有做过系统性能提升?讲一下关键的改进点?

6、为什么使用微服务?dubbo和springcloud是怎么选择的?

7、mysql事务隔离级别?什么情况下会出现幻读?mysql生产环境遇到过死锁吗,怎么理解死锁?

8、mysql 怎么做的分库分表,有没有遇到跨库查询问题?mysql 慢查询怎么解决的?

9、mysql的版本控制如何实现的?行级别锁添加和释放的时机?

10、索引结构,b+树较其他b树和红黑树的优势?

11、联合索引的树b+树长什么样子?为什么是索引最左匹配原则?B+树查询的时间复杂度?

12、mybatis的二级缓存是怎么实现的?二级缓存和一级缓存是存了哪些数据?

13、熔断限流怎么做的,hystrix解决了什么问题?hystrix怎么实现的?

14、项目中接口幂等性的实现?通过令牌保证接口幂等性过程的描述?令牌的生成和删除?

15、讲一下springmvc的原理?Spring用到哪些设计模式?

16、spring cloud 与spring什么关系?了解springboot的自动装配原理吗?

17、spring的循环依赖,怎么解决的,为什么需要加个三级缓存?

18、redis支持的数据结构?redis如何实现string,这样实现有什么好处?

19、RDB和AOF都是什么,AOF日志量太大时redis如何处理?

20、redis key过期时间内部存储结构及实现?redis的过期淘汰机制有哪些?

21、redis 集群了解哪些?redis 数据如何做的备份?

22、如何使用redis实现一个优先级队列?

23、缓存穿透和缓存雪崩及解决办法?布隆过滤器的基本原理?

24、zookeeper集群的角色?角色的区别及切换过程?zab选举的具体过程?

25、说一下HashMap的数据结构?hashmap的rehash过程?jdk1.8hashmap有哪些改进?

26.低代码方向的应用。

为什么 Rust 获得如此厚爱。

真正全新和深思熟虑的特性

当一些新语言只是在现有的概念上锦上添花,以及将它们变得更易使用时,有几个用户感觉 Rust 真正对编程语言做了一些实际性的创新,而不只是一些表面华丽的东东,他们感觉 Rust 的设计选择解决了现代编程语言中的一些困难问题。

ZiCog: “Rust 是我专业编程 40 年来用过的一打语言中的唯一一个引入了真正全新特性的语言。就是在一个编译型的、没有垃圾回收或复杂运行时的、货真价实的系统编程语言中,实现内存使用安全的这一整套功能。

Rust 看起来像是一个被用户体验设计师开发的编程语言。他们对这个语言有一个清晰的视野,会仔细选择把什么添加到语言中,哪些会回炉重造,同时也会聆听社区小伙伴真正想要什么。没有马马虎虎的地方(没有没系紧的地方),整体上是连贯一致的,能完美支撑开发者的工作流。”

Jay Oster, PubNub 架构师: “除了安全和性能,我们还有:

泛型;

特征;

代数类型;

函数式和命令式范式;

可能是世界上最好的依赖管理和构建工具,实际上解决了‘依赖地狱’问题;

对内嵌文档、测试和性能评测的美妙支持;

一个大的且正在生长的库、抽象、工具生态;

过程宏;

与已有代码的 FFI 交互性;

支持一打平台(更多的在路上!);

对开发者体验是正向的、毋庸置疑的满足。

Rust 是唯一一个下面所有框框都打勾的语言:

内存安全

类型安全

消除数据竞争

使用前编译

建立(并且鼓励)在零抽象之上

最小的运行时(无停止世界的垃圾搜集器,无 JIT 编译器,无 VM)

低内存占用(程序可以运行在资源受限的环境,比如小的微控制器)

裸金属目标(比如,写一个 OS 内核或者设备驱动,把 Rust 当一个 ‘高层’汇编器使用)”

daboross:“编译时保证:当我想到‘静态类型语言’的时候,我会想到 Java, 或 C#,或者比如像 TypeScript。它们提供编译时的保证,保证你的代码有正确的类型,将一些运行时的错误转移到编译时。Rust 在这上面又前进了一大步!编译时检查扩展到了线程安全、所有权语义、有效性验证。

枚举意味着,我可以在编译时,声明我的数据取值的变体集合,然后当我访问那些数据时,我被强制要求考虑所有可能性。特征意味着当我的代码被模板化/泛型化时,我可以精确知道我能做哪些事情。

Rust 向后兼容做得非常好。我可以运行用 Rust 1.0 写的代码。同样的,我可以继续放心写代码,这些代码在我下次升级 Rust 的时候,不需要再改动。

并且不止是 Rust 本身——这个语言也让所有库具有了同样的保证。考虑如下两点:

类型检查的时候,只会考虑函数签名,而不依赖具体的实现来确定调用者是否是正确的(像你在 Scala, 或 Haskell 中做的那样)

通篇的类型系统意味着对接口不正确的使用会变成一个类型错误,而不是运行时错误

因为这两件事情,库可以 100% 保证当发布一个新接口的时候,能维持向后兼容性。在 Python, Java, Javascript,甚至 Scala 或 Haskell 中,如果你想保证向后兼容性,你需要在事物的实现上付出额外的注意力。而在 Rust 中,这是轻松的:如果你没有改变函数签名,那它就是相同的。”

Peter Varo: “Rust 有一个很香的地方:它像 C 和 C++ 那样底层,因此也具有底层的这些优势(比如,控制、大小、速度等)。同时呢,它又像 Haskell 那样高层,自带令人吃惊的大量功能传承。它还是命令式的,所以容易被大多数人上手。然后它又像 Python 一样灵活,比如,'鸭子类型(duck-typing)'的概念出现在编译时(比如,特征限定),然后它又没有陈旧的面向对象模型以及由这个模型导致的各种出名的问题。

最后但很重要的是,还有一连串的东西被包含进来:精简短小的语法,语言提供的数目不多的特性,标准库及其一致性,高质量的文档的集成,包括对初学者和高级用户都适用的学习材料,这些都是促成因素。”

blonk: “有了 Rust/Cargo,我可以聚焦到实际的代码上,而不是把精力花在构建系统上。不需要再花一整天阅读另一个构建系统的资料。Rust 的交叉编译是如此的简单和愉快,当你知道怎么操作它时,你忍不住会想‘等等,我是不是遗漏了什么’。

若你从外面看 Rust,你往往只会听到空洞的口号,但当你开始使用它时,你会相当惊奇地发现这里面有很多干货:

当你花费时间与编译器做斗争让你的代码编译通过,你反而节省了调试代码的时间。

你不再恐惧大的重构。一旦你的重构代码通过编译,它就像预期的那样工作。

你强迫自己做了正确的多线程编程(好吧,你仍然会遇到死锁的情况,但是那种让程序崩溃的缺陷很难再出现了)

本文来自网络,不代表本站立场。转载请注明出处: https://tj.jiuquan.cc/a-2138336/
1
上一篇操作系统正版(操作系统正版软件报价)
下一篇 操作系统汤小丹(计算机操作系统汤小丹慕课版)

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: alzn66@foxmail.com

关注微信

微信扫一扫关注我们

返回顶部