简述进程和线程的主要区别 进程线程区别( 二 )


3.它们在Linux内核中实现方式有何不同?
在Linux 里面 , 无论是进程 , 还是线程 , 到了内核里面 , 我们统一都叫任务(Task) , 由一个统一的结构 task_struct 进行管理 , 这个task_struct 数据结构非常复杂 , 囊括了进程管理生命周期中的各种信息 。

简述进程和线程的主要区别 进程线程区别

文章插图
在Linux操作系统内核初始化时会创建第一个进程 , 即0号创始进程 。随后会初始化1号进程(用户进程祖宗:/usr/lib/systemd/systemd) , 2号进程(内核进程祖宗:[kthreadd]) , 其后所有的进程线程都是在他们的基础上fork出来的 。
简述进程和线程的主要区别 进程线程区别

文章插图

简述进程和线程的主要区别 进程线程区别

文章插图
我们一般都是通过fork系统调用来创建新的进程 , fork 系统调用包含两个重要的事件 , 一个是将 task_struct 结构复制一份并且初始化 , 另一个是试图唤醒新创建的子进程 。
我们说无论是进程还是线程 , 在内核里面都是task , 管起来不是都一样吗?到底如何区分呢?其实 , 线程不是一个完全由内核实现的机制 , 它是由内核态和用户态合作完成的 。
【文章福利】需要C/C++ Linux服务器架构师学习资料加群812855908(资料包括C/C++ , Linux , golang技术 , 内核 , Nginx , ZeroMQ , MySQL , Redis , fastdfs , MongoDB , ZK , 流媒体 , CDN , P2P , K8S , Docker , TCP/IP , 协程 , DPDK , ffmpeg , 大厂面试题 等)
简述进程和线程的主要区别 进程线程区别

文章插图

简述进程和线程的主要区别 进程线程区别

文章插图
创建进程的话 , 调用的系统调用是 fork , 会将五大结构 files_struct、fs_struct、sighand_struct、signal_struct、mm_struct 都复制一遍 , 从此父进程和子进程各用各的数据结构 。而创建线程的话 , 调用的是系统调用 clone , 五大结构仅仅是引用计数加一 , 也即线程共享进程的数据结构 。
简述进程和线程的主要区别 进程线程区别

文章插图
4.所以它们到底有哪些区别?
功能: 进程是操作系统资源分配的基本单位 , 而线程是任务调度和执行的基本单位
开销: 每个进程都有独立的内存空间 , 存放代码和数据段等 , 程序之间的切换会有较大的开销;线程可以看做轻量级的进程 , 共享内存空间 , 每个线程都有自己独立的运行栈和程序计数器 , 线程之间切换的开销小 。
运行环境: 在操作系统中能同时运行多个进程;而在同一个进程(程序)中有多个线程同时执行(通过CPU调度 , 在每个时间片中只有一个线程执行)
创建过程: 在创建新进程的时候 , 会将父进程的所有五大数据结构复制新的 , 形成自己新的内存空间数据 , 而在创建新线程的时候 , 则是引用进程的五大数据结构数据 , 但是线程会有自己的私有数据、栈空间 。
进程和线程其实在cpu看来都是task_struct结构的一个封装 , 执行不同task即可 , 而且在cpu看来就是在执行这些task时候遵循对应的调度策略以及上下文资源切换定义 , 包括寄存器地址切换 , 内核栈切换 。所以对于cpu而言 , 进程和线程是没有区别的 。