CS
文章平均质量分 93
CS
JunanP
这个作者很懒,什么都没留下…
展开
-
Clipper2 Parallelism (OpenMP + CUDA) Study
2]Fig 1Fig 2Fig 3Fig 4Fig 5OpenMP:CUDA:OpenMPCUDA10 K8151 M814601M161490Table 110K13.318.7100K1311921M12601880Table 2H2D(ms)D2H(ms)10K2.812.6100K201341M1971260Table 3OpenMP:Fig 6Fig 7Fig 8Fig 9CUDA:原创 2024-04-30 02:01:35 · 608 阅读 · 0 评论 -
Malloc动态内存分配
在C语言中我们会使用malloc来动态地分配内存,这样做的一个主要理由是有些数据结构的大小只有在运行时才能确定。例如,如果你正在编写一个程序,需要用户输入一些数据,但你不知道用户会输入多少数据,那么你就需要使用动态内存分配。而是一种用于动态内存分配的数据结构,当程序员使用malloc或其他动态内存分配函数请求内存时,这些函数会从堆中分配内存。:应用程序会分配和释放空间。例如,在C语言中,我们使用malloc来分配内存,然后在不再需要的时候使用free来释放内存。这种分配器需要程序员明确地管理内存。原创 2023-08-10 20:05:25 · 657 阅读 · 0 评论 -
计算机内存中的缓存Cache Memories
这篇写一下计算机系统中的缓存Cache应用场景和实现方式介绍。在讲缓存之前,首先要了解计算机中的内存结构层次Memory hierarchy。也就是下图金字塔形状的结构。原创 2023-07-24 00:17:41 · 1465 阅读 · 0 评论 -
Buffer Overflow缓冲区溢出和保护措施
缓冲区溢出是指当数据写入某个缓冲区(buffer)时,,从而导致覆盖了相邻内存区域的情况。这种现象可能导致程序崩溃、数据损坏,甚至引发安全漏洞,允许攻击者利用这一漏洞执行恶意代码。比如这个代码中,在内存中,a中的元素和d其实是挨着的,如果给a赋值了超过了它当前容量的数据,那么就会覆盖d的内容,导致d的值混乱。原创 2023-07-07 19:35:30 · 2329 阅读 · 0 评论 -
栈,栈帧Stack Frames和函数调用过程Control Flow
栈其实就是计算机系统内存中的一小块。栈是一块特殊的内存区域,栈在内存中的增长方向是向低地址扩展,%rsp寄存器存储栈的最低地址,即栈顶元素的地址。这种栈结构在程序中的应用有助于实现函数调用、局部变量的管理以及递归等功能。原创 2023-07-03 15:51:45 · 322 阅读 · 0 评论 -
machine code中的条件控制control flow和switch语句,循环Loop
上篇写了machine code基本知识概念,这篇再总结一下其中的流控制、条件判断,循环等实现。原创 2023-06-26 11:01:31 · 290 阅读 · 0 评论 -
Assembly code汇编代码,寄存器register,操作数operands与机器代码machine code
这篇文章写一下X86系统中的ISA(instruction set architecture)指令集架构,machine code以及汇编代码assembly code相关的内容。一个简单的overview:不用一下子全看得懂,先有个大致的概念,因为后面还会细讲其中一些部分。总的来说,程序执行时,CPU中存放了一些最重要的部分,如PC,是program counter,用来存储下一个指令,在 x86-64 中称为 "RIP"(instruction pointer);原创 2023-06-21 00:03:11 · 490 阅读 · 0 评论 -
Linux Shell命令行常用操作
shell是Linux系统中的一个程序,用于接收键盘的命令,可以算作是用户和操作系统之间的接口CLI。原创 2023-05-25 11:19:00 · 1319 阅读 · 0 评论 -
Bits, Bytes and Integers——二进制unsigned以及Two-complement表示,十六进制
这篇文章梳理一下Bits, Bytes and Integers——二进制unsigned以及Two-complement表示,十六进制这些事儿。原创 2023-05-23 09:38:31 · 946 阅读 · 1 评论 -
Git advanced高级操作
这篇文章是继之后的一些补充,学习总结一些额外Git操作中的比较常用的操作。所以这篇文章假设你已经有了前面的基础,我就直接说一些没有提到过的部分。原创 2023-05-13 08:24:53 · 658 阅读 · 1 评论 -
Test Doubles测试替身: Testing in Distributed Systems and Real World
"Test Doubles" 是一种用来辅助单元测试的技术,这个名字是由Gerard Meszaros首次提出的,他将其比喻为电影制作中的替身演员。当我们进行单元测试时,我们通常关注的是测试特定的函数或方法。然而,这些函数或方法常常依赖于其他的对象或系统。例如,一个函数可能需要从数据库中查询数据,或者需要调用另一个服务的API。在这种情况下,这些依赖关系可能会导致测试变得复杂或者不可预测。为了解决这个问题,我们可以使用"Test Doubles"来模拟这些依赖关系。原创 2023-05-12 09:14:34 · 400 阅读 · 0 评论 -
Git概念介绍,常用命令与工作流程整理 配图
Git是一个版本控制系统,换句话说,它可以在整个开发过程中对我们的代码库进行命名快照(即保存),并且在出现问题时,我们可以轻松地回滚到任何此类保存的状态。如果我们写了错误地代码,在没有Git的情况下,我们需要找出我们改变了什么并手动恢复,这既耗费时间又容易出错。有了Git,如果我们在代码运行正常的时候进行了保存,我们可以用一条命令就恢复到那个状态。我们也可以为彼此逐步记录我们的工作。原创 2023-05-11 12:37:30 · 465 阅读 · 0 评论 -
API Design principle 一些API设计原则
API(应用程序编程接口)是一种规范,定义了不同软件组件之间如何进行交互。API 描述了一组操作、输入和输出,这些操作独立于实现,使得开发人员可以访问其他程序、库或框架的功能,而无需了解其底层实现细节。API 是一种在软件系统中实现模块化和解耦的方式。通过定义清晰的边界和接口,API 使得各个组件或模块可以独立地开发、测试和维护,同时保证它们之间的互操作性。原创 2023-05-08 13:45:54 · 480 阅读 · 0 评论 -
Design principle: Immutability不可变性与对mutable变量的Synchronization方法
在设计模式中是指一个对象在创建后其状态就不能改变。这是一种编程思想和设计原则。在某些情况下,使用不变对象可以带来许多好处:简化代码 make things very simple:不可变对象在创建后状态不会改变,因此无需考虑对象状态的变化,这使得代码更简单,更容易理解和维护。线程安全 Inherently thread-safe:不可变对象是线程安全的,因为它们不会在多个线程之间共享可变状态。这消除了同步和锁定的需要,提高了性能和可靠性。原创 2023-05-06 12:26:02 · 463 阅读 · 0 评论 -
设计模式 Template Method Pattern(Inheritance) vs Strategy Pattern(Delegation)
继承(Inheritance)和组合+委托(Composition + Delegation)都是面向对象设计中的关键概念。继承在强耦合关系中可以实现大量代码重用,但使用时应谨慎。而良好的设计通常更倾向于使用组合和委托,因为它们支持编程接口的重用和封装,有助于信息隐藏,并产生更易于测试的代码(而使用继承的话因为需要重写父类的代码, 往往需要知道父类的具体实现信息,不利于信息隐藏)。虽然继承在某些情况下用起来更顺手,但在设计时应优先考虑delegation。原创 2023-05-06 08:03:32 · 553 阅读 · 0 评论 -
UML图中的domain model,object model,system sequence diagram以及interaction diagram
UML图(Unified Modeling Language,统一建模语言)是一种用于描述、可视化、构建和记录软件系统的标准化建模语言。在UML中,有很多类型的图,其中包括领域模型(Domain Model)、对象模型(Object Model)和系统顺序图(System Sequence Diagram)等。这些图都是用于描述不同层面和方面的系统。原创 2023-05-05 12:53:18 · 1009 阅读 · 0 评论 -
Java Test: Specification and Structure Testing(line, branch, path coverage)
这篇文章总结一下Java软件测试中的Secification test和Structure test。原创 2023-05-04 13:20:42 · 616 阅读 · 0 评论 -
JavaScript中的Concurrency并发:异步操作下的汉堡制作示例
在这篇博客中,我们比较了在JavaScript中实现同步和异步操作的三种方法:同步方法、回调函数和Promise与async/await。每种方法都有其优缺点。同步方法易于理解,但不支持异步操作;回调函数支持异步操作,但可读性差;而Promise与async/await既支持异步操作,又具有良好的可读性,因此我建议只学会最后一种方法就够用了。原创 2023-05-01 02:49:52 · 1084 阅读 · 0 评论 -
Symmetric crypto AES
Symmetric cryptography means that you use the same key for encryption and decryption. A commonly used algorithm today for symmetric cryptographyis AES, which means "Advanced Encryption Standard".原创 2022-11-30 12:23:38 · 1006 阅读 · 0 评论