第六周总结

 

进程

进程就是处于执行期的程序。
进程就是正在执行的程序代码的实时结果。
进程是处于执行期的程序以及相关的资源的总称。
进程包括代码段和其他资源。

线程

执行线程,简称线程,是在进程中活动的对象。
内核调度的对象是线程而不是进程。
Linux对线程并不特别区分,视其为特殊的进程。

虚拟处理器和虚拟内存

在现代操作系统中,进程提供两种虚拟机制:虚拟处理器虚拟内存
包含在同一个进程中的线程可以共享虚拟内存,但是每个都拥有各自的虚拟处理器。

几个函数

  • fork():创建新进程
  • exec():创建新的地址空间并把新的程序载入其中clone():
  • fork实际由clone实现exit():退出执行
  • wait4():父进程查询子进程是否终结
  • wait()、waitpid():程序退出执行后变为僵死状态,调用这两个消灭掉。

     进程描述符及任务结构

    内核把进程的列表存放在叫做任务队列的双向循环链表中。链表中的每一项都是进程描述符。
    进程描述符中包含的数据能完整地描述一个正在执行的程序,它打开的文件,进程的地址空间、挂起的信号、进程的状态等。

 

分配进程描述符

Linux通过slab分配器分配task_struct结构——能达到对象复用缓存着色的目的。
slab分配器——动态生成,只需在栈底或者栈顶创建一个新的结构struct thread_info。

进程描述符中的state域是用来描述进程当前状态的。共有五种状态,标志如下:

  • TASK_RUNNING(运行):进程是可执行的,或者正在执行,或者在运行队列中等待执行
  • TASK_INTERRUPTIBLE(可中断):进程正在睡眠/被阻塞
  • TASK_UNINTERRUPTIBLE(不可中断):睡眠/被阻塞进程不被信号唤醒
  • TASK_TRACED:被其他进程跟踪的进程
  • TASK_STOPPED(停止):进程停止执行;进程没有投入运行也不能投入运行接收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU等信号时,或者调试时收到任何信号,都可以进入这种状态。

 进程上下文

内核“代表进程执行”并处于进程上下文时,上下文中current宏是有效的,除非在此间隙有更高优先级的进程需要执行并由调度器做出了相应调整,否则在内核退出的时候,陈谷恢复在用户空间会继续执行。
程序执行系统调用或者触发异常后,会陷入内核空间,这时候内核代表进程执行,并且处于进程上下文中。
进程对内核的访问必须通过接口:系统调用和异常处理程序。

 进程家族树

所有的进程都是pid为1的init进程的后代。
内核在系统启动的最后阶段启动init进程。

系统中的每一个进程必有一个父进程,可以拥有0个或多个子进程,拥有同一个父进程的进程叫做兄弟。
这种关系存放在进程描述符中,parent指针指向父进程task_struct,children是子进程链表。

线程在Linux中的实现

线程机制是现代编程技术中常用的一种抽象概念,该机制提供了在同一程序内共享内存地址空间运行的一组线程,可以共享打开的文件和其他资源,支持并发程序设计,在多处理器系统上可以保证真正的并行处理。
Linux内核的角度来看并没有线程这个概念,它把所有线程都当做进程来实现,线程仅仅被视为一个与其他进程共享某些资源的进程。
对于Linux来说,线程只是一种进程间共享资源的手段。

进程终结

进程终结时,内核必须释放它所占有的资源并告知父进程。
进程终结的原因:一般是来自自身,发生在调用exit()系统调用时。
  • 显式的调用
  • 隐式的从某个程序的主函数返回
 

 

posted @ 2016-04-03 11:38  20135331文艺  阅读(224)  评论(0编辑  收藏  举报