1、进程和线程区别
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体,是CPU调度和分派的基本单位。
a) 进程在执行过程中拥有独立的地址空间,而多个线程共享同一进程的地址空间,从而极大地提高了程序的运行效率。
b)
进程和线程占用资源如下:
进程占有的资源 | 线程占有的资源 |
地址空间 全局变量 打开的文件 子进程 信号量 | 栈 |
线程的切换开销远小于进程切换的开销,且同一进程内的线程可以共享进程的代码段、数据段、系统资源(IO设备、文件等)
2、进程通信方式
管道:pipe
管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
信号(signal):
信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持unix早期信号语义函数sigal外,还支持语义符合posix.1标准的信号函数sigaction(实际上,该函数是基于bsd的,bsd为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
消息(message)队列:msgget/msgsend/msgrecv
消息队列是消息的链接表,包括posix消息队列systemv消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字 节流以及缓冲区大小受限等缺点。
共享内存:mmap
使得多个进程可以访问同一块内存空间,是最快的可用ipc形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
信号量(semaphore):semget/semop
主要作为进程间以及同一进程不同线程之间的同步手段。
套接口(socket):
更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由unix系统的bsd分支开发出来的,但现在一般可以移植到其它类unix系统上:linux和system v的变种都支持套接字。
3、线程同步/异步
同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)
所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。
换句话说,就是由*调用者*主动等待这个*调用*的结果。
而异步则是相反,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.
阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
4、死锁
死锁 (deallocks):如果一组进程集合中的任意进程都在循环等待该组中其他进程占用的资源,那么该组进程是死锁的。
死锁的必要条件:
- 互斥条件:一个资源每次只能被一个进程占有。
- 占有和等待条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
- 不可抢占条件:进程已经获得的资源在未释放之前,其他进程不能抢占。
- 循环等待条件:死锁发生时,必然有一条由两个或两个以上的进程组成的环路。该环路中任意进程都在等待其他进程占用的资源。
破坏上述任一条件即可避免死锁产生。
5、虚拟存储-分页机制
Intel x86 处理器的地址转换如下:
通过:
1、分段机制: 虚拟地址 (段选择符seg:段偏移shift) ==> 线性地址
2、分页机制: 线性地址 (目录dir:页面page:页内偏移shift) ==> 物理地址
分页机制如下图:
分页的好处:
1、通过LRU等页面置换算法,实现虚拟存储。
2、进程地址空间隔离。
3、减少内存碎片化,虚拟地址连续,物理地址可以不连续。