先看廖雪峰
https://www.liaoxuefeng.com/wiki/1252599548343744/1304521607217185
在计算机中,我们把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程,类似的,音乐播放器和Word都是进程。
某些进程内部还需要同时执行多个子任务。例如,我们在使用Word时,Word可以让我们一边打字,一边进行拼写检查,同时还可以在后台进行打印,我们把子任务称为线程。
进程和线程的关系就是:一个进程可以包含一个或多个线程,但至少会有一个线程。

一个Java程序实际上是一个JVM进程,JVM进程用一个主线程来执行main()方法,在main()方法内部,我们又可以启动多个线程。此外,JVM还有负责垃圾回收的其他工作线程等。


改看王道的os了
https://www.bilibili.com/video/BV1YE411D7nH?p=8
进程由程序段数据段PCB三部分组成

寄存器与内存的区别

load某内存地址的值放入某寄存器a
load某内存地址的值放入某寄存器b
运算a+b结果放到寄存器c
把寄存器c的值保存到某内存(存放运算结果)

1.如果是说有没有一条指令可以完成读内存 计算 再把结果写回内存 那显然是有的。x86的运算指令就可以用内存数据当运算对象

  1. 如果是更lower level一点 对于微指令 绝大部分情况下是没有直接在内存数据上计算的. 通常应该是用load把内存数据都到register 然后在register上进行运算。对于risc来说, 这些每一个操作其实大都是一条汇编指令

先来看寄存器。CPU 本身只负责运算,不负责储存数据。数据一般都储存在内存之中,CPU 要用的时候就去内存读写数据。但是,CPU 的运算速度远高于内存的读写速度,为了避免被拖慢,CPU 都自带一级缓存和二级缓存。基本上,CPU 缓存可以看作是读写速度较快的内存。

但是,CPU 缓存还是不够快,另外数据在缓存里面的地址是不固定的,CPU 每次读写都要寻址也会拖慢速度。因此,除了缓存之外,CPU 还自带了寄存器(register),用来储存最常用的数据。也就是说,那些最频繁读写的数据(比如循环变量),都会放在寄存器里面,CPU 优先读写寄存器,再由寄存器跟内存交换数据。

https://www.ruanyifeng.com/blog/2018/01/assembly-language-primer.html
阮一峰写的 堆内存栈内存什么的 挺好的

数据结构中的堆和内存中的堆是两个完全不同的概念

1
2
3
4
int main() {
int a = 2;
int b = 3;
}
1
2
3
4
5
6

int main() {
int a = 2;
int b = 3;
return add_a_and_b(a, b);
}

stack memory 个人理解:因为其后进先出的方式得到了stack这样的名字,另一个内存会在函数退出时自动且非常有效地回收。Stack 是由于函数运行而临时占用的内存区域。上面代码中,系统开始执行main函数时,会为它在内存里面建立一个帧(frame),所有main的内部变量(比如a和b)都保存在这个帧里面。main函数执行结束后,该帧就会被回收,释放所有的内部变量,不再占用空间。Stack 是由内存区域的结束地址开始,从高位(地址)向低位(地址)分配。

基于堆的内存分配,也称为动态内存分配。程序运行的时候,操作系统会给它分配一段内存,用来储存程序和运行产生的数据。这段内存有起始地址和结束地址,比如从0x1000到0x8000,起始地址是较小的那个地址,结束地址是较大的那个地址。比如新建对象,或者使用malloc命令。从低位(地址)向高位(地址)增长。Heap 的一个重要特点就是不会自动消失,必须手动释放,或者由垃圾回收机制来回收。

(不一定对)一般来说,每个线程分配一个stack,每个进程分配一个heap。

操作系统帧frame是什么

核心态 用户态

pv操作

王道考研操作系统 三层调度没听懂

单标志法

忙等待:指在单CPU情况下,一个进程进入临界区之后,其他进程因无法满足竞争条件而循环探测竞争条件。其缺点是,在单CPU情况下,等待进程循环探测竞争条件,浪费了时间片。

为什么生产者消费者的两个p操作不能换

实现互斥的p操作要放在实现同步的p操作之后。
两个v操作顺序可以交换

多消费者 吸烟者问题没听懂

github上XvTianYuan翻译的操作系统恐龙书第十版。
线程时CPU利用的基本单元;它包含一个线程ID,程序计数器(PC),一个寄存器集(寄存器不是在cpu里么)和栈。一个线程与其他属于同一个进程的线程共享代码段和操作系统资源,如打开的文件和信号。