进程、线程

来源:互联网 发布:mac安装homebrew失败 编辑:程序博客网 时间:2024/06/05 08:35
1)进程:计算机中已运行程序的实体
2)程序是指令的集合,进程才是程序的真正运行,同一程序可产生多个进程(一对多的关系),以允许同时多位用户运行同一程序,却不会产生冲突
3)进程需要一些资源才能完成工作,如CPU时间,存储器,文件以及IO设备,且依序逐一进行,即任何时间内仅能运行一项进程。


3种基本状态

运行状态:单处理器每时刻最多只一个进程处于运行
就绪状态:进程已处于准备运行的状态,获得了除处理器之外的一切所需资源,一旦得到处理器即可运行
阻塞状态:等待状态,进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理器)等待输入/输出完成。即使处理器空闲,该进程也不能运行


创建状态:进程正在创建,尚未转到就绪状态

结束状态:进程正在系统中消失,正常结束或者其他原因中断退出运行
就绪<->执行(处理机) 阻塞<->就绪(某件事件受阻或完成,如申请资源,I/O传输)


进程和程序的区别
1)进程是程序及其数据在计算机上的一次运行活动,是一个动态的概念。进程的运行实体是程序,离开程序的进程没有意义的存在。从静态角度看,进程由程序,数据和进程控制块(PCB)三部分组成。而程序是一组有序的指令集合,是一种静态的概念。
2)进程是程序的一次执行过程,它是动态地创建和消亡,具有一定的生命期,是暂时存在的,而程序是一组代码的集合,它是永久存在的,可长期保存
3)一个进程可以执行一个或几个程序,一个程序也可以构成多个进程。进程可创建进程,而程序不能形成新的程序。
4)进程和程序的组成不同。
创建新的进程会创建新的地址空间:子进程是父进程的复制品,在fork之后子进程获得父进程的数据空间、堆和栈的复制品,而线程使用当前的地址空间


例题:输出多少“-”
#include<stdio.h>#include<sys/types>#include<unistd.h>int main(void){int i;for(i=0;i<2;i++){fork();printf("-");//若为printf("-\n");输出“\n”会刷新缓冲区,输出6个}return 0;}
解:8个
要注意继承缓冲区

线程
1)轻量级进程,程序执行流的最小单元。由线程ID,当前指令指针(PC),寄存器集合和堆栈组成
2)线程是进程的一个实体,是系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它
可同属于一个进程的其他线程共享进程所拥有的资源
3)线程共享的进程环境包括:进程代码段,进程的共有的数据(如全局变量,利用这些共享的数据,线程很容易实现相互之间的通信)、进程打开的文件描述符,信号的处理器,进程的当前目录和进程用户ID
线程ID
每一个线程都有自己的线程ID,这个ID在本进程是唯一的,进程用来标识线程
寄存器组的值
线程间并发运行,每个线程都有自己的不同的运行线索,当从一个线程切换到另一个线程时,必须将原有的线程的寄存器的状态进行保存,一边将来该线程在被重新切换时能得以恢复。
线程的堆栈
堆栈是保证线程独立运行所必须的。线程函数可以调用函数,被调用函数又是可以层层嵌套,所以线程必须拥有自己的函数堆栈,使得函数调用可以正常执行,不受其他线程的影响,在一个进程的线程共享堆区
错误的返回码
线程的信号屏蔽码
线程的优先级
线程也有三种基本状态,每个程序至少有一个线程,若程序只有一个线程,那就是程序本身
线程是程序的一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程

进程通信与进程同步
目的:
1)数据传输:一个进程需要将它的数据发送给另一个进程
2)共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到
3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生某种事件
4)资源共享:多个进程之间共享同样的资源,需内核提供锁和同步机制
5)进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能拦截另一个进程的所有陷入和异常,并及时知道它的状态改变
Linux进程间通信的主要手段:
管道、信号、Message(消息队列)、共享内存、信号量、套接字
Linux线程间通信:
互斥体(量)、信号量、条件变量
Windows进程间通信:
管道、共享内存、消息队列、信号量、socket
Windows线程间通信:
临界区、互斥量、信号量(灯)、事件

管道有名管道:管道亲缘关系进程间通信;有名管道,克服管道没名,还允许无亲缘进程间通信
信号:通知接受进程有某种事件发生,还可发信号给进程本身。
Message(消息队列):消息的链表,包括Posix消息队列System V消息队列。有足够权限的进程可以向队列中添加信息。消息队列
克服信号承载信息量少,管道只能承受无格式字节流以及缓冲区大小受限等缺点
共享内存:多个进程可以访问同一块内存
信号量:主要一般进程间和同一进程不同线程之间的同步手段

套接字:更为一般的进程间通信机制,可用不同机器。


1)临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。

2)互斥量:采用互斥对象机制。只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。

3)信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。

4)事件:通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作。


临界区和互斥体:
1)临界区只能同步本进程的线程,不可同步多个进程的线程;互斥量,信号量,事件可跨越进程使用同步数据操作
2)临界区非内核对象,只在用户态进行锁操作,速度快;互斥体内核对象,在核心态进行锁操作,速度慢
3)临界区和互斥体在Windows平台下都可用,Linux只有互斥体
0 0
原创粉丝点击