首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Operating System 05 - 进程通信

尽管借助这些构件我们可以规避最棘手问题, 但仍然难以克服诸多锁缺点: 锁开销过大. 锁是内存系统竞争热点. 出错进程可能正处于加锁状态, 无法释放锁....软件事务内存(STM, Software Transactional Memory) 我们在HaskellGHC实现和基于JVMClojure语言中看到这种机制....STM内存当作传统数据库, 用事务决定何时写入什么内容....这种实现是用乐观方式来规避锁: 一组读写访问视作单个操作, 如果两个进程试图同时访问共享区域, 则各自启动一个事务, 最终只会有一个事务成功....类似对还有Id和Glasgow HaskellI-var和M-var, Concurrent Prolog 并发逻辑变量, 以及Oz数据流变量.

31710

STM32内存扩展应用实现,小内存单片机也能干大事(FSMC+SRAM)

至于IO,我想就不用解释了,就是CPU输入输出端口,可以由CPU控制读写一个个外部引脚,既然可以控制,就有人仿造总线时序,用多个IO来通过软件控制方式来模拟外部总线,比如8051没有SPI接口,...事实上,你也可以用二十几个IO来模拟上面所说三条总线,但每一次读写你都得按照时间顺序来控制这二十几个IO端口,你可以把它编好后写成函数,但仍然是占用CPU大量资源,这就是软件实现弊端,速度慢且占用...此时需要设置时间参数有 2 个: 1) HCLK FSMC_CLK 分频系数(CLKDIV),可以为 2~16 分频; 2)同步突发访问获得第 1 个数据所需要等待延迟(DATLAT)...选用不同时序模型时,需要设置不 同时序参数:         在实际扩展时,根据选用存储器特征确定时序模型,从而确定各时间参数存储器读/写周期参数指标之间计算关系;利用该计算关系和存储芯片数据手册给定参数指标...6 FSMC扩展外部SRAM软件实现 软件主要涉及就是FSMC配置工作,涉及到几个结构体(这里都是以NOR和SRAM为例): 【FSMC_NORSRAMInitTypeDef】:前 13 个基本类型

1.6K30
您找到你想要的搜索结果了吗?
是的
没有找到

STM32内存扩展应用实现,小内存单片机也能干大事(FSMC+SRAM)

至于IO,我想就不用解释了,就是CPU输入输出端口,可以由CPU控制读写一个个外部引脚,既然可以控制,就有人仿造总线时序,用多个IO来通过软件控制方式来模拟外部总线,比如8051没有SPI接口,...事实上,你也可以用二十几个IO来模拟上面所说三条总线,但每一次读写你都得按照时间顺序来控制这二十几个IO端口,你可以把它编好后写成函数,但仍然是占用CPU大量资源,这就是软件实现弊端,速度慢且占用...此时需要设置时间参数有 2 个: 1) HCLK FSMC_CLK 分频系数(CLKDIV),可以为 2~16 分频; 2)同步突发访问获得第 1 个数据所需要等待延迟(DATLAT)...在实际扩展时,根据选用存储器特征确定时序模型,从而确定各时间参数存储器读/写周期参数指标之间计算关系;利用该计算关系和存储芯片数据手册给定参数指标,可计算出 FSMC 所需要各时间参数,从而对时间参数寄存器进行合理配置...6 FSMC扩展外部SRAM软件实现 软件主要涉及就是FSMC配置工作,涉及到几个结构体(这里都是以NOR和SRAM为例): 【FSMC_NORSRAMInitTypeDef】:前 13 个基本类型

1.8K30

从惰性IO说起_Haskell笔记6

一.惰性I/Obuffer Haskell,I/O也是惰性,例如: readThisFile = withFile "....JS不同,Haskell是惰性,所以,实际情况类似于: const EMPTY_LIST = { value: Symbol.for('_EMPTY_LIST_'), tail: () => EMPTY_LIST...bytestring,也没有惰性List内存优势 lazy bytestring就像chunk List(List每个元素都是64K大小strict bytestring),既减少了惰性带来效率影响...-> IO () 实际上,ByteStringString类型在大多数场景可以很容易地互相转换,所以可以先用String实现,在性能不好场景再改成ByteString P.S.更多ByteString...,但一直没有尝试过捕获异常 实际上,与其它主流语言一样,Haskell也有完整异常处理机制 I/O异常 I/O相关场景需要更严谨异常处理,因为内部逻辑相比,外部环境显得更加不可控,不可信赖: 像是打开文件

2.3K30

125. 精读《深度学习 - 函数式之美》

2 概述精读 深度学习是机器学习基于人工神经网络模型一个分支,通过模拟多层神经元自编码神经网络,特征逐步抽象化,这需要多维度、大数据量输入。...然而在生产环境,基于 性能和安全性 考虑,一般会使用函数式语言 Clojure 或 Haskell。 在生产环境,可能要并发出里几百万个参数,因此面临挑战是:如何高效、安全执行这些运算。...Haskell 也有独特优势,它具有类型推断、惰性求值等特性,被认为更适合用于机器学习。 类型推断即 Haskell 类型都是静态,如果试图赋予错误类型会报错。... 2,4,6,8... 无限数组,而 zip 函数将其整合为一个新数组 (1,2),(2,4),(3,6),(4,8)... 这也是无限数组,如果 zip 函数执行完那么程序就会永远执行下去。...3 总结 本文介绍了为什么深度学习更适合使用函数式语言,以及介绍了 Clojure Haskell 语言共性:安全性、高性能,以及各自独有的特性,证明了为何这两种语言更适合用在深度学习

39510

为什么 Haskell 是我们构建生产软件系统首选

例如,在撰写 Haskell 时,无需担心以下问题: 我是否需要检查这个字段是否为空? 如果请求负载缺少字段怎么办? 这个字符串已经被解码为整数了吗? 如果无法这个字符串解码为整数怎么办?...3Haskell 有助于快速开发、无忧重构并具备出色可维护性 Haskell 上述静态类型和纯函数样式结合后,在 Haskell 开发软件速度往往会非常快。...在类方法编码类似规则做法(常见于不具有 sum 类型面向对象语言)相比,这是一组更强大保证。例如,使用上述类型,就无法定义没有应付金额 CustomerInvoice。...简而言之,数量无关紧要,重要是质量。在这一点上,Haskell 社区在整理我前面所述实际用例所需软件包方面做得非常出色。...例如,当一个函数一个元素添加到一个列表时返回一个新列表,并且旧列表使用内存将由垃圾回收器释放。这种不变性好处是它简化了并发编程。

1.3K10

七夕送礼很发愁?自己编写一个区块链送女友吧~

Cofree MerkleF Block 完成两件事:它递归应用 MerkleF 为 Merkle 树所有深度生成一个类型,并且为树每一个节点关联一个 Block 类型注释。...但是为了使用该方法,我们需要一些实际字节进行散列。这意味着我们需要一种序列化反序列化 Blockchain 方法。...下面是序列化反序列化我们所需类型完整代码: 我仅包含了 deserialize serialize 从而使得模块最终结果更为清晰。...让我们将其交给 Data.Binary decode encode 。...没有困难,所以矿工无法证明他们已完成任何工作。 我认为这些都是挖矿问题,因为矿工运行代码需要处理这些问题。 对于#3 我们等到 Networking 来解决. 其余问题可以现在解决。

891160

一个函数自白

Java抽象对象是接口,可以在类型上参数化;Haskell是一种强类型纯函数语言,抽象对象表现为类型类;C++拥有抽象类,连同模版一起完备地提供了参数化抽象对象概念。...在设计过程,当无法预期代码被修改方式时候,会使用反射。...类型匹配是指我得到类型所期待类型不符;或者一个伙伴返回了一个特定类型值,但该值稍后被调用者当作其他类型值使用。...不同类型值通常被分配不同大小内存空间,这意味着当发生类型匹配时,内存可能被重写而变得不一致,这就是这类异常问题所在。...所有现代高级编程语言都有一个类型系统,在开发和执行过程不同节点检测数据类型。静态类型语言如Java 和 Haskell,动态类型如JS,python等等。

75750

什么是好编程语言?

他本想避免这个,但实施起来太容易了,所以他无法抗拒。他还发明了很多好东西,比如 switch 语句和通信顺序、进程思想,它们经常出现在 Go 和 Ada 并发范例。...Haskell 遇到了一个「神秘元组问题」,因为尽管类型定义非常严格,但是每个函数组件可以有不同名称。...Cobol 最初是美国国防部管理行政事务权宜之计。所有临时解决方案一样,60 年后,它仍在强劲发展,主要是用在银行和政府部门。它稳步发展,最新版本是 2014 年。...事务内存,类似于许多语言附加组件,而 Culjure 内置 我不知道我会选哪一个,它们都有各自优势。...然后整个数组发送到提供索引 i 数组模板,在这里我们匹配每个元素。如果是空字符串,则输出索引,否则输出字符串。

2.6K20

编程语言具备哪些特性?

他本想避免这个,但实施起来太容易了,所以他无法抗拒。他还发明了很多好东西,比如 switch 语句和通信顺序、进程思想,它们经常出现在 Go 和 Ada 并发范例。...Haskell 遇到了一个「神秘元组问题」,因为尽管类型定义非常严格,但是每个函数组件可以有不同名称。...Cobol 最初是美国国防部管理行政事务权宜之计。所有临时解决方案一样,60 年后,它仍在强劲发展,主要是用在银行和政府部门。它稳步发展,最新版本是 2014 年。...事务内存,类似于许多语言附加组件,而 Culjure 内置 我不知道我会选哪一个,它们都有各自优势。...然后整个数组发送到提供索引 i 数组模板,在这里我们匹配每个元素。如果是空字符串,则输出索引,否则输出字符串。

2K10

2020-java中级面试题

/NIO IONIO主要区别是什么 ① IO是面向流,NIO是面向缓冲区IO是阻塞,NIO是非阻塞IO无Selector,NIO需要Selector A.精通:①②③ B:熟练:...先byType 再byName @Resource默认是按照名称来装配注入,只有当找不到名称匹配bean才会按照类型来装配注入。...,spring是无法提供事务功能。...其本质是通过AOP功能,对方法前后进行拦截,事务处理功能编织到拦截方法,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。...@Transactional 1、声明式事务最大优点就是不需要在业务逻辑代码掺杂事务管理代码,只需在配置文件做相关事务规则声明或通过@Transactional注解方式,便可以事务规则应用到业务逻辑

39440

【性能系列连载一】开篇:性能测试不可不知“干货”

通常,对服务器端应用程序开展性能测试,是为了验证软件系统是否能够达到预期性能指标,同时发现软件系统存在性能瓶颈,从而实现优化系统目的。 3....通过对比可以发现,不同性能测试类型,其本质差异还是在加压策略上,而采用何种加压策略,就取决于我们实际测试目的,即期望通过性能测试发现什么问题。明白了这一点,性能测试类型差异也就不再容易混淆了。...业务性能指标可以直观地反映被测系统实际性能状况,常用指标项有: 并发用户数 事务吞吐率(TPS/RPS) 事务平均响应时间 事务成功率 而系统资源性能指标,主要是反映整个系统环境硬件资源使用情况,...常用指标包括: 服务器: CPU利用率、处理器队列长度、内存利用率、内存交换页面数、磁盘IO状态、网卡带宽使用情况等; 数据库: 数据库连接数、数据库读写响应时长、数据库读写吞吐量等; 网络: 网络吞吐量...这是因为测试设备在模拟高并发请求过程,设备本身也会存在较高资源消耗,例如CPU、内存、网卡带宽吃满,磁盘IO读写频繁,处理器排队严重等;当出现这类情况后,测试设备本身就会出现瓶颈,无法产生预期并发压力

69220

【译文】【第一章②】Mindshare PCI Express Technology 3.0

然而为了使软件设备交互,Programmed IO仍然是一种必要事务模型。...北桥可以对地址进行译码,以此来识别自己是否是这个事务Target,比如北桥译码后发现地址自己相匹配则认为自己是这个事务Target。...,后面使用dw简写)数据,但是它无法完成整个完整全数据量传输,那么它将会在它无法继续进行传输时断开事务操作连接。...我们无法得知损坏地址信息变成了什么,也无法得知总线上哪个设备匹配上了这个错误地址,所以对于这种情况就不存在能够简单进行错误恢复方法。...因为x86 CPU无法直接访问配置空间,所以它必须通过IO寄存器进行索引(然而在PCI Express引入了一种新方法来访问配置空间,这种新方法是通过配置空间映射入内存地址空间来完成)。

89620

Kotlin版图解Functor、ApplicativeMonad

从 Swift 版翻译而来 Kotlin 版不同是,本文是直接从 Haskell 版原文翻译而来。 这是一个简单值: ? 我们也知道如何一个函数应用到这个值上: ? 这很简单。...另外 Kotlin 有自己表达可选值方式,并非使用 Maybe 类型这种方式,参见空安全。 Functor 当一个值被包装在上下文中时,你无法一个普通函数应用给它: ?...Monad 是 Haskell 另一个类型类。...contents 它可以在 Kotlin 模拟(其中 Haskell <- 操作符被替换为 (- 属性赋值操作)如下: fun `do` (ioOperations: () -> IO...(Haskell )applicative 是实现了 Applicative 类型数据类型。 (Haskell )monad 是实现了 Monad 类型数据类型

1.2K20

MySQL索引原理以及查询优化「建议收藏」

二 磁盘IO预读 考虑到磁盘IO是非常高昂操作,计算机操作系统做了一些优化,当一次IO时,不光把当前磁盘地址数据,而是把相邻数据也都读取到内存缓冲区内,因为局部预读性原理告诉我们,当计算机访问一个地址数据时候...每一次IO读取数据我们称之为一页(page)。具体一页有多大数据跟操作系统有关,一般为4k或8k,也就是我们读取一页内数据时候,实际上才发生了一次IO,这个理论对于索引数据结构设计非常有帮助。...IO)可以忽略不计,通过磁盘块1P2指针磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存做二分查找找到...21 22 #其他的如空间索引SPATIAL,了解即可,几乎不用 各个索引应用场景 三、 索引两大类型hashbtree #我们可以在创建上述索引时候,为其指定索引类型,分两类 hash类型索引...这句话意思是把查询语句where都应用到表返回记录数最小表开始查起,单表每个字段分别查询,看哪个字段区分度最高 2.explain查看执行计划,是否1预期一致(从锁定记录较少表开始查询)

43330

Java核心知识点精心整理(全是精华)「建议收藏」

1、重写是在子类存在方法父类方法名字相同,而且参数个数类型一样,返回值也一样方法,就称为重写(Override) 2、重载是一个类定义了多个方法名相同,而他们参数数量不同或数量相同而类型和次序不同...误区: 并不是非得严格按照三范式来设计,好数据库设计一定不是这样,而是根据实际情况柔性处理; 38、简单阐述Javaio、nio、bio i/o即input/output,就是指读写操作...原子性(Atomic):事务各项操作,要么全做要么全不做,任何一项操作失败都会导致整个事务失败; 一致性(Consistent):事务结束后系统状态是一致; 隔离性(Isolated):并发执行事务彼此无法看到对方中间状态...如果内存位置值和预期原值相等,就把该值更新为新值,如果不相等,则什么都不做; ABA问题:CAS操作存在一个并发问题,打个比方,有两个线程A、B同时操作变量x,A读取到预期原值是1,此时线程B...,所谓不可重复读就是在一个事务内多次查询结果不一样,其原因就是期间数据被另一个事务修改了;脏读就是一个事务读取到了另一个事务未提交数据,然而该数据回滚了,实际上并未提交; 实现原理前置知识: InnoDB

46020

newtype_Haskell笔记8

一.ZipListList 在List场景,xs ys表示从左侧xs取出函数作用于右侧ys每一项,有两种实现方式: 笛卡尔积 拉链式一一结对 分别对应[]和ZipList,例如: import...类定义行为,具体见FunctorApplicative_Haskell笔记7 二.newtype ZipList就是因这个场景而产生,本质上是对List包装,定义如下: newtype ZipList...不像type创建别名类型可以类型等价换用,newtype创建类型类型是完全不同东西,唯一联系是新类型内部实际操作是原类型(通过持有原类型实例引用),通过这种方式在外层实现对原类型扩展...除此之外,就与data关键字没什么区别了 P.S.关于值构造器参数,见类型_Haskell笔记3 三.对比type和data 关键字 作用 应用场景 data 定义自己(数据)类型 想要定义完全新类型...type 给现有类型起别名,得到东西完全等价于原类型,可无条件换用/混用 想让类型签名更清楚(语义化)时候 newtype 现有的类型包成一个新类型,得到类型类型不同,不能换用/混用 想让现有类型具有一种不同接口

59830

MySQL索引原理以及查询优化

二 磁盘IO预读 考虑到磁盘IO是非常高昂操作,计算机操作系统做了一些优化,当一次IO时,不光把当前磁盘地址数据,而是把相邻数据也都读取到内存缓冲区内,因为局部预读性原理告诉我们,当计算机访问一个地址数据时候...每一次IO读取数据我们称之为一页(page)。具体一页有多大数据跟操作系统有关,一般为4k或8k,也就是我们读取一页内数据时候,实际上才发生了一次IO,这个理论对于索引数据结构设计非常有帮助。...IO)可以忽略不计,通过磁盘块1P2指针磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存做二分查找找到...#其他的如空间索引SPATIAL,了解即可,几乎不用 各个索引应用场景 三、 索引两大类型hashbtree #我们可以在创建上述索引时候,为其指定索引类型,分两类 hash类型索引:查询单条快...这句话意思是把查询语句where都应用到表返回记录数最小表开始查起,单表每个字段分别查询,看哪个字段区分度最高 2.explain查看执行计划,是否1预期一致(从锁定记录较少表开始查询)

1K40

【译文】【第二章②】Mindshare PCI Express Technology 3.0

为了这些从内存取出来数据返回给发起方,根组件端口事务产生足够多完成包,这些数量完成包足以发起方所请求全部数据都返回回去。...完成方会将这个事务 Tag 拷贝进完成包,这样发起方就可以快速地通过完成包 Tag 来这个完成包正确请求关联起来,也就是找到了这个完成包是用来服务哪个请求。...有关被锁定事务更多信息,请参阅附录 D,“锁定事务”。 回顾一下历史,在 PCI 早期,协议规范制定者们预期 PCI 将会实际取代处理器总线。...如图2‑20 展示了一个非报告式 IO事务锁定请求相似,这样一套 IO 操作流程目的设备只能是一个传统端点(Legacy Endpoint)。...最终,完成方接收写请求包数据,这个事务才真正完成。当然,这种事务执行方法在提升效率同时也舍弃了一些东西,因为完成方不需要发送完成包,所以这也意味着它无法错误报告给发起方。

1.1K20

商品上新业务状态机接入实践

总体改造方式如下图所示: 八、预期收益 从上文可以了解到,虽然是状态机接入,实际上是要完成两方面的改造,一是完成对整个上新流程中分渠道、分操作业务代码解耦,这部分改造,能够: 解决之前新品申请链路事务问题...process方法定义较为宽泛,在不同业务操作实际执行内容可能区别很大,比如提交新品审核可能只做一些数据组装动作,而商研审核则需要对本次操作后目标状态进行判断。...persistent持久化方法单独定义出来,是为了支持只在该方法上加事务,目前系统代码其实也有类似的设计,但事务太宽泛,包括了校验、业务处理等整个执行流程,中间可能包含了各种RPC调用,这也是导致大事务其中一个重要原因...DB表status字段完全映射,状态机事件上文图中事件完全匹配。...GuardAction实现 从上文状态机具体配置可以看到,新品来样流程涉及两类状态流转: 触发事件后目标状态是固定,比如选品审核时触发了选品不通过事件,新品申请目标状态确定为选品不通过

9410
领券