现代操作系统:概述(二)
1.5 Operating System Concept 操作系统概念
1.5.0 Processes 进程
进程就是执行中的程序。如果你打开一个程序两次(如计算器)那么就是两个计算器独立的进程。通常,我们将进程的状态或上下文(它的地址空间(大致是它的内存映像)、打开的文件等)与控制线程区分开来。如果一个任务中有许多线程在运行,那么结果就是多线程进程,很显然一个进程可以包含多个线程。
操作系统将所有进程的信息保存在进程表中。实际上,操作系统将进程视为入口,这是一个活动实体(进程)被视为数据结构(进程表中的一个条目)的例子。离散事件模拟提供了活动实体被视为数据结构的另一个例子。à OS进程表中存储了所有当前OS中正在运行的进程,那么怎么存储呢?OS将进程抽象化为一个数据结构,这玩意叫进程控制块(Process Control Block PCB)。
进程表条目中包含的数据有许多用途。例如,它允许当前被抢占、阻塞或挂起的进程在将来恢复执行。另一个例子是包含当前目录位置的条目,它使进程能够利用文件的相对地址。多亏了操作系统,每个进程的行为就好像它拥有整个CPU和整个内存一样,这被称为虚拟化(virtualization)。
The Process Tree 进程树
Linux OS在启动时会自动启动三个进程,其进程号分别为0,1,2,分别是idle进程,init进程和kthreadd进程。https://www.cnblogs.com/alantu2018/p/8526970.html。
idle进程是系统创建的第一个进程,完成加载系统后其负责系统中进程的调度和交换;
init 进程由idle进程创建,完成系统的初始化,作为其它用户进程的祖先进程;
进程可以创建子进程,子进程可以继续创建多个子进程,所以进程可以构成一颗相关联的树。同时当父进程结束时,子进程不会被强制结束,每个进程都拥有自己独立的内存空间。
组进程通过(Unix) fork系统调用形成一个树。分叉者称为分叉者的父代,分叉者称为子代。如果系统总是阻塞父节点,直到子节点完成,则树非常简单,只有一行。
然而,在现代操作系统中,父操作系统可以继续自由执行,特别是可以再次自由分叉,从而产生另一个子操作系统,即第一个子操作系统的兄弟。这将生成一个过程树,如最右边所示。一个进程可以向另一个进程发送信号,使后者执行预定义的函数(信号处理程序)。
每个用户都被分配了一个用户标识(UID),该用户创建的所有进程都有这个UID。子节点具有与其父节点相同的UID。有时可以更改正在运行的进程的UID。可以形成一组用户,并给予组标识GID。其中一个UID是特殊的(超级用户或管理员),具有额外的特权。可以将对文件和设备的访问限制为给定的UID或GID。
Deadlocks 死锁
本质上是进程或线程无法获取到让自己运行所需要的资源时就产生了死锁,怎么解决后面会讲。比如A和B都要用打印机和投影仪,结果A抱住打印机,B抱住投影仪,那么这两个人最后都没有办法完成任务。
1.5.1 Address Spaces地址空间
显而易见的是,每个进程都需要一定的内存,但还有其他问题。例如,链接器生成一个加载模块,该模块假定进程加载在位置0。结果是,每个加载模块都有相同的(虚拟)地址空间。操作系统必须确保并发执行进程的虚拟地址被分配到分离的物理内存中(内存保护和上下文切换 Memory Protection and Context Switching),因此现在的操作系统可以允许每个进程获得比机器上真实内存容量更多的虚拟内存。
1.5.2 Files 文件
现代操作系统中拥有层次性的文件结构被称之为文件系统树,你可以通过一个从根目录(或者在Windows a根目录)开始的绝对路径来命名文件,或者通过一个从当前工作目录开始的相对路径来命名文件。此功能的一个要求是,操作系统必须知道每个进程的当前工作目录。因此,操作系统将当前工作目录的位置存储在每个进程的进程表项PCB中。
除了常规的文件和目录,Unix还为设备使用文件系统名称空间(称为特殊文件),这些文件系统名称空间通常位于/dev目录中。也就是说,在某些情况下,您可以将设备视为一个文件。特别是,一些通常应用于(普通)文件的实用程序也可以应用于一些特殊文件。Linux文件系统的哲学之一就是将所有的东西都视为了文件,Linux的文件类型包括bsc-lsp7种,分别表示块设备文件,字符设备文件,目录文件,普通文件,软链接文件,套接字文件,管道文件;
在访问文件之前,通常要打开文件并获取文件描述符。随后的I/O系统调用(例如,读和写)使用文件描述符而不是文件名。这是一种优化,允许操作系统一次性查找文件,并将信息保存在文件描述符访问的文件表中。先记住文件描述符就是一个int值,每个进程都是从0开始的,0,1,2分别表示标准输入stdin,标准输出stdout以及标准错误stderr,每个进程最多可以打开1024个文件描述符。
一些命令解释器提供的便利是一个或多个管道。例如,下面的命令dir | wc -w将dir的输出管道输送到一个单词计数器中。总的结果是目录中的文件数量。
1.5.3 Input/Output 输入和输出
OS必须管理各种各样的I/O设备。操作系统包含每个设备(实际上是每个控制器)的设备特定代码(驱动程序)以及设备独立的I/O代码。尽管所有给定类型的设备(例如磁盘)执行本质上相同的操作(例如,读块或写块),不同的设备需要不同的命令,因此需要不同的驱动程序。
1.5.4 Protection 保护
文件和目录具有相关权限。,大多数系统至少提供 rwx(可读、可写、可执行)。可以为文件所有者(文件(如流程和用户)以及与文件具有相同 GID 的其他用户以及其他人定义单独的权限。打开文件时,将检查读权限,如果允许打开,则返回用于后续操作的文件描述符。另外,分配给一个进程的内存(即地址空间)必须受到保护,这样其他的进程就不会这块内存。
1.5.5 The Shell 就是Shell
Shell向操作系统提供命令行接口,并提供几个方便的特性。
- 调用命令;
- 将参数传递给命令;
- 将命令的输出重定向到文件或设备;>
- 将命令的输入从文件或设备重定向获取;<
- 通过管道将一个命令传递到另一个命令(如上所示,通过dir | wc -w);
1.5.6 Others 其他
大内存(和汇编语言)
当内存变大时,汇编语言的使用大大减少。当小型计算机和微型计算机(早期的个人电脑)首次出现时,它们的内存都很小,因此汇编语言在一段时间内再次流行起来。
硬件保护(单道编程)
多道编程需要保护硬件。一旦硬件可用,单编程就过时了,当微型计算机和小型计算机出现时,它们又没有这样的硬件,所以单程序设计又复活了。
磁盘(和平面文件系统)
当磁盘很小时,它们可以保存很少的文件,一个平面(单目录)文件系统就足够了。一旦磁盘变大,就需要分层文件系统。当微型计算机和微型计算机问世时,它们有很小的磁盘,相应的文件系统是扁平的。
虚拟内存(和动态链接库)
后面将详细讨论虚拟内存,它允许单个程序寻址比计算机中存在的更多内存(后者称为物理内存)。动态重映射地址的能力还允许程序在运行时链接到库。因此,当VM硬件可用时,动态链接也可用。
posted on 2021-10-03 22:25 ThomasZhong 阅读(140) 评论(0) 编辑 收藏 举报