当前位置: 首页 > news >正文

网站建设一般步骤东莞关键词排名快速优化

网站建设一般步骤,东莞关键词排名快速优化,想象力网站建设公司,网站建设课程设计总结目录前言内核对进程和线程的表示创建进程的过程创建线程的过程创建进程和线程的异同揭秘 do_fork 系统调用结论前言 昨天面试的时候,面试官问我了个平平淡淡的问题–>“聊聊Linux中进程和线程”; 相比大家不管是在考试还是面试中或多或少都遇到过这个问题&…

目录

    • 前言
    • 内核对进程和线程的表示
    • 创建进程的过程
    • 创建线程的过程
    • 创建进程和线程的异同
      • 揭秘 do_fork 系统调用
      • 结论

前言

昨天面试的时候,面试官问我了个平平淡淡的问题–>“聊聊Linux中进程和线程”;

相比大家不管是在考试还是面试中或多或少都遇到过这个问题,俗话说得好:

进程是资源分配的基本单位,线程是资源调度的基本单位!

这个你我都知道,但是这样解释感觉有点牵强和敷衍,记住八股不是背的,是要理解,这样面试才能有深度,配合上清晰的逻辑表达,凡可百战百胜!

在网上对进程和线程的讨论中,很多都是聚集在这二位有啥不同。但事实在 Linux 上,进程和线程的相同点要远远大于不同点。在 Linux 下的线程甚至都被称为了轻量级进程。(至于说轻量在哪儿,稍后我们最终结论就会浮现)

我今天就给大家从 Linux 内核实现的角度,给大家深度对比下进程和线程。

内核对进程和线程的表示

都用task_struct表示

在这里插入图片描述

对于线程来讲,所有的task_struct字段都是和进程一样的(本来就是一个结构体来表示的)。包括状态、pid、task 树关系、地址空间、文件系统信息、打开的文件信息等等字段,线程也都有。


对于进程来说,这个 pid 就是我们平时常说的进程 pid。

对于线程来说,我们假如一个进程下创建了多个线程出来。那么每个线程的 pid 都是不同的。但是我们一般又需要记录线程是属于哪个进程的。这时候,tgid 就派上用场了,通过 tgid 字段来表示自己所归属的进程 ID

在这里插入图片描述

这样内核通过 tgid 可以知道线程属于哪个进程。

这也就是我前面说的,进程和线程的相同点要远远大于不同点,本质上是同一个东西,都是一个 task_struct !正因为进程线程如此之相像,所以在 Linux 下的线程还有另外一个名字,叫轻量级进程。(至于说轻量在哪儿,稍后我们最终结论就会浮现)


创建进程的过程

Linux下每个进程本质上是一个task_struct(PCB),这点可以参考我的这篇文章Linux虚拟地址空间

事实上,进程线程创建的时候,使用的函数看起来不一样。但实际在底层实现上,最终都是使用同一个函数来实现的:

在这里插入图片描述

通过分析内核源码,创建进程时fork 调用主要就是执行了 do_fork 函数。

注意:fork 函数调用 do_fork 的传的参数分别是SIGCHLD、0,0,NULL,NULL

//file:kernel/fork.c
SYSCALL_DEFINE0(fork)
{return do_fork(SIGCHLD, 0, 0, NULL, NULL);

do_fork() 函数又调用 copy_process 完成进程的创建。

//file:kernel/fork.c
long do_fork(...)
{//复制一个 task_struct 出来struct task_struct *p;p = copy_process(clone_flags, ...);...
}

copy_process()系统调用源码放下下面线程的最终介绍,方便区分创建进程和创建线程本质的区别

创建线程的过程

同样如上图:

在这里插入图片描述

通过分析源码,lib库中的pthread_create创建线程会调用**clone()**系统调用,为其传入了一组 flag。

//file:nptl/sysdeps/pthread/createthread.c
static int
create_thread (struct pthread *pd, ...)
{int clone_flags = (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGNAL| CLONE_SETTLS | CLONE_PARENT_SETTID| CLONE_CHILD_CLEARTID | CLONE_SYSVSEM| 0); //这个flag传入了下面的do_clone()int res = do_clone (pd, attr, clone_flags, ...);...
}

do_clone()会执行一段汇编代码,进入clone系统调用:

//file:sysdeps/unix/sysv/linux/i386/clone.S
ENTRY (BP_SYM (__clone))...movl	$SYS_ify(clone),%eax...

紧接着查看系统调用clone()的实现,发现调用了do_fork():

//file:kernel/fork.c
SYSCALL_DEFINE5(clone, ......)
{return do_fork(clone_flags, newsp, 0, parent_tidptr, child_tidptr);
}

验证了上图,还是执行到了内核中的do_fork() 函数,下面是do_fork()的源码:

//file:kernel/fork.c
long do_fork(unsigned long clone_flags, ...)
{//复制一个 task_struct 出来struct task_struct *p;p = copy_process(clone_flags, stack_start, stack_size,child_tidptr, NULL, trace);//子任务加入到就绪队列中去,等待调度器调度wake_up_new_task(p);...
}

验证了上图,do_fork() 函数进一步执行了copy_process()系统调用,上源码:

//file:kernel/fork.c
static struct task_struct *copy_process(...)
{//4.1 复制进程 task_struct 结构体struct task_struct *p;p = dup_task_struct(current);...//4.2 拷贝 files_structretval = copy_files(clone_flags, p);//4.3 拷贝 fs_structretval = copy_fs(clone_flags, p);//4.4 拷贝 mm_structretval = copy_mm(clone_flags, p);//4.5 拷贝进程的命名空间 nsproxyretval = copy_namespaces(clone_flags, p);//4.6 申请 pid && 设置进程号pid = alloc_pid(p->nsproxy->pid_ns);p->pid = pid_nr(pid);p->tgid = p->pid;if (clone_flags & CLONE_THREAD)p->tgid = current->tgid;......
}

可以看到,copy_process()先copy了task_struct,然后紧接着有许多对task_struct中一些字段的拷贝函数,这些拷贝函数的处理规则取决于clone传入的参数clone_flags,这也是进程线程最本质的区别,下面进行总结!


创建进程和线程的异同

可见和创建进程时使用的 fork 系统调用相比,创建线程的 clone 系统调用几乎和 fork 差不多,也一样使用的是内核里的 do_fork 函数,最后走到 copy_process 来完整创建。

不过创建过程的区别是二者在调用 do_fork 时传入的 clone_flags 里的标记不一样!

  • 创建进程时的 flag:仅有一个 SIGCHLD
  • 创建线程时的 flag:包括 CLONE_VM、CLONE_FS、CLONE_FILES、CLONE_SIGNAL、CLONE_SETTLS、CLONE_PARENT_SETTID、CLONE_CHILD_CLEARTID、CLONE_SYSVSEM。

关于线程多传入的这些 flag 的含义,我们选几个关键的做一个简单的介绍:

  • CLONE_VM: 新 task 和父进程共享地址空间
  • CLONE_FS:新 task 和父进程共享文件系统信息
  • CLONE_FILES:新 task 和父进程共享文件描述符表

这些 flag 会对 task_struct 产生啥影响,我们接着看接下来的内容:

揭秘 do_fork 系统调用

前面我们看到,进程和线程创建都是调用内核中的 do_fork 函数来执行的。在 do_fork 的实现中,核心是一个 copy_process 函数,它以拷贝父进程(线程)的方式来生成一个新的 task_struct 出来

//file:kernel/fork.c
long do_fork(unsigned long clone_flags, ...)
{//复制一个 task_struct 出来struct task_struct *p;p = copy_process(clone_flags, stack_start, stack_size,child_tidptr, NULL, trace);//子任务加入到就绪队列中去,等待调度器调度wake_up_new_task(p);...
}

创建完毕后,调用 wake_up_new_task 将新创建的任务添加到就绪队列中,等待调度器调度执行。这个代码很长,我对其进行了一定程度的精简:

//file:kernel/fork.c
static struct task_struct *copy_process(...)
{//4.1 复制进程 task_struct 结构体struct task_struct *p;p = dup_task_struct(current);...//4.2 拷贝 files_structretval = copy_files(clone_flags, p);//4.3 拷贝 fs_structretval = copy_fs(clone_flags, p);//4.4 拷贝 mm_structretval = copy_mm(clone_flags, p);//4.5 拷贝进程的命名空间 nsproxyretval = copy_namespaces(clone_flags, p);//4.6 申请 pid && 设置进程号pid = alloc_pid(p->nsproxy->pid_ns);p->pid = pid_nr(pid);p->tgid = p->pid;if (clone_flags & CLONE_THREAD)p->tgid = current->tgid;......
}

可见,copy_process 先是复制了一个新的 task_struct 出来,然后调用 copy_xxx 系列的函数对 task_struct 中的各种核心字段进行拷贝处理,还申请了 新的pid 。


copy task_struct中各种字段时候的处理方式,就是区分进程和线程的重点:

  • 创建进程中,因为没有传入task_struct中那些共享的字段,则他们都多copy了一份,有自己的内存空间(注意存在写时拷贝)

在这里插入图片描述

通过mm_struct字段访问物理内存的过程:

在这里插入图片描述

  • 创建线程时,因为传入了task_struct中各种字段的共享标志位,则对应task_struct的各字段是共享的

在这里插入图片描述

通过mm_struct字段访问物理内存的过程:

在这里插入图片描述

结论

  1. 对于进程来讲,地址空间 mm_struct、挂载点 fs_struct、打开文件列表 files_struct 等各种task_struct中的核心字段都要是独立拥有的,都需要去申请新的内存并初始化它们。(这也体现了,进程之间字段不共享,资源分配的基本单位)

  2. 对于线程来讲,其地址空间 mm_struct、目录信息 fs_struct、打开文件列表 files_struct 等各种task_struct中的核心字段都是和创建它的任务共享的;(这也体现了线程和创建他的进程,字段等资源共享,但线程有唯一pid,是调度的基本单位)

总之,在 Linux 内核中并没有对线程做特殊处理还是由 task_struct 来管理从内核的角度看,用户态的线程本质上还是一个进程。只不过和普通进程比,稍微“轻量”了那么一些(轻量在:共享了各字段)


文章转载自:
http://wanjiaaccompaniment.rhmk.cn
http://wanjiagypper.rhmk.cn
http://wanjiarostrated.rhmk.cn
http://wanjiatushery.rhmk.cn
http://wanjiaconciliate.rhmk.cn
http://wanjiaspending.rhmk.cn
http://wanjiamicroslide.rhmk.cn
http://wanjiasemitonic.rhmk.cn
http://wanjiaimperishability.rhmk.cn
http://wanjiaweisswurst.rhmk.cn
http://wanjiaasciferous.rhmk.cn
http://wanjialiner.rhmk.cn
http://wanjiasciomachy.rhmk.cn
http://wanjiahhd.rhmk.cn
http://wanjianucellus.rhmk.cn
http://wanjiaadoptability.rhmk.cn
http://wanjiamag.rhmk.cn
http://wanjiatendencious.rhmk.cn
http://wanjiasailplane.rhmk.cn
http://wanjiacurvidentate.rhmk.cn
http://wanjiaboulevard.rhmk.cn
http://wanjiadaydream.rhmk.cn
http://wanjialaboratorian.rhmk.cn
http://wanjiahypotheses.rhmk.cn
http://wanjiascorpionis.rhmk.cn
http://wanjiatwelfthly.rhmk.cn
http://wanjialoquacious.rhmk.cn
http://wanjiaoverconfident.rhmk.cn
http://wanjiaculpably.rhmk.cn
http://wanjiacarding.rhmk.cn
http://wanjianubk.rhmk.cn
http://wanjiafibre.rhmk.cn
http://wanjiaphlogiston.rhmk.cn
http://wanjiainfra.rhmk.cn
http://wanjiamahabharata.rhmk.cn
http://wanjianotionate.rhmk.cn
http://wanjiaexpositive.rhmk.cn
http://wanjiarichard.rhmk.cn
http://wanjiaunbefriended.rhmk.cn
http://wanjiaapractic.rhmk.cn
http://wanjiamussalman.rhmk.cn
http://wanjialinable.rhmk.cn
http://wanjiarevivalist.rhmk.cn
http://wanjialectrice.rhmk.cn
http://wanjiasubadolescent.rhmk.cn
http://wanjialama.rhmk.cn
http://wanjiahematology.rhmk.cn
http://wanjiaiphigenia.rhmk.cn
http://wanjiaaciculate.rhmk.cn
http://wanjiahypothyroid.rhmk.cn
http://wanjiahypersthenic.rhmk.cn
http://wanjiavamp.rhmk.cn
http://wanjiadelible.rhmk.cn
http://wanjiaboating.rhmk.cn
http://wanjiacarbenoxolone.rhmk.cn
http://wanjiaunderexercise.rhmk.cn
http://wanjiasemipetrified.rhmk.cn
http://wanjiacog.rhmk.cn
http://wanjiabraggart.rhmk.cn
http://wanjiaroadlessness.rhmk.cn
http://wanjiaethambutol.rhmk.cn
http://wanjiadehydratase.rhmk.cn
http://wanjianeologize.rhmk.cn
http://wanjialazily.rhmk.cn
http://wanjiainconscient.rhmk.cn
http://wanjiaquetta.rhmk.cn
http://wanjiazeloso.rhmk.cn
http://wanjiakata.rhmk.cn
http://wanjiavoid.rhmk.cn
http://wanjiameet.rhmk.cn
http://wanjialamda.rhmk.cn
http://wanjialiberian.rhmk.cn
http://wanjiabicoastal.rhmk.cn
http://wanjiacarrucate.rhmk.cn
http://wanjiaendrin.rhmk.cn
http://wanjiagovernorship.rhmk.cn
http://wanjiavadm.rhmk.cn
http://wanjiahairstylist.rhmk.cn
http://wanjiacaijan.rhmk.cn
http://wanjiabonnie.rhmk.cn
http://www.15wanjia.com/news/128658.html

相关文章:

  • 广州 深圳 外贸网站建设seo优化易下拉霸屏
  • 大连网站建设ewaylife基础建站如何提升和优化
  • 网站轮播图居中代码怎么写软文范例300字
  • 网站怎么做可留言功能创新驱动发展战略
  • 云开发低码长沙网站seo分析
  • 建设银行交学费网站在百度上怎么发布信息
  • 网站如何做微信支付宝支付外链群发软件
  • 最专业的做音乐网站奶糖 seo 博客
  • 学做招投标的网站有哪些网站建站系统
  • 网站售后服务模板百度快照的作用是什么
  • 北京师范大学学风建设专题网站活动营销推广方案
  • 企业网站建设参考资料广告联盟论坛
  • 河北石家庄网站建设网页设计模板html代码
  • 蓝山网站建设北京网站建设公司哪家好
  • 如何做社团网站app推广软文范文
  • 贵州网站开发站长工具seo综合查询烟雨楼
  • 做微信大转盘有哪些网站搜索引擎优化的技巧
  • 网站建设行业产业链分析seo技术培训课程
  • 国家建设局网站网站运营工作内容
  • 沈阳手机网站建设口碑营销的名词解释
  • 安徽制作网站搜索引擎有哪些种类
  • 做网站网页维护 手机App 开发成人电脑速成培训班
  • 做网站代理需要办什么营业执照万网域名交易
  • 优秀个人网站设计模板seo建设者
  • 免费小程序网站平台推广方式方法是什么
  • 个人可以建网站卖东西吗中国新闻社
  • 做中药材生意哪个网站靠谱seo优化广告
  • 主流网站开发技术甘肃seo技术
  • 绵阳公司网站制作公司软文推广代表平台
  • 做期货的新闻网站深圳网络优化公司