zoukankan      html  css  js  c++  java
  • 程序、进程与线程

    一、程序

      程序是存储在磁盘上, 包含可执行机器指令和数据的静态实体。 即进程或者任务是处于活动状态的计算机程序。

    二、进程

      进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例,即运行中的程序。

      一个运行着的程序,可能有多个进程。进程在操作系统中执行特定的任务。

      程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。

      1.分类:进程一般分为交互进程批处理进程守护进程三类。守护进程总是活跃的,一般是后台运行。 

          守护进程一般是由系统在开机时通过脚本自动激活启动, 或者由超级用户root来启动。

      2.查看进程  :ps /  ps axu /  ps  -efl

      3.获取进程号:getpid

      4.创建子进程:fork

        创建一个子进程,失败返回-1;调用一次,返回两次 分别在父子进程中返回子进程的PID和0。 用返回值的不同,可以分别为父子进程编写不同的处理分支。  

     1 #include <stdio.h>
     2 #include <unistd.h>
     3 
     4 int main () 
     5 {
     6     printf ("%u进程:我要调用fork()了...
    ", getpid ());
     7 
     8     pid_t pid = fork ();
     9     if (pid == -1) 
    10     {
    11         perror ("fork");
    12         return -1;
    13     }
    14 
    15     if (pid == 0) 
    16     {
    17         printf ("%u进程:我是%u进程的子进程。
    ", getpid (),
    18         getppid ());
    19         return 0;
    20     }
    21 
    22     printf ("%u进程:我是%u进程的父进程。
    ", getpid (), pid);
    23     sleep (1);
    24     return 0;
    25 }

        ① 子进程获得父进程数据段堆栈段(包括I/O流缓冲区)的拷贝,但子进程共享父进程的代码段

        ② 函数调用后父子进程各自继续运行 ,其先后顺序不确定, 某些实现可以保证子进程先被调度

        ③ 共享文件表 :函数调用后,父进程的文件描述符表(进程级)也会被复制到子进程中,二者共享同一个文件表(内核级)。

        ④ 总进程数或实际用户ID所拥有的进程数,超过系统限制,该函数将失败。

        ⑤  一个进程如果希望创建自己的副本并执行同一份代码,或希望与另一个程序并发地运行,都可以使用该函数。

        ⑥ 孤儿进程:父进程先于子进程结束,子进程成为孤儿进程,同时被init进程收养,即成为init进程的子进程。

          僵尸进程:子进程先于父进程结束,但父进程没有回收子进程的相关资源,该子进程即成为僵尸进程。

      5.创建子进程vfork  

      该函数的功能与fork基本相同,二者的区别: 

        ① fork():子进程拷贝父进程的数据段,代码段
         vfork( ):子进程与父进程共享数据段,vfork的子进程并不会拷贝父进程的数据区、堆栈区 创建进程的效率比较高

        ② fork()父子进程的执行次序不确定
         vfork保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec或exit 之后父进程才可能被调度运行.

        ③ vfork ()保证子进程先运行,在她调用exec 或exit 之后父进程才可能被调度运行.
         如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁.

    三、线程 

      1.概念  

        A、线程就是程序的执行路线,即进程内部的控制序列,或者说是进程的子任务。
        B、线程,轻量级,不拥有自己独立的内存资源,共享进程的代码区、数据区、堆区(注意没有栈区)、环境变量和命令行参数、文件描述符、信号处理函数、当前目录、用户ID和组ID等资源。
        C、线程拥有自己独立的栈,因此也有自己独立的局部变量。
        D、一个进程可以同时拥有多个线程,即同时被系统调度的多条执行路线,但至少要有一个主线程。

      2.特点

        A、线程是进程的一个实体,可作为系统独立调度和分派的基本单位。
        B、线程有不同的状态,系统提供了多种线程控制原语,如创建线程、销毁线程等等。
        C、线程不拥有自己的资源,只拥有从属于进程的全部资源,所有的资源分配都是面向进程的。
        D、一个进程中可以有多个线程并发地运行。它们可以执行相同的代码,也可以执行不同的代码。
        E、同一个进程的多个线程都在同一个地址空间内活动,因此相对于进程,线程的系统开销小,任务切换快。
        F、线程间的数据交换不需要依赖于类似IPC的特殊通信机制,简单而高效。
        G、每个线程拥有自己独立的线程ID、寄存器信息、函数栈、错误码和信号掩码。
        H、线程之间存在优先级的差异。

      3.创建线程 :pthread_create

      4.等待线程:pthread_join

      5.获取线程自身ID:pthread_self

      6.比较两个线程:pthread_equal

      7.线程分离:int pthread_detach (pthread_t thread);

            使thread参数所标识的线程进入分离(DETACHED)状态。

            处于分离状态的线程终止后自动释放线程资源,且不能被pthread_join函数等待

      8.终止线程:pthread_exit

      9.取消线程:pthread_cancel

     

    总结:

      一、程序与进程的联系与区别

          ① 进程是动态的,而程序是静态的。
          ② 进程有一定的生命期,而程序是指令的集合,本身无“运动”的含义。没有建立进程的程序不能作为1个独立单位得到操作系统的认可。
          ③ 1个程序可以对应多个进程,但1个进程只能对应1个程序。进程和程序的关系犹如演出和剧本的关系。
          ④ 进程和程序的组成不同。从静态角度看,进程由程序、数据和进程控制块(PCB)三部分组成。而程序是一组有序的指令集合。

      二、进程与线程的联系与区别

        联系:

          ① 线程是进程的最小执行和分配单元,不能独立运动,必须依赖于进程,这也就可以说众多的线程组成了进程。

          ② 资源分配给进程,同一进程的所有线程共享该进程的所有资源。

        区别:

          ① 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位

          ② 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行

          ③ 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.

          ④ 系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

          

  • 相关阅读:
    感觉跟奇怪
    人多
    淡忘
    可疑
    js判断对象是否为空对象的几种方法
    互联网隐私泄漏
    清明时节
    垃圾mac
    【ES6】---JavaScript(二)
    【微信小程序】---Socket聊天功能实现
  • 原文地址:https://www.cnblogs.com/jiangyu0331/p/11652485.html
Copyright © 2011-2022 走看看