6.cs081os学习

感谢:

参考资料:

https://www.geeksforgeeks.org/pipe-system-call/

很好的文章:

https://swtch.com/~rsc/thread/

同步机制:https://zybtree.github.io/2020/08/12/%E5%90%8C%E6%AD%A5%E6%9C%BA%E5%88%B6/

参考答案: https://github.com/relaxcn/xv6-labs-2022-solutions/blob/main/doc/utils.md

学习链接: https://pdos.csail.mit.edu/6.828/2021/schedule.html


直接从进程与线程入手

进程与线程

单独的CPU变换成多个虚拟的CPU

进程

当网页请求进入的时候 先查看 网页是否在缓存中 如果不是
启动一个磁盘请求用来获取网页 磁盘请求会花费很多时间 等待的过程中会有更多的请求进入
每个进程有它自己的虚拟的CPU 真正的CPU在进程之间来回切换
需要一些方法例如多个磁盘 模拟控制并发 进程就能发挥作用
来回切换称: 多道程序设计

支持多进程的多道程序系统
一个核一次也只能运行一个进程

internet.jpg


12.1日

一.进程的并发执行
  1. 并发
  • 进程的执行是间断的

每个进程的生命周期期间CPU执行 由于某种原因暂停 每个进程执行是间断性的

  • 进程的执行速度是不可预测的

进程调度,有其他事件的发生,每个进程上cpu执行坑你一点时间听着再接着运行

  1. 共享
  • 进程线程之间的制约性
    在一个并发环境下多个进程或者线程之间会共享某些资源,在这些资源的使用过程中会产生进程之间的一种制约性。
    比如当一个进程享用打印机这个资源,另外一个进程在第一个进程没有释放这个资源的前提之下就得不到这个资源,那就得等待。
  1. 不确定性
  • 进程执行的结果与其执行的相对速度有关

进程执行的结果和它的相对执行速度是有关系的,因此在不同的执行顺序的情况下,进程的执行结果也是不确定的。

二.进程互斥

由于各进程要求使用共享资源(变量、文件等), 而这些资源需要排他性使用,
各进程之间竞争使用这些资源,这一关系称为进程互斥。

  • 临界资源
    系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源或共享变量。
    这些程序片段,分散在不同的进程里,它们的共同的特点是对同一个共享变量进行一些操作
    这一段代码,和另外一个进程的这一段代码互为临界区,互为互斥区

internet.jpg

冯诺依曼模型

计算机基本结构:运算器 控制器 存储器 输入设备 输出设备

内存

程序和数据都是存储在内存,存储区域是线性的

存储数据的基本单位是 字节 每一个字节对应一个内存地址

最后一个地址为内存总字节数 -1 结构就像数序中的数据

中央处理器

也就是cpu:
32位cpu一次可以计算4个字节
64位cpu一次可以计算8个字节 位数也就是cpu的位宽 代表cpu一次可以计算的数据量

8 位的 CPU,那么一次只能计算 1 个字节也就是0~255 范围内的数值 那么 32位也就是一次可以计算出 2的32次方这么大的数值
cpu内部组件:寄存器,控制单元和逻辑运算单元

为什么有了内存还需要寄存器?

寄存器种类(通用寄存器)(程序计数器)(指令寄存器)

因为: 内存离 CPU 太远了,而寄存器就在 CPU 里,紧挨着控制单元和逻辑运算单元,自然计算时速度会很快。

总线

总线用于cpu和内存以及其他设备之前的通信

(地址总线):指定CPU将要操作的内存地址

(数据总线):用于读写内存的数据

(控制总线): 发送和接收信号,比如中断,设备复位等信号

CPU 要读写内存数据的时候:

  • 首先要通过「地址总线」来指定内存的地址;
  • 然后通过「控制总线」控制是读或写命令;
  • 最后通过「数据总线」来传输数据;
输入输出设备

输入设备向计算机输入数据,计算机经过计算后,把数据输出给输出设备。
如果输入设备是键盘,按下按键时是需要和 CPU 进行交互的,这时就需要用到控制总线了。

线路位宽与CPU位宽

数据是如何通过线路传输的呢
操作电压,低电压表示 0,高压电压则表示 1

101 二进制数据,十进制则表示 5,如果只有一条线路,就意味着每次只能传递 1 bit 的数据, 那么传输 101 这个数据,就需要 3 次才能传输完成,这样的效率非常低。

增加线路,数据并行传输

CPU 想要操作「内存地址」就需要「地址总线」:

地址总线只有 1 条,那每次只能表示 「0 或 1」这两种地址 最大数量为 2(2^1)个

如果地址总线有 2 条,那么能表示 00、01、10、11 这四种地址 最大数量为 4(2^2)个

CPU 操作 4G 大的内存,那么就需要 32 条地址总线,因为 2 ^ 32 = 4G

CPU位宽最好不要小于线路位宽

a little operater systerm

链接 : https://lwn.net/Articles/250967/

internet.jpg

所有 CPU(前面的示例中为两个,但可以有更多)都通过公共总线(前端总线,FSB)连接到北桥。除其他外,北桥还包含内存控制器,
其实现决定了计算机使用的 RAM 芯片的类型。不同类型的 RAM,例如 DRAM、Rambus 和 SDRAM,需要不同的内存控制器。

要访问所有其他系统设备,北桥必须与南桥进行通信。南桥通常称为 I/O 桥,通过各种不同的总线处理与设备的通信。如今,PCI、PCI Express、SATA 和 USB 总线最为重要,但南桥也支持 PATA、IEEE 1394、串行和并行端口。
较旧的系统具有连接到北桥的 AGP 插槽。这样做是出于与北桥和南桥之间的连接速度不够快相关的性能原因。然而,如今 PCI-E 插槽全部连接到南桥。


让终端显示出自己说的话
shell
1
2
3
4
5
6
7
cd ~
root@xiaoxinxiaohao:~# vim .bashrc
root@xiaoxinxiaohao:~# source ~/.bashrc
赵忠鹤闪亮登场
Today is: Fri Dec 6 05:12:09 PM CST 2024
今天也要充满活力哇咔咔

听从了一些学习的建议,带着问题去读书,想学什么,去书中学,带着问题去读书


12.16日

看到了b站的一个关于Go并发设计

了解协程: 协程是一种用户级的轻量级线程。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈

主流语言基本上都选择了多线程作为并发设施

线程相关的概念就是抢占式多任务(Preemptive multitasking),而与协程相关的是协作式多任务

多线程编程是比较困难的, 因为调度程序任何时候都能中断线程, 必须记住保留锁, 去保护程序中重要部分, 防止多线程在执行的过程中断 协程默认会做好全方位保护, 以防止中断

协程相比于多线程的优点

无需系统内核的上下文切换,减小开销; 因为:协程它不像线程和进程那样,需要进行系统内核上的上下文切换,协程的上下文切换是由开发人员决定的

无需原子操作锁定及同步的开销,不用担心资源共享的问题

单线程即可实现高并发,单核 CPU 即便支持上万的协程都不是问题,所以很适合用于高并发处理,尤其是在应用在网络爬虫中

缺点
  1. 无法使用 CPU 的多核 因为: 协程的本质是个单线程
  2. 写协程就意味着你要一值写一些非阻塞的代码,使用各种异步版本的库,比如后面的异步爬虫教程中用的 aiohttp
  3. 协程的概念最核心的点其实就是函数或者一段程序能够被挂起(说暂停其实也没啥问题),待会儿再恢复