4T_进程与进程间通信

时间:2024-04-17 20:21:56

∮进程

进程与程序

进程与程序是有区别的.刚吃完炸鸡腿,拿出一张餐巾纸,擦完嘴之后,在油乎乎的纸上写下以下文字

#include <stdio.h> void main() { printf("helloworld"); },对这段文字就是程序.你的 Hello.c 就是程序,编译之后的 Hello.out 就是程序.

程序是"静态"的,不争夺CPU 和内存资源.进程是 "动态"的,争夺CPU 和内存资源的"运行起来的程序".

why 进程

一个正在运行的进程,现在要做一些事情,这些事情并不需要CPU 的参与,如 IO 操作.这时 CPU 完全闲置下来了.以前CPU 很贵,这种行为有点 "暴殄天物",现在 CPU 很牛逼,有足够能能力让

计算机 看起来"在同时执行着很多程序".所以进程是 "多道程序设计"这一需求 催生的技术.旨在提高CPU 的利用率,当进程A 不需要CPU 的运算时,让CPU 去解决进程 B的需求.只要切换时间

小于空闲时间,这事就 干的过~ 实际上,随着内存变得越来越大,越来越大 8G 16G 128G...,切换时间就远小于空闲时间.了...

how 切换

什么是进程上下文..每个程序都将内存分为 指令区和数据区指令区存的指令和数据区存的数据就是进程上下文我说的不对~但就是这个意思.

指令执行到哪里了,用一个指针存下来. CPU 寄存器中的数据,存入内存中,并把寄存器指针也存入内存~ 这就是 执行进程切换时 所做的动作.这样一来,被切走的程序也依然

呆在内存中.这些上下文数据,确实在内存中,在内存的什么地方?在内存的一个叫 寄存器保护区,寄存器保护区是什么?是 进程控制块 PCB的一部分.操作系统为每个进程,都保留一块

内存区域,存放PCB,PCB 是一种数据结构,里面存储着,上下文数据和 一些 其他东西...

进程状态

基本的进程状态只有三种,运行态,就绪态,阻塞态.为什么进程要有状态? 是为了方便操作系统进行切换的.

操作系统维护着一个包含就绪态的列表.

当进程等待"外部事件"的执行结果时,操作系统,认为进程进入阻塞态.某种角度,是进程自己阻塞了进程自己.

除此之外进程还有 新生态和停止态.(UNIX like 中的僵尸态)

PCB

PCB 是一种数据结构,维护着每个进程的信息,每个用户进程都有一个PCB,当进程被创建时,PCB 随之创建.进程被销毁时 PCB 随之销毁.当然 PCB的创建和销毁是操作系统的事.

PCB 保存在为操作系统保留的内存中.

PCB 中都有什么...我想画个图,但是画图软件用的不熟.就描述一下就好了.有一个矩形的方框,分成了好多行.

矩形方框的第一行 进程标识符号(pid)

矩形方框的第二行 进程状态(新生,运行,就绪,阻塞,停止)

矩形方框的第三行 进程优先级 (linxu 中的 nice 值)

矩形方框的第四行 寄存器内存保护区(出现了,刚才并没有胡扯,有没有~)

矩形方框的第五行 指向进程内存的指针

矩形方框的第行 指向其他资源的指针

矩形方框的第行 打开文件的列表

矩形方框的第行 统计信息

矩形方框的第几行了? 所需其他信息

矩形方框的第...行 指向其他PCB的指针

进程间的切换本质上是一个查表操作,不再赘述(Achyut Godbole 第190页左右的内容.)

进程间的继承.操作系统允许进程有自己的后代~ (Linux 的 init 进程就是所有进程的父进程.就像 Java 的Object 类一样.这也UNIX作者讽刺Linus说,Linux 跑起来就是像一个超大的 a.out)

操作系统维护着一个单独的指针链表,将构成进程层次结构的PCB 连接在一起. 这个指针链表里存着 指向第一个子进程的PCB 指针,指向最后一个子进程的,指向前一个兄弟目录的,指向后一个兄弟目录的

指向该进程父进程的
,这些指针就避免了复杂化,和混淆不清.例如在 手动杀死一个进程时,操作系统就能知道 到底要杀死谁,以及怎么杀死(兄弟姐妹杀不杀,父亲儿子杀不杀...),有的操作系统如果

有儿子就 不让杀,这就是 操作系统自己定的了~

多线程 && why 多线程

一个进程被分配了 26ms时间片,但是 运行到第10ms 的时候,开始进行IO操作,然后这 25ms 的时间片,利用率就 十分有限了~ 这就像和女朋友开了一家星级宾馆,但是改了一夜的bug 一样.

(这货的bug 在脑子里,不在代码里,不好改~)

线程可以在两个不同的层次上实现,用户层和内核层.用户线程到内核线程的三种映射方式为 多对一模型,一对一模型,多对多模型.

POSIX 统一了线程的实现,他对多线程 API 实现了 标准化.可移植操作系统标准.遵循这个标准的线程称为 POSIX 线程或Pthread 线程.C语言的 pthread.h 文件为 多线程的管理提供了60多个函数.

Linux 线程,Linux 并不区分 进程和线程.任务是 Linux 工作的基本单元.Linux 提供了两个系统调用 fork() C标准函数. 和 clone() Linux 特有系统调用.clone() 用来实现 Linux 的内核线程.

用户级可以通过 LinuxThreads 库实现.

∮进程

...
...
...

所以主流解决互斥问题的方案,其实只有 "信号量" 和 "监视器" 两种方案.