答案:
非抢占式优先权算法:?在这种方式下,系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成。
抢占式优先权调度算法:在这种方式下,系统同样是把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。
答案:
并发:?是对于单个cpu来说,在一个时刻只能一个进程运行,但是线程的切换时间则是减少到纳秒数量级,多个任务不停的来回切换。
并行:是对于多个CPU来说,多个进程可以同时运行。
区别:
并行的"同时"是同一时刻可以多个任务在运行(处于running),并发的"同时"是经过不同线程快速切换。
答案:
操作系统在内核中开辟一块缓冲区(称为管道)用于通信。
编程步骤:
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INPUT 0 //读数据fd
#define OUTPUT 1 //发数据fd
int main(){
//创建管道
int fd[2];
pipe(fd);
//创建子进程
pid_t pid = fork();
if (pid < 0){
printf("fork error!\n");
exit(-1);
}
else if (pid == 0){//执行子进程
printf("Child process is starting...\n");
//子进程向父进程写数据,关闭管道的读端
close(fd[INPUT]);
write(fd[OUTPUT], "hello douya!", strlen("hello douya!"));
exit(0);
}
else{//执行父进程
printf ("Parent process is starting......\n");
//父进程从管道读取子进程写的数据 ,关闭管道的写端
close(fd[OUTPUT]);
char buf[255];
int output = read(fd[INPUT], buf, sizeof(buf));
printf("%d bytes of data from child process: %s\n", output, buf);
}
return 0;
}
答案:
死锁:?是指多个进程在执行过程中,因争夺资源而造成互相等待,此时系统产生了死锁。
产生条件:
解决:
答案:
需要。
因为线程锁只要是用来实现线程的同步和通信,在抢占是操作系统中,通常为每个线程分配一个时间片,当某个线程时间片耗尽时,操作系统会将其挂起,然后运行另一个线程。如果这两个线程共享某些数据,不使用线程锁的前提下,可能会导致共享数据修改引起冲突。
答案:
互斥锁机制:mutex,用于保证在任何时刻,都只能有一个线程访问该对象。当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒。
互斥锁和读写锁:
(1) 读写锁区分读者和写者,而互斥锁不区分;
(2)互斥锁同一时间只允许一个线程访问该对象,无论读写;读写锁同一时间内只允许一个写者,但是允许多个读者同时读对象;
函数 acquire() 获取锁,而函数 release() 释放锁
答案:
由于信号量只能进行两种操作,等待和发送信号,即P(sv)和V(sv),
(1)P(sv)操作:如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行(信号量的值为正,进程获得该资源的使用权,进程将信号量减1,表示它使用了一个资源单位)。
(2)V(sv)操作:如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1(若此时信号量的值为0,则进程进入挂起状态,直到信号量的值大于0,若进程被唤醒则返回至第一步)。
作用:用于多进程对共享数据对象的读取,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。
答案:
上下文切换:?指的是内核(操作系统的核心)在CPU上对进程或者线程进行切换。
进程上下文切换:
(1)保护被中断进程的处理器现场信息;
(2)修改被中断进程的进程控制块有关信息,如进程状态等;
(3)把被中断打断的进程控制块加入有关队列;
(4)选择下一个占有处理器运行的进程;
(5)根据被选中进程设置操作系统用到的地址转换和存储保护信息;
(6)根据被选中进程恢复处理器现场。
答案:
区别:
注意事项:
多线程加锁注意事项:
答案:
原因:
创建和销毁线程的花销是比较大的,这些时间可能比处理业务时间还要长,这样频繁的创建和销毁线程,再加上业务工作的线程,消耗系统资源的时间,可能导致系统资源不足,线程池可以提升系统效率。
实现线程池步骤:
线程的数量:
与CPU、IO/并发、并行有关。
如果是CPU密集型应用,则线程池大小设置为:CPU数目+1;
如果是IO密集型应用,则线程池大小设置为:2*CPU数目+1;
最佳线程数目 = (线程等待时间与线程CPU时间之比 + 1)* CPU数目;