linux操作系统-3进程管理(2)

LINUX系统进程管理 进程是计算机系统中最重要的概念之一,在计算机系统中并行运行着大量的程序,这些程序不可能独占系统的全部资源,而是需要这些程序共享系统资源,所以这些程序在运行时会产生一定的竞争关系。那在这种情况下,系统资源怎么分配?运行程序该如何管理呢?操作系统为了解决这一系列的问题引入了进程的概念,用来作为操作系统分配和管理系统资源的基本单位。所以进程的出现是为了让系统资源的利用更加合理,从而提高系统的运行效率。定义进程,就避免不了提到另一个概念“程序”。 阅读详情

进程调度

进程调度必须防止进程饿死,即低优先级的进程始终得不到运行。

1)进程的切换

来实现多个进程共享CPU。另外,当进程需要睡眠时,也必须切换进程。进程的切换主要包括几个内容:

1、硬件上下文的切换,主要是寄存器,包括控制寄存器和通用寄存器。

2、任务状态段的切换

i386提供的一种数据结构。为了简化设计,linux内核实现了每一个逻辑CPU一个任务状态段。内核的堆栈地址是保存在任务状态段里,当从用户空间向内核切换时,硬件自动从任务状态段中取出内核堆栈地址并初始化堆栈指针寄存器。另一方面,不同的进程使用不同内核堆栈,所以当进程切换时,必须切换任务状态段中的堆栈指针。

3、内核堆栈

进程的切换一定是发生在内核状态下,必须切换内核堆栈指针寄存器,是用软件的方法实现的,linux内核定义一个宏,switch_to,实现内核堆栈指针寄存器的切换。保存当前的堆栈指针寄存器内容,把下一个进程的堆栈指针取出并复制到堆栈指针寄存器。

4)浮点数寄存器

内核在三种情况下会保存浮点数寄存器:任务切换、处理信号、内核自己需要使用浮点数寄存器。

2)进程的调度策略

LINUX进程调度采用策略来区分进程。定义了几种进程:实时进程、交互式进程、批处理进程。在task_struct中定义了policy字段,指定该进程的调度策略。

Policy可以等于4个值:

SCHED_NORMAL 基于时间片机制。进程具体可以表现为交互式进程或批处理进程。

SCHED_FIFO 先进先出的实时进程。

SCHED_RR 循环执行的实时进程。

SCHED_BATCH 批处理进程。

调度策略只是比较大概的进程分类,实际调度时必须映射到调度的优先级。LINUX定义了140个优先级。0优先级最高,139最低。总是实时进程优先运行。只有当没有处于运行状态的实时进程时,交互式进程和批处理进程才可以得到调度。

时间片是进程实际被分配到的运行时间,以tick作为单位。时钟中断每发生一次,算作一个tick。每当中断发生时,内核就在当前进程的时间片里减1.如果时间片变成了1,内核就重新调度进程。实际要复杂多了。

实进程包括FIFO和RR两种。FIFO先进先出,当一个FIFO运行时,如果没有比它优先级更高的进程可以运行,即使FIFO进程时间片运行完也不会让CPU,而是再获得一个新的时间片。RR是循环调度运行的进程,运行完时间片后,需要向同一优先级的其他RR进程让出CPU。

交互式进程和批处理进程的优先级是动态变化的。内核用一个公式计算出进程新的优先级。公式输入参数是进程的静态优先级和最近的过去进程睡眠时间。

3)进程调度的触发和进程切换时机

进程调度的核心任务由函数schedule处理,主要是选择并切换到下一个合适的进程。在内核里,函数scheduler_tick处理由时钟中断触发的调度,是当前进程打标记TIF_NEED_RESCHED.一定要当进程进入合适的时候,就是已经释放了共享资源后并处于安全的时候,才可以调用函数schedule做真正的进程调度,否则可能会导致系统的死锁。

函数try_to_wake_up用于唤醒处理。唤醒优先级高的进程,并且需要在当前CPU运行,就会设置当前进程的TIF_NEED_RESCHED标志位。另外,创建新的进程和exec时都可能引发进程的调度。

4)运行队列

运行队列runqueue是内核支持调度的重要数据结构。每一个逻辑CPU有一个运行队列,减少CPU之间的竞争。

5)调度域

一般调度时只是从CPU自己的运行队列选择一个要运行的进程,必然会出现CPU资源利用不平衡,资源浪费。当一个CPU的运行队列比较短时,内核就要向其他CPU的运行队列查询,如果其他的CPU运行队列比自己的长,内核会把一些进程从其他CPU运行队列里摘除,然后加入到自己的运行队列,叫做CPU负载平衡。

SMP对称多处理机:每一个CPU有自己独立的cache、寄存器和运算单元。

cache设计原理是基于访问的局部性原理,包括时间局部性原理和空间局部性原理。时间局部性原理是指CPU刚访问过的数据,在不久的将来还会访问到;空间局部性原理是指CPU访问了某一数据后,很可能会访问这一数据空间上相邻的数据。cache存放的是内存映像,或者被CPU修改过的数据,以后刷新到内存。

在做CPU负载平衡时,主要的出发点时当进程被移动到另一个CPU的运行队列后,该进程的运行效率不能降低。主要因素就是cache,或者说访问数据的速度。根据访问cache和内存的速度,内核把逻辑CPU划分成组。首先是分成几个很小的组,然后几个小组构成大组,几个大组又可以构成更大的组,最后一个最大的组包含所有的CPU,这样一个逻辑CPU同时属于一个小组,中组,大组,最后一个最大的组,这种分组的设计思想称作调度域。

具体实现上,一个运行队列有一个调度域链表,每个调度域包含几个调度组,调度组用双向链表连接在一起。

6)抢占

preempt_disable()禁止抢占

preempt_enable()打开抢占

spin_lock()会间接使用禁止函数,所以这样的函数执行时,禁止抢占。

kernel态抢占和用户态抢占

7)调度的时间复杂度 O(1)

3.5并发控制原理

1、阻塞操作 当系统需要访问某些资源时,可能需要阻塞进程等待资源状态,在这种情况下,某些资源可能需要加锁保护,以防止阻塞进程被唤醒以前,资源的状态被破坏。

2、中断 在内核里设置一些可抢占点,把一些关键的程序片段标志成不可抢占。在这些程序片段里可以安全的操作内核数据结构而不必担心被切换到其他进程。

1)原子操作

在很多体系结构下,原子操作需要锁总线和刷洗处理器的流水线,所以原子操作相对于普通的操作通常开销还是要更大一些。

2)自旋锁(转载)

跟互斥锁一样,一个执行单元要想访问被自旋锁保护的共享资源,必须先得到锁,在访问完共享资源后,必须释放锁。如果在获取自旋锁时,没有任何执行单元保持该锁,那么将立即得到锁;如果在获取自旋锁时锁已经有保持者,那么获取锁操作将自旋在那里,直到该自旋锁的保持者释放了锁。自旋锁是一种比较低级的保护数据结构或代码片段的原始方式,这种锁可能存在两个问题:
死锁。试图递归地获得自旋锁必然会引起死锁:递归程序的持有实例在第二个实例循环,以试图获得相同自旋锁时,不会释放此自旋锁。在递归程序中使用自旋锁应遵守下列策略:递归程序决不能在持有自旋锁时调用它自己,也决不能在递归调用时试图获得相同的自旋锁。此外如果一个进程已经将资源锁定,那么,即使其它申请这个资源的进程不停地疯狂“自旋”,也无法获得资源,从而进入死循环。
过多占用cpu资源。如果不加限制,由于申请者一直在循环等待,因此自旋锁在锁定的时候,如果不成功,不会睡眠,会持续的尝试,单cpu的时候自旋锁会让其它process动不了. 因此,一般自旋锁实现会有一个参数限定最多持续尝试次数. 超出后, 自旋锁放弃当前time slice. 等下一次机会。
自旋锁(spinlock)是一种轻量级的同步原语,它的获得或等待只需要很少的指令并不需要发生上下文切换。

3)信号量

生产者-消费者问题

变量的操作必须使用特殊的原子操作来完成,即P操作和V操作。P操作是对信号量进行减少,V操作是对信号量进行增加。

信号量的数值(即缓冲区中元素的个数)是不可能为负数的,所以当信号量为0时,P操作就会自动进入睡眠状态,直到随后的V操作将它唤醒为止。V操作在任何时候都不会进入到睡眠状态,原因是信号量的数值可以表示为足够大,相当于一个无界缓冲区。在LINUX中P、V操作对应为DOWN和UP操作。

6)尝试加锁(try_lock)

系统在试图操作关键数据结构的时候先测试是否能够获得保护这个数据结构的原语,如果不能,系统将转到其他执行路径。

3同步原语

原语是由若干条指令组成的,用于完成一定功能的一个过程。由若干个机器指令构成的完成某种特定功能的一段程序,具有不可分割性·即原语的执行必须是连续的,在执行过程中不允许被中断。

同步原语一般是用来保护数据和资源的,所以在设计同步原语的时候一般把它附在被保护的数据结构上,如果这个功能可以使用原子操作实现,应该优先使用原子操作;占用时间不长的一些数据结构操作,例如链表插入,可以用自旋锁或者读写锁来保护;占用时间较长的,或者需要阻塞等待外部资源的,可以使用信号量;还要注意对有些可能被中断处理程序修改的数据结构的操作需要关中断来保护(local_irq_disable()和local_irq_enable()),通过设置CPU寄存器来阻塞中断,当开中断时,被阻塞的中断会重新到达,不会丢失。

比较常用的原子操作原语有atomaic_read、atomaic_set、atomic_add、atomic_sub、atomic_add_and_test、atomic_sub_and_test等。内核利用它们来处理简单数据或者利用它们来构造更复杂的同步原语。

在内核获得自旋锁、读写锁、关中断时,内核抢占是被关掉的。

信号量

信号量的实现前提是原子操作。由于信号量需要维护一个计数器来记录信号量的数值以及一些其他需要保护的数据,所以必须使用原子操作来保护他们。在LINUX内核中,信号量关键数据的保护是借助自旋锁来完成的。

互斥锁(mutex)是一种新的数据结构,是一个信号量的特例,数值仅为0或1。

内核中提供互斥锁的原子操作:mutex_init()、mutex_lock()和mutex_unlock()。

mutex_init()是初始化struct mutex结构,count初始值为1,表示解锁状态。

高级操作系统——XV6进程管理 源代码阅读: type.h:用于声明一些数据类型的简化名称,和声明页表指针的数据类型。 param.h:主要用于声明基本的一些常量,包括内核栈大小等。 memlayout.h:主要用于声明一些和内存与地址相关的常量与方法,包括虚拟内存转物理内存的方法以及物理内存转虚拟内存的方法等。 defs.h:声明在之后文件中要用到的函数。 x86.h:让c代码使用特殊的x86汇编的一些函数包括outb等,并声... 阅读详情

相关推荐

【操作系统】【完整实验报告】实验一:熟悉Linux操作系统(进程观测)

实验一:熟悉Linux操作系统(进程观测) 实验目的: (1)了解在Linux操作系统中进程的特点和表现形式 【特点:并发性,结构性,动态性,独立性】 (2)掌握Linux查看进程的方式与方法 【打开其它一个终端窗口,直接输入TOP命令】 (3)在一个进程中创建另一个进程的方法 【fork函数】 (4)掌握父进程和子进程的关系和fork的用法 【复制父进程的数据段和堆栈等用户空间信息,共享父进程的...

Antelope的博客 8640

详解数仓的网络调度与隔离管控能力

GaussDB目前采用的FIFO调度机制,该调度机制无法满足用户的网络隔离需求和QoS需求,同时FIFO调度可能带来比较严重的抖动。

华为云官方博客 1046

操作系统实验三:进程管理

一、实验要求 (1)掌握操作系统中进程的基本概念; (2)掌握 Linux操作系统进程管理基本方法; (3)了解进程并发运行的过程。 二、实验内容 (1)验证实验: ① 启动vi编辑器,并将其调入后台,再调出前台,最后退出vi; ② 启动vi编辑器,并将其调入后台,再将该作业杀死; ③ 启动两个vi编辑器,均调入后台后,查看当前有那些作业正在执行; ④ 列出你在当前系统中的所有进程。指出你在该系统中最早启动的进程是那个,在什么时候启动? ⑤ 列出当前系统中占用CPU时间比例最高的进程; ⑥ 系统内核的进程中

蓝多多的小仓库 8586

linux进程管理二

文章目录本章节目标控制作业作业与会话作业分类在后台运行作业进程间的通信使用信号控制进程监控进程活动IO负载实时进程监控 本章节目标 控制作业 进程间的通信 使用信号控制进程 监控进程活动 控制作业 作业与会话 作业控制是shell的一种功能,它允许单个shell实例运行和管理多个命令。 作业与在shell提示符中输入的每个管道相关联。该管道中的所有进程均是作业的一部分,并且是同一个...

mylovewxl 884

锁定放大器

锁定放大器

qq_46757048的博客 4706

微信小程序内容安全审核:从API调用到工程化落地的全流程实践

内容安全是互联网应用开发中的基础性技术环节,尤其在用户生成内容(UGC)场景下,它直接关系到平台的合规性与用户体验。其核心原理通常结合了关键词过滤、自然语言处理(NLP)和计算机视觉(CV)等技术,通过AI模型对文本、图像、音频进行多维度风险识别。这项技术的价值在于,它不仅是满足监管要求的必要手段,更是构建健康社区生态、保护品牌声誉、实现产品长期稳定运营的基石,广泛应用于社交、电商、社区论坛等各类UGC平台。本文聚焦于微信小程序生态,深入剖析其官方提供的内容安全解决方案,详细解读如何将文本同步检测与多媒体异

weixin_28622215的博客 452

Linux进程管理(二)

文章目录fg:将后台命令调至前台bg:使后台命令重新运行kill %:杀死作业kill -l:显示所有可用信号指定一个信号:kill -9(数字标识)信号完整名称kill -sigkill信号简写名称kill -kill非管理员用户只能杀死自己的进程killall杀死该程序的所有进程查看cpu核心数top用于实现全屏动态显示系统信息 fg:将后台命令调至前台 [root@localhost ~]#...

hzw199788的博客 698

STM32使用内部RC振荡器作为系统时钟开发项目--内晶振启动模板工程

STM32使用内部RC振荡器时,OSC32_IN,OSC32_OUT接法: 1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。 2)对于少于100脚的产品,有2种接法:    2.1)OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能。    2.2)分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出

overflyme的博客 1万+

《操作系统》第五章习题加解析(重点学习内容)

《操作系统》习题

qq_57531804的博客 1万+

优惠券管理

(请设计一个优惠券兑换码生成方案,可以支持20亿以上的唯一兑换码,兑换码长度不超过10,只能包含字母数字,并且要保证生成和校验算法的高效)最后把签名值的后14位、新鲜值(4位)、自增序列(32位)拼接,得到一个50位二进制数,然后与一个较大的质数做异或运算加以混淆,再基于Base32或Base64转码,即可的对兑换码。现在,就剩下防止爆刷了。自增id从1增加到Integer的最大值,可以达到40亿以上个数字,而占用的字节仅仅4个字节,也就是32个bit位,距离50个bit位的限制还有很大的剩余,符合要求!

qq_36312661的博客 2204

【python科研数据处理】将Endnote自动搜索的所有pdf文件,全都移动指定文件夹中

将Endnote自动搜索到的全部pdf文件,全都移动指定文件夹中1 背景2 问题解决 手动反爬虫,禁止转载:原博地址 https://blog.youkuaiyun.com/lys_828/article/details/122370892(优快云博主:Be_melting) 知识梳理不易,请尊重劳动成果,文章仅发布在优快云网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息 1 背景 在进行期末考试周后,面对最后一门功课,需要提交至少80篇SCI参考文献,因此最快下载文献的方式就是通过Web of S

lys_828的博客 1826

Linux 进程管理(二)

Linux中的进程管理Linux进程概述进程实体的组成Linux进程由3部分组成:正文段、用户数据段和系统数据段图见附件进程的状态进程是一个动态的概念,在其运行的整个生命周期中可根据具体情况不断改变其状态。Linux进程主要有如下几种状态。(1)运行状态(task_running)(2)等待状态(3)暂停状态(task_stopping)(4)僵死状态(task_zombie)图见附件 

xp55699312的专栏 531

基于POD和神经网络的多工况温度场重构反演系统

本文提出了一种基于本征正交分解(POD)和神经网络的多工况温度场重构反演系统。该系统通过POD方法从多工况温度场数据中提取主要特征模态,构建神经网络模型建立工况参数与POD模态系数的映射关系,实现温度场的快速重构。系统采用Python实现,包含数据预处理、POD分解、神经网络训练和温度场重构等模块。实验结果表明,该方法能够有效降低计算复杂度,实现高精度的温度场预测。

huanghm88的专栏 276

Linux kernel遨游之起始篇

前言  首先感谢陈老师把我们带入Linux的迷人世界!  虽然很早之前就接触Linux,而真正去了解Linux还是在上过陈老师的《Linux操作系统分析》课程之后,并且非常受益于陈老师严谨的治学态度和对我们的严格要求。因为去年奔波忙碌于本课程还有CSAPP、Algorithm&Discrete Mathematics的课程实验,对知识体系并没有很好的总结和梳理。现在来写这篇也算是对去年课程

windz_g的专栏 504

使用ChatGPT工具阅读文献的实战教程

本文介绍核心内容为使用ChatGPT工具阅读文献,希望对学习和使用ChatGPT的同学们有所帮助。为了兼顾质量和速度,本专栏的更新频率为一周一到两更。 文章目录 1. 前言 2. 实战教程 2.1 下载工具并登录 2.2 提取文献中的关键信息

herosunly的博客 15万+

【笔试真题】- 华子-2025.12.17-研发岗

难度:中等难度:中等偏难难度:中等K小姐是一名服务器运维工程师,她负责监控公司服务器的访问日志。服务器采用指数退避策略来优化访问频率,每次重试的时间间隔会按照某种规律增长。经过一段时间的监控,K小姐记录了 nnn 个访问时间点,第 iii 个时间点的值为 a[i]a[i]a[i](可能有重复)。现在,她想分析这些访问时间点是否符合某种特定的模式。具体来说,对于给定的参数对 (x,y)(x, y)(x,y),她想知道:有多少个访问时间点 a[i]a[i]a[i] 满足 a[i]=xK+ya[i] = x^K

春秋招笔试突围 186

linux进程的高级管理,Linux高级程序设计(第2版) PDF扫描版[94MB]

Linux高级程序设计(第2版)以Linux操作系统(内核为2.6版本)为开发平台、GCC 4.0/GDB 6.3为开发调试环境,详细介绍了Linux系统下编程环境及编程工具、文件管理(文件类型、ANSI以及POSIX标准下文件读写操作)、进程管理(创建、退出、执行、等待、属性控制)、进程间通信(管道、消息队列、共享内存)、进程间同步机制(信号量)、进程间异步机制(信号)、线程管理(创建、退出、取...

weixin_39914049的博客 289

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

第7章 现代操作系统

2-1 ext2/ext3文件系统的实现机理,采用的是_____。 (1分) A. contiguous allocation B. linked allocation C. indexed allocation D. 一种B和C的组合 2-2 ext3属于日志文件系统(journaling file system)。这种日志文件系统的好处是____。 (1分) A. 管道支持早期流行的软盘文件系统VFAT B. 在/etc/filesystems统一维护了管理信息 C.

大家一起入坑 2364

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

校招中的“熟悉linux操作系统”一般是指达到什么程度?

摘要:校招中"熟悉Linux"的要求因公司和岗位而异,主要分为5个层级(L0-L5)。互联网大厂通常要求L2-L3水平,包括熟练使用命令、排查问题、理解系统原理和编写脚本。面试常考Top20知识点,如进程管理、性能排查、文件系统等。建议校招生重点掌握常用命令和问题排查能力,目标达到"能独立解决80%常见问题"的水平。L2基础需1-2周,L3进阶需1-2个月系统学习。当前校招市场,掌握前12项核心技能即可满足多数面试要求。

m0_57545130的博客 488

深度学习工具包 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&#39;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(&#39;DeepLearnToolbox&#39;));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(&#39;state&#39;,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&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,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 = &#39;sigm&#39;;%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, &#39;Too big error&#39;);```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(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;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)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;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, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% 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&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 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, &#39;Too big error&#39;);```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(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % 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, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);%% 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(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

熟悉 Linux 系统结构,推开Linux 大门

Linux 系统一般有 4 个主要部分: 内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。部分层次结构如图1-1所示。 一、linux内核 内核是操作系统的核心,具有很多最基本功能,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。 Linux 内核由如下几部分组成:内存管理、进程管理、设备驱动程序、文件系统和网络管理等。如图: 图1 系统...

XMWS-IT 326

操作系统、Linux面试题

用户态、内核态、Linux命令、docker命令、cpu

Jay_fearless的博客 963

操作系统

首先明确操作系统的几大模块: 1.系统初始化 2.进程管理 3.文件系统 4.存储系统管理 5.I/O管理 那么windows内核和Linux内核在这几个模块上有哪些相同之处呢?又有哪些不同之处呢? 首先,作为os,他们的理念都是相似的。 1.一切皆文件。可能读写文件很好实现把,linux不管修改个什么东东其实都是在修改文件 2....

114

操作系统——实验1:熟悉Linux命令及进程管理

熟悉Linux系统及基本命令;熟悉vi编辑器和gcc编译器。 加深对进程概念的理解,明确进程和程序的区别;进一步认识并发执行的实质;分析进程争用资源的现象,学习解决进程互斥的方法。

阮阮的阮阮的博客 1万+

操作系统实验一 Linux基本操作|实验二 进程管理

计算机操作系统 |实验一Linux基本操作 |实验二进程管理

Time木的博客 1万+

【Linux系统】全面剖析 Linux 进程管理与 PCB 机制

进程是操作系统的核心概念之一,也是计算机执行任务的基本单位。在现代操作系统中,如何高效地管理和调度众多进程,是系统设计和性能优化的重要课题。Linux作为一个多用户、多任务操作系统,其进程管理实现不仅科学严谨,还高度模块化。本篇文章将深入剖析Linux中的进程管理机制,重点讲解进程控制块(PCB)的结构和作用,帮助读者理解操作系统的运行原理。通过本文的讲解,我们可以清晰地看到,Linux系统中进程的管理是通过PCB(task_struct)这一核心数据结构来实现的。

17的博客 1万+

操作系统课设之Linux 进程管理

操作系统课程设计 Linux创建进程 Linux进程管理

RongLin02的博客 4903
上一篇: linux操作系统-3进程管理(1)
下一篇: 第二章 变电站综合自动化系统的硬件原理
abcflyer
博客等级 码龄15年 49粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值