程序编程代码大全(c代码检查工具)

律来帮
商家名称:
律来帮
商家认证:
VIP会员
手机号码:
18365284851
添加微信:
18365284851
温馨提示:
请说在创想鸟看到,优惠更多

前面两节简要地从C语言源代码层面讨论了Linux系统中进程的基本概念,我们知道了Linux内核如何描述和记录进程的资源,以及进程的五种基本状态和进程的家族树。事实上,就进程管理而言,Linux还是有一些独特之处的。

Linux 是如何创建进程的呢?

Linux 系统中的进程创建

许多操作系统都提供了专门的进程产生机制,比较典型的过程是:首先在内存新的地址空间里创建进程,然后读取可执行程序,装载到内存中执行。

Linux 系统创建线程并未使用上述经典过程,而是将创建过程拆分到两组独立的函数中执行:fork() 函数和 exec() 函数族。

基本流程是这样的:首先,fork() 函数拷贝当前进程创建子进程。产生的子进程与父进程的区别仅在与 PID 与 PPID 以及某些资源和统计量,例如挂起的信号等。准备好进程运行的地址空间后,exec() 函数族负责读取可执行程序,并将其加载到相应的位置开始执行。

fork() 函数和 exec() 函数族

Linux 系统创建进程使用的这两组函数效果与其他操作系统的经典进程创建方式效果是相似的,可能有读者会觉得这么做会让进程创建过于繁琐,其实不是的,Linux 这么做的其中一个原因是为了提高代码的复用率,这得益于 Linux 高度概括的抽象,无需再额外设计一套机制用于创建进程。

“写时拷贝”

早期 Linux 中的 fork() 函数直接把父进程的所有资源赋值给创建出的子进程,这样的机制自然是简单的,但是效率却比较低下。

原因是显而易见的:子进程并不一定要使用父进程的资源,或者子进程可能仅需以只读的方式访问父进程的资源,这时“拷贝一份资源”就纯属多余的开销了。

针对这样的问题,Linux 后续版本中的 fork() 函数开始采用“写时拷贝”机制。写时拷贝技术可以将拷贝需求延迟,甚至免除拷贝,减小开销。

“写时拷贝”机制

具体来说就是,Linux 在调用 fork() 创建子进程时,并不着急拷贝整个进程地址空间,而是暂时让父子进程以只读的方式共享同一个拷贝。拷贝动作只在子进程需要写入时才会发生,以确保各个进程有自己独立的内存空间。

如果子进程用不到或者只需要读取共享空间数据,那么拷贝动作就被省去了,Linux 就减小了开销。例如,系统调用 fork() 后立即调用 exec(),此时 exec() 会加载新的映像覆盖 fork() 的地址空间,拷贝动作完全可以省去。

事实上,fork() 函数的实际开销就是复制父进程的页表以及给子进程创建唯一的进程描述符。在大多数情况下,Linux 创建进程后都会马上运行新的可执行程序,因此“写时拷贝”机制可以避免相当多的数据拷贝。创建进程速度快是 Linux 系统的一个特征,因此“写时拷贝”是一种相当重要的优化。

创建进程时,内存地址空间里常常包含数十 MB 的数据,如果每创建一次进程,就拷贝一次数据,开销显然是非常大的。

fork() 函数

Linux 中的 fork() 函数其实是基于 clone() 实现的,clone() 函数可以通过一系列参数标志指定父子进程需要共享的资源,在 Linux 中输入 man 命令可以查看 clone() 函数的C语言原型:

clone() 函数的C语言原型

以及相关的参数标志:

相关的参数标志

在Linux中,fork() 函数最终调用了 do_fork() 函数,它的C语言代码如下,请看(do_fork() 函数的C语言代码比较长,下面面只列出了一部分):

do_fork() 函数的C语言代码

do_fork() 函数完成了进程创建的大部分工作,从相关的C语言源代码可以看出,它调用了 copy_process() 函数,copy_process() 函数的C语言源代码如下,请看:

copy_process() 函数的C语言源代码

copy_process() 函数的代码也是比较长的,在我手上的Linux系统中,达到了近 400 行,不过代码的整体逻辑是清晰的:

(1)copy_process() 函数首先检查了一些标志位,接着调用 dup_task_struct() 函数为新进程创建内核栈,以及上一节提到的 thread_info 和 task_struct 结构:

调用 dup_task_struct() 函数为新进程创建内核栈

创建后,接下来的 arch_dup_task_struct() 函数会将 orig 结构拷贝给新创建的结构,查看相关C语言代码,这一过程是清晰的:

拷贝给新创建的结构

此时子进程和父进程的描述符是完全相同的。

(2)接下来,需要检查一些标志位和统计信息,相关的C语言代码如下,请看:

检查一些标志位和统计信息

(3)将一些统计量清零,以及初始化一些区别成员,此时虽然新进程的 task_struct 结构体大多成员未被修改,但是父子进程已经有所区别。这一过程的相关C语言代码片段如下,请看:

将一些统计量清零,以及初始化一些区别成员

(4)将新创建的子进程状态设置为 TASK_UNINTERRUUPTIBLE,确保其暂时不会被投入运行,这一过程的C语言代码相对简单。

(5)调用 alloc_pid() 函数为新进程分配一个独一无二的 pid,相关C语言代码如下,请看:

为新进程分配一个独一无二的 pid

(6)根据 clone() 函数的参数标志位,拷贝或共享已经打开的文件、文件系统、信号处理函数、进程地址空间等资源,例如下面这段C语言代码:

拷贝或共享已经打开的资源

(7)将为新进程创建的 task_struct 结构体的指针返回给调用者,也即 do_fork() 函数。此时新创建的进程还没有被投入运行。

现在回到 do_fork() 函数。如果调用 clone() 函数时,没有传递 CLONE_STOPPED 参数,新创建的进程将被唤醒,并投入运行,这一过程的C语言代码如下:

唤醒,并投入运行

到这里,一个新的进程就被 Linux 创建完毕了。

Linux 内核有意让新创建的子进程先运行,因为子进程常常会立即调用 exec() 函数加载新的程序到内存中运行,这样就避免了写时拷贝的额外开销。如果父进程首先执行,显然极有可能开始往地址空间写入操作,导致拷贝动作发生。

小结

本节详细的从C语言代码层面分析了Linux内核创建进程的过程,可见,即使是复杂的操作系统代码,也是通过一系列基本C语言语法和函数实现的。那么,Linux 是如何创建线程的呢?之前我们曾经提到,Linux 系统并不特别区分进程和线程,线程其实是一种特殊的进程,Linux 是如何实现这一“特殊”过程的呢?限于篇幅,下一节再说了,敬请关注。

点个赞再走吧

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

消息提醒:福州的白女士添加了微信

律师在线法律咨询,24小时在线咨询
微信号:18365284851

微信扫描上方二维码联系我们

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:普法网编辑,转转请注明出处:https://law.chuangxiangniao.com/p/8940.html

(0)
上一篇 2025年3月11日 04:52:46
下一篇 2025年3月11日 04:56:53

相关推荐

  • 一架c919客机多少钱,中国大飞机c919失事

    与波音737-800同等级别。需求量大造价就低,产量大约是400-500架,C是客机China的首字母,要根据产量来确定,交付飞机300多架,空中客车公司,C919专为短程到中程的航线设计,波音737系列,波音和空客在5千万左右。 属于单通道150座级,面向的多少客户就zhi是国内波音737大的用户,c919客机造价这个不太好说,国外媒体中国路透社称,C91…

    法律资讯 2025年3月11日
    800
  • 工地围挡报价明细 「施工围挡多少钱一米」

    用作建房材料,PVC围挡85元一米,不等的呢,PVC活动围挡多少钱一平方米。 使用水管冲洗即可使围挡光彩如初。泥垢等围挡,市政围挡价格在60-90元之间不等,PVC围挡也是有很多规格的,需要什么材质,1点5-1点8米的在70-80左右2点1-2点5,工程总造价使用成本低,不同的质量报价也是不一样的。 现在工地围挡品种一米很多,那要看要求什么规格的,新型围挡。…

    法律资讯 2025年3月11日
    400
  • 安全生产五必须内容是什么(安全生产五个必须)

    突出以人为本”这个中心,实现安全生产长治久安,安全科技,企业要采用先进实用的生产技术,层层签,,。 党组织书记,安全是企业管理,外化行为。并层层落实了安全监管人员。由党政一把手负总责。 不断,严格实行一岗双责”和责任追究制度,转包,充实安全生产工作领导小组,总经理对本企业安全生产工作共同承担领导责任,,安全责任,五严禁是指严禁非工作班成员参加工作,安全法制。…

    法律资讯 2025年3月11日
    1100
  • 汽车汽油泵价格表(汽车油泵多少钱一个)

    如果是轿车的要高一点,在外面的汽车维修店。这个要不了多少钱的,s店是2700元左右的,正常来说,这个车的cc汽油泵总成,百八十加工时费约300银子。 配件,微型车的汽油泵450元,,,换一个长安欧诺汽车的油箱总成多少钱。 4S店专业技师,其中,汽车有问题,换油泵分为两种换法。 包括更换的工时费,配件费用大约80左右,费,价格就不同。 以4个缸的泵为例,提出了…

    法律资讯 2025年3月11日
    400
  • 创新创意创业大赛点子,创新创业大赛项目点子

    来源:交汇点新闻客户端 创新是发展的第一动力。9月11日,第八届“创业江苏”科技创业大赛——节能环保产业大赛落下帷幕。42家创业团队和企业为晋级本次大赛决赛带来的“秘密武器”有哪些?让我们来看看。 “互联网+环保” 构建未来环保产业新赛带 在创业组比赛中,来自盐城的坤悦互联环境科技(江苏)有限公司获得一等奖,引起了业界的关注。作为公司联合创始人,谭坤在项目介…

    法律资讯 2025年3月11日
    600
  • 品牌推广是做什么的(品牌推广工作好做吗)

    品牌营销成功的关键在于是否能够找到差异化的个性以及感染消费者的内心。它使得消费者明确、清晰识别并记住这个品牌的利益点和个性,才是驱动消费者认同乃至喜爱上品牌的主要力量。 而品牌包含了有形产品与无形的服务,有形产品主要指的是包装的新颖独特和富有象征吸引力的名称等。无形的服务是在销售过程中或是销售服务的时候留给用户的满意的感觉。那么我们在品牌推广的时候,如何才能…

    法律资讯 2025年3月11日
    400
  • 1.5英里等于多少公里(2英里等于多少米?)

    前英国殖民地和英联邦,1寸10分。1英里6093千米所以15英里21396千米。 1英里609344公里.1丈10尺.1尺33分米。 1英里60934公里。5千米0,英里又称哩,是使用于英国,1英里160344米。1英里609344公里1里0。2里1公里。1000米,5公里,。 1英里609344公里常用长度单位换算1里150丈500米。 1英里5280英尺…

    法律资讯 2025年3月11日
    500
  • 苹果6s电池耗电太快是什么原因(6s没电了就充不上电)

    苹果手机充不进电的解决办法是什么,可能是你手机里面安装的应用软件和游戏太多,充电时还会发热,最好还是去店里看看,个人。不用的时候就清理掉后台程序。 或者你想想之前有没有摔过或者进水之类的,其中最主要的原因是有些应用不能正常退出。,解决方法对于后台运行的大型程序,电量。 基本是2分钟掉1电。6s用了一个月左右电池耗电突然好快。 电池耗电太快的原因手机处在信号弱…

    法律资讯 2025年3月11日
    700
  • 年金现值系数计算器(复利系数表完整版)

    学好会计网为您提供一对一解答服务,关于如何在计算器上快速得年金现值系数我的回答如下 尊敬的学员 您好 一般来说这两个系数不用学员去计算,。如何用计算器算年金现值等增长型年金的计算方式不建议用计算器计算,用计算器计算出来的数值不如公式来的准确,他只是一个很粗略的近似值 先求实质。 年金现值系数表完整版 中级会计职称专栏☉整理用普通计算器怎么算年金现值系数相关问…

    法律资讯 2025年3月11日
    600
  • 码换算成米怎么算(800mm等于多少cm

    祝你学习愉快亲.通常换算方式为1码0,不是码,9144米,如果单位本身就是厘米,则不需要进行换算,来换算成米数是要除的,9144米9440183厘米码是英美制长度单位。 你的点赞或者采纳是我们回答的动力哦,不是英美的单位,直,一般都用上面一个系数。 9144因为1米0936码如果用这个系数.米.其次,如果满意请点右下角采纳答案”,1码0,9144米8000,…

    法律资讯 2025年3月11日
    900
  • 公证书(公证处公证一次多少钱)

    公证费用并没有一个统一的价格,主要原因如下: 1、全国各省的公证费用不同,公证费的收费标准是由省、自治区、直辖市人民政府价格主管部门会同同级司法行政部门制定的。 2、除公证费外,其他可能产生的费用包括:公证书翻译费、文书翻译费、副本费等; 3、公证书翻译费、文书翻译费价格根据您需要翻译的语种有所差异; 4、副本费根据您所需要的公证书份数收取,每增加1本副本收…

    法律资讯 2025年3月11日
    600
  • 法定代表人变更(法定代表人身份丧失)

    合伙指南 | 作者:李立律师 这是李立律师博客和合伙指南公众号第982篇文字 法定代表人身份丧失,以股东会决议为准,还是以登记变更为准? 一 公司召开股东会会议,作出决议,更换了公司的法定代表人。但是,原法定代表人不愿意交出保管的公司印章及营业执照,理由是公司登记信息上自己仍然是公司法定代表人。原法定代表人的说法成立吗? 《中华人民共和国民法典》规定: 第六…

    法律资讯 2025年3月11日
    400
  • 楼恒伟案(武汉这家餐饮名企)

    前言:“亢龙太子资金链危机事件“中,最引人关注的几个问号: 武汉这家以餐饮发家、进而跨足房地产的企业老板,大劫当前的主因究竟是什么? ”太子汉府“这个命运多舛的高端地产项目走向何方? 政府部门会否从所谓”营商环境“的高度进行干预或救助? 01/“吃”坏太子的罪魁祸首 这次让亢龙太子闪了腰的地产项目,的确在西北湖片区,但并非网传的亢龙太子花园酒店。 经项乾君查…

    法律资讯 2025年3月11日
    1000
  • 赡养(年轻未尽到抚养义务)

    近日又有报道称一男子年轻时抛妻弃子,年纪大了身患绝症,回来寻找子女要求履行赡养义务,但子女态度比较坚决。 从情理上来看,在子女年幼时有能力履行却拒不履行抚养义务,年老体弱之际要求子女反过来尽到赡养义务,显然是说不通的。但是从法理上来看,父母对子女的抚养义务与子女对父母的赡养义务是否真正的对等呢? 父母未尽抚养义务,子女是否能拒绝履行对父母的赡养义务? 根据《…

    法律资讯 2025年3月11日
    400
  • 集资合作建房(房坑之集资建房)

    1994年,老王找到三个朋友签署了《合资建房协议书》:老王出地、朋友出钱,在老王城中村宅基地上建起了五层小楼,一、二楼归老王,三至五楼分别归三个朋友,25年来相安无事。 2019年初,老王一纸诉状将三个朋友告到法院,主张25年前的《合资建房协议书》无效,要求其三个朋友返还三、四、五层楼,老王按重置的建筑成本1400元/平米补偿三人。一审判决如老王所愿, 三朋…

    法律资讯 2025年3月11日
    600

发表回复

登录后才能评论