java并发知识(一)——基础背景知识

一、操作系统历史:

1、裸机:

老早之前的计算机只有一个处理器,而一个处理器在同一时刻只能处理一条指令,换句话说,我们的代码需要一行一行的按顺序被计算机执行,计算机只能把一个程序完整的执行完,然后再执行第二个程序。计算机专业的同学们要排队去机房做实验,一个人执行完然他的程序后,第二个人再执行自己的程序,这也就意味着所有计算机资源是被一个程序独占的,计算机资源包括处理器、内存、硬盘、输入/输出设备啥的。这样的计算机系统我们称之为裸机

2、简单批处理系统:

把所有同学们需要做实验的程序都放在这个程序里排个队,由这个程序来协调各个同学们的程序执行,一个执行完了立即换成另一个,这样就不用人工干预了,所以他们把这样的系统叫做简单批处理系统,而那个负责协调各个童鞋们程序的程序,就是所谓的操作系统的雏形

3、多道批处理系统:

处理器的速度是嗖嗖的,比内存访问的速度快好多个数量级,而内存又比硬盘、打印机等I/O设备啥的快好多个数量级,而程序执行过程中又免不了从硬盘里读个文件,往打印机输出个啥的,所以处理器浪费了好多时间等待这些I/O操作的完成。再一次,时间就是金钱,为了尽可能的剥削计算机的运算能力,在程序遇到I/O操作或者什么其他会阻塞程序执行的操作时,处理器会转向执行其它的程序,什么时候这个阻塞的操作完成了,再掉过头继续执行它。从宏观上看,处理器可以各个程序轮流执行,所以这样的系统就称为多道批处理系统

4、分时处理:

给每个程序都分配一点处理器时间去轮流执行,每个程序分配到的执行时间就叫做时间片,这个过程也叫做分时处理。又因为处理器速度太快了,时间片的大小可以做到微秒毫秒的大小,所以这个切换的过程对于人来说根本感觉不出来,所以看起来像各个程序在同时执行。不过后来人们在一台计算机上又装了多个处理器,就是我们常听说的4核、8核啥的,所以也可能真正的在同时执行。

而时间片具体设置为多大,处理器怎么切换各个程序的执行,这些工作就是所谓的操作系统来控制的

二、进程:

1、进程的概念:

我们自己写的程序,也就是所谓的用户程序是由操作系统来管理的,人们把一个执行着的程序叫做一个进程(英文名:Process),

2、进程特点:

每个进程都有这么两个特点:

(1)资源所有权

程序在运行过程中需要一定的资源,比如内存、I/O啥的,这些东西不能在不同进程间共享,假如一个进程占了另一个进程的内存,那另一个进程的数据不就丢失了么;一个进程正在使用打印机输出东西,另一个进程也使用的话,不就尴尬了么。所以进程所拥有的这些资源是不能共享的,而这种资源分配的活是由操作系统来管理的。

(2)调度/执行

操作系统会为它管理的进程分配时间片,来调度哪个进程应该被处理器处理,哪个应该先休息一会儿。

所以我们现在电脑里每个运行着的程序都是一个进程,可以打开你的任务管理器(windows)或者活动监视器(mac),看到我们的电脑里其实有好多好多进程喔,什么QQ、微信、音乐播放器、视频播放器啥的

3、进程的状态

在操作系统级别上,进程根据它运行的情况,可以分成下边5种状态:

(1)新建

刚刚创建的那个时刻,操作系统会为这个进程在内存中创建相应的数据,比如分配这个进程的ID,优先级什么的~这个状态持续的时间比较短

(2)就绪

一旦该进程相关的一些数据创建好了,这个进程就会被放在一个叫就绪队列的队列里,之后操作系统就会从这个队列里挑一个进程放到处理器里执行。

(3)运行

这个进程被操作系统分配了时间片,处理器开始执行它。

(4)阻塞

在执行进程的过程中,可能遇到某些阻塞的动作,比如I/O操作,处理器如果一直等待该阻塞动作完成的话就太浪费时间了,所以会把等待阻塞动作完成的进程放到一个叫阻塞队列的队列里,之后并不会从这个队列里挑选即将执行的进程,而是直到该阻塞动作完成,才重新把该进程放到就绪队列里等待执行

(5)退出

该进程执行完毕,或者遇到了什么错误,或者操作系统就是想弄死它,它就被杀死了,这个状态里操作系统可能还会记录一下死因啥的,这个过程也很短

状态转换:
在这里插入图片描述

三、串行编程和并行编程

1、串行编程:

也就是处理器执行完一条指令再执行另一条,串行编程的方式就是我们把所有要完成的任务放到一个进程中去执行

2、并行编程:

多个任务同时进行的编程方式就叫做并行编程,行编程的方式就是我们去开几个进程同时执行(注:这个同时可能是假的,如果只有单个处理器,那就是看上去是同时的)

3、并行编程优势:

(1)充分利用多个处理器

现代计算机的处理器越来越多,不用白不用。如果所有的任务都塞到1个进程中,而计算机实际有100个处理器,那么将会有99%的计算能力将被浪费

(2)防止任务的阻塞

即使是在单个处理器中,为多个任务创建多个进程也是有好处的。先执行的任务可能会需要执行某些I/O操作而造成阻塞,所以就需要等待I/O操作完成才能继续执行。但是如果为每个任务创建一个进程之后,一个任务阻塞掉并不会影响别的任务的正常执行。

(3)简化编程的模型

把一个大任务拆分成若干个小任务自然是会事情清晰许多(注:也不是绝对啊),也就是所谓的大事化小,小事化了

四、线程

1、线程的概念

(1)进程缺点:

进程是个好东西,可以给每个任务都分配一个进程以达到并发执行的目的。可是运行了一段时间人们发现还是有一些不好的地方的:

不同进程之间的资源不能够共享。

这个对于为了一个大目标细分成的若干小任务很不友好。比方说对于一个网站来说,针对每一个访问网站的连接都去创建一个进程,如果我们想累加一下总的访问连接数就比较麻烦了,因为各个进程不能去修改同一块内存。

创建、切换、销毁进程成本太大

(2)概念:

可以被调度和执行的单位通常被称作线程或者轻量级进程,而拥有资源所有权的单位通常被称为进程

2、线程的特点

(1)一个进程至少对应一个线程

操作系统每开始执行一个程序,都会为其分配所需的资源以及创建若干个程序执行流,也就是说会创建一个进程以及若干线程

(2)各个线程可以共享同一个进程中的各种资源

因为线程是从属于某个进程,所以进程中的内存、I/O啥的资源这个线程都可以访问到。接着上边那个例子,我们可以对于每一个连到网站的连接都可以分配一个线程,然后在申请一块儿内存表示连接数,每创建一个线程都把连接数加1,问题就愉快的解决了

(3)创建、切换、销毁线程的成本远低于原先进程的成本

因为只是一个调度和执行的单位,本来就是原先进程概念的一部分,所以创建、切换、销毁线程的成本就小多了

(4)线程通信比进程通信的效率高

原先进程间通信需要配合各种机制,现在线程间由于可以共享内存,所以通信就easy多了。

(5)总结:

线程的提出完美的解决了一开始提出的把不同任务分配给不同进程执行的缺陷,现在我们可以把不同的任务分配给不同的线程去执行,不仅可以方便通信交流,而且创建和使用的成本还低

3、线程的状态:

由于线程只是单纯的继承了进程中调度和执行的特性,所以原先进程拥有的状态,现在线程一样拥有,也就是:创建、就绪、执行、阻塞、退出

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值