操作系统的进程与线程知识汇总

上一篇:Java 中“>>”和“>>>”有什么区别?

1、栈里的数据:
栈帧:描述方法的一次执行瞬间——方法开始执行了,生成战帧,方法执行结束了,销毁栈帧。
栈帧里有局部变量/方法的形参

2、 计算机的主要目的:运行各种各样的程序,程序是通过进程这个抽象的过程跑起来。

3、 OS(操作系统)是一个管理的软件,管理两类:有形的硬件和无形的活动。
操作系统所谓的管理,即管理资源的分配权,资源是以进程的单位分配出去的。
分为:进程管理,内存管理,文件管理,网络管理,驱动管理。

4、 代码只有到CPU上才能运行。所以CPU资源是最最宝贵的。

5、 进程管理/进程调度:OS通过不断切换进程,实现分配CPU资源到进程的管理。

6、 进程会切换的几种可能时机:
i) 被高优先级进程抢占
ii) 执行结束
iii) 等待外部IO事件
iv) 主动放弃
v) 时间片耗尽(实现一个同时运行的假想)

7、 进程切换(执行操作系统的代码完成):
I) 会对当前进程的上下文保护
II) 会对下一个进程的上下文恢复。

8、 进程是操作系统资源分配的最小单位。
线程是操作系统调度的最小单位(操作系统CPU资源分配的最小单位),以Thread对象去描述。

9、 初始化对象的属性信息:
I) pid
II) 程序信息
III) 统计信息
IV) 调度信息

10、程序如果要执行,线程必须要抢到CPU资源。

11、 多线程的适用场景是什么?优点是什么?
1) 可能提升执行的速度(多一个调度单位,多有机会抢到一次CPU)。
2) 某些场景下,必须多线程才能处理,例如有阻塞时IO时(一个调度单位倒下了,剩下的调度单位还能抢CPU工作)。

12、覆写run方法的目的,只是指导线程应该进行的工作,没有其他作用。
Start不需要覆写,而调用start方法,会把线程放到就绪队列中,拥有调度机会(抢CPU的机会)。

13、线程常见属性:ID,名称,状态,优先级,是否后台线程,是否存活,是否被中断。

14、Therad的常见操作:
I)启动线程——把该线程放到就绪队列中,拥有争夺CPU的资格——start;
Ii)通知一个线程停下来(中断线程)——建议不是强制——interrupt;
Iii)等待一个线程停下来——join;
Iiii)(废弃的方法)可以强制让线程停下来的办法,但不建议用了。

15、如何感受到通知?
I) 如果正在sleep之类的操作调用,以interruptedException异常的形势被通知
II) 如果不是,则需要使用Thread. interrupted(更推荐)或者t.isInterrupted
Iii)Thread. interrupted调用会重置中断标志位(即灯变暗)
interruptedException异常抛出之后会重置中断标志位
原因:希望这次通知到此结束,不要影响到后续.

16、
1)Thread.currentThread()返回当前线程的引用——哪个线程中在执行这段代码,哪个线程就是当前代码;
2)Thread. Interrupted()通知停止;
3)Thread.sleep(毫秒)休眠x毫秒——当前线程放弃CPU,把状态修改(不在争抢CPU),给自己设置个闹钟,x毫秒之后,重新进入抢夺CPU的行列;
Sleep的时间肯定>=x毫秒,有可能大于x毫秒;
TimeUnit.SECONDS.sleep(秒);
TimeUnit.HOUR.sleep(秒);
4)Thread.yield();主动放弃CPU,但保留争夺CPU的资格。从running到ready
5)isAlive();不是NEW和TERMIANATED都返回true。

17、线程状态的作用:JVM内部调度线程时的参考;程序员DEBUG时观察线程——jconsole工具。

18、线程有哪些状态及含义?
New:线程对象刚被创建,没有抢CPU的资格
RUNNING有两层含义:ready(在就绪队列中——有抢CPU的资格)、running(抢到CPU了,已经在cpu上运行了)
BLOCKED,TIMED_WAITING,WAITING都是表示该线程不具备抢CPU的资格。线程还活着只是暂时放弃抢CPU的资格。

19、线程之间的转移:BLOCKED,TIMED_WAITING,WAITING回来的时候都是先回到ready,再去抢夺CPU

20、线程安全的概念:多线程程序的运行结果可以保证100%的正确性,才能说是线程安全的,否则哪怕99%的情况下,结果正确,也不是线程安全。

21、因为线程在执行过程中有随机因素:
I)什么时候从CPU切换下不确定
Ii)谁被选中切换上CPU不确定
进而导致程序的结果也是不确定的,即没有按照我们预期来,我们称之为:线程不安全。
反之:所谓的线程安全就是写代码能保证100%的返回期望的正确结果。

22、不是所有的多线程程序都会出现这种现象,出现两个随机现象的两个必要条件:
I)多个线程之间操作的变量(资源)是共享的
Ii)多个线程之间对共享变量(资源)是有修改操作的。
只要以上条件缺少其一,那么这个多线程代码就是线程安全的(没有bug)
有很多情况下是天生线程安全的。

23、Java中的内存区域划分:程序计数器(PC),栈(本地方法栈,JVM虚拟机栈),堆,方法区,常量池。

24、栈的作用:表示运行方法的动态过程——主要保存的是栈帧。

25、Java中的参数传递只有值传递(值拷贝过程)——形参的改变不会影响实参(无论基本数据类型还是引用数据类型)。

26、哪些内存区域是共享的,哪些区域是私有的?
程序计数器(PC):每个线程私有的;每个线程需要记录他自己运行到哪里去了(nextPCValue)。
栈(无论本地方法栈还是JVM栈)每个线程私有的;每个线程当下执行的方法路径很可能不同。
以上两个是动态过程:
以下三个是数据存储:
堆,方法区,常量池:所有线程共享同一份。

27、变量有两种类型:一种是基本数据类型,一种是引用数据类型。变量类型无法决定该变量是否是线程之间共享的变量的形态:形态才是决定变量存放位置以及是否线程之间共享的因素。
形参,局部变量——存放在栈帧里的——他们是线程之间私有的;
属性——存放在对象——对象(不包括反射对象)存放在堆中——属性是线程之间共享的;
静态属性——在类中——类在方法区中——静态属性是线程之间共享的。


在这里插入图片描述

发布了46 篇原创文章 · 获赞 82 · 访问量 8140

猜你喜欢

转载自blog.csdn.net/weixin_45662626/article/details/104985110