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 ...
随机推荐
- ORA-00907: 缺失右括号
创建表时出现ORA-00907: 缺失右括号的情况 调整关键字的顺序 CREATE TABLE s_dept(ID PRIMARY KEY NOT NULL NUMBER(7),NAME NOT NU ...
- [Linux] - Docker制作nginx+php
使用Docker制作nginx+php的镜像,这里的镜像是centos + nginx 1.9.7 + php 5.6.14 首先下载到nginx和php: nginx-1.9.5.tar.gz 下载 ...
- C++的隐式类型转换与转换操作符
C++标准允许隐式类型转换,即对特定的类,在特定条件下,某些参数或变量将隐形转换成类对象(创建临时对象).如果这种转换代价很大(调用类的构造函数),隐式转换将影响性能.隐式转换的发生条件:函数调用中, ...
- mysql_fetch_row,mysql_fetch_array,mysql_fetch_object,mysql_fetch_assoc的区别!
php从mysql中访问数据库并取得数据,取得结果的过程中用到好几个类似的方法,区别及用法值得区分一下,看下面的代码 代码如下: <?php $link=mysql_connect('loc ...
- 分配和释放 BSTR 的内存
本文档已存档,并且将不进行维护. 分配和释放 BSTR 的内存 Visual Studio .NET 2003 转自: https://msdn.microsoft. ...
- win7(64位)php5.5-Apache2.4-mysql5.6环境安装
原文链接http://jingyan.baidu.com/article/9faa723152c5d6473d28cb47.html 工具/原料 php-5.5.10-Win32-VC11-x64.z ...
- win7 audio repeater 虚拟声卡 屏幕录像专家
- CentOS 6.5下静默安装oracle
本例: 通过SSH远程连接云主机,上传oracle11g安装包,在centos6.5上无图形化界面静默安装oracle11g. 涉及工具及环境: 1.本地环境windows7+ssh远程连接工具xSh ...
- Python基础篇【第7篇】: 面向对象(1)
面向对象技术简介 相近对象,归为类 在人类认知中,会根据属性相近把东西归类,并且给类别命名.比如说,鸟类的共同属性是有羽毛,通过产卵生育后代.任何一只特别的鸟都在鸟类的原型基础上的.面向对象就是模拟了 ...
- JNI开发中String转换chat*工具
char* Jstring2CStr(JNIEnv* env, jstring jstr) { char* rtn = NULL; jclass clsstring = env->FindCla ...