进程

Linux创建进程链、进程扇、进程树 如何创建进程链、进程扇、进程树 阅读详情

进程Process

什么是进程

image-20211204102521781

进程(Process):拥有自己独立的堆和栈,既不共享堆,也不共享栈,进程由操作系统调度;进程切换需要的资源很最大,效率低。

对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。

image-20211205110401975

进程的优缺点

进程的优点:

  1. 可以使用计算机多核,进行任务的并行执行,提高执行效率
  2. 运行不受其他进程影响,创建方便
  3. 空间独立,数据安全

进程的缺点:

  • 进程的创建和删除消耗的系统资源较多

进程的创建方式(方法模式)

Python的标准库提供了个模块:multiprocessing

进程的创建可以通过分为两种方式:

1. 方法包装

2. 类包装

创建进程后,使用start()启动进程

【示例】方法模式创建进程

from multiprocessing import Process
import os
from time import sleep

def func1(name):
  print("当前进程ID:",os.getpid())    #getpid意思是获取进程ID(get process id)
  print("父进程ID:",os.getppid())    #getppid意思是获取父进程ID(get parent process id)
  print(f"Process:{name} start")
  sleep(3)
  print(f"Process:{name} end")

'''
这是一个关于windows上多进程实现的bug。
如果不加__main__限制的话,就会无限递归创建子进程,进而报错。
在windows上,子进程会自动import启动它的这个文件,而在import的时候是会自动执行这些语句的。
于是import的时候使用 __name__ =="__main__" 保护起来就可以了。
'''

if __name__ =="__main__":
  print("当前进程ID:",os.getpid())
  # 创建进程
  p1 = Process(target=func1, args=('p1',))
  p2 = Process(target=func1, args=('p2',))
  p1.start()
  p2.start()

进程的创建方式(继承Process类)

和使用Thread 类创建子线程的方式非常类似,使用 Process 类创建实例化对象,其本质是调用该类的构造方法创建新进程。Process 类的构造方法格式如下:

def __init__(self,group=None,target=None,name=None,args=(),kwargs={})

其中,各个参数的含义为:

group:该参数未进行实现,不需要传参;

target:为新建进程指定执行任务,也就是指定一个函数;

name:为新建进程设置名称;

args:为 target 参数指定的参数传递非关键字参数;

kwargs:为 target 参数指定的参数传递关键字参数。

【示例】类的方式创建进程

from multiprocessing import Process
from time import sleep

class MyProcess(Process):
  def __init__(self,name):
    Process.__init__(self)
    self.name = name

  def run(self):
    print(f"Process:{self.name} start")
    sleep(1)
    print(f"Process:{self.name} end")

if __name__ == '__main__':
  p1 = MyProcess("p1")
  p2 = MyProcess("p2")
  p1.start()
  p2.start()

Queue实现进程间通信

image-20211205112354941

前面讲解了使用 Queue 模块中的 Queue 类实现线程间通信,但要实现进程间通信,需要使用 multiprocessing 模块中的 Queue 类。

简单的理解 Queue 实现进程间通信的方式,就是使用了操作系统给开辟的一个队列空间,各个进程可以把数据放到该队列中,当然也可以从队列中把自己需要的信息取走。

【示例】使用Queue实现进程间通信的经典代码

from multiprocessing import Process, Queue
from time import sleep

class MyProcess(Process):
    def __init__(self,name,mq):
        Process.__init__(self)
        self.name = name
        self.mq = mq
    def run(self):
        print(f"Process:{self.name} start")
        print('主进程存放的数据:', self.mq.get()) #打印主进程存放的数据
        sleep(2)
        # 在子进程里存放数据,可以使用主进程提取
        self.mq.put(f'子进程存放的数据:{self.name}')
        print(f"Process:{self.name} end")

if __name__ == '__main__':  #创建主进程
    mq = Queue()
    '''mq不可以作为普通的全局变量,
    创建子进程时需要作为参数传进子进程,类里面也要写self.mq而不是mq,
    因为mq在当前进程为全局变量,但是mq会与创建的新的进程没有关系,从而导致报错'''
    #在主进程里存放数据,可以使用子进程提取
    mq.put('1')   #当字符串'1'被使用后会消失
    mq.put('2')   #所以下次进程会使用下一条数据字符串'2'
    mq.put('3')
    #进程列表
    p_list = []   #将进程全部存放在列表内
    for i in range(3):
        p = MyProcess(f'p{i}',mq)   #创建子进程
        p_list.append(p)
    for p in p_list:                #启动被存放在列表内的子进程
        p.start()

    #因为要打印主进程里存放的信息,所以使用join让子进程先结束
    for p in p_list:
        p.join()
    '''使用join之后,可以确保join后面的代码在子进程运行(存放数据)结束后运行
    如果不使用join,则join后面的代码可能在子进程运行(存放数据)之前运行,
    数据还没有存放,那么后面就无法打印子进程存放的数据'''
    print(mq.get())    #打印子进程里存放的数据
    print(mq.get())
    print(mq.get())

Pipe实现进程间通信

image-20211205115748323

Pipe 直译过来的意思是“管”或“管道”,和实际生活中的管(管道)是非常类似的。

Pipe方法返回(conn1, conn2)代表一个管道的两个端。

Pipe方法有duplex参数,如果duplex参数为True(默认值),那么这个参数是全双工模式,也就是说conn1和conn2均可收发。若duplex为False,conn1只负责接收消息,conn2只负责发送消息。send和recv方法分别是发送和接受消息的方法。例如,在全双工模式下,可以调用conn1.send发送消息,conn1.recv接收消息。如果没有消息可接收,recv方法会一直阻塞。如果管道已经被关闭,那么recv方法会抛出EOFError。

【示例】使用Pipe管道实现进程间通信

#coding=utf-8
import multiprocessing
from time import sleep

def func1(conn1):
  sub_info = "Hello!"
  print(f"进程1--{multiprocessing.current_process().pid}发送数据:{sub_info}")
  sleep(1)
  conn1.send(sub_info)  #发送进程1的数据
  print(f"来自进程2:{conn1.recv()}")
  sleep(1)
def func2(conn2):
  sub_info = "你好!"
  print(f"进程2--{multiprocessing.current_process().pid}发送数据:{sub_info}")
  sleep(1)
  conn2.send(sub_info)  #发送进程2的数据
  print(f"来自进程1:{conn2.recv()}")
  sleep(1)

if __name__ == '__main__':
  #创建管道
  conn1,conn2 = multiprocessing.Pipe()
  # 创建子进程
  process1 = multiprocessing.Process(target=func1,args=(conn1,))
  process2 = multiprocessing.Process(target=func2,args=(conn2,))
  # 启动子进程
  process1.start()
  process2.start()

Manager管理器

管理器提供了一种创建共享数据的方法,从而可以在不同进程中共享。

【示例】管理器Manager实现进程通信

#coding=utf-8
from multiprocessing import Process,current_process
from multiprocessing import Manager

def fun1(name,m_list,m_dict):
  m_list.append('你好')      #子进程往列表里添加数据
  m_dict['name'] = '尚学堂'  #子进程往字典里添加数据

if __name__ == "__main__":
  #使用后需要关闭管理器,所以用with自动关闭
  with Manager() as mgr:
    m_list = mgr.list()
    m_dict = mgr.dict()
    m_list.append('Hello!!')  #主进程里往列表增加信息
    #两个进程不能直接互相使用对象,需要互相传递
    p1 = Process(target=fun1,args=('p1',m_list,m_dict))
    p1.start()
    p1.join()  #等p1进程结束,主进程继续执行
    print(m_list)
    print(m_dict)

进程池(Pool)

Python提供了更好的管理多个进程的方式,就是使用进程池。

进程池可以提供指定数量的进程给用户使用,即当有新的请求提交到进程池中时,如果池未满,则会创建一个新的进程用来执行该请求;反之,如果池中的进程数已经达到规定最大值,那么该请求就会等待,只要池中有进程空闲下来,该请求就能得到执行。

使用进程池的优点:

  1. 提高效率,节省开辟进程和开辟内存空间的时间及销毁进程的时间
  2. 节省内存空间
类/方法功能参数
Pool(processes)创建进程池对象processes表示进程池中有多少进程
pool.apply_async(func,args,kwds)异步执行 ;将事件放入到进程池队列func 事件函数 args 以元组形式给func传参kwds 以字典形式给func传参 返回值:返回一个代表进程池事件的对象,通过返回值的get方法可以得到事件函数的返回值
pool.apply(func,args,kwds)同步执行;将事件放入到进程池队列func 事件函数 args 以元组形式给func传参 kwds 以字典形式给func传参
pool.close()关闭进程池
pool.join()回收进程池
pool.map(func,iter)类似于python的map函数,将要做的事件放入进程池func 要执行的函数 iter 迭代对象

【示例】进程池使用案例

#coding=utf-8
from multiprocessing import Pool
import os
from time import sleep

def func1(name):
  print(f"当前进程的ID:{os.getpid()},{name}")
  sleep(2)
  return name #返回数据,可以传给callback里的func2

def func2(args):
  print(args)

if __name__ == "__main__":
  pool = Pool(5)      #表示进程池中有5个进程

  pool.apply_async(func = func1,args=('sxt1',),callback=func2)  
  #callback表示把func1返回的数据传给func2
  pool.apply_async(func = func1,args=('sxt2',),callback=func2)
  pool.apply_async(func = func1,args=('sxt3',),callback=func2)
  pool.apply_async(func = func1,args=('sxt4',))
  pool.apply_async(func = func1,args=('sxt5',))
  pool.apply_async(func = func1,args=('sxt6',))  #从第5个进程开始循环使用进程池里的进程
  pool.apply_async(func = func1,args=('sxt7',))
  pool.apply_async(func = func1,args=('sxt8',))

  pool.close()  #进程池使用完需要关闭
  pool.join()   #保证子进程在主进程结束前运行完

 【示例】使用with管理进程池

#coding=utf-8
from multiprocessing import Pool
import os
from time import sleep

def func1(name):
  print(f"当前进程的ID:{os.getpid()},{name}")
  sleep(2)
  return name

if __name__ == "__main__":
  with Pool(5) as pool:
    args = pool.map(func1,('sxt1,','sxt2,','sxt3,','sxt4,','sxt5,','sxt6,','sxt7,','sxt8,'))
    for a in args:
      print(a)

进程模拟--创建新的进程:查看进程的信息,换出某个进程,杀死运行进程以及进程之间的通信 #include #include #include struct jincheng_type {        int pid;        int youxian;   int daxiao;   int msg;   int live; }; struct jincheng_type neicun[20],waicun[20]; int shumu =0,pid=1; 阅读详情

相关推荐

进程控制(上):进程创建,进程等待,进程终止

进程创建进程创建被定义为通过父进程创建子进程的过程。fork函数函数原型:pid_t fork(void);特点: 1.fork函数调用一次,返回两次两次返回值得区别分别是子进程当中的返回值为0,父进程当中的返回值为新建子进程的ID(将ID返回给父进程的原因是没有函数可以使父进程得到子进程的ID,这样会便于管理); 2.子进程被创建出来后,子进程是父进程的副本(子进程获得父进程数据空

leap的博客 2929

【linux】进程控制——进程创建,进程退出,进程等待

一个进程创建了另一个进程,创建者为父进程,被创建者为子进程。父进程可以创建多个子进程。操作系统是一号进程,所有进程构成一颗多叉树结构。每个父进程只对直系的子进程负责。父进程创建子进程的一整套流程为:创建子进程——>子进程完成任务——>父进程回收子进程父进程先退,子进程未退。此时子进程的父亲进程被改为1号进程(操作系统),那么该子进程被称为孤儿进程父进程未退,子进程先退。但父进程没有读取到子进程的退出(进程等待),该子进程的状态被改为 Z 状态,Z 状态的进程被成为僵尸进程。

2301_79796701的博客 2708

进程、线程和前台进程、后台进程

因为这些概念我从开始接触计算机就有点混淆不清,可能大家也会和我有相同的感觉,所以整理一下我理解的这几者的区别,和定义,希望可以帮助到大家,当然不一定正确,但我相信一定会管用。 进程进程:是正在执行的一个程序(软件)或者命令,每一个进程都是一个运行的实体都有自己的地址空间,并且占用一定的系统资源。说白了进程就是正在运行着的程序,只要运行就会产生至少一个进程。为什么说只要程序运行就至少会产生一个进程呢...

swf_shixinshou的博客 4804

【Linux】详解进程状态之僵尸进程——孤儿进程

详解进程状态

日出等日落 3252

Transformer是什么?看完这篇你就醍醐灌顶

前言 由谷歌团队提出的预训练语言模型BERT近年来正在各大自然语言处理任务中屠榜(话说学者们也挺有意思的,模型名都强行凑个芝麻街的人物名,哈哈哈)。 BERT算法的最重要的部分便是Transformer的概念,它本质上是Transformer的编码器部分。 而Transformer是什么呢?transformer是永远的神,自从transformer使用了抛弃rnncnn的纯attention机制之后,各种基于transformer结构的预训练模型都如雨后春笋般雄起,而transformer中最重要就是使用

fs1341825137的博客 6万+

将Matlab程序打包成.exe独立可执行程序

将Matlab程序打包成.exe独立可执行程序,在未安装Matlab的电脑上也能运行Matlab程序。

简简单单的学习笔记,致力于帮助更多前进路上的朋友~ 5万+

进程及多进程编程

                                                                              第一部分  进程知识总结  一、进程的定义 进程是执行中的程序,就类比于一出舞台剧的整个表演过程;进程动态性的实质是进程实体的执行过程;进程独立性是指每个进程都有自己的PCB;进程的并发性是内存中可以允许存在多个进程实体,并且可以同时运行一...

小不点的博客 1万+

Abaqus仿真突然中断?手把手教你解决SIGTERM/SIGINT报错(附完整命令行方案)

本文深入解析Abaqus仿真中因SIGTERM或SIGINT信号导致进程意外中断的根本原因,并提供了一套完整的命令行解决方案。通过将作业提交方式从图形界面切换到命令行,并配合关键参数设置,可以有效避免因会话空闲超时或外部干扰引发的计算中断,保障长时间仿真任务的稳定运行。

devops8pract的博客 746

进程、子进程、僵尸进程、孤儿进程的关系

进程、子进程、僵尸进程、孤儿进程的关系。

intmian1的博客 1244

【3】Ubuntu18.04下载与安装,以及中文输入法的安装

Ubuntu18.04下载与安装一、下载二、安装(在VMware 16 pro中安装Ubuntu18.04)三、Ubuntu中安装中文输入法1.检查 fcitx 框架2.安装输入法 一、下载 下载地址:Ubuntu Releases 往下拉,找到自己需要的安装版本(建议不要安装最新版,因为你在使用时候遇到的错误大多都是以前版本的,最新版本的,解决方案特别少) 我这里安装的是Ubuntu18.04 一般都是使用desktop版本的(desktop版和server版本的区别:请看这篇文章) 之后点击下载即

斯基的朦胧 1万+

信号输入到底要不要接GND?单端与差分输入的接地选择与抗干扰分析

在电子工程与工业现场中,接地是信号完整性的基石。电压本身是相对值,任何测量都需要一个公共参考点,这就是地(GND)在信号输入中的核心作用。单端输入依赖信号源与接收端共地,以GND为基准还原信号;差分输入则直接测量两根信号线之间的差值,天然不依赖本地地电位,因此能有效抑制共模干扰和地环路噪声。实际选型时,需要根据传感器类型、传输距离、地电位差大小权衡:短距离共地良好的场景可用单端,长距离或高干扰环境应优先考虑差分或隔离方案。本文从接地原理出发,结合实际接线与故障排查经验,帮助工程师在PLC、采集卡和传感器链路

weixin_28703507的博客 311

【进程概念】启动进程 | 查看进程 | 创建进程

进程 | 启动进程 | 查看进程 | 终止进程 | 创建进程

m0_74841364的博客 2212

Android USB串口通信详解与实例

在Android开发中,USB串口通信是一个常见的需求,尤其是在与硬件设备进行交互时。通过USB串口,我们可以轻松地实现数据的发送与接收。本文将详细介绍如何使用库来实现Android设备与USB串口设备的通信。

m0_62153576的博客 678

进程(父进程、子进程、init进程)

父进程和子进程、init进程之间的关系 通过上节我们知道,子进程是通过fork()函数创建的,相当于父进程的一个复制品,子进程和父进程除了子进程复制了父进程还有什么关系呢? 1.子进程和父进程属于同一进程组,父进程为进程组组长; 2.父进程退出子进程未退出的情况下,子进程会变成孤儿进程有init进程收养并转为后台进程; 3.子进程退出父进程为退出但父进程未及时进行回收,子进程就会成为僵尸进程; 用通俗的方式来讲:子进程和父进程就如同一家公司开了一家子公司一样,虽然在表面上看两家公司是两个独立的公司,但实际内

weixin_48755527的博客 4099

cartographer如何使用2个反光柱子作为一个landmark

2个反光柱的摆放要求:靠着墙摆,因为我们只能从一侧看到2个反光柱,从两侧都看到至少需要3个反光柱来定位。 landmark检测原理:因为我们是从一侧看到2个反光柱,所以看到2个反光柱在一帧激光数据中会有顺序,有2种情形,如下图 这两种情形,我们发现 情形1: 这种情形2个反光柱子被检测到的激光角度小于180,我们认为大一些激光角度的是原点。 情形2: 这种情形2个反光柱子被检测到的激光角度大于180,我们认为小一些激光角度的是原点。 这样原点就固定下来,并是唯一的。2个反光柱构成的坐标系也就确定了。和激光坐

南北粉面馆 3827

AI辅助需求分析与提示词生成

文章标题 《AI辅助需求分析与提示词生成》 关键词 人工智能 需求分析 提示词生成 深度学习 机器学习 强化学习 数学模型 系统架构

AI天才研究院 1214

【进程】进程组

一、进程组 1. 进程组 (1)进程组,也称之为作业,BSD与1980年前后向UNIX中增加的一个新特性,代表一个或多个进程的集合。每个进程都属于一个进程组,在waitpid函数和kill函数的参数中都曾经使用到,操作系统设计的进程组的概念,是为了简化对多个进程的管理。 当父进程创建子进程的时候,默认子进程与父进程属于同一个进程组,进程组ID等于进程组第一个进程ID(组长进程)。所以,组长...

月雲之霄的博客 2373

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

linux 之0号进程、1号进程、2号进程

0号进程,通常也被称为idle进程,或者也称为swapper进程,其 pid 等于0。0号进程是linux启动的第一个进程,它的task_struct的comm字段为"swapper",所以也称为swpper进程。当系统中所有的进程起来后,0号进程也就蜕化为idle进程,当一个core上没有任务可运行时就会去运行idle进程。一旦运行idle进程则此core就可以进入低功耗模式了.

z20230508的博客 3192

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

进程IO之 进程

程序:静态的,编译好的可执行文件,存放在磁盘中的指令和数据的集合进程:动态的,是程序的一次执行过程,是独立的可调度的任务。

学习过程记录,欢迎大家交流互动,互相学习 1080

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Linux进程概念(进程PID、父子进程、僵尸进程与孤儿进程)

进程是计算机系统里的一个基础概念,不论是什么系统(Windows、Linux还是macOS),都有进程这个概念。进程可以认为是在运行中的可执行程序。我们写的代码,经过编译后运行是进程,电脑中每一个运行中的软件也是进程。

laimaxgg 1366

主进程、子进程和守护进程

理解 主进程main thread: 程序执行的入口,可以理解为常用的main 函数。 父进程parent thread: 对于子进程而言, 子进程的创造者,可有多个子进程。 任何进程都有父进程,追根溯源是系统启动程序。对于我们一般写的程序,主进程是最初始的父进程。 子进程child thread: 相对父进程而言, 父进程创建的进程, 子进程只能对应一个父进程。如果没有标记为daemon , 则杀死父进程不会对子进程的运行状态有丝毫影响。 守护进程daemon thread: 即daemon thread

weixin_45295666的博客 3731

进程 进程的创建 进程的回收

进程 进程的状态 进程的创建 进程的回收 execl函数

weixin_60208935的博客 2436

孤儿进程、僵尸进程和守护进程

如果父进程先于子进程退出,则子进程成为孤儿进程,此时将自动被PID为1的进程收养, PID为1的进程就成为了这个进程的父进程。当一个孤儿进程退出以后,它的资源清理会交给它的父进程来处理。查看再使用 kill -9 <PID> # 强制终止进程 我这里是kill -9 28667。

m0_68381723的博客 1335

【Linux】进程控制 之 进程创建 && 进程终止 && 进程等待 && 进程替换

本篇博客讲解了进程控制 之 进程创建 && 进程终止 && 进程等待 && 进程替换。码字结合,快来看看吧 ~

Weraphael的博客 1038

进程控制:进程创建,进程终止,进程等待,进程替换,模拟实现shell

而代码和数据都是我们在写父进程的代码的时候所输入或者说所产生的,这些东西是我们写的,而pcb结构体是操作系统创造出来的,所以子进程的pcb结构体必定是独立的,是自己独有一份的(进程独立性也满足),而代码一般我们是只读不修改与写的所以我们的代码一般子进程与父进程是共享的,剩下的数据数据是可读可写的,我们进程分流的时候,当数据发生改变时才会分离(写时拷贝);上面我们学习了怎么创建怎么等待进程,这些其实都是为了让我们的进程为我们做事,我们需要做的事情在子进程中实现,这样我们的父进程就可以去做其他的事情;

m0_75260318的博客 1135

子进程、父进程、僵尸进程和孤儿进程

本文介绍了操作系统中父进程、子进程、孤儿进程和僵尸进程的核心概念及相互关系。父进程通过fork()创建子进程,子进程继承父进程资源并独立运行。僵尸进程是已终止但未被父进程回收的子进程,会占用系统资源;孤儿进程是父进程终止后仍在运行的子进程,会被init进程自动回收。文章通过比喻和对比表格清晰解释了这些概念,并提供了防止僵尸进程和孤儿进程的策略,如父进程调用wait()或捕获SIGCHLD信号,以及正确处理子进程终止后的资源回收。

zzzlearning的博客 1206
上一篇: 线程
下一篇: 协程
可爱软萌喵酱
博客等级 码龄5年 100粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值