线程基础、线程之间的共享和协作

**

线程基础、线程之间的共享和协作

一直比较忙,但一直想和大家分享一下自己对java一些知识的浅层次理解,希望和大家一起探讨,有错误的地方欢迎指出来一起探讨。
今天主要来分享一下多线程

基础概念

1、进程
     进程是操作系统分配资源的最小的独立单位,所谓的资源包括CPU,磁盘IO,内存空间等。进程是系统进行资源分配和调

度的一次运行活动。进程是计算机的一次执行活动,当你运行一个程序,你就启动了一个进程。显然,程
序是死的是静态的,进程是活的,动态的。进程分为系统进程和用户进程,用于完成操作系统功能的称之
为系统进程,用户进程就是用户自己启动的进程

2、线程
   线程是进程的一个基本实体,是cpu调度和分配的基本单位。线程是包含在进程中的,是比进程更小的,可以独立运行的基
 本单位。线程本身不拥有资源,他和进程里面的其他线程共享该进程所拥有的资源。
3、cpu时间片轮转机制
我们在平时的开发中,启动线程的数量好像并没有受CPU核心数的限制,哪怕在单核的cpu上的,我们也可以启动多个线程。这是因为操作系统提供了一种cpu轮换机制来调度线程。
百度百科对CPU时间片轮转机制原理解释如下:

如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结来,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾
时间片轮转调度中唯一有趣的一点是时间片的长度。从一个进程切换到另一个进程是需要定时间的,包括保存和装入寄存器值及内存映像,更新各种表格和队列等。假如进程切( processwitch),有时称为上下文切换( context switch),需要5ms,再假设时间片设为20ms,则在做完20ms有用的工作之后,CPU将花费5ms来进行进程切换。CPU时间的20%被浪费在了管理开销上了。
为了提高CPU效率,我们可以将时间片设为5000ms。这时浪费的时间只有0.1%。但考虑到在一个分时系统中,如果有10个交互用户几乎同时按下回车键,将发生什么情况?假设所有其他进程都用足它们的时间片的话,最后一个不幸的进程不得不等待5s才获得运行机会。多数用户无法忍受一条简短命令要5才能做出响应,同样的问题在一台支持多道程序的个人计算机上也会发生。
结论可以归结如下:时间片设得太短会导致过多的进程切换,降低了CPU效率:而设得太长又可能引起对短的交互请求的响应变差。将时间片设为100ms通常是一个比较合理的折衷。

并行和并发

我们在平时的开发中,很多人对并行和并发容易混淆。
并行:是指能够同时执行不同的任务,比如在写文章的时候可以边听歌。
并发:指应用可以交替执行任务,比如在单核CPU的情况下,如果我们开多个线程去执行任务,在一定的时间内只会有一个线程在执行任务,这就是上面我们所说的时间片轮转机制,每一段时间内,只有获得cpu资源的线程在运行执行相应的任务,知识计算机的速度很快,我们无法查觉,觉得任务在同时执行而已
并发和并行的区别是:并行是同时执行不同的任务,并发是指交替执行在这里插入图片描述

线程并发执行的意义

1.充分利用CPU资源
在多核系统下面,如果只有一个线程在运行,那么就会有多个CPU在等待线程执行,这样就会浪费了资源,多线程可以充分利用CPU资源
2、加快用户响应的时间
3、使代码模块化,异步化

线程并发执行的注意事项

1、资源安全
每个线程都有自己独立的线程栈,对栈内的资源进行读写都是线程安全的,如方法中的变量等。但是如果对
类中的全局变量等进行写操作,就会发生资源安全的问题。
2、线程死锁
为了解决线程安全的问题,我们引入了锁机制,但是当其他线程等待一个根本不可能被释放的锁,则相应的任务都不会被执行,从而导致死锁问题。
3、资源耗尽
线程执行是需要消耗资源的,如果创建很多线程,就会耗尽系统内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值