并发编程之始

2018-12-07  本文已影响0人  sadamu0912

从今天开始看《并发编程的艺术》,然后留下学习的笔记,是学习,是提问,是散发思维,是形成自己的知识体系。抱着学习研究的态度,去学习这本书,去深挖一门技术。看完一遍,还有一遍,如此反复。发布出来是因为,技术需要交流,如果我有写错的地方,希望朋友们可以狠狠批评,我认真改过。好,废话不多说,马上开始头脑风暴。

上下文切换,时间片,线程调度算法

1 什么是上下文切换,上下文切换的原理是什么?

1.1 cpu调度算法干了什么?

在操作系统层面,有一个概念叫模式切换,从用户态到内核态,或者从内核态到用户态。一般上下文切换指的是进程上下文切换,或者线程上下文切换。因为进程运行过程当中,会产生,局部变量,进程的方法栈,当cpu调度系统,从一个时间片切换到另一个有效的时间片时,会保存现场数据(上下文数据),局部变量表,程序运行到哪一行,进入PC(程序计数器)等一些数据到内核进程的堆栈中。 实际上,是因为cpu内部有一个计数器,当计数器倒计时到0,那么代表时间片用完了,这个时候,会产生一个中断去触发,cpu调度算法,去重新分配时间片给在就绪队列中的进程。如此循环往复。

1.2 CPU内部的MMU干了什么?
1.2.1首先MMU的主要功能是什么?

那么他不可能是这么大的一个表,肯定空间不够。那他如何寻址?
答案是通过将内存分页。通过页帧号+页内偏移来寻址,一般32位处理器是一页32KB。寻址方式 如下图。

image.png

然后回到原先的问题,MMU干了什么?在进程切换的时候,这里他要清空一些TLB中的映射条目,因为从一个虚拟地址空间到另外一个地址空间。有些条目,已经失效了。但是内核进程由于被用户进程锁共享,一直在内存的某个区域不动,所以这部分的话,不需要刷新。cpu缓存中的数据,也要被清空,设置为invaliad。这就导致,进程切换的时候,很多东西都是未命中,需要重新加载。切换时图片如下所示:


image.png

2 疑问?

什么时候会触发上下文切换? (这里的疑问??)是和进程一样的吧,时间片到了我的猜测,只有在系统时钟周期到了,或者由于中断,陷入内核态,才会触发调度算法。
《并发编程的艺术》书中显示:
多线程竞争锁时,会引起上下文切换

3 如何减少上下文切换

3.1 协程是什么?

线程不同状态之间的转化是谁来实现的呢?是JVM吗?
并不是。JVM需要通过操作系统内核中的TCB(Thread Control Block)模块来改变线程的状态,这一过程需要耗费一定的CPU资源。
多线程编程的耗性能操作:

3.2 协程的应用

上一篇 下一篇

猜你喜欢

热点阅读