1894|6

6482

帖子

8

TA的资源

管理员

楼主
 

阅读打卡第七站:进程管理之基本概念 ——《奔跑吧Linux内核(第2版)卷1》 [复制链接]

>>点此进入阅读打卡总站,查看所有打卡题目

 

阅读小伙伴们,第七站打卡 题目开启:@paope    、@费炜 @lemonboard @chejia12 @maskmoo @硬核王同学 @小默叔叔 @yin_wu_qing @meiyao

预计阅读完《奔跑吧Linux内核(第2版)卷1:基础架构》第七章可解答。

作者笨叔给了的本章打卡题目:

1.进程是什么?
2.操作系统如何描述和抽象一个进程?
3.进程是否有生命周期?
4.如何标识一个进程?
5.进程与进程之间的关系如何?
6.Linux操作系统的第0个进程是什么?
7.Linux操作系统的第1个进程是什么?
8.请简述fork()、vfork()和clone()之间的区别。

 

 

 

论坛有开设嵌入式交流群,欢迎感兴趣的小伙伴,微信添加“helloeeworld”为好友,对话:加入嵌入式交流群,入群交流。

扫码,对话:加入嵌入式交流群。

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

最新回复

1. 我们将程序与进程一起来讲便于区分。程序是我们编写的代码经过编译生成的二进制可执行文件,而“进程”是执行中的一个程序。有别于存储在硬盘中的文件。 2. 进程是操作系统中调试的一个实体,需要对进程所拥有的资源进行抽象。这个抽象模块称为进程模块Process Control Block, PCB。在Linux内核中采用一个名为task_struct的结构体(定义在include/linux/sched.h头文件中) 3. 进程也有生命周期,典型的操作系统中进程状态如下图所示,即包含创建态,就绪态,运行态,阻塞态,终止态。 4. 进程通过唯一的进程标识符(Process ID,Pid)来进行标识。 5. 还挺复杂的,使用了4个成员变量来表示进程间的关系。 | 成员 | 描述 | | ------------- | ------------------------------- | | real_parent   | 指向创建了进程A的描述符,如果进程A的父进程不存在了,则指向进程1(init进程)的描述符 | | parent        | 指向进程的当前父进程,通常和real_parent一致                  | | children      | 所有的子进程都链接成一个链表,这是链表头                     | | sibling       | 所有兄弟进程都链接成一个链表,链表头在父进程的sibling成员  | 6. 进程0是指kernel初始化阶段创建的第一个内核进程,其是所有进程的祖先。 7. 进程1是指在进程0创建完成后,创建的另一个进程,其会执行kernel_init()函数,调用execve()系统调用来装入可执行程序init,最后变成一个普通进程。 8. fork()原语是POSIX标准中定义的基本进程创建函数。使用fork()函数来创建子进程时,子进程和父进程有各自独立的进程地址空间。vfork()的父进程会一直阻塞,直到子进程调用exit()或exceve()为止。clone()用于创建用户线程,其可传递众多参数,可以有选择地继承父进程地址空间,甚至可以创建兄弟关系进程。  详情 回复 发表于 2024-1-26 23:21
点赞 关注
个人签名微信搜索公众号“EEWORLDBBS”快去添加关注吧!

回复
举报

220

帖子

1

TA的资源

一粒金砂(高级)

沙发
 

1. 进程是计算机中运行中的程序的实例,它包括程序计数器、寄存器集合和内存空间。

2. 操作系统通过进程控制块(PCB)来描述和抽象一个进程,其中包括进程状态、程序计数器、内存指针等信息。

3. 是的,进程有生命周期,包括创建、就绪、运行、阻塞和终止等阶段。

4. 进程通过唯一的进程标识符(PID)来进行标识。

5. 进程之间可以是父子关系,也可以通过进程间通信(IPC)进行交互。

6. Linux操作系统的第0个进程是调度进程(sched)。

7. Linux操作系统的第1个进程是init进程,其PID为1。

8. fork()创建子进程时会复制父进程的内存空间,vfork()则共享父进程的内存空间,而clone()提供了更灵活的选项,可以控制子进程与父进程之间的共享程度。

 
 

回复

226

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
本帖最后由 yin_wu_qing 于 2024-1-11 22:44 编辑
  1. 进程是什么?
    顾名思义,进程是执行中的程序,即一个程序加载到内存后变成了进程,公式表达如下:进程 = 程序 + 执行
    进程是一段执行中的程序,是一个有“生命力”的个体。一个进程除了包含可执行的代码(如代码段),还包含进程的一些活动信息和数据,如用来存放函数形参、局部变量以及返回值的用户栈,用于存放进程相关数据的数据段,用于切换内核中进程的内核栈,以及用于动态分配内存的堆等。进程是用于实现多进程并发执行的一个实体,实现对CPU的虚拟化,让每个进程都认为自己独立拥有一个CPU。实现这个CPU虚拟化的核心技术是上下文切换以及进程调度。
  2. 操作系统如何描述和抽象一个进程?
    进程是操作系统中调度的一个实体,需要对进程所拥有的资源进行抽象,这个抽象形式称为进程控制块(Process Control Block,PCB),本书也称其为进程描述符。进程描述符是用于描述进程运行状况以及控制进程运行所需要的全部信息,是操作系统用来感知进程存在的一个非常重要的数据结构。任何一个操作系统的实现都需要有一个数据结构来描述进程描述符,所以Linux内核采用一个名为task_struct的结构体。task_struct数据结构包含的内容很多,它包含进程所有相关的属性和信息。
  3. 进程是否有生命周期?
    在进程的生命周期内,进程要和内核的很多模块进行交互,如内存管理模块、进程调度模块以及文件系统模块等。因此,它还包含了内存管理,进程调度、文件管理等方面的信息和状态。Linux内核把所有进程的进程描述符task_struct数据结构链接成一个单链表(task_struct->tasks),task_struct数据结构定义在include/linux/sched.h文件中。
  4. 如何标识一个进程?
    在创建时会分配唯一的号码来标识进程,这个号码就是进程标识符(Process Identifier,PID)。PID存放在进程描述符的pid字段中,PID是整数类型。为了循环使用PID,内核使用bitmap机制来管理当前已经分配的PID和空闲的PID,bitmap机制可以保证每个进程创建时都能分配到唯一的PID。
    除了PID之外,Linux内核还引入了线程组的概念。一个线程组中所有的线程使用和该线程组中主线程相同的PID,即该组中第一个进程的ID,它会被存入task_struct数据结构的tgid成员中。这与POSIX 1003.1c标准里的规定有关系,一个多线程应用程序中所有的线程必须有相同的PID,这样可以把指定信号发送给组里所有的线程。如一个进程创建之后,只有这个进程,它的PID和线程组ID(Thread Group ID,TGID)是一样的。这个进程创建了一个新的线程之后,新线程有属于自己的PID,但是它的TGID还是指父进程的TGID,因为它和父进程同属一个线程组。
  5. 进程与进程之间的关系如何?
                                                                         进程间的关系
    real_parent 指向创建了进程A的描述符,如果进程A的父进程不存在了,则指向进程1(init进程)的描述符
    parent 指向进程的当前父进程,通常和real_parent一致
    children 所有的子进程都链接成一个链表,这是链表头
    sibling 所有兄弟进程都链接成一个链表,链表头在父进程的sibling成员中
  6. Linux操作系统的第0个进程是什么?
    系统中所有进程的task_struct数据结构都通过list_head类型的双向链表链接在一起,因此每个进程的task_struct数据结构包含一个list_head类型的tasks成员。这个进程链表的头是init_task进程,也就是所谓的进程0。init_task进程的tasks.prev字段指向链表中最后插入进程的task_struct数据结构的tasks成员。另外,若这个进程下面的有线程组(即PID==TGID),那么线程会添加到线程组的thread_group链表中。
  7. Linux操作系统的第1个进程是什么?
    Linux内核初始化函数start_kernel()在初始化完内核所需要的所有数据结构之后会创建另一个内核线程,这个内核线程就是进程1或init进程。进程1的ID为1,与进程0共享进程所有的数据结构。
    进程1会执行kernel_int()函数,它会调用execve()系统调用来装入可执行程序init,最后进程1变成了一个普通进程。这些init程序就是常见的/sbin/init、/bin/init或者/bin/sh等可执行的init以及systemd程序。进程1从内核线程变成普通进程init之后,它的主要作用是根据/etc/inittab文件的内容启动所需要的任务,包括初始化系统配置、启动一个登录对话等。
  8. 请简述fork()、vfork()和clone()之间的区别。
       在Linux内核中,fork()、vfork()、clone()以及创建内核线程的接口函数都是通过调用_do_fork()函数来完成的,只是调用的参数不一样。
       //fork()实现
       _do_fork(SIGCHLD, 0,0,NULL,NULL,0);
       //vfork()实现
       _do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, 0 , 0, NULL, NULL, 0);
       //clone()实现
       _do_fork(clone_flags, newsp, 0, parent_tidptr, child_tidptr, tls);
       //内核线程
       _do_fork(flags|CLONE_VM |CLONE_UNTRACED,(unsigned long)fn,(unsigned long)arg,NULL,NULL,0);
      fork()函数通过系统调用进入Linux内涵,然后通过_do_fork()函数实现。
      fork函数只使用SIGCHLD标志位,在子进程终止后发送SIGCHLD信号通知父进程。fork()是重量级调用,为子进程建立了一个基于父进程的完整副本,然后子进程基于此执行。为了减少工作量,子进程采用写时复制技术,只复制父进程的页表,不会复制页面内容。当子进程需要写入新内容时才触发写时复制机制,并为子进程创建一个副本。
      fork()函数也有一些缺点,尽管使用了写时复制机制技术,但是它还需要复制父进程的页表,在某些场景下会比较慢,所以有了后来的vfork()原语和clone()原语。
      vfork()函数和fork()函数类似,但是vfork()的父进程会一直阻塞,直到子进程调用exit()或者execve()为止。在fork()实现写时复制之前,UNIX系统的设计着很关心fork()之后马上执行execve()所造成的地址空间浪费和效率低下问题,因此设计了vfork()系统调用。
     clone()函数通常用于创建用户线程。在Linux内核中没有专门的线程,而是把线程当成普通进程来看待,在内核中还以task_struct数据结构来描述线程,并没有使用特殊的数据结构或者调度算法来描述线程。
     clone()函数功能强大,可以传递众多参数,可以有选择地继承父进程的资源,如可以和vfork()一样,与父进程共享一个进程地址空间,从而创建线程;也可以不和父进程共享进程地址空间,甚至可以创建兄弟关系进程。
阅读打卡第七站.docx (23.97 KB, 下载次数: 1)
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(高级)

4
 

1.进程是什么?

进程是一段执行中的程序
2.操作系统如何描述和抽象一个进程?

通过进程描述符(PCB),进程描述符中描述了进程的运行状态,程序计数器,CPU寄存器,CPU调度信息,内存管理信息,统计信息和文件相关信息。
3.进程是否有生命周期?

有,进程有包括创建态,就绪态,运行态,阻塞态和终止态计中状态
4.如何标识一个进程?

在创建进程时会分配一个唯一的进程标识符(PID)来标识进程。
5.进程与进程之间的关系如何?

整体上呈现的是一个家族关系。在初始化完成后会创建一个祖先init进程,后续根据线程创建关系有分为父子关系,兄弟关系等。

6.Linux操作系统的第0个进程是什么?

idle进程
7.Linux操作系统的第1个进程是什么?

init进程
8.请简述fork()、vfork()和clone()之间的区别。

三者最终都是通过_do_fork()接口函数的调用实现的,区别是调用的参数不一样。

 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(中级)

5
 

1.进程是什么?

答:进程是执行中的程序,即一个程序加载到内存后变成了进程,公式表达如下:进程=程序+指行
2.操作系统如何描述和抽象一个进程?

答:每个加载到内存中的程序称为进程,操作系统管理着多个进程并发执行。进程会认为自己独占CPU,这是很重要的抽象。进程的抽象是为了提高CPU的利用率,任何的抽象都需要一个物理基础,进程的物理基础便是程序。程序在运行之前需要有一个安身之地,这就要求操作系统在装载程序之前要分配合适的内存。此外,操作系统还需要小心翼翼地处理多个进程共享一块物理内存时可能引发的冲突问题。
3.进程是否有生命周期?

答:进程有生命周期,典型的操作系统中的进程包括创建、就绪、运行、阻塞和终止等状态。
4.如何标识一个进程?

答:在创建时会分配唯一的号码来识别进程,这个号码就是进程标识符。
5.进程与进程之间的关系如何?

答: 进程间的关系

   
real_parent 指向创建了进程A的描述符,如果进程A的父进程不存在了,则指向进程1(init进程)的描述符
parent 指向进程的当前父进程,通常和real_parent一致
children 所有的子进程都链接成一个链表,这是链表头
sibling 所有兄弟进程都链接成一个链表,链表头在父进程的sibling成员中

6.Linux操作系统的第0个进程是什么?

答:进程0是指Linux内核初始化阶段从无到有创建的一个内核进程,他是所有进程的祖先,有好几个别名,如进程0、idle进程或者swapper进程。
7.Linux操作系统的第1个进程是什么?

答:Linux内核初始化函数start_kernel()在初始化完内核所需要的所有数据结构之后会创建另一个内核线程,这个内核线程就是进程1或init进程。
8.请简述fork()、vfork()和clone()之间的区别。

答:在Linux内核中,fork()、vfork()和clone()以及创建内核线程的接口函数都是通过调用_do_fork()函数完成的,只是调用的参数不一样。

 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

6
 
 
 
 

回复

137

帖子

0

TA的资源

一粒金砂(中级)

7
 
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表