线程和进程相关

一.操作系统/应用程序

1.手工操作 —— 穿孔卡片      

  程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。

手工操作方式两个特点:
  (1)用户独占全机。不会出现因资源已被其他用户占用而等待的现象,但资源的利用率低。
  (2)CPU 等待手工操作。CPU的利用不充分。

2.批处理 —— 磁带存储和批处理系统

  批处理系统:加载在计算机上的一个系统软件,在它的控制下,计算机能够自动地、成批地处理一个或多个用户的作业(这作业包括程序、数据和命令)。

  包括联机批处理系统和脱机批处理系统

3.多道程序系统

  多道程序设计技术  , 就是指允许多个程序同时进入内存并运行。即同时把多个程序放入内存,并允许它们交替在CPU中运行,它们共享系统中的各种硬、软件资源。当一道程序因I/O请求而暂停运行时,CPU便立即转去运行另一道程序。

单处理机系统中多道程序运行时的特点:
  (1)多道:计算机内存中同时存放几道相互独立的程序;
  (2)宏观上并行:同时进入系统的几道程序都处于运行过程中,即它们先后开始了各自的运行,但都未运行完毕;
  (3)微观上串行:实际上,各道程序轮流地用CPU,并交替运行。
  多道批处理系统  , 在前述的批处理系统中,引入多道程序设计技术后形成多道批处理系统(简称:批处理系统)。

4.分时系统

  分时技术:把处理机的运行时间分成很短的时间片,按时间片轮流把处理机分配给各联机作业使用。

  特点:
  (1)多路性。若干个用户同时使用一台计算机。微观上看是各用户轮流使用计算机;宏观上看是各用户并行工作。
  (2)交互性。用户可根据系统对请求的响应结果,进一步向系统提出新的请求。这种能使用户与系统进行人机对话的工作方式,明显地有别于批处理系统,因而,分时系统又被称为交互式系统。
  (3)独立性。用户之间可以相互独立操作,互不干扰。系统保证各用户程序运行的完整性,不会发生相互混淆或破坏现象。
  (4)及时性。系统可对用户的输入及时作出响应。分时系统性能的主要指标之一是响应时间,它是指:从终端发出命令到系统予以应答所需的时间。

5.实时系统

  即系统能够及时响应随机发生的外部事件,并在严格的时间范围内完成对该事件的处理。
  实时系统在一个特定的应用中常作为一种控制设备来使用。
  实时系统可分成两类:
    (1)实时控制系统。当用于飞机飞行、导弹发射等的自动控制时,要求计算机能尽快处理测量系统测得的数据,及时地对飞机或导弹进行控制,或将有关信息通过显示终端提供给决策人员。当用于轧钢、石化等工业生产过程控制时,也要求计算机能及时处理由各类传感器送来的数据,然后控制相应的执行机构。
    (2)实时信息处理系统。当用于预定飞机票、查询有关航班、航线、票价等事宜时,或当用于银行系统、情报检索系统时,都要求计算机能对终端设备发来的服务请求及时予以正确的回答。此类对响应及时性的要求稍弱于第一类。
  实时操作系统的主要特点:
  (1)及时响应。每一个信息接收、分析处理和发送的过程必须在严格的时间限制内完成。
  (2)高可靠性。需采取冗余措施,双机系统前后台工作,也包括必要的保密措施等。

6.通用操作系统

  操作系统的三种基本类型:多道批处理系统、分时系统、实时系统。
  通用操作系统:具有多种类型操作特征的操作系统。可以同时兼有多道批处理、分时、实时处理的功能,或其中两种以上的功能。

7.操作系统的进一步发展

  a.个人计算机操作系统

  个人计算机上的操作系统是联机交互的单用户操作系统,它提供的联机交互功能与通用分时系统提供的功能很相似。
  由于是个人专用,因此一些功能会简单得多。然而,由于个人计算机的应用普及,对于提供更方便友好的用户接口和丰富功能的文件系统的要求会愈来愈迫切。
  b.网络操作系统
  计算机网络:通过通信设施,将地理上分散的、具有自治功能的多个计算机系统互连起来,实现信息交换、资源共享、互操作和协作处理的系统。
  网络操作系统:在原来各自计算机操作系统上,按照网络体系结构的各个协议标准增加网络管理模块,其中包括:通信、资源共享、系统安全和各种网络应用服务。
  c.分布式操作系统
  分布式操作系统也是通过通信网络,将地理上分散的具有自治功能的数据处理系统或计算机系统互连起来,实现信息交换和资源共享,协作完成任务。——硬件连接相同。
  区别:
  (1)分布式系统要求一个统一的操作系统,实现系统操作的统一性。
  (2)分布式操作系统管理分布式系统中的所有资源,它负责全系统的资源分配和调度、任务划分、信息传输和控制协调工作,并为用户提供一个统一的界面。
  (3)用户通过这一界面,实现所需要的操作和使用系统资源,至于操作定在哪一台计算机上执行,或使用哪台计算机的资源,则是操作系统完成的,用户不必知道,此谓:系统的透明性。
  (4)分布式系统更强调分布式计算和处理,因此对于多机合作和系统重构、坚强性和容错能力有更高的要求,希望系统有:更短的响应时间、高吞吐量和高可靠性。

8.操作系统的作用

  计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成。

  操作系统就是一个协调、管理和控制计算机硬件资源和软件资源的控制程序。

二.并发和并行

  并发, 伪 ,由于执行速度特别块,感觉不到停顿

  并行, 真, 创建10个人同时操作

  并行 : 并行是指两者同时执行,比如赛跑,两个人都在不停的往前跑;(资源够用,比如三个线程,四核的CPU )

  并发 : 并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B,B用完继续给A ,交替使用,目的是提高效率。

  区别:

  并行是从微观上,也就是在一个精确的时间片刻,有不同的程序在执行,这就要求必须有多个处理器。
  并发是从宏观上,在一个时间段上可以看出是同时执行的,比如一个服务器同时处理多个session。

三.线程和进程

  进程:序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。

  程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。

  缺点:

  • 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。

  • 进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。

  线程 : 能独立运行的基本单位——线程(Threads)。

  注意:进程是资源分配的最小单位,线程是CPU调度的最小单位.
     每一个进程中至少有一个线程。 
进程和线程的关系
 
一个应用程序(软件),可以有多个进程(默认只有一个),一个进程中可以创建多个线程(默认只有一个).
  线程与进程的区别:
  1)地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
  2)通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
  3)调度和切换:线程上下文切换比进程上下文切换要快得多。
  4)在多线程操作系统中,进程不是一个可执行的实体。
线程的特点:
   1.轻型实体.
  2.独立调度和分派的基本单位。
  3.共享进程资源。
  4.可并发执行。
内存中的线程
 
总结:
 为什么创建线程
  由于线程是cpu工作的最小单位,创建线程可以利用多核优势实现并行操作(Java/C#). 
  线程是为了工作
 为什么创建进程
  进程和进程之间做数据隔离(Java/C#)
  进程是为了提供环境让进程工作.
 在Python中
  a.Python中存在一个锁.
    造成:多线程无法利用多核优势
    解决:开多进程处理(浪费资源)
  Python多线程情况下:
    计算密集型操作:效率底. (GIL锁)
    IO操作:效率高
  Python多进程的情况下:
    计算密集型操作:效率高 (浪费资源)
    IO操作:效率高  (浪费资源)
  以后写Python时:
    IO密集型用多线程: 文件/输入输出/socket网络通信
    计算密集型用多进程.
  Python中线程和进程 (GIL锁)
    GIL锁 , 全局解释器锁
    用于限制一个进程中间一时刻只有一个线程被cpu调度.

threading模块

方法:

  • start            线程准备就绪,等待CPU调度
  • setName      为线程设置名称
  • getName      获取线程名称
  • setDaemon   设置为后台线程或前台线程(默认)
                       如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止
                        如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止
  • join              逐个执行每个线程,执行完毕后继续往下执行,该方法使得多线程变得无意义
  • run              线程被cpu调度后自动执行线程对象的run方法

线程的创建Threading.Thread类

import threading
def func(arg):
    print(arg)
t = threading.Thread(target=func,args=(11,))
t.start()
print(111)
# 结果: 11 111

主线程默认等子线程执行完毕

import time
def func(arg):
    time.sleep(2)
    print(arg)
t1 = threading.Thread(target=func,args=(3,))
t1.start()
t2 = threading.Thread(target=func,args= (9,))
t2.start()
print(123)
#结果: 123 3 9

主线程不再等,主线程终止则所有子线程终止 

import threading
import time
def func(arg):
    time.sleep(2)
    print(arg)
t1 = threading.Thread(target=func,args=(3,))
t1.setDaemon(True)
t1.start()
t2 = threading.Thread(target=func,args=(9,))
t2.setDaemon(True)
t2.start()
print(123)

 开发者可以控制主线程等待子线程(最多等待时间)

import threading
import time
def func(arg):
    time.sleep(10)
    print(arg)
print("创建子进程t1")
t1 = threading.Thread(target=func,args=(3,))
t1.start()
t1.join(2)   #无参数,让主线程在这里等着,等到子线程t1执行完毕,才可以继续往下走
            #有参数,让主线程在这里最多等待n秒,无论是否执行完毕,会继续走下去
t1.join(2)
print("创建子线程t2")
t2 = threading.Thread(target=func,args=(9,))
t2.start()
t2.join(2)
print(123)
#结果:
创建子进程t1
创建子进程t2
123
3
9

线程名称

import threading
def func(arg):
    t = threading.current_thread()    #获取当前执行该函数的线程的对象
    name = t.getName()   #获取当前线程对象获取当前线程名称
    print(name,arg)
t1 = threading.Thread(target=func,args=(11,))
t1.setName("")      #给线程起名
t1.start()
t2 = threading.Thread(target=func,args=(22,))
t2.setName("")
t2.start()
print(123)

 

转载于:https://www.cnblogs.com/chenxi67/p/9622212.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值