多线程、同步异步、阻塞非阻塞

多任务

目的

在同一时间内执行多个任务

概述

用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务

现在的操作系统都是多任务操作系统,每个运行的任务就是操作系统所做的一件事情,比如你在听歌的同时还在用MSN和好友聊天。听歌和聊天就是两个任务,这个两个任务是“同时”进行的

看起来是多个任务都在做,其实本质上我们的大脑在同一时间依旧只做了一件事情,只是在不同的事情上这个时间交替的很快,我们就觉得几件事情是同时做的

举例


形式

并发  : 在一个时间段内,程序交替的执行        轮流
并行 : 多核CPU,同一时间点执行多个任务.每个CPU都有自己的任务      同时
 
 

多进程

每个正在系统上运行的程序都是一个进程

 

时间片

操作系统分配给程序执行的一小段时间,只有获得了时间片,程序才能执行
每一个程序,默认有一个进程,称为主程序
每一个进程默认有一个线程,称为主线程
进程是操作系统分配资源的最小单位
 

多线程


多线程就是多条执行路径
多线程就是指从软件或者硬件上实现多个线程并发执行的技术
实现多线程编程的过程就是将任务的执行方式由串行改为并发的过程,即实现并发化,以此来尽量提高程序和硬件的运行效率
多线程并发使得多个任务看起来像是在同时执行
单cpu能够并发,多cpu或者多核cpu下能并行

概念

1. 作用 : 线程是实现多任务的一种方式
2. 线程是CPU调度的基本单位
3. 每个进程默认有一个线程

注意点

1. 线程执行顺序为无序 : 线程的执行需要CPU的调度,谁获得CPU,谁就先执行
2. 主线程会等待子线程结束后再结束

让子线程随主线程的结束而结束

        a. 在创建对象的时候,传入参数 :daemon= True

        b. 在创建对象之后线程启动之前,调用setDaemon(True)方法

3.线程共享全局变量
共享全局变量,由于不确定何时丢失CPU资源,会导致数据错乱(资源竞争)问题
 

 程序

程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程是程序在处理机上的一次执行过程,它是一个动态的概念。
程序可以作为一种软件资料长期存在,而进程是有一定生命期的。程序是永久的,进程是暂时的。
进程更能真实地描述并发,而程序不能;
进程是由进程控制块程序段数据段三部分组成;
进程具有创建其他进程的功能,而程序没有。
同一程序同时运行于若干个数据集合上,它将属于若干个不同的进程,也就是说同一程序可以对应多个进程
在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单元都是进程。
--百度百科

处理机

处理机包括中央处理器主存储器,输入-输出接口,加接外围设备就构成完整的计算机系统。处理机是处理计算机系统中存储程序和数据,并按照程序规定的步骤执行指令的部件。程序是描述处理机完成某项任务的指令序列。指令则是处理机能直接解释、执行的信息单位。

--百度百科

进程

进程就是一个程序在一个数据集上的一次动态执行过程。进程一般由程序、数据集、进程控制块三部分组成。

我们编写的程序用来描述进程要完成哪些功能以及如何完成;

数据集则是程序在执行过程中所需要使用的资源;

进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。

                                  --摘录

 

是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。或者说进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。

狭义:QQ.exe就是一个进程

 

线程

线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使到进程内并发成为可能。
线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。线程没有自己的系统资源。
则是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
 

线程安全与非安全

线程安全就是多线程访问时,总是能达到预期结果,结果准确且一致。可以采用加锁机制,当一个线程访问该类的某个数据时,占有锁,直到使用完释放锁,其他线程等待拿到锁,谁拿到锁谁就能持有访问权。不会出现数据不一致或者数据污染
线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据,i++在多线程下累加100次得到的并不一定是100
 

进程和线程的关系

 

 

 

 

 工厂、车间、流水线 示例:

计算机核心CPU——工厂

假定工厂电力有限——CPU资源有限,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个(单核)CPU一次只能运行一个任务。

进程——工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。

车间工人——线程,多个工人协同完成一个任务。

车间空间由车间内工人共享——进程内空间,线程共享

不同空间能容纳的人数量不同——资源抢占,一个萝卜一个坑

防止其他人进来——加锁,互斥锁
 

并发和并行

并发是多线程中的名词,多线程发生的过程:多线程是通过线程轮流切换来获取CPU执行时间的

区别

并发是指一个处理器同时处理多个任务。 快速切换

并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。 

并发是逻辑上(感觉上)的同时发生(simultaneous),而并行是物理上的同时发生。 

来个比喻:并发是一个人同时吃三个馒头(一个咬一下,轮流),而并行是三个人同时吃三个馒头(同时)。 

并行是同时响应(多处理器),并发是轮流响应(单处理器或者多处理器)

 

阻塞和非阻塞

阻塞:在调用之后,应用层即刻被挂起,一直处于等待数据返回的状态,直到系统内核从磁盘读取完数据并返回给应用层,应用层才用获得的数据进行接下来的其他操作

非阻塞:调用后,系统内核会立即返回(虽然还没有文件内容的数据),应用层并不会被挂起,它可以做其他任意它想做的操作

关注的是:接口调用(发出请求)后(应用层)等待数据返回时的状态。被挂起无法执行其他操作的则是阻塞型的,可以被立即「抽离」去完成其他「任务」的则是非阻塞型的。

参考:https://zhuanlan.zhihu.com/p/22707398

 

 

 同步和异步

阻塞和非阻塞解决了应用层等待数据返回时的状态问题,那系统内核获取到的数据到底如何返回给应用层呢?这里不同类型的操作便体现的是同步和异步的区别。

同步和异步关注的是:数据如何返回给应用层=》任务完成时消息通知的方式

同步:主动多次轮询,如未能得到响应数据,根据阻塞还是非阻塞看是挂起还是去做其它事情

异步:无需主动询问,响应方主动告知并返回数据

 
 
 

 

posted on 2023-02-21 21:06  or追梦者  阅读(80)  评论(0编辑  收藏  举报