∮进程

进程与程序

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

#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_进程与进程间通信的更多相关文章

  1. JAVA线程与线程、进程与进程间通信

    I.线程与线程间通信 一.基本概念以及线程与进程之间的区别联系: 关于进程和线程,首先从定义上理解就有所不同1.进程是什么?是具有一定独立功能的程序.它是系统进行资源分配和调度的一个独立单位,重点在系 ...

  2. python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

    一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...

  3. PHP进程及进程间通信

    一.引言 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.换句话说就是,在系统调度多个cpu的时候,一个程序的基本单元.进程对于大多数的语言都不是一个陌生的概念,作为"世界上最好 ...

  4. python开发进程:互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

    一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...

  5. Qt 进程和线程之一:运行一个进程和进程间通信

    Qt提供了对进程和线程的支持.本节讲述了怎样在Qt应用程序中启动一个进程,以及几种常用的进程间通信方法.如果对进程和线程的概念不是很了解,可以看我的另一篇博客:[多进程和多线程的概念. 设计应用程序时 ...

  6. Python程序中的进程操作-进程间通信(multiprocess.Queue)

    目录 一.进程间通信 二.队列 2.1 概念介绍--multiprocess.Queue 2.1.1 方法介绍 2.1.2 其他方法(了解) 三.代码实例--multiprocess.Queue 3. ...

  7. 【Linux 应用编程】进程管理 - 进程间通信IPC之共享内存 mmap

    IPC(InterProcess Communication,进程间通信)是进程中的重要概念.Linux 进程之间常用的通信方式有: 文件:简单,低效,需要代码控制同步 管道:使用简单,默认阻塞 匿名 ...

  8. 【Linux 应用编程】进程管理 - 进程间通信IPC之管道 pipe 和 FIFO

    IPC(InterProcess Communication,进程间通信)是进程中的重要概念.Linux 进程之间常用的通信方式有: 文件:简单,低效,需要代码控制同步 管道:使用简单,默认阻塞 匿名 ...

  9. Qt ------ QProcess,启动外部进程,进程间通信

    简介: 可用于完成启动外部程序,并与之交互通信. 启动一个进程的名字叫“program”,如果某进程的路径没有设置成环境变量,“program”需要包含路径 如果进程可以接收参数,参数叫“argume ...

随机推荐

  1. Torch 7 load saved model failed, 加载保存的模型失败

    Torch 7 load saved model failed, 加载保存的模型失败: 可以尝试下面的解决方案:  

  2. Nginx-解读内置非默认模块 ngx_http_stub_status_module

    1.Background ngx_http_stub_status_module 是一个 Nginx 的内置 HTTP 模块,该模块可以提供 Nginx 的状态信息.默认情况下这个模块是不被编译进来的 ...

  3. webbrowser 禁用 alert

    void web_Navigated(object sender, WebBrowserNavigatedEventArgs e) { var web = sender as System.Windo ...

  4. FCN网络的训练——以SIFT-Flow 数据集为例

    参考文章: http://blog.csdn.net/u013059662/article/details/52770198 caffe的安装配置,以及fcn的使用在我前边的文章当中都已经提及到了,这 ...

  5. 自己动手制作CSharp编译器

    在你喜欢的位置(如F盘根目录)新建一个文件夹,并命名为“CSharp开发环境”.找到或下载C#编译器组件(csc.exe和cscui.exe),并放在先前建立的文件夹中.该组件的一般位置在C盘的.NE ...

  6. PHP MYSQL单向同步方案

    项目上有个需求,需要从外网服务器的MYSQL同步到本地服务器上. 思路如下: 1 在外网MYSQL中创建表 table_change_log ,记录表中数据的更改记录. DROP TABLE IF E ...

  7. oracle中找出某个字段中有非数字型的记录

    工作中遇到一个大表记录中有非法非数字字符,不想用正则语法去做, 用一条SQL语句查出来的方法如下: select * from table where translate(col,'*01234567 ...

  8. 《前端们,贺老 Live 面试你了!》所引发的思考与实践

    贺老在知乎live中提到了一个这样的问题: 产品经理提出了一个需求:用户点击文章阅读,返回之后阅读其他文章.当用户看得多了,容易点到自己看过的文章,造成时间浪费.所以想给点击过的文章加一个标记,如:& ...

  9. FastJson的使用

    FastJson FastJson:阿里巴巴的一个Json处理工具包,包括序列化和反序列化两部分. <dependency> <groupId>com.alibaba</ ...

  10. WinRAR压缩操作帮助类

    //------------------------------------------------------------------------------------- // All Right ...