zoukankan      html  css  js  c++  java
  • 理解操作系统5——多线程

    线程:

    线程就是程序中的一条控制流,多线程就是多条控制流;线程是在进程的基础上,进一步划分;

    进程是资源的基本单元;线程是调度的基本单位; 一个进程至少有一个线程,或多个线程;

    进程更像操作系统对资源分配的单位;

    线程是操作系统对处理机调度的单位;

    线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属于一个进程的其他进程共享进程所拥有的全部资源。

    程序执行流的最小单元。一个标准的线程由:线程ID、当前指令指针、寄存器集合、堆栈组成。

    线程是进程中的实体,是被系统独立调度和分派的基本单位。

    线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属于一个进程的其他进程共享进程所拥有的全部资源。

    同一进程中的多个线程之间可以并发执行,由于线程之间的相互制约,致使线程再运行中呈现出间断性。线程有:就绪、阻塞、运行三种基本状态。

      就绪:具备运行的所有条件,逻辑上可以运行,在等待处理机;

      运行:指线程占有处理机正在运行;

      阻塞:线程再等待一个事件(如某个信号量),逻辑上不可运行。

    线程是程序中一个单一的顺序控制流程;

    进程内有一个相对独立的、可调度的执行单元。是系统独立调度和分派CPU的基本单位指令运行时的程序的调度单位。

    和进程的关系:

    进程是资源分配的基本单位,线程是任务调度的基本单位;

    线程实际上是轻量级进程,和进程可以看作是包含关系。没有线程的进程叫做单线程,一个进程可以有多个线程。线程是在进程的基础上继续划分线程;

    进程有独立的代码和数据空间,进程的切换开销较大;线程可以看成轻量级进程,同一类线程共享代码和数据空间,但是线程有独立的栈和程序计数器PC,线程之间的切换开销小;

    线程的状态:

    同一进程中的多个线程之间可以并发执行,由于线程之间的相互制约,致使线程在运行中呈现出间断性。

    线程有:就绪、阻塞、运行三种基本状态。

    就绪:具备运行的所有条件,逻辑上可以运行,在等待处理机;

    运行:指线程占有处理机正在运行;

    阻塞:线程再等待一个事件(如某个信号量),逻辑上不可运行。

    线程的意义:

    进一步提升并发性,克服了进程的切换开销大的缺陷,减少时空开销;

    线程进程都是由操作系统所体会的程序运行的基本单元。利用该基本单元实现系统对应用的并发性。线程的划分尺度更小,并发性更高

    进程在执行的过程中有独立的内存单元。而多个线程共享内存,极大提高了程序的运行效率。

    每个独立的线程有一个程序运行的入口(入口函数),顺序执行序列和程序的出口。但是线程不能独立执行,必须依赖在应用程序中。

    从逻辑角度看:多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看成独立的应用,来进行进程的调度和管理以及资源分配。

    进程是系统进行资源分配和调度的一个独立单位。

    ===================================================

    线程安全:

    进程之间有独立的内存空间,相互之间访问不到。

    但是进程中有多个线程。每个线程都有各自的栈内存,这个栈内存也是各个线程自己私有的,别人访问不到;

    但是进程中有公共的堆空间,是多个线程都可以访问得到的空间。如果大家都能访问到这个空间中的某个对象或方法。

    那就存在数据被意外修改的风险,使得某个线程的数据被污染。这就是线程安全问题。

    非线程安全是指多线程操作同一个对象可能会出现问题。而线程安全则是多线程操作同一个对象不会有问题。

     

    为例保证线程安全,于是就有了一些机制:

    例如CAS(compare and swap),保存数据的状态然后检查数据是否被修改了,被修改的话,就重头再来。->开销较大,适用于线程不多,数据被修改的概率不大,但是存在这种可能;

    还有一种是加锁机制->也是有开销的,但是能保证数据不被修改,适用于线程较多,大概率数据会被修改的情况;

    当我们用一些机制保证线程安全时,其实是存在一些代价的,就是增加了系统开销,导致性能下降。所以要根据实际情况取舍。

     

    线程安全必须要使用很多synchronized关键字来同步控制,所以必然会导致性能的降低。

    所以在使用的时候,如果是多个线程操作同一个对象,那么使用线程安全的Vector;否则,就使用效率更高的ArrayList。

    非线程安全!=不安全

     

    线程安全相关链接:

    线程安全这么回答才牛逼:https://www.cnblogs.com/qiu18359243869/p/11009883.html

    Java中的线程安全和非安全:https://www.cnblogs.com/lijingran/p/8722301.html

    什么是线程安全:https://www.jianshu.com/p/f99a04cff60a

    什么是线程安全:https://www.cnblogs.com/lixinjie/p/a-answer-about-thread-safety-in-a-interview.html#4249651#undefined

    ===================================================

    相关链接:

    线程的意义与常见面试题:https://www.cnblogs.com/yanglin666/p/10551661.html

    多线程使用的主要目的:https://blog.csdn.net/qq_34512307/article/details/77283870

    多线程的实际意义和优势:https://blog.csdn.net/liu123641191/article/details/80904522

    多线程的优点和意义:https://blog.csdn.net/xiaokangboy/article/details/77969758

    多线程的意义和线程的生命周期:https://baijiahao.baidu.com/s?id=1637095684358533046&wfr=spider&for=pc

  • 相关阅读:
    浅谈一致性Hash原理及应用
    学习sql中的排列组合,在园子里搜着看于是。。。
    SQL Server DAC——专用管理员连接
    通过phantomjs 进行页面截图
    《javascript算法--对象的比较》
    React-生命周期的相关介绍
    常用的谷歌插件
    webpack的externals的使用
    mac 10.12显示隐藏文件
    “文字”聚合、散出动画-转自奇舞团
  • 原文地址:https://www.cnblogs.com/grooovvve/p/11605652.html
Copyright © 2011-2022 走看看