进程的概念:
进程是计算机中已经运行的程序的实体。
程序本身只是一组代码的集合,进程才是程序(指令和代码)的真正运行。用户下达运行程序的命令后,就产生了进程。进程与程序可以是一对多的关系(一个进程可以由若干个程序运行生成),也可以是多对一的关系(一个程序可以产生多个进程)。进程需要一些资源才可以运行,比如:I/O设备,内存和CPU等。进程的组成为:数据段、代码段、进程控制块,进程是系统分配资源的基本单位。进程间可以并发执行。
进程有5中状态,其中前3种是基本态:
1、就绪状态:在系统已经为进程分配了除CPU后的所有资源后,进程就在就绪队列里面排队,等到CPU分配资源后就可以马上执行。
2、运行状态:就是指进程正在处理器上运行。单处理系统在同一时刻只能使一个进程在处理器上运行。
3、阻塞状态:是指进程在运行的过程中由于需要资源,所以暂时需要等待资源,就会进入到阻塞队列里面。直到系统为其分配所需的资源后,进程就会进入到就绪队列里面。
4、新状态:指正在创建进程,但是还没有进入到就绪队列里。
5、结束状态:是指进程已经执行完成或者被中断执行,进程正在被撤销的状态。
其中进程的3个基本状态都可以相互转换。
线程的概念:
线程也称为轻量级进程(lightweight process),是程序的一个片段的执行。线程的组成为:线程ID、当前的指针、少量寄存器、堆栈(stack)。线程是CPU调度和分配的基本单位,线程自己不拥有资源,但是线程有自己的堆栈(用于函数实参和内部分配变量存储)。同一个进程下的线程共享进程的资源(包括I/O设备、文件描述符fd、堆、进程的代码段等)。每个进程至少有一个线程,如果进程只有一个线程,那么这个线程就是程序本身。线程间也可以并发执行。线程也拥有三个基本状态:就绪状态、阻塞状态、运行状态。
进程和线程的区别:
1、调度:进程是系统资源拥有和调度的基本单位;而线程是处理器分配和调度的基本单位。
2、拥有资源:每个进程都拥有自己的独立资源;而线程不拥有资源,但是同一个进程下的所有线程共享进程的资源。线程拥有自己独立的栈。
3、地址空间:进程间的地址空间是不一样的,都有一个独立的起始地址,但同一个进程下的线程共享进程资源,
4、并发性:不仅进程间可以并发,同进程下的线程也可以并发。
5、系统开销:创建和销毁一个进程比创建和销毁一个线程所需花费的系统开销大得多(因为系统需要为进程重新分配资源,调入就绪队列,分配CPU运行,而线程切换时只需要保存和设置少量寄存器的内容就可以了)。
6、通信:进程间通信需要通过系统,而线程间通信通过读/写进程数据段就可以达到通信的目的。
进程间通信的主要手段:
1、信号量( semaphore):用来控制进程访问临界资源和同步访问的机制。
2、管道(pipe):无名管道(创建步骤:1、使用pipe(int fd[2])创建一个管道,将两个文件描述符分别指向管道头尾 2、使用fork()函数创建一个子进程,因为子进程拷贝父进程的数据段和代码段,所以子进程也获得了两个文件描述符,且指向同一个管道 3、父进程关闭管道的读端,子进程关闭管道的写端(因为无名管道是半双工的))可用于具有父子关系的进程中(半双工方式),有名管道(创建步骤:1、调用mkfifo(char*filename, mode_t mode),创建一个有名管道)除了用于有亲缘关系的进程通信外,还可以用于没有亲缘关系的进程之间。
3、消息队列(message):消息队列是消息的链表。
4、共享内存(share memory):可以是多个进程访问同一片内存空间,是对快的一种IPC通信方式(创建步骤:1、创建共享内存shmget() 2、映射共享内存shmat());
5、信号(signal)
6、套接字(socket):一般用于客户端和服务器之间的通信机制,可用于不同机器之间通信。
进程/线程间的同步机制:
1、信号量(signal):使用pv操作(p操作将资源数减一,v操作将资源数加一,当资源数小于或等于零的时候,其他进程就不可以访问当前资源了,直到正在使用资源的进程释放后才可以访问),它可以使多个进程在同一时间访问同一资源,但是规定了最大的访问进程数量。
2、互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享 .互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。
3、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。
4、事 件: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作 .
以上纯属个人编辑,如有不妥,敬请指出,转载请注明出处。