进程和线程的区别是老八股文了。这里要好好学习。

文章目录

1 进程综述

1.1 历史变化的角度

1.1.1 进程

我之前是做单片机的嘛,所以从我的经历来说。一开始是程序员直接录入裸机程序跑,那时候你的程序在cpu上需要直接跟周围IO设备交互,不需要经过io控制器。
后来逐步提取了公共程序,比如汇编器,以及简单的执行库。
类似DOS这种操作系统出现,多个程序要执行,那么这个时候,进程就是“执行或者可供调用的程序实体,负责管理对应程序的执行资源,比如CPU周期,内存,IO。

1.1.2 线程

后来大家发现进程之间通信起来,共享资源太重了,希望有轻量级的“进程”有独立的执行栈,但是共享代码跟数据段,甚至整个内存空间。方便快速的通信,于是有了线程的需求,这时候进程内部有了至少一个执行线程(),而同时对于内核调度,其实所有线程都会对接真正的CPU资源,这个负责执行的,就是所谓的内核线程,

1.1.3 协程

1.2 三者区别

进程是一个程序的被分配的资源,线程是cpu调度和执行的对象。
linus都说过这两个没有严格意义上的区别。
感觉实际使用的时候线程主要是为了省内存,协程省操作系统的调度开销

1.3 多线程与多进程

linux里的多线程,就是共享同一段内存的多个进程。

1.4 进程

一个进程可以被认为是一个正在执行的程序。一个进程将需要某些资源来完成它的任务,例如CPU的哪些周期给这个进程、内存、文件和I/O设备。这些资源是在进程创建或执行时分配给它的。

在大多数系统中,进程是工作单元。系统由一组进程组成:操作系统进程执行系统代码,用户进程执行用户代码。所有这些进程都可以并发执行。

尽管传统上一个进程在运行时只包含一个控制线程,但大多数现代操作系统现在支持具有多个线程的进程。

操作系统负责进程和线程管理的几个重要方面:创建和删除用户和系统进程;进程的调度;以及同步、通信和死锁处理机制的提供。

2 进程

2.1 概念

job VS process VS task: https://www.baeldung.com/cs/job-vs-task-vs-process
一个task组成多个job,某些情况下,task和process是一样的。

进程就是内存中执行的一个程序。启动new、就绪ready、运行run、等待wait和终止terminate五个步骤。
程序是磁盘上的一个可执行文件,当程序进入内存后,程序成为了一个进程。多个用户运行同一个程序,一个程序就成为了多个进程。

2.2 内存中的进程

操作系统(三)进程_子进程


操作系统(三)进程_子进程_02


操作系统(三)进程_操作系统_03

2.3 进程控制块(PCB process control block)

进程控制块(Processing Control Block),是操作系统核心中一种数据结构,主要表示进程状态。 或者说,OS是根据PCB来对并发执行的进程进行控制和管理的。

  • Process state – running, waiting, ready, new, terminated.
  • Program counter – location of instruction to next execute
  • CPU registers – contents of all process-centric registers
  • Memory-management information – memory allocated to
    the process
  • I/O status information – I/O devices allocated to process,
    list of open files
  • CPU scheduling information- priorities, scheduling queue
    pointers
  • Accounting information – CPU used, clock time elapsed
    since start, time limits
  • 操作系统(三)进程_多线程_04

2.4 进程状态

操作系统(三)进程_子进程_05


这里可以跟随PPT的图片变化理解整个过程。

2.5 CPU进程切换

操作系统(三)进程_多线程_06


操作系统(三)进程_子进程_07

2.5.1 上下文切换

操作系统(三)进程_操作系统_08


上下文切换是需要时间的,这断时间内,操作系统没干有意义的工作。时间和硬件有关系。这个时间是日常开销,无法省略。

操作系统(三)进程_多线程_09

2.6 Ready Queue And Various I/O Device Queues

现在的操作系统都是多线程,同时在内存中,等待cpu的调用。

操作系统(三)进程_父进程_10


ready queue: 放在内存中准备被cpu执行的进程队列

Process scheduler : 从队列中选择进程交给cpu

Device queue / IO queue: 准备使用io设备的进程队列

2.6.1 进程在队列间的迁移(看pdf的图对应)

操作系统(三)进程_父进程_11

2.7 调度器(scheduler)

  • ​Short-term scheduler (or CPU scheduler)​​ – selects which process should be executed next and allocates CPU
  • Sometimes the only scheduler in a system
  • Short-term scheduler is invoked frequently (milliseconds) -> (must be fast)
  • ​Long-term scheduler (or job scheduler)​​ – selects which processes should be brought into the ready queue
  • Long-term scheduler is invoked infrequently (seconds, minutes)  (may be
    slow)
  • The long-term scheduler controls the degree of multiprogramming
  • ​Medium-term scheduler​​ can be added if degree of multiple programming needs to decrease
  • Remove process from memory, store on disk, bring back in from disk to
    continue execution: swapping

2.7.1 IO绑定和CPU绑定

进程还可以分类为:

  • I/O bound:进程会发出更多的I/O请求,(所以该进程的执行时间更受限于IO,所以叫IO绑定)
  • CPU 绑定:进程更多去进行计算

2.8 进程操作

父进程创建子进程,形成进程树。

2.8.1 进程创建

操作系统(三)进程_子进程_12

  • pid process identifier
  • 操作系统(三)进程_进程_13

  • 上图需要看书和代码理解。P118

2.8.2 进程终止

进程自己通过exit()终止
父进程通过abort()终止子进程
Cascading Termination: 父进程终止,操作系统令所有子进程都终止。
父进程通过wait()等待子进程终止

orphan 进程:父进程终止,子进程还存在
zombie 进程:父进程没有使用wait()进程,不知道子进程已经终止

2.8.3 合作进程和独立进程Cooperating Processes independent process

合作进程需要进程间的通信interprocess communication (IPC)

操作系统(三)进程_多线程_14

  • 共享内存是被用户进程所控制的,而不是操作系统。
    生产者:
    消费者:
  • 信息传递:
    直接通信:经常是2个进程1个连接,双向的通信,互相发
    间接通信:通过邮箱,许多进程可以有一个连接

2.8.4 Client-Server Systems 通信

  • pipes
  • Sockets
  • Remote Procedure Calls
  • Remote Method Invocation (Java)
    了解管道
    unidirectional
  • 操作系统(三)进程_子进程_15

  • 命名管道
  • 操作系统(三)进程_父进程_16