Questions tagged «operating-systems»

有关在硬件和应用程序之间进行接口的软件原理的问题。



7
打开程序时,操作系统是否注入自己的机器代码?
我正在研究CPU,我知道它如何从内存中读取程序并执行其指令。我还了解到,操作系统将进程中的程序分开,然后在各个程序之间如此快速地切换,以至于您认为它们在同一时间运行,但实际上每个程序都在CPU中单独运行。但是,如果OS也是在CPU中运行的一堆代码,那么它如何管理进程? 我一直在思考,我唯一能想到的解释是:当操作系统将程序从外部存储器加载到RAM时,它会在原始程序指令的中间添加自己的指令,然后执行该程序,可以调用操作系统并执行某些操作。我相信操作系统会添加一条指令到程序中,这将允许CPU在一段时间后返回到操作系统代码。而且,我相信操作系统加载程序时,它会检查是否存在一些禁止的指令(该指令会跳转到内存中的禁止访问地址)并消除该指令。 我在想严厉吗?我不是CS学生,但实际上不是数学学生。如果可能的话,我会想要一本好书,因为如果操作系统也是一堆在CPU中运行的代码,并且无法同时运行,那么我找不到能解释操作系统如何管理进程的人。节目时间。这些书仅说明操作系统可以管理事物,但现在可以管理事物。

6
从一组对中生成组合而无需重复元素
我有一对。每对都具有(x,y)的形式,使得x,y属于范围内的整数[0,n)。 因此,如果n为4,那么我有以下几对: (0,1) (0,2) (0,3) (1,2) (1,3) (2,3) 我已经有一对了。现在,我必须使用n/2对构建一个组合,这样就不会重复任何整数(换句话说,每个整数在最终组合中至少出现一次)。以下是正确和不正确组合以更好地理解的示例 1. (0,1)(1,2) [Invalid as 3 does not occur anywhere] 2. (0,2)(1,3) [Correct] 3. (1,3)(0,2) [Same as 2] 一旦我有了配对,有人可以建议我一种生成所有可能组合的方法。

7
Unix / C中不一致和不完整的例子有哪些?
在理查德·加布里埃尔(Richard Gabriel)的著名文章《更糟的崛起》中,他将MIT / Stanford(Lisp)和新泽西(C / Unix)设计哲学的漫画版本沿简单性,正确性,一致性和完整性进行了对比。他举例说明了“ PC失败者的问题”(Josh Haberman在其他地方讨论过),以为Unix优先于实现的简单性而不是接口的简单性。 我想出的另一个例子是不同的数字方法。Lisp可以表示任意大的数字(最大取决于内存的大小),而C将数字限制为固定的位数(通常为32-64)。我认为这说明了正确性轴。 有什么例子可以保持一致性和完整性?以下是加百列的所有描述(他承认是漫画): 麻省理工学院/斯坦福大学的方法 简单性-设计必须在实现和界面上都简单。接口要比实现简单,这一点更为重要。 正确性-设计在所有可观察的方面都必须正确。根本不允许不正确。 一致性-设计一定不能不一致。为了避免不一致,允许设计稍微简单一些,不太完整。一致性与正确性一样重要。 完整性-设计必须涵盖尽可能多的重要情况。必须涵盖所有合理预期的情况。不允许过分简化完整性。 新泽西州方法 简单性-设计必须在实现和界面上都简单。简单的实现比接口更重要。简洁是设计中最重要的考虑因素。 正确性-设计在所有可观察的方面都必须正确。简单比正确要好一些。 一致性-设计一定不能过分不一致。在某些情况下,为了简化起见,可以牺牲一致性,但是最好将设计中处理不常见情况的那些部分放掉,而不是引入实现复杂性或不一致。 完整性-设计必须涵盖尽可能多的重要情况。所有合理预期的情况都应包括在内。可以牺牲完整性来支持任何其他质量。实际上,每当实现简单性受到威胁时,都必须牺牲完整性。如果保持简单性,可以牺牲一致性来实现完整性。尤其是一文不值的是接口的一致性。 请注意,我并不是在问Gabriel是否正确(这个问题不适用于StackExchange),而是要举例说明他可能一直在指的是什么。

4
一般而言,哪些线程共享?
好吧,这是一个普遍的问题。而且,如果有人想使其实现特定,那么我将更喜欢Unix相关的东西。但首先需要普遍了解以下问题: 我读到单个进程可以有多个线程。同一进程的多个线程确实在它们之间共享事物。我想知道他们分享什么,不分享什么。考虑到进程由地址空间,堆栈,堆,全局变量,代码,数据,OS资源组成,线程之间共享哪些资源?我有以下猜测: 全局变量-我已读取线程共享全局变量。同样,在用Java和C#编程时,我创建了线程来共享类级变量。因此,我认为线程共享全局变量(尽管不能确定高级编程语言中的概念是否可以转换为低操作系统级别的事实)。 堆-由于全局变量存储在堆中,因此堆在线程之间共享。 堆栈-由于每个线程可以具有自己的执行序列/代码,因此它必须具有自己的堆栈,可以在该堆栈上推入/弹出程序计数器的内容(在发生函数调用和返回的情况下)。因此,同一进程的线程不共享堆栈。 现在我不确定以下内容的共享 地址空间-不确定在地址空间中到底要算什么。但是我想地址空间通常用于进程而不是线程的上下文中。而且,由于同一进程的所有线程与父进程位于同一地址空间,因此可以说线程共享地址空间。(但是,然后它们在同一地址空间内维护不同的堆栈吗?) 操作系统资源-我猜这可能是特定于实现的。例如,父进程可以选择性地将同一文件的句柄分配给它的某些线程,而不是全部。还是我误会了,操作系统资源意味着文件以外的东西? 代码-线程可以具有不同的代码,因此共享代码并非总是如此。 数据-不确定要在数据下考虑什么。但是请确保全局变量在线程之间共享。并确保不会局部共享局部变量。 总体而言,由于术语含糊,操作系统书籍中的超级概括以及在线提供的额外的实现特定细节,我感到非常困惑。因此,我试图找到一些令我满意的答案。

2
操作系统如何为随机种子创建熵?
在Linux上,文件/dev/random和/dev/urandom文件分别是伪随机字节的阻塞和非阻塞源。 它们可以作为普通文件读取: $ hexdump /dev/random 0000000 28eb d9e7 44bb 1ac9 d06f b943 f904 8ffa 0000010 5652 1f08 ccb8 9ee2 d85c 7c6b ddb2 bcbe 0000020 f841 bd90 9e7c 5be2 eecc e395 5971 ab7f 0000030 864f d402 74dd 1aa8 925d 8a80 de75 a0e3 0000040 cb64 4422 02f7 0c50 6174 f725 0653 2444 …

4
合作调度在执行I / O操作时是否会挂起进程?
许多操作系统参考都说,在协作式(而不是抢占式)多任务处理中,进程将保持CPU直到它明确地自愿挂起自身。如果正在运行的进程执行了无法立即满足的I / O请求(例如,请求尚不可用的击键),那么调度程序是否将其挂起,或者它确实保留了CPU,直到可以为该请求提供服务为止? [进行了编辑,以“执行无法立即满足的I / O请求”替换“ I / O上的块”。]

3
具有恒定时间操作的智能内存管理?
让我们考虑一个内存段(可以在需要时增大或缩小文件的大小,就像文件一样),您可以在该内存段上执行两个涉及固定大小块的基本内存分配操作: 分配一个块 释放先前已分配的不再使用的块。 同样,作为一项要求,不允许内存管理系统在当前分配的块之间移动:它们的索引/地址必须保持不变。 最幼稚的内存管理算法将增加一个全局计数器(初始值为0),并将其新值用作下一个分配的地址。但是,当只剩下几个分配的块时,这绝不允许缩短段。 更好的方法:保留计数器,但维护一个释放块列表(可以在固定时间内完成),并在不为空的情况下将其用作新分配的源。 接下来是什么?在保持恒定的时间分配和解除分配约束的情况下,有什么办法可以使内存段尽可能地短而可以完成? (目标可能是使用最小的地址跟踪当前未分配的块,但是在恒定时间内似乎不可行……)

4
操作系统如何在应该管理的同一芯片上运行?
从我对操作系统的阅读(阅读Wikipedia,技术网站等的基本材料)中,我了解到操作系统是一个程序,它允许程序和应用程序以有效和安全的方式与硬件进行交互。 但是,我对操作系统如何在需要操作时如何监督计算机的操作感到困惑。 我什么意思 好吧,我想像一个操作系统的工作方式是在一台计算机上有两个CPU。一个始终运行操作系统,另一个用于操作系统运行计算机。但是,事实证明,该操作系统与其他进程在同一CPU上运行。这就像经理必须与员工在同一生产线上工作,并且只有在另一名员工完成工作后才能使用电动工具。他将不是一个非常有效的经理,因为如果他的员工稍微不纪律,他将无权下达命令。 那么,操作系统在部分必须在所有其他进程之间共享的同一CPU上仅部分运行的情况又如何呢?最终如何解决?

3
“软”实时操作系统实际上可以提供什么保证
我想我知道什么是“硬”实时操作系统。它是带有调度程序的操作系统,该调度程序与应用程序程序员提供合同。应用程序为每个资源分配请求提供截止日期。 如果期限请求是可行的,则调度程序保证将在期限之前将每个资源分配给请求的应用程序。该保证足以使应用程序程序员能够推理特定请求的最大延迟和最小吞吐量。 我发现的所有关于“软”实时系统的定义在我看来都是空虚的。 维基百科说 结果的有用性在其截止日期之后降低,从而降低了系统的服务质量。 嗯 好的。按照这个标准,Windows 95是一个软实时系统,3BSD和Linux也是如此。Wikipedia不是一个很好的来源,但是接下来的两个Google热门记录并没有好得多。例如http://users.ece.cmu.edu/~koopman/des_s99/real_time/说 在软实时系统中,可以容忍很少出现的峰值负载下的性能下降。 那不是合同,那是什么都不说的幻想。 实际操作系统提供的真正的软实时担保/合同的例子有哪些? 我正在寻找以下形式的答案: 在(OS-name)中,如果程序员这样做(程序员需要做什么),则操作系统保证(系统保证什么)。

2
微内核vs整体内核的性能
微内核将所有驱动程序实现为用户空间程序,并在内核本身中实现IPC之类的核心功能。但是,单片内核将驱动程序实现为内核的一部分(例如,以内核模式运行)。 我已经读过一些说法,微内核比单片内核慢,因为它们需要处理用户空间中驱动程序之间的消息传递。这是真的? 长期以来,大多数内核都是单片的,因为硬件太慢而无法快速运行微内核。但是,现在有许多微内核和混合内核,例如GNU / Hurd,Mac OS X,Windows NT line等。 那么,微内核的性能是否发生了变化?这种对微内核的批评在今天仍然有效吗?

2
拥有运行托管代码的最小内核的潜在陷阱是什么?
假设我要基于一个很小的本机较低层内核构建操作系统,该较低层本地内核充当托管代码解释器/运行时,并基于一个较大的较高层内核编译为非本地机器语言(Java字节码,CIL等)。类似操作系统的示例将是Singularity和Cosmos。 与纯本机解决方案相比,使用这种基础结构编写操作系统存在哪些陷阱和开发挑战?

6
在一个间隔中找到两个数字的最大异或:我们能做得比二次更好吗?
lllrrrmax(i⊕j)max(i⊕j)\max{(i\oplus j)}l≤i,j≤rl≤i,j≤rl\le i,\,j\le r 天真的算法只检查所有可能的对。例如在红宝石中,我们有: def max_xor(l, r) max = 0 (l..r).each do |i| (i..r).each do |j| if (i ^ j > max) max = i ^ j end end end max end 我感觉到,我们可以做得比二次。是否有针对此问题的更好算法?

1
操作系统中的内存膨胀
一些虚拟机管理程序使用一种称为“膨胀”的方法(至少是KVM所谓的“膨胀”)来优化内存使用,该方法对VM之间的内存进行重复数据删除,并将普通页面设置为只读,并在写入时进行复制。 这与fork调用相反。 在操作系统级别上实现流程是否可行(我主要想到的是在同一站点上使用带有多个选项卡的Chromium浏览时重复存储),是否已经实现?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.