1.Linux知识百宝箱新手学习Linux必看的源码书籍linux书籍知乎
2.三代差异可变剪切?lr2rmats——Long read to rMATS
3.僵尸进程和僵死进程有什么区别? - 知乎
4.进程间通信到底有几种方式? - 知乎
5.有什么适合做复杂树状图或者人物关系图的软件? - 知乎
6.Cygwin系列(四):一步一步搭建Cygwin最小系统
Linux知识百宝箱新手学习Linux必看的书籍linux书籍知乎
Linux操作系统广受广大用户喜爱,有许多软件针对初学者提供了大量便利的分析功能。作为新手,知乎一定要先从Linux知识百宝箱开始,源码然后才能正确地学习使用Linux操作系统。分析
Linux知识百宝箱中包括了一些Linux学习资源,知乎dubbo负载均衡 源码如书籍、源码文章、分析教程、知乎代码等。源码在这里,分析新手可以轻松找到适合自己的知乎学习资源,迅速掌握Linux的源码基础知识。
新手学习Linux最好的分析资源就是书籍。下面就介绍几本新手学习Linux必看的知乎书籍:
1、《Linux/UNIX系统编程》:这本书涵盖了Unix的基本编程环境,介绍了Unix文件系统的工作方式、编程调用系统的编程接口,并详细介绍了编程接口如何与底层操作系统进行通信。
2、《Linux内核完全指南》:这本书介绍了比较完整的Linux内核结构及其各部分的功能,代码示例清楚易懂,可以帮助新手快速了解Linux内核。
3、《Linux Shell编程指南》:这本书介绍了Linux Shell的语法、命令用法、如何写Shell脚本等,内容详细易懂,适合新手学习。
4、《C程序设计》:对于刚接触Linux的新手来说,学习Linux必不可少的一门语言就是C语言,这门语言可以帮助新手更好地理解Linux应用程序是如何工作的。
以上就是Linux知识百宝箱中新手学习Linux必看的几本书籍,希望以上介绍可以帮助新手快速掌握Linux的基本知识,加强对Linux的了解。
三代差异可变剪切?lr2rmats——Long read to rMATS
lr2rmats 是一个用于结合第三代长读长和第二代短读长 RNA-seq 数据进行转录组分析的轻量级管道。它基于 Snakemake 构建,旨在生成增强的基因注释文件,这些文件能提供给 rMATS 进行差异选择性剪接分析。
lr2rmats 的安装仅支持 Linux/Unix 系统。使用克隆和构建命令,依赖如 minimap2、STAR、samtools、bedtools 和 Snakemake 等开源软件。若软件未安装,可通过 make dependencies 命令自动下载和构建。亦可选择单独构建某个软件。
运行示例后,程序会在当前工作目录下生成增强的基因注释文件 output/updated.gtf,以及一些中间文件和日志文件。该管道支持多样本、多种格式(fa,fq,*gz)和多种平台(双端/单端短 reads)的输入。
所有输入和输出文件的振幅副图指标源码配置在 config.yaml 文件中。lr2rmats 支持多样本和多种输入格式,适用于双端/单端短 reads 平台。
详细信息和疑问可访问官网查阅。分享至此,希望对您有所帮助。如有问题,请联系站长。
欲了解更多文章,请关注知乎同名微信公众号《生信益站》或加入 QQ 交流群 。生信益站,一点就有益!明天再见!
僵尸进程和僵死进程有什么区别? - 知乎
僵尸进程与孤儿进程是Unix系统中进程管理的两个关键概念。僵尸进程,即子进程完成工作后,其父进程未调用wait()或waitpid()系统调用获取子进程终止状态,导致子进程虽然退出,但状态信息仍留在系统进程中,成为“占着茅坑不拉屎”的僵尸。僵尸进程的积累会耗尽系统进程表资源,影响新进程创建。
孤儿进程则指的是在父进程退出前,其产生的子进程成为无父进程的孤儿。系统中的init进程承担起孤儿进程的善后工作,即等待并释放孤儿进程占用的系统资源。
僵尸进程对系统稳定构成威胁,尤其是在大量生成短生命周期子进程且父进程对子进程退出后处理不及时的情况下,系统中僵尸进程积累过多,可用ps命令查看状态为Z的进程。
僵尸进程并非问题根源,问题出自产生大量僵尸进程的父进程。解决僵尸进程问题的关键在于消除产生僵尸进程的父进程。使用kill发送SIGTERM或SIGKILL信号,枪毙掉父进程后,其产生的僵尸进程变为孤儿进程,由init进程接管,等待释放资源。
防范僵尸进程的关键是正确处理子进程退出后的情况,防止僵尸进程的产生。参考郭无心的回答,了解如何在编写Unix程序时防止僵尸进程的出现。
进程间通信到底有几种方式? - 知乎
进程间通信(IPC,InterProcess Communication)是不同进程之间传播或交换信息的主要方式。IPC主要包括管道、消息队列、信号量、共享内存和Socket(套接字)等五种方式。下面将对这五种方式进行详细介绍。
一、管道
管道,通常指的是无名管道,它是UNIX系统IPC最古老的形式。管道通过两个文件描述符(fd[0]和fd[1])进行数据传输,其中fd[0]用于读取,fd[1]用于写入。管道的无钥匙进入系统源码关闭只需关闭这两个文件描述符即可。单个进程中的管道几乎没有用处,通常在调用pipe后立即调用fork创建父进程与子进程之间的IPC通道。
二、FIFO
FIFO,即命名管道,是一种文件类型,其功能与管道类似,但FIFO可以跨进程通信。创建FIFO时,需要使用open函数,并设置模式参数。FIFO的通信方式类似于使用文件进行数据传输,同时具备管道的特性,数据遵循“先进先出”的原则。使用FIFO进行IPC的例子包括客户端进程与服务端进程的通信。
三、消息队列
消息队列是一个消息的链接表,存储在内核中,并由一个标识符(队列ID)来标识。消息队列允许消息以先进先出或非先进先出的方式进行读取。使用消息队列进行IPC的例子包括服务端程序等待特定类型消息并发送反馈,客户端读取反馈并打印。
四、信号量
信号量是一个计数器,用于实现进程间的互斥与同步,而非用于存储通信数据。信号量有二值信号量和通用信号量两种形式。使用信号量进行IPC的例子包括在父进程和子进程间引入同步机制,确保子进程执行完毕后父进程才继续执行。
五、共享内存
共享内存是一种允许两个或多个进程共享同一存储区的机制。创建共享内存时,需要使用shmget函数指定大小;引用已存在的共享内存则将大小指定为0。通过shmat函数将共享内存连接到当前进程的地址空间,允许进程像访问本地内存一样访问共享内存。使用共享内存进行IPC的例子包括服务器进程与客户端进程之间的通信。
总结:管道速度较慢,容量有限,仅适用于父子进程通信;FIFO允许任何进程间通信,但速度较慢;消息队列容量受系统限制,需注意数据读取顺序;信号量仅用于同步和互斥,不用于传递复杂信息;共享内存能够控制容量,速度快,但需注意同步问题,适用于进程间的高效通信。
有什么适合做复杂树状图或者人物关系图的软件? - 知乎
寻找适合构建复杂树状图或人物关系图的软件时,首先可以考虑使用专门设计用于制作家谱族树状结构的工具。这些软件允许用户仅需输入内容,而布局则由软件自动生成,非常适合整理复杂的关系。
另一种推荐的软件是思维导图类应用程序。这类工具能帮助用户整理各种关系,无论是工作计划、项目管理还是人物关系图,都能够轻松上手。
对于关系极其复杂的欢乐拼购系统源码情况,可以尝试使用VisionOn这样的软件。VisionOn提供程序化制图功能,用户只需通过文本文件整理好关系,软件即可自动生成图形,如下面展示的Unix谱系表,直观且高效。
Cygwin系列(四):一步一步搭建Cygwin最小系统
本文共余字,阅读约需分钟,本文知乎链接:Cygwin系列(四):一步一步搭建Cygwin最小系统:本文同步发布于微信公众号。
经过前面连续4篇文章对Cygwin的充分介绍,相信你对Cygwin也有了准确认识,本文将带你一步一步搭建Cygwin最小系统环境。
UNIX/Linux系统上,二进制程序文件、函数库、文档、源代码等通常是按照软件包(Package)的形式组织,一个软件包是一个或多个应用程序、函数库、帮助手册页、文档组成的压缩档。Cygwin继承了先辈UNIX/Linux系统的优良传统,也采用这种方式。
Cygwin由核心的Cygwin DLL(被包装在cygwin包中)和基于Cygwin DLL移植GNU、BSD等开源项目的海量软件包组成。那么,怎么有效管理这些软件包呢?一股脑全部一起打包发布不是一个明智的选择,不仅要消耗很大的网络流量和硬盘空间,而且用户也不是所有的软件包都需要用到。 Cygwin系列(二):初窥Cygwin背后 中说过,年4月,项目宣布了新的发布方式:额外提供一个不依赖于Cygwin的Windows原生程序——setup.exe,与Cygwin DLL独立,用于安装、更新、卸载软件包。从功能角度讲,setup有点“名不符实”,或许叫“Package Manager”更恰当。
Cygwin发展到支持位,包管理器、软件包也自然分成位和位两套。位的包管理器程序为setup-x.exe,位的为setup-x_.exe,x和x_分别是位和位指令集代称。以下未明确/位硬件平台时,setup泛指其中一个。
为特别区别于Windows程序安装卸载习惯,在此再强调,setup不是一次性的安装卸载程序,而是可用于安装、更新、卸载软件包的包管理器,负责软件包在本地从生到死!后期对软件包的所有管理操作都可以通过setup完成。
Step 0:事前准备工作
进入 Cygwin官网找到“Installing Cygwin”,网站整套源码怎么获取下方文字介绍中有setup-x.exe和setup-x_.exe链接,按自己需求选择其中一个下载即可,建议选择位版本。
为使文件不显得杂乱,在d盘新建一个文件夹Cygwin,把setup-x_.exe也放入其中,当然你也可以把文件放在任何其他的地方,路径最好不含空格。为方便描述,以下称“d:\Cygwin”为CYG_ROOT,$CYG_ROOT表示对字符串“d:\Cygwin”的引用。
Step 1:选择安装方式
双击运行setup,可以看到setup自身的版本是“2.( bit)”。
点击“下一步”,如图显示3种安装方式:
①“Install from Internet”是指从Internet下载并安装,下载的安装包同时也保留在硬盘中并不删除;
②“Download Without Installing”意思是仅下载,供后期再安装;
③“Install Local Directory”是指从本地安装,如果前期选择了②,现在选择③即可。
把②和③两步合并,效果就是①;此处由于是从零开始,选择①。
Step 2:路径设置
点击“下一步”之后进入Step2,选择安装顶层路径——Root Directory。setup可以探测到自己所处的路径,即$CYG_ROOT,一般不用再更改;默认勾选为所有用户安装(Install for All Users)。
点击下一步,选择本地软件包存放路径,同样可按照默认设置为$CYG_ROOT。
Step 3:选择网络连接方式
点击“下一步”之后进入Step3,网络连接类型按默认选择,即直接连接(Direct Connection)即可。
Step 4:添加/选择下载站点
点击“下一步”之后进入Step4,选择下载站点,除了Cygwin官方网站,还有很多站点提供了软件仓库(repository)的镜像,分布于世界各地,setup内部记录了很多已有的站点,但没有大陆地区。用户还可以自行添加,下面的Add按钮就是用来添加新站点的。仅列出国内几个比较常用、速度较快、连接较稳定的Cygwin镜像站点:
将镜像站点URL地址填入编辑框,点击“Add”按钮,镜像站名称即出现在选择列表中,下一次再来直接选择就行,注意到列表显示内容移除了URL路径,只保留了协议和主机名。此时发现,setup建立了$CYG_ROOT\var\log路径,用于记录本次安装过程相关日志。
点击“下一步”,setup开始下载站点的setup.ini文件,这个文件最终保存在$CYG_ROOT\%2fcygwin%2f\x_路径下,其中%2fcygwin%2f是按照站点主机名建立的路径。
每个站点上同时有x(位)和x_(位)两套软件仓库,所以在站点名后面有继续建立x_文件夹。setup.ini记录着软件包功能描述、版本、依赖等信息,可看做是一个软件包索引数据库。
Step 5:筛选软件包及操作
点击“下一步”之后进入Step5,筛选软件包及操作。Cygwin软件包被按照用分类组织,点击“View”旁边下来框,选择“Category”,看到有Accessibility、Admin、Base、Devel、Doc等多个类别,一个软件包可以属于一个或多个类别。点击类别前的“+”,可展开查看下面的各个软件包。
软件包信息分成了几栏展示:
为构建最小系统,这里选中Base(基本)类别,执行动作为Install,看到Base类别中包含了alternatives、base-cygwin、base-files、bash、coreutils、cygwin、mintty、util-linux等等最个软件包。点击“下一步”,setup开始针对软件包进行依赖解析(这些信息就存储在setup.ini文件中),并把软件包依赖的所有软件包也全部添加进来,可以看到“依赖”中有大量以“lib”开头的库文件。
Step 6:执行安装
点击“下一步”之后进入Step6,执行安装。setup开始下载软件包,并在左上角显示整体进度百分比。可以看到$CYG_ROOT \ %2fcygwin%2f\x_\release\目录下多了很多子目录,子目录按照软件包独立组织,里面就存放着软件包的压缩文件。
setup自动进行下载、安装,安装完成后自动跳转至最后一步,选择是否创建快捷方式和添加到开始菜单,可以都勾选上,最小系统的整个安装过程就此结束。
安装结束后,可以看到在$CYG_ROOT目录下,增加了bin、dev、etc、home、lib、tmp、usr子目录,软件包主要安装到bin、lib、usr中,配置文件安装到dev、etc中,home存放用户个人文件。
让系统跑起来
安装完成后,桌面上多了一个名为“Cygwin Terminal”的快捷方式,双击运行,看到一个黑色框框里面输出一些已创建文件的信息,并打印提示符,等待用户键入命令。这个黑框框便是终端模拟器——mintty,mintty启动了shell与用户交互。输入“help”并回车看看得到什么,再输入“ls /”并回车看看得到什么,如果没有报错说明最小系统已经能跑起来。
第一次使用时,home目录下创建了一个以Windows登陆用户命名的文件夹,被称为用户个人目录($HOME),个人文件都默认放在这里,Cygwin的shell启动后默认进入的工作路径也是这里。
后记
从整个安装过程也看出,setup本质是一个软件包的管理工具,亦即“包管理器”,用户通过图形界面可以方便地进行安装、卸载、重装、升级等工作。setup也支持在命令行中运行。
最小系统跑起来以后,后期还想安装其他的软件包,重复Step 1至6的过程,中间注意选择要安装的软件包即可。
最小系统经过压缩,其大小不过约几十MB。Cygwin技术交流群()共享文件中同时提供位和位最小系统,解压即可用。
UNIX/Linux/Cygwin上的逻辑、操作习惯与Windows有着巨大差异,在Cygwin中要培养以shell命令行为中心的操作习惯,暂时抛开Windows下的惯性思维。
视频和视频帧:Intel GPU(核显)的编解码故事
一般提及基于“显卡或多媒体处理芯片对视频进行解码”为硬解码,本文将探讨如何利用Intel的核显,即集成GPU实现硬解码。提及QSV,全称为Quick Sync Video,Intel在年发布Sandy Bridge CPU时,一同推出了这项基于核显进行多媒体处理,包括视频编解码的技术。集成核显,官方称HD Graphics,最早在Sandy Bridge前一代制程已推出,但性能提升及充分发挥在Sandy Bridge时期。Haswell及后续制程发布更高级的Iris架构。最近Intel宣布将开发独立显卡,核显发展具体走向未知。
接手QSV项目时,预期会有很多相关资料,实则相反。因此,将记录自己学习过程。
本文将介绍:
I. Intel的核显(集成GPU):
了解核显很有必要,几个月前,作者对CPU的认识还停留在“南北桥”架构。以下内容若有不准确之处,欢迎指正。
查看Gen CPU结构图,首先看CPU核心部分。在整块CPU芯片中,核显占比不小,算力不容小觑。在没有独立显卡的笔记本上,可以运行大量大型游戏,虽偶有卡顿、掉帧情况,整体表现已相对不错。
接下来,看官方给出的GPU内部结构图。GPU内部远比图上所示复杂,图中介绍的仅为部分Subslice芯片结构。GPU分为Slice部分和Un-Slice部分,Slice部分已介绍,接下来介绍Un-Slice部分。
作者找到了一张图,展示了在MFF上进行视频处理的流程:1) 首先在MFX/VDBOX模块上进行编解码;2) 接着送到VQE/VEBOX上做图像增强和矫正处理;3) 然后送到SFC上做scale和transcode;4) 最后送出到显示屏上展示。是否完全正确,作者这里做个记录。
推荐知乎文章《转》Intel Gen8/Gen9核芯显卡微架构详细剖析,深入浅出,关于thread dispatch的说明即出自该文。
最后,总结Intel集成GPU/核显结构图。
注意,这是skylake架构下的GT2/GT3/GT4 GPU结构图,X数字越大,集成的Slice和Unslice芯片更多,能力越强,价格也更高。
II. Quick Sync Video(QSV)技术:
QSV是Intel推出的将视频处理任务直接送到GPU上进行专门负责视频处理的硬件模块处理的软件技术。与CPU或通用GPU上的视频编码不同,QSV是处理器芯片上的专用硬件核心,这使得视频处理更为高效。
要了解QSV如何驱动GPU的MFF,首先看官方Intel® Video and Audio for Linux上的图。在介绍QSV之前,提及Intel在FFmpeg上提供的插件,包括ffmpeg-qsv、ffmpeg-vaapi和ffmpeg-ocl。详细描述如下:
· FFmpeg-vaapi提供基于低级VAAPI接口的硬件加速,在VA API标准下在Intel GPU上执行高性能视频编解码器、视频处理和转码功能。
· FFmpeg-qsv提供基于Intel GPU的硬件加速,基于Intel Media SDK提供高性能视频编解码器、视频处理和转码功能。
· FFmpeg-ocl提供基于工业标准OpenCL在CPU/GPU上的硬件加速,主要用于加速视频处理过滤器。
接下来,介绍QSV在ffmpeg2.8及以上版本的支持,经过MSDK、LibVA、UMD和LibDRM。分层进行分析:
· MSDK:Intel的媒体开发库,支持多种图形平台,实现通用功能,可用于数字视频的预处理、编解码和不同编码格式的转换。源码地址为Intel® Media SDK,在Linux平台上编译使用。
· VA-API:Video Acceleration API,提供类unix平台的视频硬件加速开源库和标准。Intel源码地址在Intel-vaapi-driver Project,在Linux平台上使用。
· UMD:User Mode Driver的缩写,指VA-API Driver。Intel提供了两个工具:intel-vaapi-driver 和 intel-media-driver,推荐使用后者。
· LibDRM:Direct Rendering Manager,解决多个程序协同使用Video Card资源问题,提供一组API访问GPU。与VA-API,LibDRM是一套通用的Linux/Unix解决方案。
· Linux Kernel:Intel的Kernel是i driver,描述了libDRM和Kernel Driver之间的关系。
至此,整个关系图较为清晰。
III. FFMPEG+QSV解码:
QSV硬解的任务主要包括:
关于3-4步操作的详细实现,底层库会帮助完成。但作为一个优秀的工程师,研究FFMPEG源码依然十分重要。接下来,介绍如何使用FFmpeg API中的h_qsv解码器插件。
提及FFmpeg命令行使用方法,推荐阅读官方资料《QuickSync》或《Intel_FFmpeg_plugins》。
关于示例代码,作者曾遇到许多坑,总结为:多数中文博客不可靠,官方demo最可信。官方代码提供了两份可用:qsvdec.c和hw_decode.c。作者最早使用的是第一段代码,核心部分如下:
然而,这段代码存在问题。测试发现,对于赛扬系列一款CPU,在p视频上MSDK达到fps,理论上h_qsv平台上限也应为fps,但实际测试不到fps。排查后发现是av_hwframe_transfer_data()性能较弱。
最终,与Intel一起解决了性能问题。那么,性能提升方案为何是GPU-COPY技术做Memory-Mapping?
解释GPU和CPU渲染图像的过程,包括坐标系转化、纹理叠加等,仅需了解两点:
后者的数据组织方式能充分利用GPU的并行特性,加速图像处理、渲染。尽管存在一些纹理叠加的技术难题,但性能提升足以补偿。
接下来,解释Memory-Mapping:从Intel CPU架构图中可见,GPU和CPU位于同一芯片上,各自寄存器/缓存区有限,视频数据主要存储在内存上。GPU和CPU的数据组织方式不同,同一帧数据存于内存同一位置,数据格式不同,因此需要做Memory-Mapping。Memory-Mapping相较于Memory-Copy,减少了数据从内存区域A移动到区域B的操作,已经是优化。进一步优化:GPU完成Memory-Mapping以及数据从GPU到内存和CPU的操作。
在av_hwframe_transfer_data()内部,Memory-Mapping由CPU完成,性能受限于CPU,只能并行。修改后,整体性能从不到fps提升至fps,虽然与理想fps仍有差距,但满足性能需求。
据悉,Intel将在FFmpeg 4.3开源出这个解决方案。
写在后面:
了解GPU底层对应用开发人员帮助不大,毕竟了解芯片布线的重新设计、制程工艺提升、GPU-COPY技术的数据I/O提升等,也不能做什么。最终,芯片架构是芯片工程师的事,底层逻辑实现是嵌入式工程师的事。应用开发人员无法做出实质贡献,但作为知识库扩充或休闲阅读,了解也无妨。
希望有机会接触CUDA的编解码,深入学习N卡设计。
感谢因《视频和帧》系列文章结识的朋友,热心指出文章描述不准确的地方。文中如有不严谨之处,欢迎指正。