进程、轻量进程、线程

学习计算机系统很好的网站:http://www.brokenthorn.com/Resources/OSDevIndex.html

                                                                                   http://wiki.osdev.org/Main_Page

 

进程是正在执行程序的一个实例。可以认为是数据结构的集合,这个集合详细描述了程序的执行情况。

  进程创建时继承了父进程的地址空间且与父进程执行同样的代码,但它们有各自的数据,子进程对数据的改变对父进程是不可见的。

  为更好的支持多线程应用,Linux使用轻量进程。两个轻量进程共享某些资源,如地址空间,打开的文件等。当其中一个修改共享资源时,另一个可以立即看到变化,不过在访问共享资源时进程间需同步。实施多线程应用的一个简单方法就是将一个轻量进程与每个线程相关联。通过共享相同的存储地址空间,相同的打开文件等,线程可以访问相同的应用数据堆栈集。同时,每个线程可以由内核单独调度,一个处于休眠而另一个处于运行态。

  进程的各项参数存储在进程描述符。进程描述符由很多域组成。进程状态域由系列标志组成,它们是互相排斥的:一个被置位时,其余的被清除。以下是可能的进程状态:

  TASK_RUNNING -- 进程正由CPU执行或等待执行。

  TASK_INTERRUPTIBLE -- 进程被挂起直到某些条件为真。硬中断、进程等待的系统资源被释放或传递一个信号是唤醒进程的条件。

  TASK_UNINTERRUPTIBLE -- 类似于TASK_INTERRUPTIBLE,除非向休眠进程传递一个信号,否则状态不变。

  TASK_STOPPED -- 进程接收SIGSTOP,SIGTSTP,SIGTTIN或SIGTTOU信号后终止执行。

  TASK_TRACED -- 调试器终止进程执行。当进程受另一个进程监控时,每个信号可能将进程置于此状态。

  EXIT_ZOMBIE -- 进程已被终止,但父进程还未调用wait4( )或waitpid( )来返回僵死进程的信息。在调用类似wait( )之前,内核不能丢弃僵死进程描述符中的数据,因为父进程仍可能需要它。

  EXIT_DEAD -- 最终状态。父进程已调用wait4( )或waitpid( ),进程被系统终结。从EXIT_ZOMBIE状态到EXIT_DEAD状态,避免由于其他线程对同一个进程调用类似wait( )而产生竞争情况。

  用户通过PID对进程进行识别,PID存储于进程描述符的pid域。PID是顺序增加的,紧接着前一个进程号。PID有上限,当内核到达这个上限时会从较低未用PID编号从新开始。

  进程列表将所有已存在的进程描述符串在一起。每个task_struct结构有tasks域,这个域是list_head类型,list_head中的prev和next域指向前一个和后一个task_struct元素。进程列表的头是init_task task_struct描述符,也就是被称为0号进程的进程描述符。init_task的tasks->prev指向这个列表的最后一个进程描述符的tasks域。

  早期的Linux版本将所有可运行进程放在同一个被称为runqueue的列表中,这迫使调度器遍历整个列表来选择一个最佳的可运行进程,这样开销会很大。2.6版本之后将runqueue分裂为多个列表,每个列表都对应了一个进程优先级。每个task_struct描述符包括一个run_list域,这个域的类型为list_head。如果进程优先级为k(0-139),run_list就将进程描述符链接到进程优先权为k的可运行进程列表。所有的runqueue列表由单个prio_array_t数据结构进行管理。

  进程有父/子关系,当一个进程创建了多个子进程后,这些子进程之间也有兄妹关系。进程描述符的某些域用来表示这些关系。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值