进程与线程
进程:一个运行着的程序叫做进程,包含了该程序的地址空间和该程序所需要的系统资源。
线程:在一个程序中的多个执行路线就叫做线程。
- 线程优点:开销小,切换速度快,线程切换时操作系统做的工作少。
- 缺点: 1)写多线程程序要仔细,共享变量会引发问题。 2)多线程程序调试会很困难
- 线程同步:信号量,互斥量。
- 互斥量和信号量的区别:1)互斥是指同一时刻只允许一个线程对某一资源的访问,具有唯一性和排他性,但无法限制访问者对资源的访问顺序。同步是指在互斥的基础上,通过其他机制实现访问者对资源的有序访问。2)互斥量值只能为0/1,信号量值可以为非负整数 。3) 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。
- 一个线程只能属于一个进程,但一个进程可以拥有多个线程;多线程处理就是允许一个进程在同一时刻执行多个任务
- 线程没有地址空间,线程包含在进程的地址空间中。所有线程共享进程的内存和资源,共享代码段(代码和常量),数据(全局变量和静态变量),扩展段(堆)。但每个线程都有自己的栈段,有自己寄存的局部变量和临时变量。
信号
信号是Linux系统响应某些条件而产生的一个事件。接受到该信号的进程会相应地采取一些行动。信号是由某些错误条件而产生的,如内存段冲突、浮点处理器错误或者非法指令。比如在 Terminal 中通过键盘敲入 Ctrl+C 组合,就会向正在运行地程序发送 SIGINT 信号,这将引起程序地终止。
进程间通信
进程间的通信主要包括以下几种
1)管道(pipe)从一个进程流向另一个进程,单向流动,父进程和子进程之间使用
2)命名管道(FIFO)能在不相关的进程中传递数据,先进先出
3)信号量:用于管理对临界资源的访问,信号量是一个特殊的变量,取正整数。并且程序对他的访问都是原子操作。
// P操作,passeren(传递),
P(sv);
if(sv > 0)
{
sv--;
//执行功能
}
else if(0 == sv)
{
wait(); //等待
}
// V操作, vrijgeven(给予或释放)
if(有进程正在等待sv)
{
//恢复挂起的进程;
}
else
{
sv++;
}
4)共享内存:用于程序之间高效地共享数据,允许两个不相关的进程访问同一逻辑内存。具体实现:把不同进程之间共享的内存安排在同一段物理内存,并未提供同步机制,一般用共享内存来提供对大块内存区域的有效访问,同时通过传递小消息来同步。同步方法:信号量、消息队列、信号。
5)消息队列,在程序之间传递数据的一种简单方法。消息队列和FIFO的区别:
6)套接字
TCP 和 UDP 的区别
1)TCP提供面向连接的传输,通信前要先建立连接(三次握手机制);UDP提供无连接的传输,通信前不需要建立连接。
2)TCP提供可靠的传输(有序,无差错,不丢失,不重复);UDP提供不可靠的传输。
3)TCP面向字节流的传输,因此它能将信息分割成组,并在接收端将其重组;UDP是面向数据报的传输,没有分组开销。
4)TCP提供拥塞控制和流量控制机制;UDP不提供拥塞控制和流量控制机制。
为什么要用线程池
为了减少创建和销毁线程的次数,让每个线程可以多次使用,可根据系统情况调整执行的线程数量,防止消耗过多内存,所以我们可以使用线程池。
硬中断和软中断
- 硬中断是由硬件产生的,处理中断的驱动是需要运行在CPU上的,因此,当中断产生的时候,CPU会中断当前正在运行的任务,来处理中断。
- 软中断的处理非常像硬中断。然而,他们仅仅是由当前正在运行的进程产生的。通常,软中断是一些对I/O的请求。这些请求会调用内核中可以调度I/O发生的程序。对于某些设备,I/O请求需要被立即处理,而磁盘I/O请求通常可以排队并且可以稍后处理。