zoukankan      html  css  js  c++  java
  • 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() 创建:

     

     

     

  • 相关阅读:
    Vuejs --01 起步
    ajax利用FormData异步文件提交
    格式化JSON数据
    获取url中的参数
    xampp配置多端口访问
    自动识别移动端还是PC端
    一些常见的shell命令和git命令
    网站性能优化之减少HTTP请求
    ajax学习笔记
    canvas随笔
  • 原文地址:https://www.cnblogs.com/feisky/p/2433263.html
Copyright © 2011-2022 走看看