鱼友3172
Java后端
·2025-11-10
学习笔记 因为IO操作执行慢,我们就发明了多进程。这是怎么回事呢?在使用一个CPU时,当一个进程执行IO操作时,这个进程就会标记自己为休眠状态,此时就会执行任务切换(也可以说进程切换),将CPU的使用权交给其他进程,待IO操作执行完毕之后,操作系统会把这个进程唤醒,这个进程就有机会重新获得CPU使用权了,这就是多进程。多进程使得我们可以一边听歌,一边写代码。 但是,多个进程之间是不共享内存空间的,所以当我们进行任务切换(也可以说进程切换)时,需要切换内存映射地址,成本高。 于是我们又有了多线程,同一个进程的多个线程是共享内存空间的,所以使用线程去做任务,线程进行切换的时候,不需要切换内存映射地址,成本就低,所以我们现在用的基本都是多线程,任务切换也指的是线程切换。 又但是,线程切换回导致原子性的并发问题。我们现在基本上都是使用高级编程语言,它的一句语法可能是由多个CPU指令组成的,比如说count++,它是由三个CPU指令去执行的,CPU指令1:先将count变量从内存加载到缓存再加载到CPU寄存器。CPU指令2:然后寄存器去执行count+1操作。CPU指令3:最后将结果写进内存(也有可能写入缓存,因为缓存机制的存在)。 那么问题来了,我们的原子性是基于CPU指令的,CPU保证的原子操作是CPU指令级别的,也就是说,它只能保证CPU指令1或者指令2或者指令3能够完整的运行。又换句话说,线程切换是可以发生在执行完CPU指令1之后,执行CPU指令2之前的,这就是原子性问题了,它也会导致count加了两次,但是结果为1; 线程A执行指令1,从内存中读取到count=0。此时线程切换到线程B,线程B也读取到count=0,但是完整的执行了三个指令操作,返回给内存count=1。然后线程又切换回A,A继续执行操作,但是它任然是对count=0执行后面两条指令的操作,最后得到的结果也是count=1,返回给内存。但是我们期望的结果是2而不是1;
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP