Linux进程管理(2)

linux进程的五种状态

  • 运行
  • 可中断
  • 不可中断
  • 僵尸
  • 停止

 

遍历父进程和子进程

 

 

注:init进程是作为init_struct静态分配的。

 

进程的创建

linux中通过fork和exec实现进程的创建。fork通过拷贝当前进程来创建一个新的进程,再通过exec加载可执行文件并执行。fork采用的写时拷贝方法避免了不必要数据的拷贝,使得linux可以快速创建进程。

 

Fork

在shell中,执行命令时,shell程序就是通过"复制"形成了父子进程。子进程生成后,执行exec系列函数,载入新的可执行文件,开始执行。
由于复制完成后,子进程马上就要载入新的程序来运行了,在此之前从父进程那里复制来的内存空间都不需要了。所以,"复制"过程中,复制内存空间是件费力不 讨好的事情。
所以,fork有了"写时复制"技术。"复制"的时候内存并没有被复制,而是共享的。直到父子进程之一去写某块内存时,它才被复制。(内核先将这些内存设 为只读,当它们被写时,CPU出现访存异常。内核捕捉异常,复制空间,并改属性为可写。)

vfork

 

vfork最早起源于2.9BSD,它与fork的不同就在于它并不将父进程的地址空间完全复制到子进程中,因为 子进程会立即调用exec。vfork出来的子进程是在父进程的空间中运行的,它的存在就是为了exec调用,所以它不需要复制这些东西,因为复制了也没 有用。如果这时子进程修改了某个变量,这将影响到父进程。vfork保证子进程先运行,在它调用exec或exit后父进程才可能调度运行。而fork的父子进程运行顺序是不定的,它取决于内核的调度算法。

 

Linux线程的实现

 

内核线程

 

内核线程没有独立的地址空间,只运行与内核空间。内核线程通过kernel_thread() 创建:

 

 

 

原文地址:https://www.cnblogs.com/feisky/p/2433263.html