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

    xiaoxiao2024-12-16  10

    **

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

    一直比较忙,但一直想和大家分享一下自己对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、资源耗尽 线程执行是需要消耗资源的,如果创建很多线程,就会耗尽系统内存。

    最新回复(0)