学会注解的正确使用姿势
每个线程有自己的栈 stack,记录该线程里面的方法相互调用的关系; 但是一个进程里的所有线程是共用堆 heap 的。 那么不同的进程之间是不可以互相访问内存的,每个进程有自己的内存空间 memeory space,也就是虚拟内存 virtual memory。 通过这个虚拟内存,每一个进程都感觉自己拥有了整个内存空间。 虚拟内存的机制,就是屏蔽了物理内存的限制。 Q:那如果物理内存被用完了呢? 用硬盘,比如 windows 系统的分页文件,就是把一部分虚拟内存放到了硬盘上。 相应的,此时程序运行会很慢,因为硬盘的读写速度比内存慢很多,是我们可以感受到的慢,这就是为什么开多了程序电脑就会变卡的原因。 Q:那这个虚拟内存是有多大呢? 对于 64 位操作系统来说,每个程序可以用 64 个二进制位,也就是 2^64 这么大的空间! 如果还不清楚二进制相关内容的,公众号内回复「二进制」获取相应的文章哦~ 总结 总结一下,在一个时间片里,一个 CPU 只能执行一个进程。
CPU 给某个进程分配资源后,这个进程开始运行;进程里的线程去抢占资源,一个时间片就只有一个线程能执行,谁先抢到就是谁的。 Q:这些进程是并行执行的吗? 单核 CPU 一个时间片里只能执行一个进程。但是因为它切换速度很快,所以我们感受不到,就造成了一种多进程的假象。(多核 CPU 那真的就是并行执行的了。) Q:那如果这个进程没执行完呢? 当进程 A 执行完一个时间片,但是还没执行完时,为了方便下次接着执行,要保存刚刚执行完的这些数据信息,叫做「保存现场」。 然后等下次再抢到了资源执行的时候,先「恢复现场」,再开始继续执行。 这样循环往复。。 这样反复的保存啊、恢复啊,都是额外的开销,也会让程序执行变慢。 Q:有没有更高效的方式呢? 如果两个线程归属同一个进程,就不需要保存、恢复现场了。 这就是 NIO 模型的思路,也是 NIO 模型比 BIO 模型效率高很多的原因,我们之后再讲。 线程 thread 线程,是一个进程里的具体的执行路径,就是真正干活的。 在一个进程里,一个时间片也只能有一个线程在执行,但因为时间片的切换速度非常快,所以看起来就好像是同时进行的。
一个进程里至少有一个线程。比如主线程,就是我们平时写的 main() 函数,是用户线程;还有 gc 线程是 JVM 生产的,负责垃圾回收,是守护线程。 (编辑:平顶山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |