看到百度面试题有道进程和线程的区别,什么是线程安全?于是就想借此机会把进程线程的知识扫了。
一、进程基本概念
1. OS引入进程的概念是为了支持程序的并发执行(在未配置OS的系统中,程序是顺序执行的)。
2. 创建进程及进程控制块PCB
PCB记录了OS所需的、用于描述进程的当前情况及控制进程运行的全部信息[1]。这是教科书版的概念。
当系统创建一个新进程时,就为它建立了一个PCB,进程结束后又回收其PCB,进程于是随之消亡。Windows用CreateProcess创建进程,创建进程后,系统将创建一个进程内核对象(PCB)。然后系统为新进程创建一个线程内核对象。这个主线程执行c /c++运行时启动例程,它由链接器设为应用程序入口,最终调用WinMain或main。。然后系统为新进程创建一个线程内核对象。这个主线程执行c /c++运行时启动例程,它由链接器设为应用程序入口,最终调用WinMain或main。
PCB常被访问,于是常驻内存,系统将所有的PCB组织成若干个链表(或队列),存放在操作系统中专门开辟的PCB区。
PCB中有如下一些信息:
(1)进程标识符;
(2)处理机状态;
实际上是寄存器的信息:通用寄存器,指令寄存器,程序状态字PSW,用户栈指针。
(3)进程调试信息;
(4)进程控制信息。
二、进程的同步
首先区别进程同步和线程同步,线程是进程的更小的CPU分配单位,所以在某种意义上,进程同步与线程同步是一回事(除当同步线程在同一进程中)。
1. 互斥量;
2. 信息量;
利用PV原子操作操作临界资源S。wait使S=S-1,signal使S=S+1。信号使用不当会导致死锁。
三、进程间通信
实际上,进程的同步是“低级”的进程间通信,因为交换的数据少。
1. 共享存储器系统
2. 消息传递系统
3. 管道系统
4. Windows下的同步
Windows下可以使用共享内存,命名管道,WinSock,Mailslot通信,也可以使用COM/DCOM/RPC。
(1)共享内存
Windows下使用共享内存涉及到的Win32 API:
CreateFileMapping();
MapViewOfFile();
UnMapViewOfFile();
CloseHandle();
四、线程的基本概念
为什么要引入线程呢?由于系统在创建进程时,必须为它为本除处理机外的所有资源,故而进程的创建,撤消及切换都需较大代价。于是,提出线程,作为更小的实体。
参考:
1. 《计算机操作系统》