操作系统中的进程与线程

操作系统

关于操作系统的概念,我在北京大学出版社出版的《操作系统教程》中找到这么一段话:
操作系统是计算机系统中的一个系统软件,它能够有效的组织和管理计算机系统中的硬件及软件资源,合理地组织计算机工作流程,控制程序的执行,幷向用户提供各种服务功能,使的用户能够灵活、方便、有效的使用计算机,并使整个计算机系统能够高效的运行。

简而言之,操作系统就是一个管理计算机中所有资源(所有的硬件,比如CPU、内存、输入输出设备以及软件),并合理分配,使计算机能够高效的运行的一个程序。(操作系统本身也是一个程序,也是由一段段的指令+数据组成的!!)。

进程

进程是一个在内存中运行的应用程序,从操作系统的角度来看,进程就是操作系统分配资源的最小单位。
在空间角度上,主要是对内存进行分配:在这里插入图片描述
在时间角度上,主要是对CPU的时间段进行分配(在单核的情况下,只有一个CPU,所有的进程只能使用CPU一段时间):在这里插入图片描述
因为每个进程所需要使用CPU的时间不同,如果等上一个进程结束了,再让下一个进程使用CPU,那么执行进程的效率就会非常低下。
比如:进程A先来,需要使用CPU2个小时,进程B后来,需要使用CPU2分钟,那么如果按照先来先服务,进程B就需要等待A使用完毕后,才能使用CPU。
在此基础上,将CPU的时间分为一个个时间片,一个进程占用CPU一小会儿,就可以使进程的执行效率得到提高(现代操作系统所采用的方式)。
在这里插入图片描述
当分给A的时间片耗尽时,就会发生进程的调度(但是发生进程调度的情况不止这一种),此时B再来使用CPU,这样往复操作,进程的执行效率就会提高,而且,由于每段的时间片都是非常微小的,在宏观上看,哪怕是只有一个CPU,AB进程也是在同步执行的。

发生进程调度的几种情况:
1、拥有更高权限的进程可能把CPU从当前进程抢走(抢占式)。
2、当一个进程的所有指令都执行完毕时,进程就执行结束了。
3、当一个进程需要等待外部IO时(比如scanner.nextLine()等待用户输入)。
4、一个进程可以主动放弃CPU。
5、时间片耗尽。

进程状态在这里插入图片描述

5点可能被发生进程调度的情况,从状态的视角来看

运行->就绪     1、被更高优先级的进程抢走了CPU。2、时间片耗尽。3、主动放弃。
运行->阻塞     4、等待IO(scanner.nextLine()等)。
运行->终止     5、进程中的指令执行完毕。

线程

进程是系统分配资源的最小单位,线程是系统调度的最小单位。一个进程至少有一个线程,允许有多个线程(多线程),一个进程内的线程之间是可以共享资源的。

多线程的优势:

1、增加运行速度:
通过添加线程,可以争抢到更多的CPU资源。
在这里插入图片描述
需要注意的是,线程个数变为原来的四倍,但分配的时间并不是原来分配的时间的四倍(比四倍小)。
这是因为:

	1、在就绪队列中还存在其他线程。
	2、线程本身的创建/销毁,也需要耗费CPU的时间。

一味的增加线程,可以一直提升运行速度吗?
不可以!
因为线程抢到CPU是有极限的,而且,线程数越多,用在线程的创建或销毁上的时间也会变得越来越大,同时也会增加操作系统的负担。

	比如说:原本有一个人打扫一间教室,此时增加到五个人,打扫的效率就会提高,
如果增加到100个或者更多,打扫的效率就会非常低,同时也不方便管理这些人。

2、在阻塞场景下:
通过添加新的线程,使如果阻塞一个线程,不影响其他线程抢CPU的过程。

	比如说:在处理一些时间复杂度过高的算法时,比如用递归计算斐波那契数列的第N项,
如果用户输入的数字过大,那么在执行这一过程时,程序可能会出现卡死的状况,此时采用
多线程,如果某一个次用户输入的数据过大导致主线程被阻塞了,也不耽误用户输入下一个
数据的计算。

本文仅对进程和线程做大概总结,后续会更新多线程的一些比较重要的知识点(线程安全及实现,多线程的应用,阻塞队列,线程池等)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值