【Linux系统】冯•诺依曼体系结构与操作系统

        本篇博客整理了操作系统相关的基础知识,先从硬件之冯•诺依曼体系结构,再结合软件之操作系统,旨在帮助读者理解计算机的软硬件资源,和操作系统的管理软硬件资源的手段。

目录

一、冯•诺依曼体系结构

1.计算机硬件设备

2.体系结构的再推导

3.内存的意义

4.计算机之间的数据交互

二、操作系统

1.计算机的层状结构

1.1-操作系统之下

 1.2-操作系统之上

2.先描述,再组织

2.1-如何管理

2.2-如何维护硬件信息


一、冯•诺依曼体系结构

        现在常见的计算机(如笔记本、台式机)和不常见的计算机(如服务器等),它们本质都是一堆硬件——cpu、内存、网卡、磁盘等的集合。但并不是说,把这些硬件随意放在一起就能够组成计算机,而是各硬件之间首先要具备协同能力,这就要求硬件与硬件之间要组织好,构建成一个系统,这样才能对外提供计算输出服务。

        数学家冯·诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑程序存储执行以及计算机由五个部分组成(运算器、控制器、存储器、输入设备、输出设备),这套理论被称为冯•诺依曼体系结构。

        冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同,如英特尔公司的8086中央处理器的程序指令和数据都是16位宽。 ​

1.计算机硬件设备

  • 输入设备:鼠标、键盘、摄像头、磁盘、网卡等。

        为了给用户提供计算服务,就需要用户先把数据交给计算机。但计算机只认识二进制的0和1且通过各种电路信号来计算,而用户提供的数据一般是文字、图片、音频等,所以就需要有一些设备,能够把用户的数据转换成二进制,然后再交给计算机。于是这就决定了,用户是无法直接访问到内存、中央处理器等硬件的,而必须要经过输入设备来访问。例如通过键盘上输入一串字符“abcd”,对于用户而言,输入的是一个字符串,但对于计算机而言,用户输入的是一串0和1的序列。

  • 输出设备:显示器、音响、磁盘、网卡、显卡等。

        计算机运算完毕后,也只能输出二进制,为了将这些二进制结果转换成文字、图片等用户可以看懂的形式,就需要经过输出设备的处理。因此,输入、输出设备一般是用来进行人和计算机,计算机和计算机之间互相传递信息的外部设备。

  • 外存:光盘、U盘、磁盘、磁带、硬盘、软盘等。

        外存存储器的存储容量很大,是计算机存储数据的主力。计算机要从外存(例如硬盘)读取数据,会先将外存中的一部分数据加载到内存,再通过CPU调度输入设备来改写或通过CPU调度输出设备来查看。 

        外存、输入设备、输出设备统称为计算机的外设。

  • 中央处理器(CPU):运算器 + 控制器 + 寄存器。

        中央处理器(CPU)由运算器和控制器共同组成。在不考虑缓存的情况下,CPU只能对内存进行读写,不能访问外设(输入、输出设备)。

        其中,运算器是对用户输入的数据执行计算任务,分为算数运算和逻辑运算,前者就是加减乘除,后者就是真假判断;而控制器是对计算过程,即硬件流程进行控制,协调各组件与各单元间的工作;寄存器可用于传送和暂存数据,也可参与算术运算和逻辑运算,并保存运算结果。

  • 存储器(内存 )

        内存包含主存和高速缓存,是一种硬件级别的缓存空间,作为CPU和输入输出设备、外存之间的中转站,在冯•诺依曼体系结构中占据核心地位。存储数据的硬件随着存储容量越来越大,访问数据的速度会越来越慢,访问成本也会越来越高(存储金字塔理论),为了保证计算机的运算效率,冯诺依曼体系结构要求,数据必须先从输入设备写入内存,CPU再从内存读取数据进行运算,CPU不能直接从输入设备读取数据,同样CPU的运算结果也不能直接写入到输出设备,而是要先写入内存,再从内存中将结果刷新到输出设备。

  • 【补】总线

        冯诺依曼体系结构中涉及的五大模块——输入设备、存储器、运算设备、控制器、输出设备——都是独立的个体,有各自独立的功能。而这些独立的个体要共同组成一个计算机,就必须要将它们组织联系起来。输入设备需要把数据交给内存,CPU再从内存中读取数据进行运算,将运算结果再写入内存,内存最终再把数据交给输出设备。

        为了实现数据在五大模块间的流动,就需要把用“线”把各个硬件单元连接起来,这个“线”在计算机中就被称作总线。

        总线可分为系统总线和IO总线。前者是用于连接CPU和内存,后者是连接内存和外设(输入、输出设备)。

        有些总线在我们拆开计算机后可以直接看到,有些则是直接集成在硬件电路上。

2.体系结构的再推导

        数据在计算机中的运算,主要是一系列的算术运算和逻辑运算(运算器)。

        想要计算机为用户提供计算服务,首先需要用户将数据输入到计算机中,于是,计算机必须要有输入设备来接收用户的数据。

        当计算机计算完毕后,还需要将结果反馈给用户,于是,计算机必须要有输出设备来输出计算的结果。

        但是计算机中只有算术运算和逻辑运算是远远不够的,还需要有一种控制功能(控制器),来控制何时从输入设备获取数据、何时输出结果到输出设备等。拿一个C语言程序来类比,算术运算对应的是一系列的加减乘除,逻辑运算对应的是一系列的逻辑 & 和逻辑 | 等等,控制功能对应的是C语言条件判断、循环、各个函数的调用等等。

        而当需要运算的数据较多,以及运算后的结果较多,不能及时处理,此时就需要一种存储功能(寄存器),将要输入的数据和要输出的结果暂时存起来,等待处理。

        这个具有算术运算功能、逻辑运算功能、控制功能、一定容量的存储功能的模块就被称为中央处理器,简称CPU。

        在实际的操作中,用户输入的数据和需要获取的结果当下未必要交给CPU处理,可能在未来用到,至于在未来什么时候用到,还不清楚,但在这期间可能还会有新的不必及时处理的数据,于是就需要一种容量较大的存储功能(存储器)将数据先保存起来,以期在需要时使用。

 

3.内存的意义

        冯诺依曼体系结构要求:数据必须先从输入设备写入存储器,CPU再从存储器读取数据进行运算,CPU不能直接从输入设备读取数据,同样CPU的运算结果也不能直接写入到输出设备,而是要先写入存储器,再从存储器中将结果刷新到输出设备

        这是因为,在计算机体系结构中,不同部分的材料不同,它们的性能也不同,所以存储是分级的。

        其中,不同部分的访问速度是:CPU内的寄存器 > 存储器(内存) > 外设(外存、输入输出设备),且它们之间的关系不是大于,而是远大于。它们的访问速度并不在一个量级,例如CPU是纳秒级别的,内存是微秒级别的,而外设是毫秒级别的。由于CPU和外设之间的速度差距很大,如果将CPU与外设直接进行连接,就会在木桶效应的影响下,导致计算机整体的运算速度下降。

        如果CPU直接和外设连接,那么,就算CPU的运算速度再快,计算机整体的运算能力也会被外设的读取速度所限制。

        假设CPU需要一个数据,这个数据在输入设备和内存中都有,如果从输入设备中拿需要1毫秒,那么从存储器中拿就只需要1微秒;假设CPU需要传出一个数据,如果直接给输出设备的话,也是需要1毫秒,但给存储器的话只要1微秒。

        因此,为了降低木桶效应对计算机整体运行速度的影响,冯·诺依曼体系结构要求CPU只能和内存进行数据交互。

        内存除了读取速度较快以外,还起着第三方中介的作用。数据可以从输入设备预先加载到内存,等CPU空闲了,再直接到内存读取数据。CPU的运算和内存从外设中读取数据,是可以同时进行的,这使得计算机整体的运行速度大幅提升。

        而如果没有内存,外设与CPU直接相连,那此时外设就必须等CPU当前的运算结束后,才能继续将数据传给CPU以及继续从CPU中获取结果。

        此外,由于冯·诺依曼体系结构要求CPU只能和内存进行数据交互,一个程序要运行就必须先加载到内存。

        所有软件的设计,都必须遵循硬件结构的规律,硬件是整个计算机的下限,而软件是上限。基础决定上层,只要是硬件的要求,所有软件都必须要遵守。

        一个可执行程序(软件)一般是由一些源文件编译生成的,然后才能运行。而这些源文件和编译生成的可执行程序都是保存在外设(硬盘或磁盘等)上。运行可执行程序,就是让CPU来执行文件中的代码,对其中的数据进行运算,而根据冯·诺依曼体系结构的要求,CPU只能从内存中拿数据,因此,一个程序想要运行,就必须先加载到内存。

 【小结】

  • 冯·诺依曼体系结构要求,CPU只能和内存进行数据交互。
  • 内存的意义是,在存储分级和木桶效应的影响下,尽可能提升计算机的整体运行速度。
  • 冯·诺依曼体系结构保证了CPU的运算和IO可以同时进行。
  • 外设和CPU在数据层面不会直接交互,但是在信号控制阶段,CPU和外设是可以直接进行交互的。
  • 所有软件的设计,都必须遵循硬件结构的规律;一个程序要运行,就必须先加载到内存。

 

4.计算机之间的数据交互

        以“我”通过QQ与朋友进行通讯为例。

  1. 要用QQ软件进行通讯,首先“我”和朋友的电脑都需要联网。
  2. “我”和朋友的电脑都是冯·诺依曼体系结构,当“我”向朋友发了一句“在吗?”,“我”电脑中的键盘充当了输入设备,显示器和网卡充当了输出设备;而朋友电脑中的网卡因为从网上获取“在吗?”又将“在吗?”加载到内存,充当了输入设备,显示器充当了输出设备。
  3. 当“我”开始在键盘当中输入“在吗?”,键盘将“在吗?”加载到内存,此时“我”电脑的显示器也从内存中获取了“在吗?”进而显示在显示器上;而CPU从内存获取到“在吗?”并对其进行各种封装,然后再将其写回内存,好让网卡可以获取;“我:电脑的网卡获取“在吗?”后,会在网络中经过一系列处理。
  4. 朋友电脑的网卡会从网络中获取“我”发给他的“在吗?”,并将“在吗?”加载到内存中;CPU再从内存中获取“在吗?”并对其进行解包,然后将解包好的“在吗?”写回内存;最后,朋友电脑的显示器就可以从内存中获取“我”发的“在吗?”,并显示在显示器上让他看到。

二、操作系统

        上文中提到的很多硬件设备,如键盘、显示器、网卡、CPU等,都各有所职,发挥着各自的功能。但在实际中这是不够的,它们需要相互配合来共同完成任务,而这最好有一个角色能将它们管理起来,让它们在合适的时机有合适的分工——操作系统就是这样一个角色。

        简单来说,操作系统就是一款管理软硬件资源的软件,其中包括内核(进程管理、内存管理、文件管理、驱动管理)与其他程序(例如函数库、shell程序等等)这两个部分,既可以管理和调配好硬件资源,又可以为软件提供一个良好的执行环境。

        那么,操作系统是如何进行管理的呢?

1.计算机的层状结构

1.1-操作系统之下

        肉眼可见、触手可及的计算机硬件,看似是一个个独立且独特的部件,其实在底层互有联系,共同组成了冯·诺依曼体系结构。

         但如果只有这些底层硬件,对于完成计算机的任务来说是远远不够的。内存何时从输入设备读取数据?读取多少数据?内存何时刷新缓冲区到输出设备?——这些都需要一个角色来进行管理和调度,而这个角色就是操作系统。

         但实际上,操作系统并不是直接管理底层硬件的。
        这是因为,比如说操作系统直接在键盘中读取数据,只要键盘的读取方式发生改变,那么操作系统的内核源代码就需要重新编译,这样一来,操作系统的维护成本就太高了。

        为了降低操作系统的维护成本,操作系统与底层硬件之间增加了一层驱动程序。

        驱动程序的主要功能就是控制底层硬件,可以访问硬件的读写和当前的状态等等,和硬件直接打交道,完成了操作系统与底层硬件之间的解耦。例如,键盘有相应的键盘驱动,网卡有相应的网卡驱动,硬盘有相应的硬盘驱动等等。驱动一般是由硬件制造厂商提供,或是根据操作系统的相关模块进行开发的(比如网卡)。有了驱动,操作系统就只需操心何时读取数据,而不必操心数据是如何读取的了。

         既然实际是驱动程序在负责管理底层硬件,那操作系统又管理的是什么呢?——

  1. 内存管理:内存分配、内存共享、内存保护、内存扩容等。
  2. 驱动管理:对计算机设备的驱动程序进行分类、更新、删除等操作。
  3. 文件管理:对文件存储空间的管理、目录的管理、文件操作的管理、文件的保护等。
  4. 进程管理:主要是对进程的调度。

 1.2-操作系统之上

        操作系统之上就是用户层,用户就是在这一层使用命令行或图形化界面进行各种操作的。

        而实际上,用户也不是直接在操作系统上进行操作的。为了保护操作系统,保证稳定、安全、高效的程序执行环境,操作系统不允许用户对其直接进行操作,而是为用户一些接口,让用户间接在操作系统进行操作。这一系列接口被称为系统调用接口。

        但系统调用接口对于普通用户来说,上手成本又太高了,要直接系统调用接口,就必须要求用户对系统有一定了解。于是,为了降低上手成本,方便用户使用,系统调用接口之上又构建出了一系列用户操作接口。其实,在语言级别上使用的各种库函数,就是封装了系统调用接口的,例如C语言的printf()、scanf()等。

 【小结】库函数调用和系统调用

  • 站在开发的角度,操作系统对外可以视为一个整体,会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用接口,是操作系统的一部分。
  • 系统调用接口在使用上,功能比较基础,但对用户的要求很高,所以开发者对部分系统调用进行了适度封装,从而形成库,这样更有利于上层用户或开发者进行后续的开发。
  • 库函数调用和系统调用之间是调用和被调用的关系,库函数调用在上层,系统调用在下层。

 

2.先描述,再组织

        操作系统对下可以管理好硬件资源,对上可以为软件提供一个良好的执行环境,为用户提供一个良好的使用环境。那么,操作系统是如何进行管理的呢?——答案是先描述,再组织!

 

2.1-如何管理

        要理解操作系统是如何进行管理的,就得先正确理解管理。

        这里以校园管理为例。校长作为学校的管理者,学生作为学校里被管理对象,校长是如何管理学生的呢?

        如今,每个学校都有自己的教务系统,教务系统有学生的各种信息——姓名、学号、年级、绩点等等。

        假设某一天,学校要评选奖学金,校长作为管理者,只需在教务系统中依据每个学生的成绩排个序,就完成了对学生成绩的排名,然后根据这份排名就可以把奖学金发给排在前例的学生。

        又假设某一天,一名学生挂科的学分太多,需要留级处理,校长作为管理者,只需要更改这名学生在教务系统中的年级信息即可。

        在以上事例中,校长作为管理者在进行校园管理的时候,并没有与作为被管理对象的学生见面;而实际上,校长也不是直接在管理学生,而是在对教务系统中学生的信息进行增删改查的操作。也就是说:

  • 在管理过程中,管理者和被管理对象其实不必见面。
  • 管理本质是对被管理对象的属性的增删改查操作。

        那校长作为做决策的管理者,是如何知道学生的各种信息的呢?——从执行决策的执行者那里得知。而在学校里,辅导员就扮演执行者这一角色。比如说,校长需要知道学生们的假期去向——放假后什么时间离校,去哪里,怎么去——于是安排辅导员去收集学生的信息;辅导员收到校长的安排后,就开始执行,在vx群里通知学生,让学生填表,然后自己将表格收集起来交给校长。这样一来,校长就知道学生们的假期去向了。

  • 管理者和执行者的本质区别在于,管理者拥有决策权,而执行者是没有决策权的,只负责执行管理者的决策。

        回到计算机当中,来操作系统就相当于是校长,属于管理者;驱动程序就相当于是辅导员,属于执行者;硬件就相当于学生,属于被管理者——

计算机身份角色
操作系统校长管理者
驱动程序辅导员执行者
底层硬件学生被管理对象

        也就是说,操作系统是通过驱动程序来获取到硬件的各种信息,以实现对硬件的管理。比如,网卡在使用的过程中发生了故障,驱动程序就会把错误信息报告给操作系统;如果操作系统本身如果解决不了,就会把信息报告给用户,提示用户需要更换网卡。

 

2.2-如何维护硬件信息

        管理本质是对被管理对象的属性的增删改查操作,换句话说,操作系统管理底层硬件,本质是在维护硬件的信息。

【Tips】操作系统对底层的管理:

  • 先描述:用结构体定义被管理对象的属性;
  • 再组织:借助数据结构,将描述硬件属性的结构体组织起来。

        再以校园管理为例,先将作为被管理对象的学生的信息用结构体封装起来:

struct student 
{
    //学生的各种信息
    char name[10]; //姓名
    int id[20];    //学号
    int age;       //年龄
    int grade;     //年级
    int GPA;       //绩点
    //...
 
    struct student* next;
    struct student* prev;
};

         再借助数据结构,如链表,将封装学生信息的结构体组织起来:

        这样一来,对学生信息的增删改查,就变成了对一个链表的增删改查。

        回到计算机当中,同理,先将底层硬件的信息用结构体封装起来,再借助数据结构,如链表,将这些结构体组织起来:

【小结】 操作系统对底层硬件的管理,最终都会转换为对某种数据结构的增删查改(这同时也决定了操作系统中含有大量的数据结构)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/593629.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Springboot的校园生活服务平台(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的校园生活服务平台(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…

【Java】基本程序设计结构(一)

前言:现在,假定已经成功安装了JDK,并且能够运行上篇示例程序。本篇将开始介绍Java程序中的基本设计结构,其中包括:一个简单的Java应用,注释,数据类型,变量与常量,运算符&…

spring框架学习记录(3)

Spring事务 Spring事务简介 事务作用:在数据层保障一系列的数据库操作同成功同失败Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功或同失败 Spring事务角色 事务管理员:发起事务方,在Spring中通常指代业务层开…

企业级数据治理学习总结

1. 水在前面 “数据治理”绝对是吹过的牛里面最高大上的题目了,本来想直接以《企业级数据治理》为题来水的,码字前又跑去图书馆借了几本书,翻了几页才发现自己连半桶水都提不起,撑死只能在小屁孩跟前吹吹牛。 好吧,实在…

Mysql如何通过ibd文件恢复数据

Mysql ibd文件恢复注意问题 创建数据库(随意创建)创建数据表(备注:表结构要和要恢复的表结构一致,row_format要和ibd文件的row_format一致,否则,会提示两者不一致。 当前row_formatdynamic&…

刘强东创业成功的四大要素:团队、用户体验、成本与效率

摘要: 本文深入探讨了刘强东创业成功的四大关键要素:团队、用户体验、成本和效率。通过对这些要素的细致分析,我们旨在揭示刘强东如何运用这些策略将京东打造成一个全球知名的电商平台。 一、引言 刘强东作为京东集团的创始人和CEO&#xff…

【DPU系列之】DPU中的ECPF概念是什么?全称是什么?(E CPF对标H CPF;embedded CPU function ownership)

ECPF:embedded CPU function ownership。 嵌入式CPU运转ownership。也叫DPU模式,是DPU工作运转3种模式之一,也是默认的模式。这里的嵌入式CPU指的是DPU上ARM CPU,表示网卡所有资源和功能被embedded CPU全权管理,行使所…

虚拟机jvm下

jvm原理与实践 java程序的跨平台特性 jvm基本结构 JVM类加载流程和内存结构总览 类加载 加载阶段 类加载 验证阶段 类加载 准备阶段 类加载 解析阶段 类加载 初始化阶段 程序计数器 虚拟机栈&本地方法栈 栈帧操作 堆 方法区 永久代 元空间 垃圾回收 可触及性

SpringBoot+Vue实现美食交流网站的设计与实现

一、前言介绍 美食交流网站采用Java技术,Mysql数据库存储数据,基于Springboot框架开发。系统采用了模块化设计方法,根据用户的需求开发功能模块,方便了程序扩展维护,以便后期的更新。整个开发过程首先对系统进行需求分…

Gradle 进阶学习 之 build.gradle 文件

build.gradle 是什么? 想象一下,你有一个大型的乐高项目,你需要一个清单来列出所有的乐高积木和它们如何组合在一起。在软件开发中,build.gradle 就是这个清单,它告诉计算机如何构建(组合)你的软…

Python-VBA函数之旅-open函数

目录 一、open函数的常见应用场景 二、open函数使用注意事项 三、如何用好open函数? 1、open函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页:神奇夜光杯-CSDN博客 一、open函数的常见应用场…

LLaMA详细解读

LLaMA 是目前为止,效果最好的开源 LLM 之一。精读 LLaMA 的论文及代码,可以很好的了解 LLM 的内部原理。本文对 LLaMA 论文进行了介绍,同时附上了关键部分的代码,并对代码做了注释。 摘要 LLaMA是一个系列模型,模型参…

带权并查集

续前章节:并查集及应用 目录 1 带权问题1.1 点带权1.2 边带权 2 例题2.1 家族合并2.2 信息传递2.3 [NOI2002] 银河英雄传说 1 带权问题 1.1 点带权 用num[i]记录节点 i i i 所在的集合的数量。 初始化:所有的num[i]都是 1 1 1,因为每个点…

公考学习|基于SprinBoot+vue的公考学习平台(源码+数据库+文档)

公考学习平台目录 目录 基于SprinBootvue的公考学习平台 一、前言 二、系统设计 三、系统功能设计 5.1用户信息管理 5.2 视频信息管理 5.3公告信息管理 5.4论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&…

Spring 原理

🎥 个人主页:Dikz12🔥个人专栏:Spring学习之路📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 Bean的作用域 代码实现 观察Bean的作用域 Bean的生命周期 Spring …

[单片机课设]十字路口交通灯的设计

题目要求: 模拟交通灯运行情况。南北绿灯亮30秒,南北黄灯亮3秒,东西红灯亮33秒;南北红灯亮33秒,东西绿灯亮30秒,东西黄灯亮3秒;要求数码管同步显示时间的倒计时,用定时器实现延时。…

Java_从入门到JavaEE_07

一、数组的排序(冒泡排序) 原理: 从下标“0”开始,相邻两个元素依次进行比较,每次找出最大的往后移动。 规律:N个数字来排队,两两相比小靠前,外层循环N-1,内层循环N-1-i…

error LNK2001: 无法解析的外部符号 “__declspec(dllimport) public: __cdecl ......

运行程序时,报如上图所示错误,其中一条是: ReflectionProbe.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl osg::Object::Object(bool)" (__imp_??0ObjectosgQEAA_NZ) 报这个错误一般是因为…

MongoDB详解

目录 一、MongoDB概述 1.MongoDB定义 2.MongoDB主要特点 2.1文档 2.2集合 2.3数据库 2.4数据模型 二、安装MongoDB 1.Windows安装MongoDB 1.1下载MongoDB 1.2安装MongoDB 1.3配置MongoDB 1.3.1可能遇到的问题 1.4安装一盒可视化工具 2.Linux安装MongoDB 2.1下载…

鸿蒙内核源码分析(用栈方式篇) | 程序运行场地谁提供的

精读内核源码就绕不过汇编语言,鸿蒙内核有6个汇编文件,读不懂它们就真的很难理解以下问题. 1.系统调用是如何实现的? 2.CPU是如何切换任务和进程上下文的? 3.硬件中断是如何处理的? 4.main函数到底是怎么来的? 5.开机最开始发生了什么? 6.关机…
最新文章