zoukankan      html  css  js  c++  java
  • 操作系统-并发-线程-进程

    操作系统/应用程序

    什么是操作系统?

    精简的说法:操作系统就是一个人协调,管理和控制计算机硬件资源和软件资源的控制程序

    操作系统位于计算机硬件与应用软件之间,本质也是一个软件.操作系统由操作系统的内核(运行于内核态,管理硬件资源)以及系统

    调用(运行于用户态,为应用程序员写的应用程序提供系统调用接口)两部分组成,所以,单纯的说操作系统是运行于内核态的,是不准确的.

      

    日常我们所知道的操作系统/应用程序:

    硬件:

      -硬盘

      -CPU

      -主板

      -显卡

      -内存

      -电源

      -......

    软件(装系统):

      -一个由程序员写出来的软件,该软件用于控制计算机硬件,让他们之间相互配合.

    安装应用程序(装软件):

      例如:QQ,百度云,Pycharm......

    并发,并行!!!

    什么是并发?并行?

      一般来说,并发指的是多个任务能够同时存在,是否同时存在执行并不重要,而并行,主要侧重于多个任务之间能够同时运行,

    所以,我们也可以理解为并行是并发的一个子集.

    无论是并发还是并行,在用户看来都是同时运行的,不管是线程还是进程,都只是一个任务而已,真正干活的是CPU,CPU来做这些任务,

    而一个CPU同一时刻只能执行一个任务.

    一并发:是伪并行,即看起来是同时运行,单个CPU+多道技术实现并发(并行也属于并发)

    二并行:同时运行,只有具备多个CPU才能实现并行

      

    所有现代计算机经常会在同一时间做很多件事,一个用户的PC(无论是单cpu还是多cpu),都可以同时运行多个

    任务(一个任务可以理解为一个进程)。

        启动一个进程来杀毒(360软件)

        启动一个进程来看电影(暴风影音)

        启动一个进程来聊天(腾讯QQ)

    所有的这些进程都需被管理,于是一个支持多进程的多道程序系统是至关重要的

    多道技术概念回顾:内存中同时存入多道(多个)程序,cpu从一个进程快速切换到另外一个,

    使每个进程各自运行几十或几百毫秒,这样,虽然在某一个瞬间,一个cpu只能执行一个任务,

    但在1秒内,cpu却可以运行多个进程,这就给人产生了并行的错觉,即伪并发,以此来区分多

    处理器操作系统的真正硬件并行(多个cpu共享同一个物理内存)

    Python并发编程之多进程

    什么是进程?

      进程:正在进行的一个过程或一个任务,而负责执行任务的是CPU.

    进程于程序的区别:

      程序仅仅是一堆代码而已,而进程指的是程序的运行过程.

    进程的层次结构:

      无论是UNIX还是Windows,进程只有一个父进程,不同的是:

      1,在UNIX中所有的进程,都是init进程为根,组成树形结构.父子进程共同组成一个进程组.

      在Windows中,没有进程层次的概念,所有进程都是地位相同的,唯一类似于进程程序的暗示,

    是在创建进程时,父进程得到一个特别的句柄,该进程可以用来控制子进程,但是父进程有权把该句柄

    传给其子进程,这样就没有层次了.

    创建进程的类

      

    process([group[,target[,name[,args[,kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动)
    
    强调:
    1:需要使用关键字的方式来指定参数
    2.args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号.
    

    参数介绍:

    1 group参数未使用,值始终为None
    
    2 target 表示调用对象,即子进程要执行的任务
    
    3 args表示调用对象的位置参数元组,args = (1,2,'egon',)
    
    4 kwargs 表示调用对象的字典,kwargs = {'name':egon,'age':18}
    
    5 name 为子进程的名称
    

    属性介绍:

    1.p.daemon:默认值为False如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置.
    
    2.p.name进程的名字
    
    3.p.pid:进程的pid
    
    4,p.exitcode:进程在运行时为None.如果为-N,表示被信号N结束
    
    5.p.authkey:进程的身份验证键,默认是由os.urandom(),随机生成的32字符的字符串.这个键的用途是为涉及网络连接的底层进程间提供安全性,这类连接只有在具有相同的身份验证键时才能成功
    

    Python并发编程之多线程

    什么是线程?

    进程只是用来把资源集中到一起,(进程只是一个资源单位,或者说资源集合),而线程才是CPU上的执行单位.

    多线程(多个控制线程)的概念,在一个进程中存在多个控制线程,多个控制线程共享该进程的地址空间,相当于一个车间内

    有多条流水线,共用一个车间资源.

    为什么要用多线程?

    多线程指的是,在一个进程中开启多个线程,简单的讲:如果多个任务共用一块地址空间,那么必须在一个进层内开启多个线程,

    1.多线程共享一个进程的地址空间,

    2.线程比进程更轻量级,线程比进程更容易创建课撤销,在许多操作系统中,创建一个线程比创建一个进程要快10~100倍,在有大量线程

     需要动态和快速修改时,这一特性很有用

    3.若多个线程都是CPU密集型的,那么并不能获得性能上的增强,但是如果存在大量的计算和大量的I/O处理,拥有多个线程允许这些活动

     彼此重叠运行,从而会加快程序执行的速度.

    4.在多CPU系统中,为了最大限度的利用多核,可以开启多个线程,比开进程开销要小的多.

    开启线程的方法

    from threading import Thread
    import time
    def sayhi(name):
        time.sleep(1)
        print('%s say holle' %name)
    
    if __name__ = '__main__':
        t = Thread(target = sayhi,args = ('egon',))
        t.start()
        print("主线程")
    方式一
    from threading import Thread
    import time
    class Sayhi (Thread)
        def __init__(self,name)
            super().__init__()
            self.name = name
        def run(self):
            time.sleep(2)
            print('%s say hello' % self.name)
    
    if __name__ == '__main__':
        t = Sayhi('egon')
        t.start()
        print("主线程")
    方式二

    Python 线程编写:

    import threading
    v1 = [11,22,33]    #+1
    v2 = [44,55,66]    #+100
    
    def func(data,plus):
        for i in range(len(data)):
            data[i] = data[i]+plus
    
    t1 = threading.Thread(target = func,args = (v1,1))
    t1.start()
    
    t2 = threading.Thread(target = func,args = (v2,100))
    t2.start()
    1. 计算密集型多线程无用
    import threading
    import requests
    import uuid
    
    url_list =[
    'https://www3.autoimg.cn/newsdfs/g28/M05/F9/98/120x90_0_autohomecar__ChsEnluQmUmARAhAAAFES6mpmTM281.jpg',
                'https://www2.autoimg.cn/newsdfs/g28/M09/FC/06/120x90_0_autohomecar__ChcCR1uQlD6AT4P3AAGRMJX7834274.jpg',
                'https://www2.autoimg.cn/newsdfs/g3/M00/C6/A9/120x90_0_autohomecar__ChsEkVuPsdqAQz3zAAEYvWuAspI061.jpg',]
    
    def task(url):
        ret = requests.get(url)
        file_name = str(uuid.uuid4())+'.jpg'
        with open (file_name,mode='wb')as f:
            f.write(ret.content)
    
    for url in url_list:
        t = threading.Thread(target = task,args = (url,))
        t.start()
    2. IO操作 多线程有用

      

  • 相关阅读:
    解决mongodb设备mongod命令不是内部或外部的命令
    Zoj 3545 Rescue the Rabbit(ac自己主动机+dp)
    中国云计算网站的第六次会议
    MYSQL,innodb_buffer_pool_size内存分配
    SharePoint综合Excel数据与Excel Web Access Web部分
    在小发现SQL字符串比较是不是他们的大写和小写敏感
    代码质量初步
    软件开发:速度 vs 质量
    UI概念体系要素
    模式与方法论
  • 原文地址:https://www.cnblogs.com/wangjun187197/p/9622349.html
Copyright © 2011-2022 走看看