计算机进程、线程简述
本节内容
- 任务
- 进程
- 多进程
- 线程
- 子进程与线程
- 并发与并行
- 进程互斥
- 进程同步
- 生产者消费者模型
一、任务
In the sense of "unit of execution", in some operating systems, a task is synonymous with a process, and in others with a thread
二、进程概念
In computing, a process is the instance of a computer program that is being executed。 It contains the program code and its activity. Depending on the operating system (OS), a process may be made up of multiple threads of execution that execute instructions concurrently.
进程与程序
- 进程是活动的;程序是静止的,是文件
- 进程中的内容包含:文本区域(text region)、数据区域(data region)和堆栈(stack region)
- 程序可以有一个或多个进程
进程状态
进程的活动由操作系统来控制,各个状态的切换通常也叫做进程的生命周期
- 创建态:操作系统分配进程活动区域,以区别其他进程
- 消亡态:操作系统回收活动区域
- 就绪态:进程获得除CPU资源以外的全部资源,等待CPU中
- 运行态:CPU控制进程执行(进程活动区域的内容不断变换)
- 阻塞态:CPU执行进程过程中,需要使用其他计算机资源(例:硬盘等),被迫中止
三、多进程
多个进程通过调度程序(采用调度算法)协调各进程并发执行。常用调度算法如下:
- 先来先服务
- 时间片:把CPU资源分为多个时间片,进程抢夺时间片获取CPU资源
- 段任务优先
- 混合算法
进程间沟通
When processes communicate with each other it is called "Inter-process communication" (IPC) 。
一个程序多个进程
一个进程可以创建多个子进程,通过读共享,写覆盖完成父子间通讯。即多进程软件编程
四、线程
有时也叫轻量级进程,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源
目前操作系统中的执行单元(即上文中提到的task)就是线程。
因为要并发,我们发明了进程,又进一步发明了线程。只不过进程和线程的并发层次不同:进程属于在处理器这一层上提供的抽象;线程则属于在进程这个层 次上再提供了一层并发的抽象。如果我们进入计算机体系结构里,就会发现,流水线提供的也是一种并发,不过是指令级的并发。这样,流水线、线程、进程就从低 到高在三个层次上提供我们所迫切需要的并发!
例如:我们经常使用微软的Word进行文字排版,实际上就打开了多个线程。这些线程一个负责显示,一个接受键盘的输入,一个进行存盘等等。这些线程 一起运行,让我们感觉到我们输入和屏幕显示同时发生,而不是输入一些字符,过一段时间才能看到显示出来。在我们不经意间,还进行了自动存盘操作。这就是线 程给我们带来的方便之处。
五、子进程与线程
转载自 https://blog.csdn.net/heatdeath/article/details/72846593
相同点:
二者都具有ID,一组寄存器,状态,优先级以及所要遵循的调度策略;
每个进程都有一个进程控制块,线程也拥有一个线程控制块;
线程和子进程共享父进程中的资源;线程和子进程独立于它们的父进程,竞争使用处理器资源;线程和子进程的创建者可以在线程和子进程上实行某些控制,比如,创建者可以取消、挂起、继续和修改线程和子进程的优先级;线程和子进程可以改变其属性并创建新的资源;
不同的:
线程是进程的一部分, 一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的;
启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间;
系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。而一个线程的数据可以直接为其他线程所用,这不仅快捷,而且方便;
与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB中所保存的线程状态比PCB表中少多了;
进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在。
举例而言
进程和线程的区别在于粒度不同, 进程之间的变量(或者说是内存)是不能直接互相访问的, 而线程可以, 线程一定会依附在某一个进程上执行.我举个例子, 你在Windows下开一个IE浏览器, 这个IE浏览器是一个进程. 你用浏览器去打开一个pdf, IE就去调用Acrobat去打开, 这时Acrobat是一个独立的进程, 就是IE的子进程.而IE自己本身同时用同一个进程开了2个网页, 并且同时在跑两个网页上的脚本, 这两个网页的执行就是IE自己通过两个线程实现的.值得注意的是, 线程仍然是IE的内容, 而子进程Acrobat严格来说就不属于IE了, 是另外一个程序.之所以是IE的子进程, 只是受IE调用而启动的而已.
Linux系统的实现打破了纯粹的进程与纯粹的线程之间的差异。在Linux系统下二者是本质一致的。
附其他
windows下,当你设计一个应用程序时,你可能想使用一些需要长时间运行的代码,而又不中继当前正在进行的工作。一个方法是使用线程,将这个工作交由一个线程去执行,如果这些代码在运行过程中发生了错误,它可能会影响所在进程空间的所有线程。第二个方法是建立一个子进程,由这个子进程完成所需工作,这样子进程代码的错误不会影响到父进程的执行。子进程与父进程之间可以通过动态数据交换(DDE)、OLE、管道、邮件槽等进行通信,使用内存映射文件是最便利的方法之一。当前子进程终止后,子进程句柄变为有信号,父进程可使用 WaitForSingleObject 来等待子进程退出,这样父进程就可使用 GetExitCodeProcess 来获得子进程的退出码。
五、并发与并行
关于这个争论网络上很多,感觉讲的都很模棱两可
举例说明: 公司员工去餐厅点餐,其中: 服务员的任务为点餐——进程;
串行: 服务一类对象。例如:一个餐厅服务员服务所有公司员工,其结果只能排队。
并行: 多个同类任务执行者同时服务一类对象。例如:招聘多个服务员,同时服务所有公司员工,排队时间减少了
并发: 不同类任务执行者同时服务一类对象。例如:点餐完毕后,继续排队等待厨师做菜(这样设计餐厅你会疯掉),那么服务员的任务:写菜单,收款,通知厨师做菜。使点餐与做菜独立出来
结论:
- 并行是增加共享资源以提高效率的方法
- 并发是对一组共享资源优化工作方式以提高效率的方法
六、进程互斥
注意: 这里提到的进程指一般意义上的,可以代表线程,进程等
基础概念
- 临界资源(临界区):指一次只能允许一个进程使用的共享资源称为临界资源;
- 互斥:指两个或多个进程访问临界资源时只能一个进程访问,其他进程等待的一种相互制约的关系。常见解决互斥的方法:
互斥解决方法
- 加锁:对临界区加锁以实现互斥。当某个进程进入临界区后,它将锁上临界区,直到它退出临界区为止。并发进程在申请进入临界区时,首先测试该临界区是否上锁
缺点:①循环判断临界资源是否上锁消耗资源 ②由于判断是否上锁由进程自身判断,so会导致不公平现象,即绝对饥饿
- 信号量与PV原语:临界资源(sem)只能通过PV原语来实现访问,sem>0表示可供并发进程访问的资源实体数;sem<0表示被阻塞的进程数
七、进程同步
基础概念
- 进程间的直接制约:一组在异步环境下的并发进程,各自的执行结果互为对方的执行条件,从而限制各进程的执行速度的过程称为并发进程间的直接制约。这里的异步环境主要是指各并发进程的执行起始时间的随机性和执行速度的独立性。
- 进程间的同步:把异步环境下的一组并发进程因直接制约而互相发送消息而进行互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程间的同步。具有同步关系的一组并发进程称为合作进程,合作进程间相互发送的信号称为消息或事件。
八、生产者消费者模型
把并发进程的同步和互斥问题一般化,可以得到一个抽象的一般模型,即生产者-消费者问题(producer-consumer problems)。
把系统中使用某一类资源的进程称为该资源的消费者,而把释放同类资源的进程称为该资源的生产者。
设生产者进程和消费者进程是互相等效的,其中,各生产者进程使用的过程deposit(data)和各消费者使用的进程remove(data)可描述如下:
首先,可以看到,上述生产者-消费者问题是一个同步问题。即生产者和消费者之间满足如下条件:
- (1)消费者想接收数据时,有界缓冲区至少有一个单元是满的。
- (2)生产者想发送数据时,有界缓冲区至少有一个单元是空的。
另外,由于有界缓冲区是临界资源,因此,各生产者进程和各消费者进程之间必须互斥执行。
设公用信号量mutex保证生产者进程和消费者进程之间的互斥,设信号量avail为生产者进程的私用信号量,信号量full为消费者进程的私用信号量。信号量avail表示有界缓冲区中的空单元数,初值为n;信号量full表示有界缓冲区中非空单元数,初始值为0。信号量mutex表示可用有界缓冲区的个数,初始值为1。
在这个例子中,由于包含多个公用信号量和私用信号量,因此P、V原语的操作顺序需要非常小心。一般来说,由于V原语是释放资源,所以可以以任意次序出现。但P原语则不然,如果次序混乱,将会造成进程之间的死锁。例如:如果我们调换P(full)和P(mutex),便有可能导致程序一直占用临界区,而无法得到资源(如果此时full=0,mutex >= 0,程序进入临界区后得不到资源,但又无法释放临界区),从而导致死锁。
【其他】
设计:先看是否存在互斥,给出公用信号量;再看同步,给出私用信号量。互斥和同步分开操作。
操作:先对同步的私用信号量做P操作,然后对互斥的公用信号量做P操作。