Linux Task 状态变迁

进程的状态以及状态转化图、导致转化的事件 今天又重新复习了一下进程方面的知识 进程的初始状态 进程是通过fork系列的系统调用(fork、clone、vfork)来创建的,内核(或内核模块)也可以通过kernel_thread函数创建内核进程。这些创建子进程的函数本质上都完成了相同的功能——将调用进程复制一份,得到子进程。(可以通过选项参数来决定各种资源是共享、还是私有。)那么既然调用进程处于TASK_RUNNING状态(否则 阅读详情
Linux Task 状态变迁
Linux Task 状态变迁

 

在 Linux 中,通常进程将在下面几种状态之间迁移:

  • 可运行状态和运行状态 
  • 睡眠状态
    • 不可中断的睡眠
    • 仅能被致命信号中断的睡眠
    • 可中断的睡眠
  • 停止态
  • 僵尸态和死亡态

1 可运行状态和运行状态

均用 TASK_RUNNING 表示:

可运行状态

在等待队列上等待调度器调度来获取 CPU 时间片。

运行状态

已经被调度器选中并分配到 CPU 时间片,正在 CPU 上运行。


2 僵尸态和死亡态

在 linux 系统中,资源是以进程为单位分配的,处于僵尸态的进程在父进程回收资源后进入死亡态。

僵尸态 (TASK_DEAD, EXIT_ZOMBIE)

当进程完成执行或终止时,它会向父进程发送 SIGCHLD 信号并进入僵尸状态。如果父进程没有回收僵尸进程,那么这些进程就会一直占用系统资源。

父进程必须使用 wait() 或 waitpid() 系统调用用来获取子进程的退出状态并回收资源。

死亡态 (TASK_DEAD ,EXIT_DEAD)

父进程调用 wait() 或 waitpid() 系统调用获取了子进程的退出状态并将其系统资源释放,子进程进入死亡态。死亡态的进程在进程表中不再存在。

僵尸态是一个过渡状态,表示进程已经结束但是父进程还没有完全释放它,而死亡态状态则是一个最终状态,表示进程已经完全结束并且被释放。

进程回收子进程资源:

int main()
{
    pid_t pid = fork();
    if (pid == 0) {
        // 子进程执行的代码
        return 0;
    }
    else if (pid > 0) {
        // 父进程执行的代码
        std::cout << "Parent process starts\n";
        int status;
        waitpid(pid, &status, 0); // 等待子进程退出,回收其系统资源
        if (WIFEXITED(status)) {
            std::cout << "Child process exited with status: " << WEXITSTATUS(status) << "\n";
        }
        std::cout << "Parent process ends\n";
        return 0;
    }
}

进程回收子线程资源:

void *childThreadFunc(void *arg) {
    // 子线程运行
}

int main() {
    pthread_t childThread;

    pthread_create(&childThread, NULL, childThreadFunc, NULL);

    pthread_join(childThread, NULL); // 等待子线程退出,即使回收它的系统资源

    return 0;
}

注:

如果调用 pthread_detach() 函数可以将子线程设置为 "DETACHED" 状态后,子线程退出时可以自动回收资源,而不需要使用 pthread_join() 函数等待线程退出。

非 "DETACHED" 状态子线程退出时,即使进程没有调用 pthread_join() 回收其资源,其占用的资源将在进程退出后,在回收其资源时统一回收,但是会导致资源回收不及时。

如果父进程提前子进程退出呢?子进程将变成孤儿进程,由 init 进程统一回收孤儿进程的资源。


3 停止态

TASK_STOPPED

处于可运行状态或运行状态的 task,可以使用 SIGSTOP 或 SIGTSTP 信号将 task 置于停止状态 (T),这两个信号的区别:

  • SIGSTOP :强制停止 task 的信号,该 task 不能忽略此信号并将进入停止状态。
  • SIGTSTP :也是停止进程的信号,但 task 可以通过信号处理程序来忽略该信号。

在这种状态下,可以通过发送 SIGCONT 信号使进程恢复到可运行状态或运行状态。


4 休眠状态        

Linux Task 有三种休眠状态,主要区别在于唤醒的方法,包括:

TASK_INTERRUPTIBLE

将其唤醒再次运行的方法有两种:

  • 显式唤醒
  • 收到非屏蔽信号

比如 mutex_lock_interruptible() 申请互斥锁失败会导致进程进入该状态。

TASK_UNINTERRUPTIBLE

将其唤醒再次运行的方法只有一种:

  • 会忽略所有信号,只能显式唤醒

比如等待 IO 资源或 mutex_lock() 申请互斥锁失败会导致进程进入该状态。

TASK_KILLABLE 

将其唤醒再次运行的方法有两种:

  • 显式唤醒它
  • 致命信号(fatal signals)

比如 mutex_lock_killable() 申请互斥锁失败会导致进程进入该状态。

4.1 为什么存在 TASK_KILLABLE?

TASK_KILLABLE [LWN.net]

//include/linux/sched.h
#define TASK_KILLABLE            (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)

TASK_INTERRUPTIBLE 和 TASK_UNINTERRUPTIBLE 睡眠方式都有优点和缺点。

TASK_INTERRUPTIBLE 状态的 Task

优点:

可以更快地响应信号。

缺点:

它使编程更加困难。 使用可中断睡眠的内核代码必须始终检查它是否因信号而醒来:

  1. 如果是,则清理它正在做的任何事情并将 -EINTR 返回给用户空间;
  2. 用户空间端也必须意识到系统调用被中断并做出相应的响应;但是并非所有用户空间程序员都以会认真和正确的处理 -EINTR 信号;

TASK_UNINTERRUPTIBLE 状态的 Task

优点:

使睡眠不可中断可以消除​​“可中断休眠”带来的这些问题,它会忽略所有信号,不会将错误的处理抛到用户空间。

缺点:

代价是不可中断。如果预期的唤醒事件没有出现,该过程将永远等待,并且除了重新启动系统之外,通常没有任何人可以对此做任何事情。这是可怕的、无法杀死的进程的根源,它被 ps 显示为处于“D”状态。

考虑到不可终止进程的高度令人讨厌的性质,人们会认为应该尽可能使用可中断睡眠。这个想法的问题在于,在许多情况下,引入可中断睡眠很可能会导致应用程序错误。正如 Alan Cox 最近指出的那样:

Unix 传统(因此几乎所有应用程序)认为文件存储写入是非信号中断的。更改该保证既不安全也不切实际。

Matthew Wilcox 意识到,如果应用程序无论如何都将被终止,那么许多关于应用程序错误的担忧并不适用。如果系统调用注定永远不会返回到用户空间,开发人员是否考虑过系统调用中断的可能性并不重要。所以Matthew创建了一个新的休眠状态,叫做TASK_KILLABLE;它的行为类似于 TASK_UNINTERRUPTIBLE,除了致命信号(fatal signals)会中断睡眠。

TASK_KILLABLE 带来了一组新的原语,用于等待事件和获取锁:

int wait_event_killable(wait_queue_t queue, condition);
long schedule_timeout_killable(signed long timeout);
int mutex_lock_killable(struct mutex *lock);
int wait_for_completion_killable(struct completion *comp);
int down_killable(struct semaphore *sem);

对于这些函数中的每一个,正常、成功返回的返回值将为零,或者在出现致命信号的情况下为负错误代码。在后一种情况下,内核代码应该清理并返回,使进程能够被终止。

TASK_KILLABLE 补丁已为 2.6.25 内核合并,但这并不意味着无法杀死的进程问题已经消失。内核中(从 2.6.26-rc8 开始)实际使用这种新状态的地方数量非常少——例如,人们不必担心在数手指时会用完手指。 NFS 客户端代码已经转换,这只能是一个可喜的发展。但是 TASK_KILLABLE 的其他用途很少,而且在设备驱动程序中根本没有,这通常是进程陷入困境的地方。

新的 API 在内核中得到广泛使用可能需要一些时间,尤其是当它补充了大多数情况下运行良好的现有功能时。此外,将现有代码大量转换为可终止睡眠的好处并不完全清楚。但几乎可以肯定,内核中的某些地方可以通过此更改得到改进,前提是用户和开发人员能够识别进程挂起(hung)的位置。在新代码中使用 killable sleep 也是有意义的,除非有一些紧迫的理由完全禁止中断。

关于更多 TASK_KILLABLE 的介绍:

宋宝华: 聊一聊进程深度睡眠的TASK_KILLABLE这个状态 - 腾讯云开发者社区-腾讯云

linux源码剖析 | 进程(task)数据结构 上 目录任务 ID信号处理任务状态进程调度标题写进程主要是为了引流吧。在 Linux 里面,无论是进程,还是线程,到了内核里面,我们统一都叫任务(Task)。由一个统一的结构 task_struct 进行管理。 Linux 内核有一个链表,将所有的 task_struct 串起来。struct list_head tasks;task_struct 里面涉及任务 ID:pid 是 process idtgid 是 thread group ID。如果只有主线程: pid 是自己,tgid 是自己,grou 阅读详情

相关推荐

进程概念【Linux】 【进程基本概念】【PCB-进程控制块】【查看进程】【fork初始】【进程状态】【僵尸进程及其危害】【孤儿进程】

进程运行在操作系统上叫运行,在Linux内核叫运行状态R。进程终止在操作系统上叫终止,在Linux内核叫僵尸状态Z和死亡状态X。进程阻塞在操作系统上叫阻塞,在Linux内核叫浅度睡眠状态S和深度睡眠状态D。进程挂起在操作系统上叫挂起,在Linux内核叫S、D、T。

weixin_62850079的博客 1753

Linux0.11内核--进程的调度(运行态(就绪态)和睡眠态之间的转换)

当进程等待资源或者事件时,就进入睡眠状态。有两种睡眠态,不可中断睡眠态(TASK_UNINTERRUPTIBLE)和可中断睡眠态(TASK_INTERRUPTIBLE)。 处于可中断睡眠态的进程不光可以由wake_up直接唤醒,还可以由信号唤醒。在schedule()函数中,会把处于可中断睡眠态并且收到信号的进程变成运行态,使他参与调度选择。Linux0.11中进入可中断睡眠状态的方法有3中 调用interruptible_sleep_on()函数 调用sys_pause(...

weixin_55255438的博客 4840

Linux线程阻塞、加入(join)与分离(detach)编程

线程加入可以实现线程之间的同步和协作,并获取线程的返回值。线程分离可以将线程的执行和资源回收交给系统自动处理,不需要其他线程显式地调用线程加入操作。线程分离是指将一个线程的执行和资源回收交给系统自动处理,不需要其他线程显式地调用线程加入操作。在Linux中,我们可以使用线程的阻塞来等待其他线程完成某些任务或者等待某些事件的发生。线程加入是指一个线程等待另一个线程的完成,并获取其返回值。通过线程加入操作,我们可以实现线程之间的同步和协作。在上面的示例中,我们传递了一个整数值给子线程,并在子线程中修改了该值。

DevProZ的博客 219

linux内核task的5种状态,Linux内核调试技术——进程D状态死锁检测

Linux的进程存在多种状态,如TASK_RUNNING的运行态、EXIT_DEAD的停止态和TASK_INTERRUPTIBLE的接收信号的等待状态等等(可在include/linux/sched.h中查看)。其中有一种状态等待为TASK_UNINTERRUPTIBLE,称为D状态,该种状态下进程不接收信号,只能通过wake_up唤醒。处于这种状态的情况有很多,例如mutex锁就可能会设置进程于...

weixin_39844963的博客 978

Arnold Denoise流程

参考:https://support.solidangle.com/display/ARP/Removing+Noise+Workflow Arnold生来不是一个以单帧渲染速度见长的渲染器,但这并不能作为一个简单场景渲染时间长达几个小时的借口。 个人认为高品质生产级渲染结果中,Unbiased renderer在渲染时最耗计算时间的其实就是降噪,以至于降噪专门成了一门灯光师必备的技术

机器猫的CG空间 5084

从零开始训练一个简单的CLIP

到这里,你已经基本了解了CLIP的基本原理,并且能够自己动手训练一个简单的CLIP模型。整体上来看,代码比较简单,但是已经基本覆盖到CLIP的整体训练流程了。另外,如果需要实际的落地,建议还是使用openclip等更加成熟的框架。欢迎关注github:https://github.com/taishan1994。

u012374012的专栏 2911

Linux进程管理知识整理

Linux进程管理知识整理 1、进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些? TASK_RUNNING(可运行状态) TASK_INTERRUPTIBLE(可中断等待状态) TASK_UNINTERRUPTIBLE(不可中断等待状态) TASK_STOPPED(进程被其它进程设置为暂停状态) ...

weixin_30613727的博客 286

Matlab2018a崩溃解决的办法No sandbox or build area path

Matlab 2018a (No sandbox or build area path)出现崩溃后需要使用terminal进行如下操作: cd /home/david/MySoft/MATLAB/R2018a/bin/glnxa64 (你的matlab路径) mkdir exclude mv libfreetype* exclude/ 执行后图片如下: 如果你用的Windows系统,请手动按照上面步骤剔除了dll。 Matlab 2018a (No sandbox or build are

David Xiao 1万+

Linux进程控制开发基础——Linux进程状态/fork()/waitpid()/wait()详解

第一部分 Linux进程概述        在Linux下进程被创建后可以有5种状态。 关于Linux进程状态不再赘述,参考下面这2个博客链接即可 Linux进程简介及五种状态 Linux状态详解 不过有一些值得补充的说明: 很多操作系统教科书将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度...

尧fighting的博客 911

【Android】条形码/二维码扫描——ZXing源码分析

正在更新中 针对3.2.1版本源码 与其他版本代码可能会有出入,但核心思想基本不变。 首先从com.google.zxing.client.android包中的目录结构分析:Book:这个文件夹中有5个类: BrowseBookListener 实现了adapter的点击事项响应,通过获取ISBN,然后跳转到Google books中查询响应的详细信息。 SearchBookContents

年轻的学徒 2453

我用WorkBuddy“克隆“了一个我,从此每句话像我自己说的

各位,做这件事花了多长时间?准备样本可能要半小时,提炼风格十分钟,保存固化再花十分钟。加起来不到一个小时。但这一个小时之后呢?你就拥有了一个"永远在线的文字替身"。以后写口播稿,打开WorkBuddy跟它说;写课程逐字稿,跟它说;写公众号文章,也跟它说。写出来的东西,你的学员一看——“嘿,这不就是翟猛老师说的嘛。说到这儿,可能有人会问:老师,我的风格有那么重要吗?AI写的不都挺好的吗?各位你想想看,你为什么愿意听某个老师的课?不只是因为他讲的内容好,更是因为你喜欢他讲话的方式。

weixin_39284145的博客 819

进程的终止方式和进程的状态

进程的终止方式: 有8种方式使进程终止,其中前5种为正常终止,它们是 1:从 main 返回 2:调用 exit 3:调用 _exit 或 _Exit 4:最后一个线程从其启动例程返回 5:最后一个线程调用pthread_exit 异常终止有3种,它们是 6:调用 abort 7:接到一个信号并终止 8:最后一个线程对取消请求做出响应 Linux进程状态:R (TASK_RU...

6331

【文献阅读】使用深度语音后验改进独立于说话者的构音障碍可懂度分类

原文名称:本文探讨了利用DeepSpeech后验概率改进说话人无关的构音障碍可理解性分类方法。作者提出了一个基于DeepSpeech(一种端到端的语音转文本引擎)输出的新特征集,用于评估构音障碍患者的语音可理解性。这些新特征在说话人无关的情况下表现良好,能够更好地处理不同说话人的变异性。背景介绍:数据集:特征提取:实验设置:结果:本文提出的新特征集在说话人无关的构音障碍可理解性分类任务中表现出色,特别是在低可理解性和高可理解性类别上。未来的工作将集中在减少低可理解性和中可理解性类别之间的混淆,以进一步提高系

帅小柏的博客 452

Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)

转自:http://blog.youkuaiyun.com/gatieme/article/details/51383272   日期内核版本架构作者GitHub优快云 2016-05-12 Linux-4.5 X86 &amp; arm gatieme LinuxDeviceDrivers Linux-进程管理与调度 进程是处于执行期的程序以及它所...

weixin_33757609的博客 167

122、Android Camera HAL3 框架:Request、Result、Metadata 的异步管道模型

本文深入剖析了Android Camera HAL3框架中的异步管道模型,围绕Request、Result和Metadata三个核心要素展开。作者通过实际案例(黑屏闪退问题)切入,揭示了异步模型中常见的帧序错乱陷阱。文章详细阐释了三个角色的交互机制,指出HAL3采用生产者-消费者模式的关键特征:Request与Result一一对应但不保证顺序。针对开发实践,总结了三个必须加锁的场景和回调函数的锁使用禁忌,并给出解决帧序问题的具体方案(独立帧号生成器)。最后提出五项经验性建议,强调异步模型带来的灵活性与复杂性

sundong_81的博客 213

「HTML和CSS入门指南」hr 标签详解

标签是 HTML5 中用于插入水平分割线的标签,常用于在页面中添加分隔线或者段落之间的分割线。通过灵活运用 标签和属性,我们可以帮助用户更好地理解页面内容,同时也可以美化和装饰页面。在实际应用中需要注意避免过度使用 标签,以使页面看起来简洁明了。

a451319296的博客 7661

【Linux】进程状态

讲解 Linux 中进程状态!

L_0907的博客 939

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

查linux有哪些task_Linux进程的状态以及如何查看

.linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态。Linux进程状态:R(TASK_RUNNING),可执行状态。只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进...

weixin_39917718的博客 787

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

linux 进程状态浅析 可执行 不可中断的睡眠 暂停 僵尸进程 退出 进程状态变迁 进程的初始

粉丝不过W 众所周知,现在的分时操作系统能够在一个 CPU 上运行多个程序,让这些程序表面上看起来是在同时运行的 在 linux 系统中,每个被运行的程序实例对应一个或多个进程 linux 内核需要对这些进程进行管理,以使它们在系统中“同时”运行 linux 内核对进...

记录点点滴滴 3339

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

[Linux操作系统]操作系统中关于进程PCB的那些知识

1. 冯诺依曼 1.1 五部分组成 1.2 以二进制形式存在 1.3 自动从存储器中取出命令并执行 1.4 执行指令的过程 2. 进程 PCB 2.1 进程 进程:是程序进行运行后所产生的。 查看进程 进程是操作系统粉配资源的基本单位,也是分配资源的最小单位 每个进程有自己独立的地址空间和运行状态 进程中一个重要的练习: int main(){ const int a =10; int* p=(int*)&a; *p=11; printf("p =%d,a=%d\

藏宝大厦 1513

Linux进程状态

进程状态 在linux下,通过ps命令我们能够查看到系统中存在的进程,以及它们的状态: R (TASK_RUNNING),可执行状态。 只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器的任务就是从各个CPU的

张勤一 2131

Linux进程调度原理

转载自:http://www.cnblogs.com/zhaoyl/archive/2012/09/04/2671156.html     Linux进程优先级   进程提供了两种优先级,一种是普通的进程优先级,第二个是实时优先级。前者适用SCHED_NORMAL调度策略,后者可选SCHED_FIFO或SCHED_RR调度策略。任何时候,实时进程的优先级都高于普通进程,实...

cool grass's blog 244

Linux进程状态(ps stat)之R、S、D、T、Z、X

一、进程的状态表述:#define TASK_RUNNING 0#define TASK_INTERRUPTIBLE 1#define TASK_UNINTERRUPTIBLE 2#define TASK_STOPPED 4#define TASK_TRACED 8/* in tsk->exit_state */#define EXIT_ZOMBIE 16#d

学海无涯,回头是岸........ 8185

Linux进程状态和转换分析

转载https://blog.youkuaiyun.com/shenwansangz/article/details/51981459 Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态。 Linux进程状态:R (TASK_RUNNING),可执行状态。 只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可...

weixin_38812277的博客 441

Linux进程状态解析 之 R、S、D、T、Z、X

Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态。 Linux进程状态:R (TASK_RUNNING),可执行状态。 只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行...

造梦先森Kai的专栏 3722

Linux 0.11 进程状态变迁的日志追踪与性能分析实践

本文通过动手实践,详细介绍了如何在Linux 0.11内核中插入日志代码,以追踪和记录进程从创建、就绪、运行、阻塞到退出的完整运行轨迹。通过分析生成的日志数据,可以直观理解进程状态变迁,并定量分析不同时间片设置对系统吞吐率等性能指标的影响,将抽象的操作系统原理具象化。

weixin_29276847的博客 213
上一篇: 在内核态Block Layer访问块设备
zs.w
博客等级 码龄4年 133粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zs.w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值