4T_进程与进程间通信
∮进程
进程与程序
进程与程序是有区别的.刚吃完炸鸡腿,拿出一张餐巾纸,擦完嘴之后,在油乎乎的纸上写下以下文字
#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 库实现.
∮进程
...
...
...
所以主流解决互斥问题的方案,其实只有 "信号量" 和 "监视器" 两种方案.
4T_进程与进程间通信的更多相关文章
- JAVA线程与线程、进程与进程间通信
I.线程与线程间通信 一.基本概念以及线程与进程之间的区别联系: 关于进程和线程,首先从定义上理解就有所不同1.进程是什么?是具有一定独立功能的程序.它是系统进行资源分配和调度的一个独立单位,重点在系 ...
- python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型
一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...
- PHP进程及进程间通信
一.引言 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.换句话说就是,在系统调度多个cpu的时候,一个程序的基本单元.进程对于大多数的语言都不是一个陌生的概念,作为"世界上最好 ...
- python开发进程:互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型
一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...
- Qt 进程和线程之一:运行一个进程和进程间通信
Qt提供了对进程和线程的支持.本节讲述了怎样在Qt应用程序中启动一个进程,以及几种常用的进程间通信方法.如果对进程和线程的概念不是很了解,可以看我的另一篇博客:[多进程和多线程的概念. 设计应用程序时 ...
- Python程序中的进程操作-进程间通信(multiprocess.Queue)
目录 一.进程间通信 二.队列 2.1 概念介绍--multiprocess.Queue 2.1.1 方法介绍 2.1.2 其他方法(了解) 三.代码实例--multiprocess.Queue 3. ...
- 【Linux 应用编程】进程管理 - 进程间通信IPC之共享内存 mmap
IPC(InterProcess Communication,进程间通信)是进程中的重要概念.Linux 进程之间常用的通信方式有: 文件:简单,低效,需要代码控制同步 管道:使用简单,默认阻塞 匿名 ...
- 【Linux 应用编程】进程管理 - 进程间通信IPC之管道 pipe 和 FIFO
IPC(InterProcess Communication,进程间通信)是进程中的重要概念.Linux 进程之间常用的通信方式有: 文件:简单,低效,需要代码控制同步 管道:使用简单,默认阻塞 匿名 ...
- Qt ------ QProcess,启动外部进程,进程间通信
简介: 可用于完成启动外部程序,并与之交互通信. 启动一个进程的名字叫“program”,如果某进程的路径没有设置成环境变量,“program”需要包含路径 如果进程可以接收参数,参数叫“argume ...
随机推荐
- Linux监控分析实战-1
监控概述及5个大指标 cpu mem 内存 io 磁盘交互 load 负载 Network 网络 它们之间关系是相互彼此依赖,任何一个高负载都会到导致其他指标出现问题: 网卡 ...
- Javascript模式(第三章字面量与构造函数)------读书笔记
一 对象字面量 1.1对象字面量的语法 1,对象键值对哈希表,在其他的编程语言中称之为“关联数组”, 2 键值对里面的值,可以是原始类型也可以是其他类型的对象,称之为属性,函数称之为方法 3 自定义对 ...
- 实现windows批处理下的计时功能
有时在执行完一段windows的批处理后,想知道这个过程花费了多少时间,如果是windows下的c代码可以在过程前后分别调用GetTickCount(),然后相减即可得到花费的时间. 但是如果在批处理 ...
- IOS零碎技术整理(3)-获取wifi列表
1. 该功能实现基于MobileApple80211框架来进行开发,而目前该框架成为了私有框架,其中的API均为私有API. 如果使用这些API可能导致应用不能上app store或者ios版本升 ...
- javascript冒泡排序一些新实现
一.冒泡排序 说起冒泡排序,可能每个人都不会陌生,实现思路相当简单明了,就是不停的对数组进行两两比较,将较大(较小)的一项放在前面: 如 var arr = [7, 3, 10, 1, 8, 4, 2 ...
- git常用命令 (阿里云code)
命令行指令 Git 全局设置 git config --global user.name "马会东" git config --global user.email "ma ...
- HDU 2222 关键词查找
题目大意:给出一篇文章,长度最多1000000,若干个关键词,关键词有可能重复.关键词不超过10000,每个关键词不超过50个字符.请问该文章包含多少个关键词. 这是AC自动机的入门题.首先将关键词分 ...
- PHP购物车类
<?php /** * 购物车类 */ session_start(); class Cart{ private static $ins = null; private $items = arr ...
- xampp出现 Access forbidden! 问题解决
解决 XAMPP 出现 A今天安装了XAMPP 试了下,增加虚拟主机时出现没权限,apache配置文件httpd.conf的allow属性,把下图中的文字注释掉: 然后公开于外网出现以下错误,也很容易 ...
- Python六大开源框架对比:Web2py略胜一筹
Python是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性.除了语言本身的设计目的之外,Python标准库也是值得大家称赞的,Python甚至还自带 ...