获得徽章 0
不论Win还是Linux,都存在静态库和动态库。
软件开发过程中:
1)静态库是直接编译链接到二进制中的
2)动态库的链接是在运行时进行的,即运行时进行链接,并将符号导入到进程地址空间的

但是,很多开发者仍然有一点是不知道的:
动态库在系统内存中,是各个进程共享的。

换句话说,在各个进程中,动态库是位于相同的系统物理内存地址中,但却不同(不一定相同)的进程虚拟地址中。
这也是为什么Linux的动态库,以so后缀命名(shared object)。

但是,这是如何做到的呢?
当然是要依赖一个外部的链接器来做。

比如,在Linux中,应用程序启动时,需要动态链接的进程,通常代理给ldd(链接器)来查找相应的so,并完成so文件到进程的虚拟地址空间的内存映射的。如此,so既然是文件,就可以在相同的物理内存中被各个进程所共享。使用动态库链接的方式,通过共享物理的内存映射方式,从而大大节省了众多只读库对系统物理内存的消耗。
展开
敩科炼技堂于2022-11-01 13:07发布的图片
敩科炼技堂于2022-11-01 13:07发布的图片
评论
写过跨Linuxicon和Windows平台系统软件(C/C++)的研发工作者,一定深感到其中的痛苦。尽管在一些网络协议(如:TCP/IP)上是相同的,但编程模型、以及编译器上的细微差别就让人头疼万分。
犇叔略举几个点:
1)事件通知模型:众所周知,Linux有基于事件的用户态中断机制,通俗来说就是select/poll/epoll的用户态和内核态事件通知模型。要在Windows系统上找出对等的机制,可不太容易。
2)GNU C编译器和MSVC编译器:总有一些出乎你意料的编译器行为,犇叔建议一定要写好单模块的ut用例。
3)原子操作icon和内存语义:找到匹配的原子操作,不是那么困难。但仍然要注意其中语义差别,包括内存可见性和内存序问题(这一点,犇叔下半年写一个相关专题)。
4)并发:多线程icon和多进程在这两个平台上的差别非常大,要特别留意Linux下的“惊群”唤醒,以及Windows下iocp的内部机制,性能表现非常大。
今天,总体而言,Windows作为数据中心的常驻服务端已经少之又少。但包括客户端(如docker),以及众多优势领域,仍然绕不开Windows平台的支持,譬如图形图像渲染、远程桌面等。就Windows APIicon来说,犇叔认为其设计非常优秀,相比Linux系统调用和GNU C lib库的而言,不管是文档还是统一的风格,对程序员icon更友好。缺点是:“API数量真的非常庞大”。想来,这也是微软要做一个上层统一框架的直接原因吧。
#创意代码大赏#
展开
敩科炼技堂于2022-09-14 11:43发布的图片
评论
当你走进书店的算法角落,你就会知道今天的机器学习和深度学习类的AI算法是有多么的“烂大街”。
坦白讲,今天的人工智能算法的的确确进入到了行业结合产品落地的阶段,但目前可靠稳固的算法“基石”少之又少。
相关算法人才层面,可创新性的人才更少。目前,众多AI创业公司几乎无一例外依赖国外成熟的AI框架,迅速做产业应用罢了。而在算法上能有所突破,或者能写出产业级的优秀框架的公司更是少见。
再次,AI算力层面,又有多少真正对底层GPU加速器、其他芯片加速器理解的呢? 算法icon所依仗的底层硬件和系统方向更需要多年的实践积累,绝非几本“白话书”就能入行的。

展开
敩科炼技堂于2022-09-09 13:28发布的图片
敩科炼技堂于2022-09-09 13:28发布的图片
4