我试图学习如何在没有操作系统的情况下运行应用程序,并且我不断遇到以下信息:为了在没有操作系统的情况下运行程序,该程序必须提供操作系统通常提供的所有 oprocesses 。这让我想到:像Linux(例如Android)这样的操作系统使用哪些进程来运行应用程序?
换句话说,我知道应用程序在操作系统内部运行(没有关系:),但我不太了解操作系统提供哪些功能或它们如何与 Linux 内核交互。
关于如何在没有操作系统的情况下开发程序的建议很有用,但我主要是在寻找有关操作系统如何管理应用程序的信息。谢谢您的帮助!
答案1
所有进程都是通过内存馈送到处理器的一行指令,处理器可以跳转到内存的其他部分,并将部分内存作为数据进行操作。这就是最简单的计算机的工作原理。 (查看https://en.wikipedia.org/wiki/Universal_Turing_machine和https://en.wikipedia.org/wiki/Von_Neumann_architecture了解更多信息)
对于现代计算机,您拥有以两种不同模式运行的处理器 -实模式和用户模式。当计算机启动时,第一个进程可以声明实模式,并在其中看到计算机的真实情况 - 及其拥有的所有硬件。
该进程就是操作系统内核。 Unix 内核所做的就是启动一个用户进程(第一个程序,通常称为在里面在 Unices 上),它有一种错觉,就像它拥有这台计算机一样。
这是一种幻觉,因为内核将设置硬件,以便时不时地,进程将被强制(对它)无形地从处理器中取出,并且内核将在短时间内完成其管理工作。用户进程看到的内存也不是真实内存,而是内核映射到真实硬件内存的假内存(在一些硬件帮助下,请参阅https://en.wikipedia.org/wiki/Memory_management_unit了解更多信息)。
用户进程无法直接访问硬件,但 Unix 内核向其呈现一个用于读写的分层结构(文件系统),内核将其转换为硬件操作(最简单的是磁盘读取和磁盘写入,但不仅如此)。除了访问文件系统之外,内核还提供了一些其他服务。用户进程可以通过指定的简单协议(称为系统调用)。
它可以要求的两项最基本的服务是分叉一个执行。分叉要求内核为父级映像创建另一个进程,并执行从文件系统加载新映像。这样,初始进程可以启动一大堆其他用户进程,然后这些用户进程可以启动其他进程,依此类推。
就像初始进程一样,每个用户子进程都可以像它自己在计算机上一样运行,但它实际上只在一个计算机上运行。虚拟内存地址空间(内核将其映射到进程背后的真实地址),并且内核每隔一段时间就会强制将其从处理器中取出,以便其他进程也可以访问处理器(这称为抢占式多任务处理内核有一个部分称为调度程序它负责具体如何完成)。
本质上是一个内核复用硬件资源计算机上已启动的用户进程(CPU、RAM、Hardrive、GPU...),并且它这样做是合理的相当(每个进程都有一个时间片,以便所有进程都可以进行)并且有效率的(如果一个进程正在等待来自慢速源(磁盘、网络)的数据,那么内核不会浪费 CPU 时间,让它在 CPU 上运行只是为了询问“它还在吗?”,而答案在逻辑上是很长一段时间没有)。所有这些默认公平性都会通过人工输入的策略进行调整。内核还确保进程可以通过内核提供的各种方式相互通信,并确保它们获得共享全局状态的合理视图。