学校网站建设介绍,网站收费吗,网络推广最新技巧,vs2012建设网站1.什么是进程#xff1f;为什么要有进程#xff1f;
进程有一个相当精简的解释#xff1a;进程是对操作系统上正在运行程序的一个抽象。
这个概念确实挺抽象#xff0c;仔细想想却也挺精准。
我们平常使用计算机#xff0c;都会在同一时间做许多事#xff0c;比如边看…1.什么是进程为什么要有进程
进程有一个相当精简的解释进程是对操作系统上正在运行程序的一个抽象。
这个概念确实挺抽象仔细想想却也挺精准。
我们平常使用计算机都会在同一时间做许多事比如边看电影边微信聊天顺便打开浏览器百度搜索一下我们所做的这么多事情背后都是一个个正在运行中的软件程序这些软件想要运行起来首先在磁盘上需要有各自的程序代码然后将代码加载到内存中CPU会去执行这些代码运行中会产生很多数据需要存放也可能需要和网卡、显卡、键盘等外部设备交互这背后其实就涉及到程序对计算机资源的使用存在这么多程序我们当然需要想办法管理程序资源的使用。并且CPU如果只有一个那么还需要操作系统调度CPU分配给各个程序使用让用户感觉这些程序在同时运行不影响用户体验。
理所当然操作系统会把每个运行中的程序封装成独立的实体分配各自所需要的资源再根据调度算法切换执行。这个抽象程序实体就是进程。
所以很多对进程的官方解释中都会提到进程是操作系统进行资源分配和调度的一个基本单位。
2.什么是线程为什么要有线程
在早期的操作系统中并没有线程的概念进程是拥有资源和独立运行的最小单位也是程序执行的最小单位。任务调度采用的是时间片轮转的抢占式调度方式而进程是任务调度的最小单位每个进程有各自独立的内存空间使得各个进程之间内存地址相互隔离。
后来随着计算机行业的发展程序的功能设计越来越复杂我们的应用中同时发生着多种活动其中某些活动随着时间的推移会被阻塞比如网络请求、读写文件也就是IO操作我们自然而然地想着能不能把这些应用程序分解成更细粒度、能 准并行运行 多个顺序执行实体并且这些细粒度的执行实体可以共享进程的地址空间也就是可以共享程序代码、数据、内存空间等这样程序设计模型会变得更加简单。
其实很多计算机世界里的技术演变都是模拟现实世界。比如我们把一个进程当成一个项目当项目任务变得复杂时自然想着能不能将项目按照业务、产品、工作方向等分成一个个任务模块分派给不同人员各自并行完成再按照某种方式组织起各自的任务成果最终完成项目。
需要多线程还有一个重要的理由就是每个进程都有独立的代码和数据空间程序上下文程序之间的切换会有较大的开销线程可以看做轻量级的进程同一类线程共享代码和数据空间每个线程都有自己独立的运行栈和程序计数器线程之间切换的开销小。所以线程的创建、销毁、调度性能远远优于进程。
在引入多线程模型后进程和线程在程序执行过程中的分工就相当明确了进程负责分配和管理系统资源线程负责CPU调度运算也是CPU切换时间片的最小单位。对于任何一个进程来讲即便我们没有主动去创建线程进程也是默认有一个主线程的。
3.它们在Linux内核中实现方式有何不同
在Linux 里面无论是进程还是线程到了内核里面我们统一都叫任务Task由一个统一的结构 task_struct 进行管理这个task_struct 数据结构非常复杂囊括了进程管理生命周期中的各种信息。 在Linux操作系统内核初始化时会创建第一个进程即0号创始进程。随后会初始化1号进程用户进程祖宗/usr/lib/systemd/systemd2号进程内核进程祖宗[kthreadd]其后所有的进程线程都是在他们的基础上fork出来的。 我们一般都是通过fork系统调用来创建新的进程fork 系统调用包含两个重要的事件一个是将 task_struct 结构复制一份并且初始化另一个是试图唤醒新创建的子进程。
我们说无论是进程还是线程在内核里面都是task管起来不是都一样吗到底如何区分呢其实线程不是一个完全由内核实现的机制它是由内核态和用户态合作完成的。 推荐视频
linux服务端的网络并发详细解读网络io与线程进程关系
【C后端开发】5000道C“八股文”还需要死记硬背吗90分钟梳理清晰
2023年最新技术图谱c后端的8个技术维度助力你快速成为大牛 免费学习地址C/CLinux服务器开发/后台架构师
【文章福利】需要C/C Linux服务器架构师学习资料加群812855908资料包括C/CLinuxgolang技术内核NginxZeroMQMySQLRedisfastdfsMongoDBZK流媒体CDNP2PK8SDockerTCP/IP协程DPDKffmpeg大厂面试题 等 创建进程的话调用的系统调用是 fork会将五大结构 files_struct、fs_struct、sighand_struct、signal_struct、mm_struct 都复制一遍从此父进程和子进程各用各的数据结构。而创建线程的话调用的是系统调用 clone五大结构仅仅是引用计数加一也即线程共享进程的数据结构。 4.所以它们到底有哪些区别
功能 进程是操作系统资源分配的基本单位而线程是任务调度和执行的基本单位
开销 每个进程都有独立的内存空间存放代码和数据段等程序之间的切换会有较大的开销线程可以看做轻量级的进程共享内存空间每个线程都有自己独立的运行栈和程序计数器线程之间切换的开销小。
运行环境 在操作系统中能同时运行多个进程而在同一个进程程序中有多个线程同时执行通过CPU调度在每个时间片中只有一个线程执行
创建过程 在创建新进程的时候会将父进程的所有五大数据结构复制新的形成自己新的内存空间数据而在创建新线程的时候则是引用进程的五大数据结构数据但是线程会有自己的私有数据、栈空间。
进程和线程其实在cpu看来都是task_struct结构的一个封装执行不同task即可而且在cpu看来就是在执行这些task时候遵循对应的调度策略以及上下文资源切换定义包括寄存器地址切换内核栈切换。所以对于cpu而言进程和线程是没有区别的。
附我们通常所说的上下文切换具体指什么
操作系统抽象出一个进程的概念让应用程序专心于实现自己的业务逻辑既可对应用程序屏蔽了CPU调度、内存管理等硬件细节而且在有限的CPU上可以“同时”进行许多个任务。但是它为用户带来方便的同时也引入了一些额外的开销。
在操作系统中由于CPU的时间片调度策略从一个进程切换到另一个进程需要保存当前进程的状态并恢复另一个进程的状态当前运行任务转为就绪或者挂起、删除状态另一个被选定的就绪任务成为当前任务。上下文切换包括保存当前任务的运行环境恢复将要运行任务的运行环境。
在上下文切换过程中CPU会停止处理当前运行的程序并保存当前程序运行的具体位置以便之后继续运行。从这个角度来看上下文切换有点像我们同时阅读几本书在来回切换书本的同时我们需要记住每本书当前读到的页码。
在三种情况下可能会发生上下文切换中断处理多任务处理内核/用户态切换。
在中断处理中其他程序”打断”了当前正在运行的程序。当CPU接收到中断请求时会在正在运行的程序和发起中断请求的程序之间进行一次上下文切换。
在多任务处理中CPU会在不同程序之间来回切换每个程序都有相应的处理时间片CPU在两个时间片的间隔中进行上下文切换。
在Linux中进行内核/用户态切换也会进行上下文切换进行系统调用时CPU寄存器里原来用户态的指令位置需要先保存起来。接着为了执行内核态代码CPU寄存器需要更新为内核态指令的新位置。最后才是跳转到内核态运行内核任务。而系统调用结束后CPU寄存器需要恢复原来保存的用户态然后再切换到用户空间继续运行进程所以一次系统调用的过程其实是发生了两次CPU上下文切换。
CPU上下文切换是保证Linux系统正常工作的核心功能之一一般情况下不需要我们特别关注。
但过多的上下文切换会把CPU时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上从而缩短进程真正运行的时间导致系统的整体性能大幅下降。