天道酬勤,学无止境

operating-system

为什么要使用 64 位操作系统? [关闭](Why go 64 bit OS? [closed])

问题 关闭。 此问题不符合 Stack Overflow 准则。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其成为 Stack Overflow 的主题。 6年前关闭。 改进这个问题 关于这些问题: 哪个 Vista 版本最适合开发人员机器? 用于开发机器的 Vista 或 XP 人们推荐 64 位,你能解释一下为什么吗? 是否只是为了让您可以拥有 32 位给您的超过 3GB 的可寻址 RAM? Visual Studio 如何从所有这些额外的 RAM 中受益? 我从 64 位 XP 回到 32 位,因为我使用的 90% 的软件无论如何都是 32 位的,而且我的驱动程序和一些 64 位软件有问题。 回答1 据我所知,Vista 对 64 位的支持比 XP 好得多。 它比 64 位 XP 宣传得更好,也更受欢迎。 对于 64 位 Vista,驱动程序和软件支持应该会好得多。 64 位转换目前在计算行业正在进行中。 你还不如换。 微软已经向 64 位迈进了一大步,许多人已经效仿。 那些尚未转换的人,很可能很快就会转换。 至于技术优势,除了更高的内存限制之外,没有太多优势。 如果您在 64 位上使用 Vista,它肯定会允许您利用 4GB+ 的 RAM。 回答2 几个原因。 是的,你是对的,所以你可以拥有超过 3 演出的 ram 越来越多的系统将很快成为 64 位

2021-07-13 03:39:01    分类:技术分享    windows-vista   windows-xp   64-bit   operating-system

Why are SIMD instructions not used in kernel?

I couldn't find much use of SIMD instructions (like SSE/AVX) in kernel (except one place where they were used to speedup parity computation of RAID6). Q1) Any specific reason for this or just the lack of use-case? Q2) What needs to be done today if I want to use SIMD instruction, in say a device driver? Q3) How hard will it be to incorporate framework like ISPC into kernel (just for experimentation)?

2021-07-13 03:18:50    分类:问答    linux-kernel   operating-system   linux-device-driver   simd   ispc

是否有跨平台的方式在 Python 中打开文件浏览器?(Is there a cross-platform way to open a file browser in Python?)

问题 我正在考虑 webbrowser 模块的一些东西,但对于文件浏览器。 在 Windows 中,我想打开资源管理器,在 Linux 上的 GNOME 中,我想打开 nautilus,KDE 上的 Konqueror 等。如果可以避免的话,我宁愿不要把它搞砸。 ;-) 回答1 如果可以避免的话,我宁愿不要把它搞砸。 Weeell 我认为您将需要一些平台嗅探工具,但希望不会像可怕的命令嗅探webbrowser模块那样多。 这是第一次尝试: if sys.platform=='win32': subprocess.Popen(['start', d], shell= True) elif sys.platform=='darwin': subprocess.Popen(['open', d]) else: try: subprocess.Popen(['xdg-open', d]) except OSError: # er, think of something else to try # xdg-open *should* be supported by recent Gnome, KDE, Xfce 请注意,win32 版本当前会因文件名中的空格而失败。 错误 2304 可能与此有关,但参数转义和 Windows shell( cmd /c ... )似乎确实存在基本问题

2021-07-13 03:04:30    分类:技术分享    python   cross-platform   operating-system

为 Linux 进程分配的堆栈内存在哪里?(Where is the stack memory allocated from for a Linux process?)

问题 我们知道,当一个进程被创建时,会为这个进程分配一个堆栈。堆栈的大小在linux中通常是8 Mb。我的问题是,这个堆栈是从哪里分配的?从用户空间还是从系统空间? 回答1 我希望你知道所有用户进程将只保存在用户空间中的概念。 它使用系统调用来让内核完成一些工作。 堆栈内存将成为内存中进程上下文区域的一部分。 即用户空间。 假设您的进程正在运行,请通过ps -ax获取 PID。 说 1234 是你的 PID。 cat /proc/1234/maps将为您提供该特定进程的映射。 在那个映射文件中,您可以检查stack以进行堆栈映射。 回答2 首先,您必须了解什么是分页和缺页错误:x86 分页是如何工作的? 内核与进程内存 Linux 内核保留了两个虚拟内存区域: 一个用于内核内存一个程序 确切的拆分由CONFIG_VMSPLIT_...配置。 默认: 在 32 位上: 底部 3/4 是程序空间: 00000000到BFFFFFFF 前 1/4 是内核内存: C0000000到FFFFFFFF 像这样: ------------------ FFFFFFFF Kernel ------------------ C0000000 ------------------ BFFFFFFF Process ------------------ 00000000 在 64 位上:目前仅实际使用

2021-07-13 00:39:52    分类:技术分享    linux   unix   operating-system

Mac OS 上的 Java 随机减速(续)(Java Random Slowdowns on Mac OS cont'd)

问题 几周前我问过这个问题,但我仍然遇到问题并且我有一些新的提示。 原来的问题在这里: Mac OS 上的 Java 随机减速 基本上,我有一个 Java 应用程序,它将作业拆分为独立的部分并在单独的线程中运行它们。 线程没有同步或共享内存项。 它们共享的唯一资源是硬盘上的数据文件,每个线程都有一个开放的文件通道。 大多数时候它运行得非常快,但偶尔它会无缘无故地运行得很慢。 如果我将 CPU 分析器附加到它,那么它会再次开始快速运行。 如果我拍摄 CPU 快照,它会说它的大部分时间都花在“自我时间”中,该函数除了检查一些(未共享的未同步)布尔值之外什么都不做。 我不知道这如何准确,因为 1,它没有意义,2,附加分析器似乎使线程脱离了它们所处的任何模式并解决了问题。 此外,无论它运行得快还是慢,它总是完成并给出相同的输出,并且它的总 CPU 使用率永远不会下降(在这种情况下约为 1500%),这意味着线程没有被阻塞。 我尝试了不同的垃圾收集器、不同大小的内存空间部分、将数据输出写入非 RAID 驱动器,并将所有数据输出放在与主工作线程分开的线程中。 有谁知道这可能是什么问题? 会不会是操作系统(OS X 10.6.2)? 我无法在 Windows 机器上复制它,但我没有具有类似硬件配置的机器。 回答1 回复可能有点晚了,但我可以在线程中使用 Random 观察到类似的减速,这与

2021-07-12 21:08:02    分类:技术分享    java   multithreading   macos   random   operating-system

Can Test and Set be implemented in software without hardware support?

Here's the Test and Set written in software: boolean TestAndSet(boolean *target) { boolean rv = *target; *target = TRUE; return rv; } and do { while(TestAndSetLock(&lock)) ; // do nothing // critical section lock = FALSE; // remainder section } while(TRUE); Can we use the mechanism in CPUs that do not support test-and-set at the hardware level? If so, how is atomicity assured?

2021-07-12 18:54:13    分类:问答    c   operating-system   synchronization   mutual-exclusion

os.path.join 和 os.sep 串联使用的区别(Differences between use of os.path.join and os.sep concatenation)

问题 我想弄清楚是否更好地使用: os.path.join(str1, str2) 或者: str1 + os.sep + str2 使用timeit分析我发现,正如预期的那样,连接速度更快: %timeit 'playground' + os.sep + 'Text' 10000000 loops, best of 3: 139 ns per loop %timeit os.path.join('playground', 'Text') 1000000 loops, best of 3: 830 ns per loop 所以我的问题是,由于串联也更短,是否有理由使用os.path.join(() ? 谢谢 回答1 它就在文档中: os.path.join(path1[, path2[, ...]]) 智能地连接一个或多个路径组件。 如果任何组件是绝对路径,则所有先前的组件(在 Windows 上,包括先前的驱动器号,如果有的话)都将被丢弃,并继续连接。 返回值是path1和可选的path2等的串联,在每个非空部分(最后一个除外)之后正好有一个目录分隔符( os.sep )。 (这意味着最后一部分为空将导致路径以分隔符结尾。)请注意,在 Windows 上,由于每个驱动器都有一个当前目录, os.path.join("c:", "foo")表示相对于驱动器C: ( c:foo )

2021-07-12 14:54:54    分类:技术分享    python   string   path   operating-system

fork 产生的唯一开销是页表复制和进程 ID 创建(the only overhead incurred by fork is page table duplication and process id creation)

问题 fork() 产生的唯一开销是父页表的重复和为子进程创建唯一的进程描述符。 在 Linux 中,fork() 是通过使用 copy-on-write 页实现的。 写时复制(或 COW)是一种延迟或完全阻止数据复制的技术。 那么为什么需要复制页表。 只要进程以只读模式共享页面或直到他们写一些东西,就不需要复制页表,因为父子进程的翻译是一样的?? 有人可以解释.. 提前致谢 回答1 因为COW是在页面只读的基础上工作的,所以我们需要一份全只读的页表副本。 当新进程写入某处时,页面错误被认为是写入只读页面的结果。 页面错误处理程序查看页面的状态,确定它是否应该被写入(如果不是,段错误,就像你在原始进程中写入只读一样)并将相关的原始页面复制到新的过程。 原始页表对于某些条目是可读写的,因此至少必须复制这些条目。 我确实相信整个页表都被复制了(因为它使其他一些代码更简单,并且页表条目不是很大 - 每页四或八个字节[每 4096KB 加上一个条目,每 4009*4096KB 加上一个条目,依此类推]。 还有一些有趣的方面,例如,我们有一些代码可以: char *ptr = malloc(big_number); // Fill ptr[...] with some data. if(!fork()) { // child process works on ptr data. ... }

2021-07-12 14:19:00    分类:技术分享    linux   process   operating-system   kernel   fork

如何判断进程是否在 Windows 上的 Python 中响应(How to tell if process is responding in Python on Windows)

问题 我正在编写一个 python 脚本来保持一个有问题的程序打开,我需要弄清楚该程序是否没有重新播放并在 Windows 上关闭它。 我无法弄清楚如何做到这一点。 回答1 在 Windows 上,您可以这样做: import os def isresponding(name): os.system('tasklist /FI "IMAGENAME eq %s" /FI "STATUS eq running" > tmp.txt' % name) tmp = open('tmp.txt', 'r') a = tmp.readlines() tmp.close() if a[-1].split()[0] == name: return True else: return False 不过,使用 PID 更可靠: def isrespondingPID(PID): os.system('tasklist /FI "PID eq %d" /FI "STATUS eq running" > tmp.txt' % PID) tmp = open('tmp.txt', 'r') a = tmp.readlines() tmp.close() if int(a[-1].split()[1]) == PID: return True else: return False

2021-07-12 12:58:18    分类:技术分享    python   process   operating-system

为什么在从实模式切换到保护模式之前需要禁用中断?(Why do interrupts need to be disabled before switching to protected mode from real mode?)

问题 我在许多 os(和一些引导加载程序)中看到,它们在从实模式切换到保护模式之前都禁用了中断( cli )。 为什么我们需要这样做? 回答1 BIOS 使用 PIT 中断 (IRQ0) 来跟踪时间。 一旦进入保护模式,实模式中断处理就不再有效; 处于保护模式的 CPU 需要保护模式 IDT(中断描述符表)。 进入保护模式后,IDTR(IDT寄存器)中的IDT限制设置为0(任何中断号都会使CPU产生异常),因此只要PIT(或其他任何东西)产生中断,CPU就会产生异常,这将产生另一个异常,触发#DF(双重故障),并因此触发#TF(三重故障)。 此外,在保护模式下发生的 IRQ0 将触发 #DE(除法异常)ISR(中断服务例程),因为从 0 到 31 的中断向量是为保护模式下的异常保留的。 所以,(最有可能的,因为除了 PIT 之外的其他中断也可能发生)发生的事情的顺序是这样的(注意:这假设 PIT 中断将首先被触发,但是,正如我之前所说,它本质上可以是任何中断,每个都会导致 #DF 和三重错误): PE 位在 CR0 中设置。 PIT 中断发生,PIC(可编程中断控制器)在其引脚 #0 上获得信号。 PIC 重映射未设置,因此它会在 CPU 上触发 IRQ0。 IRQ0 (= #DE) 尝试执行中断处理程序,但 IDT 的限制为 0,因此生成 (IIRC) #GP(通用保护故障)。

2021-07-12 12:33:27    分类:技术分享    operating-system   x86   bootloader   osdev   real-mode