linux内核设计与实现 笔记 第3章进程管理

进程是Unix操作系统最基本的抽象之一,另一个基本抽象是文件。

一个进程就是处于执行期的程序(目标码存放在某种存储介质上)。但进程并不仅仅局限于一段可执行程序代码(Unix称其为代码段(text section))。通常进程还要包括其他资源,像打开的文件、挂起的信号、内核内部数据、处理器状态、地址空间及一个或多个执行线程(thread of execution)、当然还包括用来存放全局变量的数据段等。实际上,进程就是正在执行的程序代码的活标本。

执行线程,简称线程(thread),是在进程中活动的对象。每个线程都拥有一个独立的程序计数器、进程栈和一组进程寄存器。内核调度的对象是线程,而不是进程。在传统的Unix系统中,一个进程只包含一个线程,但现在的系统中,包含多个线程的多线程程序司空见惯。稍后你会看到,Linux系统的线程实现非常特别----它对线程和进程并不特别区分。对Linux而言,线程只不过是一种特殊的进程罢了。

在现代操作系统中,进程提供两种虚拟机制:虚拟存储器和虚拟内存。虽然实际上可能是许多进程正在分享一个处理器,但虚拟存储器给进城一种假象,让这些进程觉得自己在独享处理器。而虚拟内存让进程在获取和使用内存时觉得自己拥有整个系统的所有内存资源。在线程之间(指包含在同一个进程中的线程)可以共享虚拟内存,但拥有各自的虚拟处理器。

程序本身并不是进程,进程是处于执行期的程序以及它所包含的资源的总称。

无疑,进程在它被创建的时刻开始存活。在Linux系统中,这通常是调用fork()系统调用的结果,该系统调用通过复制一个现有进程来创建一个全新的进程。调用fork()的进程被称为父进程,新产生的进程被称为子进程。

通常,创建新的进程都是为了立即执行新的、不同的程序。而接着调用exec*()这族函数就可以创建新的地址空间,并把新的程序载入。在现代Linux内核中,fork()实际上是由clone()系统调用实现的。

最终,程序通过exit()系统调用退出执行。这个函数会终结进程并将其占用的资源释放掉。父进程可以通过wait4()系统调用查询子进程是否终结,这使得进程拥有了等待特定进程执行完毕的能力。进程退出执行后,被设为僵尸状态,直到其父进程调用wait()或waitpid()为止。

进程的另一个名字叫任务(task)。

1.1进程描述符及任务结构

内核把进程存放在叫做任务队列(task list)的双向循环链表中。链表中的每一项都是都是类型为task_struct、称为进程描述符(process descriptor)的结构,该结构定义在<linux/sched.h>文件中。进程描述符中包含一个具体进程的所有信息。


1.1.1分配进程描述符

1.1.2进程描述符的存放


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值