并发编程基础之进程

目录

  • 1、操作系统发展史
  • 2、多道技术
  • 3、并发与并行
  • 4、进程
  • 5、同步与异步
  • 6、阻塞与非阻塞
  • 7、进程的三种状态

1、操作系统发展史

研究并发编程其实就是研究操作系统的底层原理,所以我们需要从操作系统的发展史开始学起

手工操作—— 穿孔卡片

1946年第一台计算机诞生-–20世纪50年代中期,计算机工作还在采用手工操作方式。此时还没有操作系统的概念。

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

手工操作方式两个特点:

  (1)用户独占全机。不会出现因资源已被其他用户占用而等待的现象,但资源的利用率低。

  (2)CPU 等待手工操作。CPU的利用不充分。

  1. 1、穿孔卡片
  • 读取数据特速度别慢
  • CPU利用率极低
  • 单用户(一份代码)使用
  1. 2、批处理
  • 读取数据速度特别慢
  • CPU的利用率极低
  • 联机(多份代码)使用
  • 效率还是很低
  1. 3、脱机批处理(现代操作系统的设计原理
  • 读取数据速度提高
  • CPU的利用率提高

2、多道技术

多道技术(基于单核背景下产生的)

  • 单道:一条道,一直走 -–-–-–-–串行

    比如:a,b需要使用CPU,a先试用,b等待a使用完毕后,b才能使用CPU

  • 多道

    比如:a,b需要使用CPU,a先使用,b等待,直到a进入“IO或执行时间过长“,a会(切换+保存状态),然后b可以使用CPU,待b执行遇到”IO或执行时间过长“,再将CPU执行权限交给a,直到两个程序结束

空间上的复用:

? 多个程序使用一个CPU

时间上的复用:

? 切换 + 保存状态

? 1、当执行程序遇到IO时,操作系统会将CPU的执行权限剥夺

? 优点:CPU的执行效率提高

? 2、当执行程序时间过长,操作系统执行时间过长,操作系统会将CPU的执行权限剥夺

? 缺点:程序的执行效率低

3、并发与并行

并发:看起来像同时运行

在单核(一个cpu)情况下,当执行两个a,b程序时,a先执行,当a遇到IO时,b开始争抢cpu的执行权限,再让b执行,他们看起像同时运把正意义上的同时运行。

并行:真正意义上的同时运行

在多核(多个cpu)的情况下,当执行两个a,b程序时,a与b同时执行。他们是真正意义上的同时运行。

面试题: 在单核情况下能否实现并行? 不行

4、进程

1、什么是进程?

? 进程是一个资源单位

2、进程与程序:
程序:一对代码文件

? 进程:执行代码的过程,称之为进程

3、进程调度(了解)

1) 先来先服务调度算法(了解)
    - 比如程序 a,b,若a先来,则让a先服务,待a服务完毕后,b再服务。
    - 缺点: 执行效率低。

2) 短作业优先调度算法(了解)
    - 执行时间越短,则先先调度。
     缺点:
     导致执行时间长的程序,需要等待所有时间短的程序执行完毕后,才能执行。

现代操作系统的进程调度算法: 时间片轮转法 + 多级反馈队列  (知道)

3) 时间片轮转法
     - 比如同时有10个程序需要执行,操作系统会给你10秒,然后时间片轮转法会将10秒分成10等分。

4) 多级反馈队列:
     1级队列: 优先级最高,先执行次队列中程序。
     2级队列: 优先级以此类推
     3级队列:

5、同步与异步

同步与异步指的是“提交任务的方式”

同步(串行):

两个a,b程序都要提交并执行,假如a先提交执行,b必须等a执行完毕后,才能提交任务。

异步(并发):

两个a,b程序都要提交并执行,假如a先提交并执行,b无需等a执行完毕,就可以直接提交任务。

6、阻塞与非阻塞

阻塞(等待):

? 凡是遇到IO都会阻塞

? IOinput(),output(),time.sleep(3),数据的传输

非阻塞(不等待):

? 除了IO都是非阻塞,(比如:从1+1开始计算到100万)

7、进程的三种状态

就绪态:

? 同步与异步(提交任务的方式)

运行态:

? 程序的执行时间过长 -–-–> 将程序返回给就绪态

? 非阻塞

阻塞态:

? 遇到IO

面试题:阻塞与同步是一样的吗?非阻塞与异步是一样的吗?

  • 同步与异步:提交任务的方式
  • 阻塞与非阻塞:进程的状态
  • 异步与非阻塞,CPU的利用率最大化

8、创建进程的两种方式:

方式一:

from multiprocessing import Process
import time

def task(name):
    print(f'start{name}---')
    time.sleep(3)
    print(f'end{name}---')

if __name__ == '__main__':
    print("开始执行主进程。。。")
    #target=任务(函数地址)--->创建一个子进程
    #异步提交了3个任务
    obj1 = Process(target=task,args=('letin',))#args内是元组,注意加‘,’
    obj2 = Process(target=task,args=('letin',))
    obj3 = Process(target=task,args=('letin',))
    obj1.start()    #.start()告诉操作系统,去创建一个子进程
    obj2.start()
    obj3.start()
    # obj1.join()   #告诉主进程,等待子进程结束后,在结束
                    #主进程是当前程序(程序的执行过程)

结果:
开始执行主进程。。。
startletin---
startletin---
startletin---
endletin---
endletin---
endletin---

方式二:

继承Process方法

from multiprocessing import Process
import time

class MyProcess(Process):
    def run(self):
        print(f'start...{self.name}的子进程')
        time.sleep(3)
        print(f'end...{self.name}的子进程')

if __name__ == '__main__':
    list1 = []

    for line in range(4):
        obj = MyProcess()
        obj.start()
        list1.append(obj)

    for obj in list1:
        obj.join()

结果:
start...MyProcess-4的子进程
start...MyProcess-2的子进程
start...MyProcess-3的子进程
start...MyProcess-1的子进程
end...MyProcess-4的子进程
end...MyProcess-2的子进程
end...MyProcess-3的子进程
end...MyProcess-1的子进程
主进程

原文地址:https://www.cnblogs.com/leiting7/p/11997020.html

时间: 2024-10-13 23:33:14

并发编程基础之进程的相关文章

python中并发编程基础1

并发编程基础概念 1.进程. 什么是进程? 正在运行的程序就是进程.程序只是代码. 什么是多道? 多道技术: 1.空间上的复用(内存).将内存分为几个部分,每个部分放入一个程序,这样同一时间在内存中就有了多道程序. 2.时间上的复用(CPU的分配).只有一个CPU,如果程序在运行过程中遇到了I/O阻塞或者运行时间足够长.操作系统会按照算法将CPU分配给其他程序使用,依次类推.直到第一个程序被重新分配到CPU会继续运行. 多道技术中的问题解决: 空间复用:程序之间的内存必须分割.这种分割需要在硬件

C#网络编程基础之进程和线程详解

在C#的网络编程中,进程和线程是必备的基础知识,同时也是一个重点,所以我们要好好的掌握一下. 一:概念 首先我们要知道什么是"进程",什么是"线程",好,查一下baike. 进程:是一个具有一定独立功能的程序关于某个数据集合的一次活动.它是操作系统动态执行的基本单元, 在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元. 线程:是"进程"中某个单一顺序的控制流. 关于这两个概念,大家稍微有个印象就行了,防止以后被面试官问到. 二:进程

python并发编程基础之守护进程、队列、锁

并发编程2 1.守护进程 什么是守护进程? 表示进程A守护进程B,当被守护进程B结束后,进程A也就结束. from multiprocessing import Process import time ? def task(): print('妃子的一生') time.sleep(15) print('妃子死了') ? if __name__ == '__main__': fz = Process(target=task) fz.daemon = True #将子进程作为主进程的守护进程.必须在

Python3 与 C# 并发编程之~ 进程先导篇

Linux专项¶ 先写几个问号来概况下今天准备说的内容:(谜底自己解开,文中都有) 你知道Ctrl+C终止进程的本质吗?你知道Kill -9 pid的真正含义吗? 你知道那些跨平台框架(Python,NetCore)在Linux下创建进程干了啥? 你了解僵尸进程和孤儿进程的悲催生产史吗?孤儿找干爹,僵尸送往生想知道不? 想知道创建子进程后怎么李代桃僵吗?ps aux | grep xxx的背后到底隐藏了什么? 你了解Linux磁盘中p类型的文件到底是个啥吗? 为什么要realase发布而不用de

Java并发编程-基础概念全解

1.基础 1.1.什么是进程和线程 进程和线程都是操作系统所运行的程序运行的基本单元.进程可以说是是线程的集合. 进程:从系统资源讲,进程都有自己独立的地址空间,一个进程的崩溃不会影响另一个进程的执行. 线程:进程中的一个执行路径,一个进程中可以同时有多个线程在执行,当其中一个线程对公共资源做了修改,其他线程是可以看到的. 1.2.什么是并行和并发 并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时. 并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正

4.java并发编程艺术-java并发编程基础

java从诞生开始就明智的选择了内置对多线程的支持,这使得java语言相比同一时期的其他语言具有明显的优势.线程作为操作系统调度的最小单元,多个线程能够同时执行,这将显著提升程序的性能,在多核环境中表现的更加明显.但是,过多的创建线程和对线程的不当管理也容易造成问题.本章将着重介绍java并发编程的基础知识,从启动一个线程到线程间不同的通信方式,最后通过简单的线程池示例以及应用(简单的Web服务器)来串联本章所介绍的内容. 1.线程简介 1.1 什么是线程 现代操作系统中在运行一个程序时,会为其

C++11 并发编程基础(一):并发、并行与C++多线程

正文 C++11标准在标准库中为多线程提供了组件,这意味着使用C++编写与平台无关的多线程程序成为可能,而C++程序的可移植性也得到了有力的保证.另外,并发编程可提高应用的性能,这对对性能锱铢必较的C++程序员来说是值得关注的. 回到顶部 1. 何为并发 并发指的是两个或多个独立的活动在同一时段内发生.生活中并发的例子并不少,例如在跑步的时候你可能同时在听音乐:在看电脑显示器的同时你的手指在敲击键盘.这时我们称我们大脑并发地处理这些事件,只不过我们大脑的处理是有次重点的:有时候你会更关注你呼吸的

Go并发编程基础(译)

2015-05-20 三 By youngsterxyf 原文:Fundamentals of concurrent programming 译者:youngsterxyf 本文是一篇并发编程方面的入门文章,以Go语言编写示例代码,内容涵盖: 运行期并发线程(goroutines) 基本的同步技术(管道和锁) Go语言中基本的并发模式 死锁和数据竞争 并行计算 在开始阅读本文之前,你应该知道如何编写简单的Go程序.如果你熟悉的是C/C++.Java或Python之类的语言,那么 Go语言之旅 能

并发编程之多进程进程进程

Python 并发编程之多进程 1.1 multiprocessing 模块 Python 中的多线程无法利用多核资源,如果想要充分的使用多核 cpu 的资源,在 Python 中大部分情况需要使用多进程. Python 为我们提供了非常好用的多进程包multiprocessing! os.cpu_coutn() multiprocessing模块用来开启子进程,并在模块中执行我们定制的任务(如函数,实现功能等). multiprocessing 模块的功能有很多: ?支持子进程 ?通信和共享数