CS:APP/深入理解计算机系统-第一章(1.7~1.7)

这篇博客介绍了操作系统如何管理硬件资源,包括进程和线程的概念,它们如何在单CPU系统中并发执行。虚拟内存为每个进程提供了独立的内存视图,而文件系统则统一了不同I/O设备的操作。此外,文章还提到了线程在多任务和高并发场景下的重要性。

1.7 The Operating System Manages the Hardware

简单来说程序——操作系统——硬件设备三者之间的关系:操作系统是位于程序和硬件设备之间的软件层,简单示意图如下:

 操作系统可以起到两个主要的作用:

        1.保护硬件不会被应用程序滥用

        2.为应用程序提供简单、统一的机制,用于方便操作复杂且差异很大的底层(low-level)硬件设备。

操作系统通过下图所示的抽象来实现这两个作用:

 files是IO设备的抽象,virtual memory是main memory和IO设备的抽象,processes是全部三者的抽象。

1.7.1 Processes(进程)

这是一个很6的概念,process是操作系统对于运行一个程序program的抽象。多个process可以同时在一个系统上运行,每一个process似乎都在自己使用硬件设备。“同时”的意思是一个process的指令和其他另一些process的指令交错执行。

对于传统的system,一次只能执行一个程序program,对于新的system,例如有多核处理器的,可以同时跑多个程序。在这两种情况下,通过在进程之间切换处理器,单个的CPU也可以执行并发的进行。操作系统一般通过context switching来执行这种切换。为了简化学习,在本节中讨论的都是单CPU的uniprocessor system。

操作系统会跟踪process运行所需要的所有状态信息,可以起个名叫做context,包括PC的当前值,register file和main memory的content(翻译成内容还是容量?不太清楚)。在任意时刻,一个uniprocessor system只能执行单个进程process的code。当这个system打算切换进程的时候,它首先会保存当前进程的context,然后restore新进程的context,接着把控制权交给新的process。新的process就会从它停止的地方开始运行。

下面结合图简单理解一下:

目前有两个并发进程processA和B,分别是shell进程和hello进程。在最开始的时候,shell等待我们的输入,当我们让它调用hello程序时,shell就携带相应的信息让操作系统做些动作。操作系统保存了shell进程的context,创建了新的hello进程和相应的context,然后把控制权交给了hello程序。在hello程序完事之后,操作系统restore了shell进程,然后把控制权交还给shell。最后shell等待下一次输入。

从图中看到,从一个进程到另一个进程的转换是由kernel管理,这个kernel是操作系统代码中始终驻留在内存里的。当应用程序需要操作系统执行某些操作的时候,例如read或write一个file,它就执行一个call指令,把控制权给kernel。然后kernel执行request操作并且返回应用程序。注意,kernel不是一个单独的进程,它是系统用来管理所有进程的代码和数据结构的集合。

1.7.2 Threads(线程)

虽然通常认为一个进程process里面只有一个控制流,但现在的系统里面,一个进程实际上可以由多个执行单元组成,每个执行单元叫做线程。每个线程都在进程的上下文中运行(run in the context of the process),并且不同线程之间共享相同的代码和数据。

现在网络服务器对并发的要求越来越多,所以线程越来越重要。这是因为在多个线程之间共享数据比在多个进程之间共享数据更容易,并且线程比进程更加高效。多线程还可以使程序在多个处理器可用时运行的更快

1.7.3 Virtual Memory

虚拟内存是一种抽象,它为每个进程提供了一种illusion,让进程觉得它自己使用了main memory。每个进程都有统相同的内存统一视图,叫做virtual address space(虚拟地址空间)。这个虚拟地址空间的简单示意如下图所示(假设是Linux系统)

在Linux里面,地址空间的最顶端区域是为操作系统中所有进程通用的代码和数据保留的。地址空间的下面部分的区域保存用户进程定义的代码和数据。注意,图中的地址从下到上递增。 

每个进程看到的虚拟地址空间由许多区域组成,每个区域都有特定的用途。下面从低地址开始逐步向上介绍每一个部分:

  • Program code and data.
    • 对于所有的进程,代码从相同的固定地址开始,然后是和全局C变量相关的data locations。代码区和数据区从可执行对象文件的内容直接初始化。
  • Heap
    • 代码区和数据区后面紧跟着run-time堆。堆会在运行时动态的展开和收缩。
  • Shared libraries
    • 靠近地址空间中间的区域存放共享库(例如C标准库和数学库)的代码和数据。
  • Stack
    • 在用户的虚拟地址空间的顶部是编译器用来实现函数调用的user stack(用户栈)。用户栈在程序运行期间动态的展开和收缩。具体来说,调用函数时栈会增长,从函数返回时栈会收缩。
  • Kernel virtual memory
    • 定址空间的顶部区域是为kernel保留的。应用程序不允许读写该区域的内容,也不允许直接调用内核代码中定义的函数,只能通过调用内核来执行这些操作。

为了让virtual memory工作,硬件和操作系统软件之间需要复杂的交互,包括处理器生成的每个地址的硬件转换。基本思想是把进程虚拟内存的内容存储到磁盘disk上,然后使用main memory作为disk的缓存。

 1.7.4 Files

一个file就是一系列byte。每个IO设备,包括硬盘,键盘,显示器甚至network,都可以建模成一个file。系统的所有输入和输出都可以是read和write一个file,借助于一组成为unix IO的系统调用。

这种简单却有效的概念是很强大的,它为应用程序提供了系统中可能包含的不同IO设备的统一视图。例如同一个程序会在使用不同磁盘技术的不同系统上运行。

------------

1.7的有点多,先不看1.8了,好好消化一下。

[root@localhost opt]# ./download.sh --2025-07-31 22:58:26-- https://github.com/kubesphere/kubekey/releases/download/v3.1.10/kubekey-v3.1.10-linux-amd64.tar.gz 正在解析主机 github.com (github.com)... 20.205.243.166 正在连接 github.com (github.com)|20.205.243.166|:443... 已连接。 已发出 HTTP 请求,正在等待回应... 302 Found 位置:https://release-assets.githubusercontent.com/github-production-release-asset/248386471/bd547688-b9b7-4626-a24e-b46158a99d7e?sp=r&sv=2018-11-09&sr=b&spr=https&se=2025-08-01T03%3A42%3A50Z&rscd=attachment%3B+filename%3Dkubekey-v3.1.10-linux-amd64.tar.gz&rsct=application%2Foctet-stream&skoid=96c2d410-5711-43a1-aedd-ab1947aa7ab0&sktid=398a6654-997b-47e9-b12b-9515b896b4de&skt=2025-08-01T02%3A41%3A51Z&ske=2025-08-01T03%3A42%3A50Z&sks=b&skv=2018-11-09&sig=DcINlCbzQSeX9%2FfBrCJmxvU29yQ%2FnL3USeEBnVKPzE4%3D&jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmVsZWFzZS1hc3NldHMuZ2l0aHVidXNlcmNvbnRlbnQuY29tIiwia2V5Ijoia2V5MSIsImV4cCI6MTc1NDAxNzQwNywibmJmIjoxNzU0MDE3MTA3LCJwYXRoIjoicmVsZWFzZWFzc2V0cHJvZHVjdGlvbi5ibG9iLmNvcmUud2luZG93cy5uZXQifQ.T-Acka7omsqUozHloS2l_qdf4gk6r752kMkkvY1bF_I&response-content-disposition=attachment%3B%20filename%3Dkubekey-v3.1.10-linux-amd64.tar.gz&response-content-type=application%2Foctet-stream [跟随至新的 URL] --2025-07-31 22:58:27-- https://release-assets.githubusercontent.com/github-production-release-asset/248386471/bd547688-b9b7-4626-a24e-b46158a99d7e?sp=r&sv=2018-11-09&sr=b&spr=https&se=2025-08-01T03%3A42%3A50Z&rscd=attachment%3B+filename%3Dkubekey-v3.1.10-linux-amd64.tar.gz&rsct=application%2Foctet-stream&skoid=96c2d410-5711-43a1-aedd-ab1947aa7ab0&sktid=398a6654-997b-47e9-b12b-9515b896b4de&skt=2025-08-01T02%3A41%3A51Z&ske=2025-08-01T03%3A42%3A50Z&sks=b&skv=2018-11-09&sig=DcINlCbzQSeX9%2FfBrCJmxvU29yQ%2FnL3USeEBnVKPzE4%3D&jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmVsZWFzZS1hc3NldHMuZ2l0aHVidXNlcmNvbnRlbnQuY29tIiwia2V5Ijoia2V5MSIsImV4cCI6MTc1NDAxNzQwNywibmJmIjoxNzU0MDE3MTA3LCJwYXRoIjoicmVsZWFzZWFzc2V0cHJvZHVjdGlvbi5ibG9iLmNvcmUud2luZG93cy5uZXQifQ.T-Acka7omsqUozHloS2l_qdf4gk6r752kMkkvY1bF_I&response-content-disposition=attachment%3B%20filename%3Dkubekey-v3.1.10-linux-amd64.tar.gz&response-content-type=application%2Foctet-stream 正在解析主机 release-assets.githubusercontent.com (release-assets.githubusercontent.com)... 185.199.110.133, 185.199.109.133, 185.199.111.133, ... 正在连接 release-assets.githubusercontent.com (release-assets.githubusercontent.com)|185.199.110.133|:443... 已连接。 已发出 HTTP 请求,正在等待回应... 200 OK 长度:37244306 (36M) [application/octet-stream] 正在保存至: “kubekey-v3.1.10-linux-amd64.tar.gz” kubekey-v3.1.10-linux-amd64.tar.gz 100%[===========================================================================================================================>] 35.52M 216KB/s 用时 96s 2025-07-31 23:00:04 (380 KB/s) - 已保存 “kubekey-v3.1.10-linux-amd64.tar.gz” [37244306/37244306]) tar (child): kubekey-vv3.1.10-linux-amd64.tar.gz:无法 open: 没有那个文件或目录 tar (child): Error is not recoverable: exiting now tar: Child returned status 2 tar: Error is not recoverable: exiting now chmod: 无法访问'kk': 没有那个文件或目录 ./download.sh:行42: ./kk: 没有那个文件或目录 CentOS-8 - BaseOS - mirrors.aliyun.com 根据 错误完善脚本并重新生成下载脚本、部署脚本、优化脚本
08-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值