进程和线程的区别是老八股文了。这里要好好学习。
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 内存中的进程
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
2.4 进程状态
这里可以跟随PPT的图片变化理解整个过程。
2.5 CPU进程切换
2.5.1 上下文切换
上下文切换是需要时间的,这断时间内,操作系统没干有意义的工作。时间和硬件有关系。这个时间是日常开销,无法省略。
2.6 Ready Queue And Various I/O Device Queues
现在的操作系统都是多线程,同时在内存中,等待cpu的调用。 ready queue: 放在内存中准备被cpu执行的进程队列 Process scheduler : 从队列中选择进程交给cpu Device queue / IO queue: 准备使用io设备的进程队列
2.6.1 进程在队列间的迁移(看pdf的图对应)
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 进程创建
- pid process identifier
上图需要看书和代码理解。P118
2.8.2 进程终止
进程自己通过exit()终止 父进程通过abort()终止子进程 Cascading Termination: 父进程终止,操作系统令所有子进程都终止。 父进程通过wait()等待子进程终止
orphan 进程:父进程终止,子进程还存在 zombie 进程:父进程没有使用wait()进程,不知道子进程已经终止
2.8.3 合作进程和独立进程Cooperating Processes independent process
合作进程需要进程间的通信interprocess communication (IPC)
2.8.4 Client-Server Systems 通信
- pipes
- Sockets
- Remote Procedure Calls
- Remote Method Invocation (Java)
了解管道 unidirectional 命名管道
|