进程和线程
进程线程的区别
- 进程是操作系统分配资源的最小单位,线程是操作系统调度的最小单位
- 每个进程有自己独立的上下文和代码,切换开销较大。同一个进程内的所有线程有共有的资源(虚拟内存空间,打开的文件),但是有自己独立的寄存器和栈(上下文 …
进程和线程
进程线程的区别
- 进程是操作系统分配资源的最小单位,线程是操作系统调度的最小单位
- 每个进程有自己独立的上下文和代码,切换开销较大。同一个进程内的所有线程有共有的资源(虚拟内存空间,打开的文件),但是有自己独立的寄存器和栈(上下文),线程上下文切换的开销小。因为线程不需要切换完整的虚拟内存空间
- 进程中某个线程崩溃,可能导致整个进程崩溃。进程的子进5程崩溃不影响其他进程
- 系统会为每个进程分配内存,但不会为线程分配。线程可以使用自己所在的进程的资源
为什么要有进程和线程
进程和线程没有合二为一,是因为它们承担不同的职责。进程主要作为资源分配和隔离的单位,拥有独立的地址空间和系统资源;线程主要作为 CPU 调度和执行的单位。同一进程内的多个线程共享进程资源,可以方便地进行并发执行和数据共享,同时不同进程之间又能保持资源隔离。因此将资源管理和执行调度分离,可以兼顾隔离性和并发性能。
线程的调度过程
从一个线程切换到另一个线程的时候,首先保存旧线程的上下文资源,然后线程调度器通过调度算法决定新线程,恢复新线程的上下文,切换到新线程进行执行
进程的五种状态
创建状态,运行状态,结束状态,阻塞状态,就绪状态
上下文指什么
CPU上下文:CPU寄存器和程序计数器 进程上下文:包括虚拟内存,内核堆栈,寄存器等资源 线程上下文:线程状态,栈指针等
进程间通信的办法
管道
在管道中,数据以字节流的形式在内核缓冲区之中传输,主要有匿名管道和命名管道
- 匿名管道:没有名字,通常用于有亲缘关系的进程,生命周期随进程结束
- 命名管道:有文件系统中的名字,可以用于没有关系的进程,生命周期不依赖于创建他的进程 不管是匿名管道还是命名管道,数据都存在内核中,不支持iseek之类的文件定位操作,先进先出
消息队列
相比较于管道无格式的数据流传输,消息队列可以一个消息一个消息传输。需要用户态拷贝到内核态
共享内存
分配一个内存供所有需要的进程访问,不需要陷入内核,需要保护共享资源。这种方式大大提高了进程通信的速度 共享内存本质是两个虚拟内存映射同一块物理内存,这样就可以直接访问而不需要拷贝了
信号量
信号量可以保护共享资源,可以保证资源的互斥性。信号量其实是一个计数器,表示资源个数。信号量可分为二值信号量,计数信号量。有P操作和V操作 P 操作(wait):信号量大于0则–,否则阻塞等待 V 操作(signal/post):信号量++,如果有则唤起一个等待者
信号
信号是操作系统提供的一种异步通知机制,用于通知进程发生了某种事件,例如crtl+c
socket
用于网络传输,不同主机中的进程间通信
线程间通信的方法
互斥锁
读写锁
可以同时读,但是只有一个可以写。但是当读锁被占,读操作以及获取读锁操作会被阻塞,防止数据不一致的情况
条件变量
一个线程之间共享的全局变量,一个线程等待条件,另一个线程执行。条件变量总是和互斥锁结合使用
自旋锁
自旋锁在用户态执行,不会主动产生上下文切换(因为不涉及阻塞等待)。会一直检查锁的状态,然后尝试获得锁。CAS把这两个操作合并成一个硬件级原子指令。保证不可分割
信号量
进程调度的算法都有哪些
先来先
字面意思,非抢占式的先来先到,从队列中取出第一个进程执行,直到进程退出或者阻塞,从队列中取出下一个进程 这样调度会导致长任务执行太久,对短任务不公平
最短作业优先调度算法
优先选择运行时间最短的进程来运行,这样对长进程很不利
高响应比优先调度算法
先进行响应级优先比计算,把优先比最高的投入执行

时间片轮转调度算法
给每个进程分一个时间片,允许该进程在这个时间段内运行 如果时间结束这个进程还在运行,那么cpu切换进程执行,如果在时间结束前进程阻塞或结束,cpu立刻切换进程
优先级调度算法
进程的优先级可以分为
静态优先级:创建进程的时候就确认了,后面不会修改
动态优先级:在进程运行的时候动态进行修改,运行时间长的进程优先级降低,等待时间长的进程优先级升高 进程的优先级一般为-20——19,数字越小,优先级越高。初始创建的时候进程的默认级为0,root权限可以降低数字,其余权限只可以增大数字
非抢占式:当就绪队列中出现优先级高的进程,先执行完当前进程,再执行优先级高的进程
抢占式:上述情况先执行优先级高的进程,当前进程挂起等待
多级反馈队列调度算法
该算法是时间片轮转算法和优先级调度算法的结合 多级表示有多个队列,优先级从高到低,优先级约高时间片越短 反馈是指如果有新的进程加入优先级高的队伍,先执行优先级高的进程,当前进程挂起等待 收起