Linux之进程

Linux进程——进程退出 线程。 阅读详情

1.进程的定义

在讨论进程定义之前,我们可以先来了解一下计算机操作系统为什么要引入进程这个概念。
1.1 进程的引入
当计算机系统只有一个程序运行时,称之为单道程序,此时这个程序独占系统中的所有资源,在执行的过程中不受外界的影响;而多道程序在执行时,就是所谓的程序并发执行,即若干个程序同时在系统中执行,这时,这些程序就不可能独占所有的系统资源了,而需要多个程序共享系统的资源,从而导致各个程序在执行时出现相互制约的关系。为了刻画系统内部出现的这种动态情况,描述程序并发执行的活动规律,操作系统就引入了进程这个概念,进程的出现是为了使多个程序并发执行,用以改善资源利用率,并且提高系统的吞吐量。
1.2 进程的定义
进程是一个“执行中的程序”,即程序在处理机上执行时所发生的活动。
由上述简单的定义可以发现,进程与程序有着密不可分的关系,运行中的程序在内存中的映像就叫做进程。
1.3查看进程信息
在Windows系统下,可以通过任务管理器来查看系统中的进程信息。
在Linux系统下,可以通过命令 “ps -aux”来查看系统中的进程信息。如下图所示:
在这里插入图片描述

2.进程的基本操作

2.1 进程创建
在Linux下,提供了好几个关于创建进程的操作函数,如fork(), vfork()
(1)fork()函数
该函数的功能是创建一个进程,新进程为当前进程的子进程,当前进程就被称为父进程。该函数的调用形式为:pid_t fork(void);使用该函数要引用头文件<sys/types.h>和<unistd.h>头文件,函数返回值类型为pid_t,表示一个非负整数。若程序运行在父进程中,函数返回的PID为子进程的进程号;若运行在子进程中,返回的PID为0.若创建子进程失败,则会返回-1.
程序代码如下:

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    pid_t pid;
    pid = fork();
    if(pid <0)
    {
	printf("fork error!\n");
	exit(1);
    }
    else if(pid == 0)
    {
	printf("in the child process!\n");
    }
    else
    {
	printf("in the parent process!\n");
    }
    exit(0);
}

从程序的结果可以看出fork()函数的一个特点,即“调用一次,返回两次”,这又是为什么呢?
原来,在一个程序中,调用fork()函数后,就出现了分叉。在子进程中,fork()函数返回0;在父进程中,fork()函数返回子进程的PID。但是,调用fork()之后,谁先执行完全由调度器决定。
(2)vfork()函数
与fork()函数相同,这两个函数都是系统调用函数。而两者的区别是在创建子进程时fork()函数会复制父进程的所有资源,包括进程环境、内存资源等。而vfork()函数在创建子进程时并不会复制父进程的所有资源,父子进程共享地址空间。这样,在子进程中对虚拟地址空间中的变量修改,实际上是在修改父进程虚拟地址空间中的值。
以下是个实例,演示两个函数的区别。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int gvar = 2;

int main()
{
    pid_t pid;
    int var = 5 ;
    printf("process id: %ld\n", (long)getpid());
    printf("gvar = %d var = %d\n",gvar, var);
    pid = vfork();
    if(pid<0)
    {
	perror("error!\n");
	return 1;
    }
    else if(pid ==0)
    {
	gvar--;
	var++;
	printf("the child process id: %ld\ngvar = %d var=%d\n",(long)getpid(),gvar,var);
	_exit(0);
    }
    else
    {	
	printf("the parent process id: %ld\ngvar = %d var=%d\n",(long)getpid(),gvar,var);
	return 0;
    }
}

结果如下:
在这里插入图片描述
由运行结果可以看出,父进程中输入的变量值也是在子进程中变化后的值。由此可知,调用vfrok()函数改变子进程中的值,其实就是改变父进程中的值。

2.进程等待

进程等待就是为了同步父进程与子进程,通常需要通过wait()函数使父进程等待子进程结束。如果父进程没有调用等待函数,子进程就会进入“僵尸(Zombie)”状态。
Linux提供的等待函数原型如下:

#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int* status);
pid_t waitpid(pid_t pid,int* status, int options);

wait()函数系统调用的工作过程是:首先判断子进程是否存在,即是否成功创建了一个子进程。如果创建失败,子进程不存在,则会直接退出进程,并且提示相关错误信息;如果创建成功,那么wait()函数会将父进程挂起,直到子进程结束,并且返回结束时的状态和最后结束的子进程的PID。

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

/*定义一个功能函数,通过返回的状态,判断进程是正常退出还是信号导致的退出*/
void exit_s(int status)
{
    if(WIFEXITED(status))
    {
	printf("正常退出,status=%d\n",WEXITSTATUS(status));
    }
    else if(WIFSIGNALED(status))
    {
	printf("信号退出,status=%d\n",WTERMSIG(status));
    }
}

int main()
{
    pid_t pid, pid1;
    int status;
  //创建一个子进程
    if((pid=fork())<0)
    {
	printf("child process error!\n");
	exit(0);
    }
    else if(pid ==0) //子进程
    {
	printf("the child process!\n");
	exit(2);  //调用exit()退出函数正常退出
    }
    if(wait(&status)!=pid) //在父进程中调用wait()函数等待子进程结束
    {
	printf("This is a parent process!\nwait error!\n");
	exit(0);
    }
    exit_s(status);  //wait()函数调用成功,调用自定义的功能函数来判断退出类型

    /*又一次创建子进程,在子进程中,使用kill()函数发送信号,导致退出*/
    if((pid=fork()) <0)
    {
	printf("child process error!\n");
	exit(0);
    }
    else if(pid == 0)
    {
	printf("the child process!\n");
	pid1 = getpid();
	/*使用kill()函数发送信号*/
	kill(pid1,19);
    }
    if(wait(&status)!=pid1)
    {
	printf("This is a parent process!\nwait error!\n");
	exit(0);
    }
    exit_s(status);
    exit(0);
}

提示:在Linux系统的终端输入“kill -l”命令,可以列出信号的具体情况、信号类型和其所对应的数字。

关于进程等待函数,还有一个常用的等待函数waitpid(),该函数实现的功能与wait()函数相同,但它们区别在于:wait()函数用于等待所有子进程的结束,而waitpid()函数仅用于等待某个特定进程的结束,这个特定的进程是指其pid与函数中的参数pid相关时。所谓的相关,有如下几种可能:
(1) pid=-1,等待任一个子进程,与wait()等效
(2)pid>0, 等待其进程ID与pid相等的子进程。

3.进程结束

当想要终止或者结束一个进程时,会使用系统调用exit()函数正常退出进程。该系统调用包括exit()和_exit()两个函数。
1.exit()函数
原型为:

 #include <stdlib.h>
  void exit(int status);

注意:该函数调用成功与失败都没有返回值,并且没有出错信息的提示。
exit()函数的作用是终止进程,并将运算status&0377表达式后的值返回给父进程,在父进程中通过wait()函数来获得。
2._exit()函数
原型为:

 #include <stdlib.h>
void exit(int status);

同上,无论成功与否,都没有返回值。
在之前的进程创建时,vfork()函数创建的子进程在退出时只能使用_exit()函数退出进程,而不能使用exit()函数来退出。这是因为在调用exit()函数时,会对输入/输出流进行刷新,释放所占用的资源以及清空缓冲区等;而 _exit()函数则不具备刷新缓冲区等操作的功能。

4.进程组

所谓的进程组,就是一个或者多个进程的集合。作为一个进程组,里面的每一个进程都有统一的进程标识。
在Liunx系统中,可以通过调用函数 getpgrp()来获取进程组ID,该函数的原型为:

#include <sys/types.h>
#include <unistd.h>
pid_t getpgrep(void);

调用该函数可以返回调用该函数的进程所在的进程组ID。在进程组中有一个特殊的进程,该进程的ID与进程组的ID相同。
每一个进程都有其生命周期,从创建进程到进程终止,这是一个进程的生命期,而进程组的生命期是从该进程组的创建到最后一个进程终止。在Linux系统中,可以使用setpgid()函数创建一个新的进程组或者将一个进程加入到一个进程组中。该函数原型为:

#include <sys/types.h>
#include <unistd.h>
int setpgid(pid_t pid, pid_t pgid);
//调用成功返回0.失败返回-1;

以下为该函数的应用:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
    int a ;
    pid_t pgid, pid;
    pid = (long)getpid();
    pgid = (long) getpgrp();
    a = setpgid(pid, pgid);
    printf("a = %d, pid = %ld, pgid = %ld\n", a, pid, pgid);
    return 0; 
}

结果:
在这里插入图片描述
注意:在setpgid()函数中,如果参数pid和pgid相等,则该函数功能是创建一个新的进程组;如果两个值不同,并且pgid是一个已经存在的进程组,那么该函数的功能是将pid进程加入到pgid这个进程组中。

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

相关推荐

【linux】查看进程和子进程

在Linux系统中,可以使用多个命令来查看进程及其子进程。

数字人生 5277

Linux网络编程(二)

Linux网络编程(二)Unix/Linux模型基本结构流和标准I/O库进程进程控制进程建立fork()exec()exec和fork的联用进程的终止exit()进程的同步wait()进程的属性进程标识符进程组标识符进程环境进程的有效标识符进程的优先级进程、进程组和会话的关系守护进程守护进程的启动守护进程的错误输出守护进程的建立步骤 Unix/Linux模型 基本结构 三个层次: 用户 内核 硬件 Unix内核结构: 内核主要成分: 文件子系统 进程控制子系统 系统调用与库函数区别: 系统调用

qq_41191468的博客 1121

28-基于STM32单片机的便携式健康监测系统设计与实现(程序+原理图+元件清单)

本文详细介绍了基于STM32单片机的便携式健康监测系统设计与实现,该系统集成MAX30102光电传感器和MSP20压力传感器,实时监测心率、血氧和血压等关键生理指标。通过STM32F103C8T6主控芯片和HC-05蓝牙模块,实现数据采集、处理及无线传输,具有便携性高、操作简便等特点,适用于家庭健康监护和户外运动场景。

weixin_29191669的博客 420

linux故障处理实例,SELinux导致故障解决实例

这样的报错还是第一次遇到,排查过程没有头绪,一直纠结在child setpgid这个地方,还好在google过程中看到有人在设置selinux的时候的相关案例,于是想到从这方面入手。原因为selinux开启导致的,但是比较诡异的是从别的terminal ssh 跳转过去之后无法执行任何操作,包括配置selinux,后来还是从后台远程管理口登陆上去之后设置并重启,彻底解决这个问题。-bash-4.3...

weixin_32597695的博客 532

双目相机立体匹配算法概述(含Python代码)

立体匹配任务是计算机视觉中的一个重要问题,旨在从一对具有相同场景的图像中估计每个像素的视差(disparity)。本文对现有的传统算法和深度学习算法进行了综述,以便于各位选择合适的立体匹配算法用于深度估计或三维建模。

m0_59257547的博客 8291

【ADCU详解】PMIC电源管理集成电路详解

自动驾驶域控制器(ADCU)中的电源管理集成电路(PMIC)是高度集成的关键部件,负责为计算核心、传感器等提供高效稳定的多路电源。其核心特点包括:符合车规AEC-Q100标准、支持功能安全ASIL等级、精确的时序控制及强抗干扰能力。PMIC由开关稳压器、LDO、时序控制器、监控保护电路等模块组成,通过分层电源树框架实现电能分配。设计需考虑效率、功率密度、噪声性能等关键维度,底层基于Buck转换器和LDO原理工作。使用中需满足严苛的车规环境要求,并通过静态/动态测试及故障注入测试进行验证,确保系统可靠性和安全

qq_40844444的博客 841

linux进程/进程组的一些概念,和相关API,setpgid等

1、 int setpgid(pid_t pid, pid_t pgid);功能1:设置进程pid所在的进程组的ID为pgid,如果pid的实参为0,setpgid(0, 5)等价于setpgid(getpid(), 5),其中getpid()的作用是获取本进程的pid。功能2:把进程pid移动到别的进程组(这一功能的一个常见例子就是:shell创建管道线时),原进程组和目标进程组必须处于同一个会...

野生猿-群号1025127672 2600

openharmony之UniProton内核技术揭秘:鸿蒙面向工业控制领域的RTOS设计之道

UniProton是鸿蒙操作系统面向工业控制领域的轻量级实时操作系统(RTOS),专为资源受限的嵌入式设备设计。作为鸿蒙生态的重要组成部分,UniProton提供了高效的实时任务调度、内存管理和IPC机制,满足工业控制场景对实时性和可靠性的严格要求。想象一下,UniProton就像一个超级聪明的管家,管理着电子设备里所有的工作。让你的智能手表既能显示时间,又能接收消息让家里的扫地机器人既能避开障碍物,又能记住哪里已经打扫过了让工厂里的机器人手臂既能精确地抓取东西,又能快速地完成任务实时性强。

m0_67505153的博客 883

【Linux】进程

本文将详细的介绍Linux环境的进程,与进程状态和进程优先级。

Yui_的博客 2049

《YOLOv8:从入门到实战》报错解决 & 专栏答疑

《YOLOv8:从入门到实战》专栏上线后,部分同学在学习过程中提出了一些问题,笔者相信这些问题其他同学也有可能遇到。为了让大家可以更好地学习本专栏内容,笔者特意推出了该篇专栏答疑,针对同学们在学习过程中所提出的问题进行汇总记录,并不断实时更新,希望能够帮助到大家!🌈

小哥谈 1241

Milvus 向量数据库部署方案全景指南:从单机开发到生产级高可用集群

本文系统介绍了Milvus向量数据库的四大部署方案:嵌入式开发利器Milvus Lite、单机简易部署Standalone模式、生产级高可用Cluster模式以及全托管SaaS服务Zilliz Cloud。针对不同应用场景(开发测试、小型应用、大规模生产环境),详细分析了各模式的适用条件、资源配置要求和部署步骤,并提供了关键配置示例。文章强调正确选择部署方案对系统性能至关重要,帮助开发者根据向量规模、QPS和高可用需求,选择最优部署方式,实现资源优化与稳定运行。

reset2021的博客 385

linux中什么是进程名,Linux进程是什么

进程是 Linux 操作系统中最重要的基本概念之一,这一节我们将了解学习 Linux 进程的一些基础知识。进程是运行在 Linux 中的程序的一个实例。这是一个你之前就可能已经听说过的基本定义。当你在 Linux 系统中执行一个程序时,系统会为这个程序创建特定的环境。这个环境包含系统运行这个程序所需的任何东西。每当你在 Linux 中执行一个命令,它都会创建,或启动一个新的进程。比如,当你尝试运行...

weixin_39551554的博客 2053

YOLO十年演进:从CNN到Transformer再到MoE,我看懂了2026年目标检测的落地风向标

技术永远是为业务服务的,能解决真实问题的技术,才是有价值的。YOLO的十年演进,从CNN到Transformer再到MoE,从来都不是学术上的炫技,而是一步一步解决工业落地的痛点:从让实时检测成为可能,到解决复杂场景的漏检误检,再到打破精度和算力的死局,每一步都踩在了工业落地的真实需求上。很多新入行的朋友,总喜欢追新,今天换Transformer,明天堆MoE,觉得模型越新、参数越大,就越厉害。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 748

<Linux> 进程

进程有关概念、如何创建进程、进程状态、环境变量详解、进程优先级、程序地址空间、如何控制进程以及如何替换进程

weixin_61522065的博客 4302

TIA protal与SCL从入门到精通(4)——软件单元使用

平台: TIA portal 15.1 1.添加软件单元 添加软件单元如下图: 关于软件单元使用基本限制,看如下文章即可 TIA protal与SCL从入门到精通(3)——软件单元基本介绍 每个软件单元是一个独立结构,所以每个软件单元的运行方式与实际PLC类似,所以首先添加主函数块: 注意:无论系统是否是具有并发性(这里不要混淆并行与并发的概念),在PLC所有主函数执行总是按主函数依次完成...

苦走一口田 7375

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

2301_79796701的博客 2707

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【linux 多进程并发】0301 Linux创建后台服务进程,daemon进程,自己的进程可以被一号进程接管啦

通常我们在终端启动程序,该程序的父进程一般是终端进程,这样在终端退出时,会产生像SIGHUG信号发给所有子进程,子进程默认处理是退出。 我们要创建后台服务进程时,必需让进程与终端无关,这就是示例代码中经过一次fork之后,父进程退出,而子进程让systemd接管的真正作用。 本章节代码位于[gitcode](https://gitcode.com/toadb/hatchCode/overview), 路径为: multiProcess/ex02_multiprocess, 有兴趣的同学可以下载测试,当然

一个追逐梦想的码农 3233

深度学习工具包 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")

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Linux进程——Linux下常见的进程状态

在了解Linux中进程的分类时,我们通常是先了解操作系统的进程,因为二者有一定的联系,了解操作系统能更好理解进程在操作系统中的运行关系。进程状态在进程中也极为重要,希望大家能理解透彻!

EterNity_TiMe_的计算机学习之路 2792

【Linux】Linux进程管理

Linux进程管理

Linux小白一只~正处于学习阶段,觉得我写的还好的请多多给我点赞呀,谢谢大家!!(๑>ڡ<)☆ 5213

linux进程

这个文件用来检查内核数据结构的当前状态,通常由GDB调试使用 /proc/kmsg:此文件用来保存由内核输出的信息 /proc/meminfo:系统中关于当前内存的利用状况等的信息,常由free命令使用 /proc/version:当前系统运行的版本号 /proc/sys:与/proc下其他文件的只读属性不同,管理员可对/proc/sys子目录中的徐彤文件内容进行修改以更改内核的运行特性,事先可以使用ls -l查看某文件是否可写入。进程是程序的一次执行过程,动态的,包括创建、调度、执行和消亡。

m0_45148083的博客 1621

Linux进程控制——Linux进程终止

进程终止相对于其他的进程控制来说,是很好理解的。我们主要介绍了进程终止,在明白错误码和退出码之后,相信能理解父进程是怎么得到子进程信息的。让我们期待下一节——进程等待与替换!

EterNity_TiMe_的计算机学习之路 2343

Linux——进程概念

进程概念精析

2302_81486993的博客 3290

linux查找被杀死的进程,linux查找进程和杀死进程

查看进程:ps -ef | grep 检索内容杀死进程:kill pid (进程号)kill -9 pid 强制杀死进程ps命令将某个进程显示出来grep命令是查找中间的|是管道命令 是指ps命令与grep同时执行PS是LINUX下最常用的也是非常强大的进程查看命令grep命令是查找,是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是G...

weixin_34944897的博客 2447

linux 系统master进程,Linux进程监视

由于复刻了 mon 项目到 etbemon 中,我花了一些时间做监视脚本。事实上监视一些事情通常很容易,但是决定监视什么才是困难的部分。进程监视脚本 ps.monitor 是我重新设计过的一个。对于进程监视我有一些思路。如果你对进程监视如何做的更好有任何建议,请通过评论区告诉我。给不使用 mon 的人介绍一下,如果一切 OK 该监视脚本就返回 0,而如果有问题它会返回 1,并使用标准输出显示错误信...

weixin_35598104的博客 2776
上一篇: List的模拟实现(C++)
下一篇: Linux下MiniShell的实现
Romeo  i
博客等级 码龄9年 151粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值