进程和线程的区别与联系

129 阅读2分钟

进程

进程是操作系统在执行任务时的一种动态的抽象化体现,每一个运行起来的程序都会对应一个进程或多个进程。

进程内部的结构有:

  • PID(进程ID,作为区分系统中不同进程的标识);

  • 内存指针(记录了这个进程占用的内存区域);

  • 文件描述符表(记录了进程占用了哪些硬件资源);

  • 进程调度的相关属性

    • 进程的状态:如是在就绪态、运行态还是阻塞态等;
    • 优先级:操作系统针对不同的进程会分配不同的优先级,优先级高的可以先被调度到CPU上执行;
    • 上下文信息:当某个进程被切出CPU时,需要先保存当前进程已经执行了哪些指令,就是将CPU寄存器中的数据保存到内存中,当此进程下次再被调度到CPU上进行时,根据保存的信息恢复到上次的状态。
    • 记账信息:描述了当前进程在CPU上执行时长,指向了多少条指令等,然后操作系统会根据这些来决定之后的调度;

操作系统为了描述这些结构,给它们起了个名叫 PCB(Process Control Block),同时操作系统会把正在运行的所有进程都组织起来,类似像使用双向链表这种数据结构给串起来。

线程

因为创建或销毁进程的开销太大了,针对每个进程都维护需要上述这些信息,而且进程去CPU上调度开销也比较大。为此,操作系统引入了线程的概念,将进程作为资源分配的最小单位,每个进程可以包含多个线程,并将线程作为CPU调度的最小单位,进程内的所有线程会共享分配给这个进程的内存、文件描述符表这些资源,而像调度状态、优先级、上下文信息、记账信息这些,每个线程都独有一份,这样就减轻了资源分配和回收的压力。

因为多个线程会共享进程的内存资源,所以一定要注意线程安全问题。