Linux内核设计与实现——进程管理

Linux内核设计与实现——进程管理

进程

  • 进程就是处于执行期的程序,但不仅仅是可执行程序代码,通常还要包含其他资源,像打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个或多个执行线程,以及用来存放全局变量的数据段等
  • 进程就是正在执行的程序代码的实时结果
  • 执行线程,简称线程(thread),是在进程中活动的对象。每个线程都拥有一个独立的程序计数器、进程栈和一组进程寄存器。内核调度的对象是线程,而不是进程。传统UNIX系统中,一个进程只包含一个线程。而Linux对线程和进程并不特别区分,线程只不过是一种特殊的进程罢了
  • 进程提供两种虚拟机制:虚拟处理器和虚拟内存
  • 同一进程中的线程之间可以共享虚拟内存,但每个都拥有自己的虚拟处理器
  • 进程在创建它的时刻开始存活
  • Linux系统中,通过调用fork()复制一个现有进程来创建一个全新的进程。调用fork()的进程称为父进程,新产生的进程称为子进程。在该调用结束时,在返回这个相同位置上,父进程恢复执行,子进程开始执行。fork()系统调用从内核返回两次:一次回到父进程,另一次回到新产生的子进程
  • 通常,创建新的进程都是为了立即执行新的、不同的程序,而接着调用exec()这组函数就可以创建新的地址空间,并把新的程序载入其中。现代Linux内核中,fork()实际上是由clone()系统调用实现的
  • 最终,程序通过exit()系统调用推出执行。这个函数会终结进程并将其占用的资源释放掉。父进程可以通过wait4()系统调用查询子进程是否终结,这其实使得进程拥有了等待特定进程执行完毕的能力。进程推出执行后被设置为僵死状态,知道他的父进程调用wait() or waitpid()

进程描述符及任务结构

  • 任务队列:内核把进程的列表放在叫做任务队列的双向循环链表中
  • 进程描述符:链表中的每一项都是task_struct、称为进程描述符的结构,该结构定义在<linux/sched.h>文件中。进程描述符中包含一个具体进程的所有信息
  • 进程描述符中包含的数据能完整地描述一个正在执行的程序:它打开的文件,进程的地址空间,挂起的信号,进程的状态,还有其他更多信息

分配进程描述符

  • Linux通过slab分配器分配task_struct结构,这样能达到对象复用和缓存着色的目的

  • 在x86上,struct thread_info在文件<asm/thread_info.h>中定义如下:

    struct thread_info {
         
        struct task_struct		
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值