zoukankan      html  css  js  c++  java
  • 线程

    一、认识线程

    1.线程的引入

    多道程序管理:追求效率的目的下实现“并发”

    利用进程实现的多道程序系统中

    进程是一个可拥有资源的独立单位;

    是一个可独立调度和分派资源的基本单位

    有如下频繁操作:创建进程、撤销进程、进程切换

        PCB信息,CPU环境的管理等付出不少时空开销,尤其在进程切换上。

    所以并发程度不是随意设定的:

    并发进程数量不宜过多,切换频率不宜过高。

    限制并发程度问题所在:进程实体信息量大,对进程的管理操作越多,与运行时间的比值就越大,运行效率就低。

    怎样进一步提高并发效率,节约时空开销?     

    以进程为单位分配资源

    将进程划分为多个功能单位调度执行。

    多线程系统中,同一个进程中的多个线程

    共享进程资源

    可并发执行

    2.线程的属性

    多线程OS中,一个进程包括多个线程,每个线程都是利用CPU的基本单位。

    轻型实体:只需一点必不可少的、能保证独立运行的资源。(TCB)

    独立调度和分派的基本单位:调度切换迅速且开销小。

    可并发执行

    共享进程资源:同进程中的线程可共享相同的进程地址空间、已打开文件、信号量机构等。

    3.线程的信息

    状态参数

    标识符、运行状态、优先级、寄存器状态、堆栈、专有存储器、信号屏蔽等。

    运行状态

    执行、就绪、阻塞

    4. 线程的创建和终止

    在多线程OS中,应用程序启动时,通常只有一个线程(初始化线程)在执行,它根据需要再创建若干线程。

    5.多线程系统中的进程

    进程只是用于分配系统资源

    包括多个线程

    不是执行实体,线程在进程范围内作为执行实体。

    * 线程与进程的比较

    调度:线程作为CPU调度的基本单位,而进程只作为其它资源分配单位。

    并发性:进程之间可以并发,实质上是不同进程中的两个线程并发。一个进程的多个线程之间亦可并发。

    拥有资源:进程间资源相互独立;同一进程的各线程间共享。某进程内的线程在其它进程不可见

    系统开销:线程上下文切换在同进程环境下上下文切换要快得多。因为同进程内线程间共享内存地址和打开的文件资源;

    6.线程的管理

    同步和通信机制

    1)互斥锁

    比较简单的,控制线程互斥访问资源;

    适用于高频度使用的关键共享数据和程序段;

    unlock和lock两个锁操作原语;

    2)条件变量

    与互斥锁一起使用

    锁保证互斥进入临界区,但利用条件变量使线程阻塞

    注意不满足条件时,wait条件变量:

    释放互斥锁

    进程阻塞在条件变量指向队列中

    被唤醒后要重新再设互斥锁

    3)信号量

    私用信号量(private samephore)

    用于同进程的线程间同步,数据结构存放在应用程序的地址空间。属于特定进程,OS感知不到其存在。

    公用信号量(public samephore)

    用于不同进程间或不同进程中线程的同步,数据结构由OS管理,存放在受保护的系统存储区。

    互斥锁是为了上锁而优化的;条件变量是为了等待而优化的;信号灯即可用于上锁,也可用于等待,因而可能导致更多的开销和更高的复杂性。

    三种机制适用逐渐复杂的同步情况

    二、线程的实现方式

     

    1.内核线程KST(kernel-level thread)

    依赖于内核,利用系统调用由OS内核在内核空间完成创建、撤消、切换等线程工作。时间片分配给线程,所以多线程的进程获得更多CPU时间。

    2.用户线程ULT(user-level thread)

    无须利用系统调用,不依赖于OS核心。进程利用线程库函数创建、同步、调度和管理控制用户线程。调度由应用软件内部进行,通常采用非抢先式和更简单的规则,也无需用户态/核心态切换,速度比kst快。

    3.组合方式

    内核支持多KST线程的管理,同时也允许用户应用程序级的线程管理。

    用户级线程需借助某种形式的中间系统取得内核服务,用户程序复杂

    运行时系统:管理和控制线程的函数/过程集合。

    内核控制线程,轻型进程LWP

    1、Runtime System

    2、轻权进程(LightWeight Process)

  • 相关阅读:
    性能测试流程
    性能测试关注的指标
    什么样的系统需要做性能测试
    python数据类型-列表
    python-数据类型-元组
    python自动化第二课
    python自动化第二课
    内存泄漏和内存溢出
    程序中必须知道的几种命名规范
    超级详细安装jmeter的教程(亲测)
  • 原文地址:https://www.cnblogs.com/Kirino1/p/10027280.html
Copyright © 2011-2022 走看看