UpFront

作者:Various

UpFront

diff -u:内核开发中的新变化

Ahmed S. Darwish 最近发起了一项失败的尝试,旨在改进 系统崩溃 的日志记录方式。当系统,尤其是笔记本电脑,在启动过程的早期崩溃时,通常不会保留任何记录。Ahmed 的想法是依靠 BIOS 例程将日志信息写入磁盘,即使崩溃几乎立即发生。Ahmed 的工作引起了广泛的兴趣,因为它可能对调试有很大的帮助。但是,Linus Torvalds 否决了这个想法,他说:“我绝不希望出现‘系统搞砸了,所以让我们覆盖磁盘’这种情况成为我发布的内核可能做的事情。这太疯狂了。磁盘比内核重要得多。” 因此,很明显,这种类型的特性几乎肯定会在很长一段时间内仍然是一个第三方补丁。

ARM 架构 有相当多的 clk struct 实现,这让 Jeremy Kerr 很恼火,并启发他将所有这些实现重写为一个通用的实现。很多人提出了建议。一些比较棘手的问题包括确定何时多个设备正在使用单个时钟的正确方法。同样重要的是确保通用代码具有适当的边界,以便更容易为需要它的系统编写特殊情况代码。

IntelOren Weil 提交了一个补丁,以支持英特尔新的 管理引擎。不幸的是,补丁提交过程本身存在各种问题,包括遗漏了关键的 Signed-Off-By 标头等等。因此,大部分讨论都集中在这些问题上,而不是代码本身。一个关键问题是补丁绝不应该破坏内核构建。即使后续补丁会修复构建,这也是至关重要的。原因是开发人员需要能够依靠 “git bisect” 来追踪错误,而这只有在内核的每个版本都正确构建的情况下才有可能。这也使得一般的开发过程更加清晰,其中没有任何单个项目会因为等待另一个项目修复构建才能继续进行自己的测试和开发而受阻。

Thomas Gleixner 修改了内核中的 通用中断处理代码。这样做部分是为了清理命名约定,以便开发人员更容易理解,但也是为了封装系统的各种功能,以便开发人员不能再滥用它们——或者至少让滥用它们的开发人员容易被识别和阻止。目标之一是逐步扩展 IRQ 处理代码,以适应所有各种项目的特殊需求,而当人们将他们畸形的尖端伸入代码内部时,这会更加困难。

Eric Paris 希望重新引入一个 全局 capabilities bounding set,以便可以从系统中删除某个 capability,使其无法恢复。这个想法是删除一些关键的 capability,然后将 root 访问权限交给不受信任的实体。Eric 的想法是,这将保持系统的安全。不幸的是,Linux 安全性主要根据防止 root 访问的方式来实现,而不是减轻授予 root 访问权限的影响的方式。几乎所有内核开发人员都认为,一旦用户获得了 root 访问权限,那就Game Over了。因此,像 Eric 这种对 root 权限的微妙操作,对于大多数内核人员来说并不真实。

Dropbox 技巧和窍门

Dropbox,或 Ubuntu One 或 SparkleShare 等替代品,是保持计算机同步的绝佳工具。它们也提供了一些独特的功能。以下是我们最喜欢的一些

  • 将配置文件目录(如 Pidgin 的 .purple 目录)保存在您的 Dropbox 中,并在您的主目录中创建符号链接。这可以节省在您的计算机上输入相同信息的时间。

  • 让您的家用计算机监控 Dropbox 内的特定文件夹以查找 torrent 文件。然后,每当您想在家中下载 torrent 时,只需将 torrent 文件放入您任何计算机上的文件夹中,它就会在家中开始下载。

  • 将您最喜欢的桌面壁纸照片保存在 Dropbox 中,这样您就可以在您的各种桌面和笔记本电脑上访问您的所有 NASA 天文照片。(这也适用于非 NASA 照片,但是您为什么要使用非太空壁纸呢?)

  • 将 Dropbox 与 Calibre 和 Calibre2opds 结合使用,以保持您的电子书库在线且始终可访问。当您度假并忘记带足够的书时,这使得从您的藏书中下载书籍变得简单。

UpFront

您有更多 Dropbox 技巧吗?请将它们发送至 shawn@linuxjournal.com,我将在 LinuxJournal.com 上发布好的技巧。

非 Linux FOSS

如果您是 OS X 上的 Quicksilver 或 Linux 上的 GNOME Do 的粉丝,那么 Launchy 可能是您的 Windows 安装所需要的。Launchy 是一款开源应用程序启动器,在您需要它之前,它会保持隐藏状态。只需一个简单的按键即可将其调至前台,并帮助您启动您想要的任何应用程序。请访问 www.launchy.net 查看。

UpFront

为您的 Office 增添更多精彩

无论您喜欢 OpenOffice.org 还是 LibreOffice,它们目前仍然非常相似,但开箱即用时,它们缺少一些商业同类产品安装的便利功能。诚然,它们功能齐全,但如果您想要一个强大的剪贴画库和大量文档模板,您需要添加一些扩展和模板。

UpFront

浏览至 extensions.services.openoffice.orgtemplates.services.openoffice.org,以获取一些附加组件,这将使您的办公套件焕发光彩。无论您是想在文档中添加一些图形,还是想为您的下一个演示文稿增添趣味,都有广泛的选择。

此外,如果您的用户对系统文件具有写入权限,您将获得为所有用户或仅为当前用户安装扩展的选项——对于像我这样的系统管理员来说,这是一个很棒的福利!

并行编程速成课程

在过去的几个月中,我一直在介绍各种科学程序,但有时很难找到一个满足您需求的软件包。在这些情况下,您需要继续编写自己的代码。当您参与繁重的科学计算时,您通常需要进行并行计算,以便将运行时间缩短到合理的范围内。本月,我将给出一个并行编程的速成课程,以便您可以了解其中涉及的内容。

并行程序主要分为两大类:共享内存和消息传递。您可能会在各种科学领域看到这两种类型的使用。共享内存编程是指您使用的所有处理器都在一个单机上。这限制了您的问题规模。当您使用消息传递时,您可以将尽可能多的机器通过一些互连网络连接在一起。

让我们从研究消息传递并行编程开始。目前最常用的版本是 MPI(消息传递接口)。MPI 实际上是一个规范,因此有许多不同的实现可用,包括 Open MPI、MPICH 和 LAM 等。这些实现可用于 C、C++ 和 FORTRAN。也有适用于 Python、OCaml 和 .NET 的实现。

一个 MPI 程序由多个进程(称为槽)组成,这些进程在一个或多个机器上运行。这些进程中的每一个都可以与其他所有进程通信。本质上,它们位于一个完全连接的网络中。每个进程都运行程序的一个完整副本作为其可执行内容,并独立于其他进程运行。当这些进程开始相互发送消息时,并行性就发挥作用了。

假设您已经有一些 MPI 代码,那么使用它的第一步是编译它。MPI 实现包含一组包装器脚本,这些脚本处理您的所有编译器和链接器选项。它们分别称为 mpicc、mpiCC、mpif77 和 mpif90,分别用于 C、C++、FORTRAN 77 和 FORTRAN 90。您可以为您的编译器添加额外的选项作为包装器脚本的选项。一个非常有用的选项是-showme。此选项只是打印出将用于调用编译器的完整命令行。如果您在系统上有多个编译器和/或库,并且需要验证包装器是否在做正确的事情,这将非常有用。

一旦您的代码被编译,您需要运行它。您实际上并没有直接运行您的程序。一个名为 mpirun 的支持程序负责设置系统并运行您的代码。您需要告诉 mpirun 您想要运行多少个处理器以及它们位于何处。如果您在一台机器上运行,您可以使用选项提交处理器数量-np X。如果您在多台机器上运行,您可以提交主机名列表,可以在命令行中或在文本文件中。如果此主机名列表有重复,mpirun 会假定您希望为每个重复启动一个进程。

现在您知道如何编译和运行您的代码了,那么您实际上如何编写 MPI 程序呢?第一步需要初始化 MPI 子系统。有一个函数可以执行此操作,在 C 语言中是这样的

int MPI_Init(&argc, &argv);

在您调用此函数之前,您的程序正在运行单线程执行。此外,在此之前,您不能调用任何其他 MPI 函数,除了MPI_Initialized。一旦你运行MPI_Init,MPI 启动所有并行进程并设置通信网络。在此初始化工作完成后,您将以并行方式运行,每个进程运行您代码的副本。

当您完成所有工作后,您需要干净地关闭所有这些基础设施。执行此操作的函数是

int MPI_Finalize();

一旦完成,您将返回到运行单线程执行。在调用此函数后,您可以调用的唯一 MPI 函数是MPI_Get_version, MPI_InitializedMPI_Finalized.

请记住,一旦您的代码变为并行,每个处理器都在运行您代码的副本。如果是这样,那么每个副本如何知道它应该做什么呢?为了使每个进程执行一些独特的操作,您需要某种方式来识别不同的进程。这可以通过函数来完成

int MPI_Comm_rank(MPI_Comm comm, int *rank);

此函数将给出调用它的进程的唯一标识符,称为 rank。Rank 只是整数,从 0 到 N–1,其中 N 是并行进程的数量。

您可能还需要知道有多少进程正在运行。要获取此信息,您需要调用函数

int MPI_Comm_size(MPI_Comm comm, int *size);

现在,您已经初始化了 MPI 子系统,并了解了您是谁以及有多少进程正在运行。接下来您可能需要做的是发送和接收消息。发送消息最基本的方法是

int MPI_Send(void *buf, int count, MPI_Datatype type, 
 ↪int dest, int tag, MPI_Comm comm);

在这种情况下,您需要一个缓冲区(buf),其中包含count个类型为type的元素。参数dest是您要将消息发送到的进程的 rank。您还可以使用参数标记消息tag。您的代码可以决定根据您设置的 tag 值执行不同的操作。最后一个参数是 communicator,我稍后会介绍它。在接收端,您需要调用

int MPI_Recv(void *buf, int count, MPI_Datatype type, 
 ↪int source, int tag, MPI_Comm comm, MPI_Status *status);

当您接收消息时,您可能不一定关心是谁发送的或 tag 值是什么。在这些情况下,您可以将这些参数设置为特殊值 MPI_ANY_SOURCE 和 MPI_ANY_TAG。然后,您可以通过查看 status 结构来检查事实发生后的实际值。status 包含值

status->MPI_source
status->MPI_tag
status->MPI_ERROR

这两个函数都是阻塞的。这意味着当您发送消息时,您最终会被阻塞,直到消息完成发送。或者,如果您尝试接收消息,您将阻塞,直到消息完全接收。由于这些调用会阻塞直到它们完成,因此很容易导致死锁,例如,两个进程都在等待消息到达,然后才发送任何消息。它们最终会永远等待。因此,如果您的代码有问题,这些调用通常是首先要查看的地方。

这些函数是点对点调用。但是,如果您想与一组其他进程对话怎么办?MPI 有一个广播函数

int MPI_Bcast(void *buf, int count, MPI_Datatype type, 
 ↪int root, MPI_Comm comm);

此函数接受一个包含count个类型为type并广播到所有处理器,包括 root 进程。root 进程(来自参数root)是实际拥有数据的进程。所有其他进程都接收数据。它们都调用 MPI_Bcast,MPI 子系统负责整理出谁拥有数据以及谁正在接收。此调用还将缓冲区的全部内容发送到所有进程,但有时您希望每个进程处理一部分数据。在这些情况下,将整个数据缓冲区发送给所有进程是没有意义的。MPI 有一个函数来处理这个问题

int MPI_Scatter(void *send, int sendcnt, MPI_Datatype type,
                void *recv, int recvcnt, MPI_Datatype type, int root,
                MPI_Comm comm);

在这种情况下,它们都调用相同的函数,MPI 子系统负责整理出哪个是 root(拥有数据的进程)以及哪些进程正在接收数据。然后,MPI 将发送缓冲区分成大小均匀的块,并将其发送到所有进程,包括 root 进程。然后,每个进程都可以处理自己的块。当它们完成时,您可以使用以下命令收集所有结果

int MPI_Gather(void *send, int sendcnt, MPI_Datatype type,
               void *recv, int recvcnt, MPI_Datatype type, int root,
               MPI_Comm comm);

这是 MPI_Scatter 的完全逆转。在这种情况下,所有进程都发送它们的小块,root 进程收集所有小块并将它们放入其接收缓冲区中。

将以上所有信息结合在一起,您可以组合一个基本的样板示例

#include <mpi.h>
// Any other include files

int main(int argc, char **argv){
   int id,size;
   // all of your serial code would
   // go here
   MPI_Init(&argc, &argv);
   MPI_Comm_rank(MPI_COMM_WORLD, &id);
   MPI_Comm_size(MPI_COMM_WORLD, &size);
   // all of your parallel code would
   // go here
   MPI_Finalize();
   // any single-threaded cleanup code
   // goes here
   exit(0);
}

希望您现在对 MPI 程序感到更舒适了。我在这里研究了最基本的元素,但是如果您感到受到启发,您应该拿起一本好的教科书,看看还有哪些其他功能可供您使用。如果不是,您至少应该能够阅读现有的 MPI 代码,并对它试图做什么有一个很好的了解。与往常一样,如果您想看到某个特定领域被涵盖在这个专栏中,请随时告诉我。

Scrivener,现在支持 Linux 了!

www.literatureandlatte.com 的工作人员有一个非常棒的作家工具,名为 Scrivener。多年来,它一直是小说家和编剧的 OS X 专属程序,充当大型写作项目的项目管理工具。Linux 用户可能熟悉 www.writerscafe.co.uk 的 Writer's Café,这是一个类似的程序。虽然 Scrivener 比 Writer's Café 贵一点(45 美元 vs. 40 美元),但它的功能使其成为任何小说家都应该查看的东西。而且,如果您在 Beta 测试期间尝试它,Scrivener 是免费的。

UpFront

不幸的是,拥有 OS X 版本 Scrivener 现有许可证的用户无法将该许可证转移到 Linux 版本。也许一旦最终版本发布,Literature and Latte 的工作人员会改变他们的想法。无论如何,如果您是作家,您都会想查看 Scrivener 或 Writer's Café。两者都是不错的软件包,现在两者都与 Linux 兼容!

名人名言

现在出现了各种各样的计算机错误。您会惊讶地发现,有那么多医生声称他们在治疗怀孕的男人。

——艾萨克·阿西莫夫

人类的未来在星空中,而这个未来太重要了,不能在幼稚的愚蠢和无知的迷信的重压下迷失。

——艾萨克·阿西莫夫

我不是速读者。我是一个快速理解者。

——艾萨克·阿西莫夫

我不害怕计算机。我害怕缺少计算机。

——艾萨克·阿西莫夫

如果我的医生告诉我我只有六分钟的生命,我不会愁眉苦脸。我会打字更快一点。

——艾萨克·阿西莫夫

我们希望在 LinuxJournal.com 上听到您的声音

互联网是一件了不起的事情。我知道,“欢迎来到 1995 年,Katherine”,但请听我说完。您手中掌握着关于 Linux 和开源软件的惊人信息来源。我认为这是纸和墨水非常棒的用途,但这是一条单行道。另一方面,LinuxJournal.com 提供了许多双向交流的机会。我希望你们每个人都利用在线社区在您最喜欢的文章的评论区交流想法,或通过我们的 LinuxJournal.com 个人资料直接与我们的作者和工作人员交流(我是 www.linuxjournal.com/users/webmistress)。经常访问以查看最新的投票并投票。想知道 Linux Journal 读者更喜欢哪种办公软件?现在您知道了:www.linuxjournal.com/content/whats-your-favorite-office-program

我们希望听到您的声音,以便我们继续为您提供您最喜欢的内容,并更好地了解您。不要害羞!访问 LinuxJournal.com 并打个招呼。

加载 Disqus 评论